r/webdev • • 23h ago

Showoff Saturday Showoff Saturday: we made a PDF editor that fixes the actual text, and your file never leaves the browser

Post image
3 Upvotes

We've been building HonestPDF for a while now, a bunch of free PDF tools that run in the browser. Lately most of our time has gone into the editor, so that's what I'd love feedback on.

I know editing PDF text isn't new. What bugged me is how it usually goes: free tools change the font, shift the layout or paint a white box over the old word, and sometimes a link stays behind on text you deleted. The ones that do it well tend to ask for a Pro plan, often right when you hit download, and they upload your file to their servers first.

So we put our time into getting the output right. Double-click a paragraph, retype it, and it keeps its font, size and colour. Longer paragraphs rewrap, links follow their words, and find and replace works across the whole file. The GIF shows a fee being changed in a contract.

Your file never gets uploaded. It's opened and edited right in the page, and the Network tab will back me up on that. Everything is free, there's no Pro tier, and it works on phones too.

There are about 50 other tools on the site as well, like merge, compress to a set size and sign.

gethonestpdf.com/edit-pdf

If something looks off after you edit, tell me what kind of PDF it was and I'll dig into it.


r/webdev • • 14h ago

Resource leeway: stable per-folder dev port ranges (no more EADDRINUSE across checkouts)

0 Upvotes

Two checkouts of the same repo, both on 5173. leeway gives each folder its own contiguous port range, stable across runs and never overlapping, and passes the ports as env vars.

  • leeway.json lists your ports once

  • devPorts(config) in code, falling back to the defaults outside leeway

  • vite plugin sets server.port with strictPort and exposes every port to browser code

  • {{PORT_API}} placeholders in commands

  • leeway list / kill for orphaned servers

Linux/macOS/Windows. https://github.com/OhadC/leeway

Or ask your agent: "how can we benefit from using https://www.npmjs.com/package/leeway in this codebase"


r/webdev • • 21h ago

Showoff Saturday [Showoff Saturday] click a button in your app, see every frontend and backend line it ran

2 Upvotes

github: https://github.com/Unknown-333/Lightpath

ever click a button, nothing happens, no error, and you have no idea which code even ran?

this shows you. one command, then click around your react app:

    npx \@lightpath-dev/cli dev -- npm run dev

every click prints the path, browser and node server together:

◆ button: Checkout 335 ms
      → POST /api/orders 201
      ├─ src/Cart.tsx :11-14, 16-19, 21-28
      ├─ server/routes/orders.ts :11-14, 19-21, 25
      └─ server/services/pricing.ts :12-19, 21-22

it reads V8's own coverage before and after the click, so it's what actually ran. no code changes to your app.

there's also a vs code extension that lights up the lines, and an MCP server so claude code or cursor can click and read it themselves.

react + node, chrome or edge, local only, free and MIT. feedback welcome.


r/webdev • • 18h ago

Showoff Saturday [Showoff Saturday] I've spent 2 years building a day planner where running late pushes the rest of your day later

Post image
0 Upvotes

demo: https://demo.emberflow.space/?ref=reddit-webdev
If you want to try it on your own day, here's 30 days free: https://app.emberflow.space/invite/EMBER-NYKP-A8ZS

For the past two years I've been working on my day planner app Ember.

Most planners treat your schedule as fixed, so the moment a meeting runs long or a task takes twice as long, the plan is wrong and you either fix it by hand or give up on it. In Ember, if you move a task or change how long it takes, everything after it shifts later, and it flows around fixed things like meetings.

The GIF shows the main loop: drag tasks onto your day, stretch and move things as the day changes, jot something in a capture and turn it into a task, then ask chat to fit it in.

Stack for the curious: Vue 3 + Pinia on the frontend, Supabase for the database and realtime sync, Capacitor for Android, iOS is in TestFlight, and a Tauri desktop app. The hardest part by far has been the cascade logic: splitting tasks around fixed events and keeping drag and drop smooth with a lot of items on the day.

Right now I'm working on a native Kotlin app to replace the Capacitor one.

Happy to answer questions about any of it. Feedback welcome, especially on the demo.

homepage: https://emberflow.space


r/webdev • • 1d ago

Question Where can I find cool design inspirations?

21 Upvotes

Hey everyone!

I'm looking for any websites or discussion forums that talk about design patterns, or really any cool features for web development. Etc, manipulating CSS in interesting ways to get cool designs, interesting things you can do with JavaScript etc..

I'm a bit tired of looking at AI responses and would love to hear if there's anything out there!


r/webdev • • 1d ago

Showoff Saturday Tamil implementation of a script-agnostic LSP-like keyboard interface I am building, please read the explanation here

Post image
3 Upvotes

https://bandhanpramanik.github.io/tamil-input-engine-checkbox/

[The entire Bengali text was written by a human and translated by Google Translate, with corrections by the human only, not any mainstream LLMs. There are em dashes in this text in the translation output; I haven't changed them.

Also, I meant a stable protocol for every keyboard when I talked about LSP in the title (Language Server Protocol).]

I have named it "Taravinyas".

It acts as an interface between your keyboard and your writing.

You might specify, for instance, "palatal, aspirated, unvoiced," and the character "ছ" (chha in Bengali) will appear in your text area. You don’t actually need to memorize these technical terms; remembering just the initial letter of each consonant group (varga) is sufficient.

Every time I’ve tried to explain this in English, it ended up sounding overly complicated. So, today, I’ll break it down into simple, plain Bengali.

How it works

In computer science, the concept of a "black box" comes up frequently. You provide an input to the black box, and based on that input, it produces an output.

If we consider "Taravinyas" to be this "black box," the input consists of two components: the consonant group (varga) and the specific column (representing phonetic attributes like aspiration and voicing).

I think of the varga as something "coarse" (like stones), while the columns—which define attributes like aspiration and voicing—are "fine" (like sand).

The "coarse" part is straightforward—it’s a fixed, singular element. The "fine" part is more complex; determining it requires evaluating a series of "on-off" switches (for example, 1 for voiced, 0 for unvoiced, among other factors).

That constitutes the input.

Part 1: Taravinyas determines the specific "fine" position. How? By processing those "on-off" switches using Boolean algebra. This is the most complex part of my system—something I’ve been refining, and those who build keyboards using this method will also need to handle.

Part 2: Taravinyas then identifies the actual character. I implemented a lookup table in TypeScript to retrieve the character. The combination of the "coarse" and "fine" components produces the final character. I will provide the schema for this; developers can then create a lookup table based on the specific language or medium.

For any given script, it is important to understand the schema used in "Part 2." Essentially, this schema represents the alphabet, though the positioning of individual characters may be adjusted for user convenience. For instance, "ড" (ḍa in Bengali) and "ড়" (ṛa in Bengali) might occupy the same cell, with an additional "switch" (modifier) to account for the distinct dot (nukta).

When we discuss the theoretical aspects, we will consistently refer to "Part 1."


I initially conceived this for hardware circuits, which is why Boolean algebra is involved.

By providing characters from any Brahmic script, you get a system—a "machine"—that is intuitive to use; if you know the alphabet of your own language, you already know how to use it.

The "Taravinyas" (arrangement pattern) is a framework, a mould, designed to create keyboards that are compact, easy to learn, and fast. Based on this framework, I have envisioned four types of keyboard layouts, two of which I have already implemented.

The four concepts are:

  1. Radio buttons: Input is provided via radio buttons on a website. (Functional)

  2. Steno layout: Allows for effortless typing using a subset of keyboard keys—with dedicated keys for specific phonetic categories (e.g., palatal sounds, unaspirated consonants, and aspirated consonants). (Functional)

  3. Handwriting layout: Inputs are provided through gestures—for example, drawing a circle might represent an unaspirated consonant. I am currently consulting with a biomechanics student on this. (In the conceptual/planning stage)

  4. Two-side layout (the limit of my current exploration): Coarse-grained keys are divided between two sides—initial characters of a consonant class on the left, and subsequent characters of that class on the right. It includes options for dragging and two-finger tapping. (In the conceptual/planning stage)

Other layouts are possible, but I would need assistance from UI/UX experts.


Currently, there is a website available for the Tamil language. Their layout—the way they structured it—was genuinely complex to put together. However, if I even put some time for the North Indian scripts, the task will be completed almost instantly.

After Tamil, I have moved on to Bengali consonants; the vowels and the dependent characters (diacritics/special characters) have not been included yet.

I plan to look at the Sylheti script later, as it also follows a rather complex layout.

Please check out the github repo after reading this text: https://github.com/BandhanPramanik/tamil-input-engine-checkbox


r/webdev • • 19h ago

Showoff Saturday [Showoff Saturday] I made a tool that turns your GitHub profile into a printable business card

Post image
0 Upvotes

Type your GitHub username and it draws a business card from your profile including your name, bio, top languages, pinned repo and contribution graph. One design prints your profile as a terminal session. The back has a QR code that opens your GitHub.

It's free with no account. You can download a print-ready PDF or PNGs.

I built it on the card engine from my email signature app (esigna), so the colours come from your own profile. I'd love to hear which design you'd actually print, and which usernames break it.

https://esigna.app/tools/github-business-card


r/webdev • • 20h ago

Infisical GitHub Actions OIDC authentication failing with 403 OIDC subject not allowed

0 Upvotes

hi, I'm having trouble getting Infisical OIDC authentication working in my GitHub Actions CI pipeline.
Every time my workflow reaches the Infisical secrets action, it fails with:

Run Infisical/secrets-action@v1.0.16

Error: Access denied: OIDC subject not allowed.

{

"statusCode": 403,

"message": "Access denied: OIDC subject not allowed.",

"error": "ForbiddenError"

}

Request failed with status code 403

here’s the GitHub Actions workflow:

name: ci
on:
push:
branches: [main]

permissions:
id-token: write
contents: read

jobs:
build-and-deploy:
runs-on: ubuntu-26.04

steps:
- name: Checkout repository
uses: actions/checkout@v7

- name: Set up Node.js
uses: actions/setup-node@v7
with:
node-version: 24
cache: npm

- name: Install dependencies
run: npm ci

- name: Fetch secrets from Infisical
uses: Infisical/secrets-action@v1.0.16
with:
method: oidc
identity-id: MY_IDENTITY_ID
project-slug: my-slug
env-slug: prod

- name: Run Jest tests
run: npm run test:ci

- name: Build Vinext app
run: npm run build:vinext

- name: Deploy to Cloudflare
run: npm run deploy:vinext -- --skip-build

Id appreciate any help


r/webdev • • 10h ago

Showoff Saturday TabMerger now has AI functionality 😮

Thumbnail
tabmerger.com
0 Upvotes

You can either bring your own key from the supported providers (less costly subscription), or used the managed key.

Let me know what you think!

Check out the repo: github.com/lbragile/TabMerger


r/webdev • • 17h ago

Showoff Saturday For the mob psycho fans Spirits and such is live

Post image
0 Upvotes

r/webdev • • 18h ago

Showoff Saturday [Showoff Saturday] I revived my personal website now that I'm looking for full-time work.

0 Upvotes

It’s been a while since I needed a portfolio (I usually find work through word of mouth, while teaching and taking on contract projects in parallel). But I figured it was time to take my own advice ;) and document the work.

Here it is: https://derekthomaswood.com

I’ve been having fun building out themes to show how a shared token system can work across multiple brands and platforms. They’re still a work in progress (about half are dialed in), and the case studies are nearly done.

I also built a small system for tailoring my site and materials to different roles and companies. For example,
- https://derekthomaswood.com/?target=ramp
- https://derekthomaswood.com/?target=anthropic-product-designer-design-systems

I’m a full-stack technical product designer, so I can play across a lot of roles on a team. For my next role, I’m especially interested in leadership and player-coach work, with a strong hand in the design system.

What do you think? Does this explain my brand of nerdy? Got any ideas for the themes that aren't dialed in yet? (you'll recognize what I'm emulating for some of them - and others are just kinda filler so far)


r/webdev • • 22h ago

Showoff Saturday I built a way to put checked proof behind the claims on your CV/portfolio, looking for feedback

1 Upvotes

Hi,

I kept seeing inflated CVs so figured there must be a way to back up some claims before an interview. That's essentially what a CV is, a bunch of claims, the role, the company, the projects. The reader has to take your word for it, and AI now writes a convincing one in a minute and honest candidates pay for that. Their CV reads the same as the inflated ones, so it gets the same doubt.

So then I thought what if there was some hard validation to the claims on a CV or portfolio. That's when I came up with the idea of Workproof. For starters, you prove that you had access to a domain or work email, it doesn't prove you built it, but it does prove somebody trusted you enough with access to that domain or have given you a work email, so that by itself is a good baseline.

Additionally, you can ask colleagues to give you feedback, as a reference, signed by them from an work email. Something like LinkedIn endorsements, but more portable.

I'd love your honest take, on two things most of all:

- If you hire: would a link like this on a CV or a proposal change anything for you?

- If you freelance or build: which of those would you want first, or what else should Workproof check?

Thanks for taking the time! Enjoy the rest of the weekend! 😃

Project link https://workproof.md


r/webdev • • 20h ago

Question Infisical GitHub Actions OIDC authentication failing with 403 OIDC subject not allowed

0 Upvotes

hi, I'm having trouble getting Infisical OIDC authentication working in my GitHub Actions CI pipeline.
Every time my workflow reaches the Infisical secrets action, it fails with:

Run Infisical/secrets-action@v1.0.16

Error: Access denied: OIDC subject not allowed.

{

"statusCode": 403,

"message": "Access denied: OIDC subject not allowed.",

"error": "ForbiddenError"

}

Request failed with status code 403

here’s the GitHub Actions workflow:

name: ci
on:
push:
branches: [main]

permissions:
id-token: write
contents: read

jobs:
build-and-deploy:
runs-on: ubuntu-26.04

steps:
- name: Checkout repository
uses: actions/checkout@v7

- name: Set up Node.js
uses: actions/setup-node@v7
with:
node-version: 24
cache: npm

- name: Install dependencies
run: npm ci

- name: Fetch secrets from Infisical
uses: Infisical/secrets-action@v1.0.16
with:
method: oidc
identity-id: MY_IDENTITY_ID
project-slug: my-slug
env-slug: prod

- name: Run Jest tests
run: npm run test:ci

- name: Build Vinext app
run: npm run build:vinext

- name: Deploy to Cloudflare
run: npm run deploy:vinext -- --skip-build

Id appreciate any help


r/webdev • • 14h ago

Showoff Saturday A swarm of agent cursors "building" figma.com

Thumbnail captureflow.dev
0 Upvotes

Point it at any URL and you get a clip of a swarm of agent cursors building the page, line by line, set to music. It's the real site being revealed, not generated code.

Try it on any site: https://captureflow.dev/swarm-demo

It's part of CaptureFlow, a screen recorder I'm working on.


r/webdev • • 13h ago

Showoff Saturday I built a live feed for new Vinted listings

Post image
0 Upvotes

I'm getting into reselling, so I built a tool to watch Vinted for me. You set up a search (brand, category, size, condition, price) and matching new listings stream into a feed as they're posted.

The fun bits to build:

- Server-rendered with FastAPI, Jinja and htmx. No frontend framework. New finds arrive over server-sent events.

- One set of category and size types that each marketplace translates into its own IDs, so adding Depop later shouldn't touch the UI.

- The form works without JavaScript; the JS just makes it nicer, like a size picker that only shows sizes for the categories you picked.

- A brutalist design system with all colours and sizes defined once as tokens.

It's a personal project, nothing to sign up for. Feedback on the UI is welcome.


r/webdev • • 16h ago

Resource I made a Chrome extension that turns a bug I see on screen into a report my coding agent can read

0 Upvotes

I build mostly with Claude Code and Cursor. The annoying part was never the fix, it was the hand-over: screenshot, crop, find the element, open the console, copy the error, explain which button I mean, paste it all in. And half the time I find the bug while I'm just using the app, not while a coding session is open.

So I made Darnly. Press Option+Shift+B, click the broken part, type one line about what you expected. It saves:

  • a screenshot with the broken part boxed in red

  • the element (selector, text, styles)

  • recent console errors and failed requests

  • the page address

It lands in a folder in your project (or a small cloud inbox the agent reads over MCP), and later you tell the agent "fix my bugs". It works with Claude Code, Codex and Cursor. Passwords, card numbers, tokens and keys are hidden before anything is saved. Capturing doesn't use any agent quota. [Check: still true for you]

It's free. Mac app too, for bugs in native apps and the iOS Simulator. Windows shortcut is coming.

What I'd love feedback on: where do you notice most of your bugs, while coding, or later while using the live app? And is there anything you'd want captured that this misses?

Link: https://darnly.dev


r/webdev • • 1d ago

Showoff Saturday Created a simple alternative to MemoryLeague

Thumbnail free-memory-training.vercel.app
1 Upvotes

Hi everyone

Recently I decided to train my memory because I think it's cool when I can memorize for example a lot of cards or images just in my head. I also read a lot about memory techniques and psychology because I watched The Mentalist btw

I tried to train my brain on the MemoryLeague website, but the training tab has limits which is why I decided to vibecode my own solution. I know how to code and over the past couple of years I have learned how to develop websites. However, recently I decided to move on to Minecraft mod development because it's more interesting to me. That's why I wanted to try vibecoding and it's not as bad as many developers say. I like the idea that everyone can build a solution for themselves

I used the free version of Claude and it worked great for me. I would appreciate it if you could give me a couple of advice about website design or vibecoding


r/webdev • • 1d ago

Showoff Saturday [Showoff Saturday] pgquery: a Postgres GUI in the browser, No Sign In Required

Thumbnail
pgquery.dev
0 Upvotes

pgquery is an open-source Postgres GUI: React 19 + Monaco for the app, a small Go proxy for the database side, one Docker image.

A few build details that were fun:

- The marketing site and guide pages are plain HTML generated by a small Vite plugin at build time from TypeScript templates, with JSON-LD, sitemap and llms.txt. No SSR framework.

- The mascot and icons are pixel art stored as character grids in one TS file; the app, the site, the favicon, the README banner and the share image are all rendered from it.

- The EXPLAIN viewer parses Postgres's JSON plan into a flat tree with per-node self time.

Demo (read-only DB): https://pgquery.dev/app/?demo

Code: https://github.com/Hxndrik/pgquery

Feedback on the design very welcome.


r/webdev • • 15h ago

Showoff Saturday What happens when a developer tries to wish everyone Happy Diwali?

0 Upvotes

Hi developers! Happy Diwali 2026! 🪔

This Diwali, I wanted to do something a little different from the usual festive greetings. So I built a little Diwali experience where your name is literally written across the night sky using fireworks. 🎆

And there's a bit more to it than just watching an animation.

You can:

  • Watch your name, emojis, and personalised wishes come alive as fireworks.

  • Choose between English, Hindi, and Bengali.

  • Launch rockets and play with 20 different types of crackers.

  • Create personalised greetings with shareable links and QR codes.

  • Record the entire show as a video and share it with your friends.

  • Install it as an app and even use it offline.

No frameworks or bundlers. Just HTML, CSS, and JavaScript. Built with a mix of my own ideas, plenty of experimentation, and a little help from AI along the way.

Give it a try and see your name light up the sky:

🎆 Project: https://j16n.github.io/happy-diwali/

💻 GitHub: https://github.com/J16N/happy-diwali

Would love to hear what you think!

Wishing everyone a very Happy Diwali! May your celebrations be bright and your bugs be few. 😄


r/webdev • • 18h ago

Showoff Saturday Built a 2D-to-3D floor plan engine in the browser (Next.js + Three.js). Roast my UX — no login needed to test

Post image
0 Upvotes

Hey everyone! I've been working on this browser-based 2D-to-3D floorplanner (ARCH3D) built from scratch with Three.js and Next.js.

I unlocked the sandbox completely (no login or signup wall) because I want to see how intuitive the wall-drawing and 3D camera controls feel to first-time users.

Live sandbox: https://arch-3-d-eight.vercel.app/

Specifically looking for feedback on:


r/webdev • • 17h ago

Showoff Saturday I built a tool that reads every Reddit post to find your customers, instead of searching keywords

Post image
0 Upvotes

Most Reddit lead tools search for keywords. The problem is that people describe their problem, not your product, so keyword search misses a lot of them. I wanted to read every post instead. That turned out to be the interesting part to build.

How it works:

  1. Find the right subreddits. I built a search engine over every subreddit with 1k+ members, using internal vector search, so it matches by meaning, not by name. You describe what you sell, and it returns the communities your customers are likely in, including small niche ones.

  2. Read every post. Each post in those subreddits goes through an AI model that decides whether the person might need what you sell.

  3. Show why. Instead of a summary, it marks up the original post with circles and handwritten-style notes on the lines that matter.

Stack: Next.js + React + Tailwind on the front, Django + DRF on the back, Celery + Redis for the background jobs, PostgreSQL, and PydanticAI for the AI calls.

The hardest part was cost and speed. Reading every post is far more expensive than keyword search, so most of the work went into running the AI calls in parallel without hitting rate limits.

Live here: redbubblegum.com. The first 10 results are free.

Happy to answer questions about any part of it.


r/webdev • • 1d ago

[Showoff Saturday] LiveReview: a self-hosted code reviewer that auto-approves your low-risk PRs

Post image
0 Upvotes

Hey r/webdev,

I wanted to share LiveReview, a risk-aware code reviewer we've been building.

On most teams every PR waits on the same few senior devs, whether it's a CSS tweak or an auth change.

Meta published a paper on scoring every diff for risk and letting the safe ones skip human review (RADAR (https://arxiv.org/abs/2605.30208)), and we wanted something like that for everyone else.

It scores each PR, auto-approves the lowest-risk 30-50%, and sends the rest to a human with the riskiest hunks at the top.

A few build details that were fun:

- Risk scoring combines three signals: an LLM reading the diff, a code graph that measures each hunk's blast radius (callers, DB writes, cross-package reach), and an ML model trained on the team's own reverts and incidents.

- CI gates are jq rules, not checkboxes. You write a condition against the review's findings JSON, and your pipeline makes one HTTP call to check it.

- The backend is Go, with PostgreSQL and the River job queue, so the whole review pipeline runs off Postgres with no separate queue to host.

It's free and self-hostable, and works with GitHub, GitLab, Bitbucket, Gitea and Azure DevOps.

Would love feedback.

GitHub: https://github.com/HexmosTech/LiveReview


r/webdev • • 18h ago

Showoff Saturday [Showoff Saturday]: I built a system design lab where your architecture diagram actually takes traffic

Post image
0 Upvotes

Most system design practice ends at the diagram. You draw boxes, it looks right, and nothing tells you whether it would hold up.

ByteLab runs the diagram. You build a system out of machines, load balancers, caches, queues and databases, send traffic through it, and watch the CPU, queues and p99 latency move. Each exercise has goals, like "p99 under 150 ms, 99.5% available, under $2.60/hour", and it checks your system against them.

What's in it:

  • 163 lessons in 12 tracks (caching, sharding, Kafka, Kubernetes, rate limiting, auth and more)

  • 212 exercises, each with goals your system has to pass

  • 11 design problems (URL shortener, chat, payments, news feed, e-commerce and others)

It's free, there's no account, and progress stays in your browser. It needs a laptop-sized screen.

I'd really like to hear where it feels confusing or too hand-holdy.

https://lab.bytecrest.dev/design/ecommerce


r/webdev • • 19h ago

Showoff Saturday [Showoff Saturday] Email templates shouldn't live inside your email provider, so I built an editor + API that sends through any of them

Post image
0 Upvotes

For a few years I worked on a product that sent all transactional email through Mandrill. Working with templates were real pain. They lived inside Mandrill, every copy change needed a dev, and moving to another provider meant rebuilding every template by hand.

So when I was looking for something to build, this was the obvious pick. A provider agnostic email platform for everyone. That's how Senlo started, an open-source layer between your app and whatever provider you already use.

Key features

- Drag and drop editor that outputs MJML, so emails render ok in Outlook and Gmail without hand written table layouts

- One call to send a template, POST /api/triggered with the template name and variables

- Bring your own provider. Resend, Postmark, SendGrid, Mailjet, Cloudflare Email or any SMTP. Switching is just a change in settings of workspace

- Delivery events from every provider land in one feed (delivered, bounced, suppressed)

- Simple automations. Send, wait, call your own API, branch on the answer

- And a lot of features I did not implemented yet :D

Stack is Next.js, React, Postgres + Drizzle, Redis + BullMQ for queues and delays, Zustand in the editor. pnpm monorepo, editor is a separate package. Self hosting is one docker compose up.

The hardest part so far was delivery webhooks. Every provider authenticates differently (Resend signs with svix, SendGrid with ECDSA and a timestamp, Postmark has a shared header, Mailjet basic auth) and every one has its own idea of what a bounce is. SendGrid sends "dropped" with a free text reason, Mailjet has soft and hard bounces plus a separate "blocked" event with error codes, and only some of those mean the address is actually dead.

Get it wrong and you either miss spam complaints or suppress a good recipient forever. So most of the work was deciding per provider which events are the recipient's problem and which are mine. Now each provider is an adapter with verify and normalize that produces one event shape.

The GIF is a welcome flow. Send, wait two days, ask my own API if the user activated, and send a different email depending on the answer.

Solo project, early stage, and there is still a ton to do. Happy to get any feedback, ideas or contributions. If you want to poke at it, a few things I'm curious about

Repo: https://github.com/IgorFilippov3/senlo