{"repo":"JastinXyz/fana","free":true,"listed":false,"github":"https://github.com/JastinXyz/fana","clone":"git clone https://github.com/JastinXyz/fana.git","description":"Self-hostable disposable email with an API your tests can actually use: private inboxes, wait-for-mail, OTP extraction, webhooks.","language":"TypeScript","stars":15,"topics":["disposable-email","docker","drizzle-orm","email-testing","hono","nextjs","otp","postgres","redis","self-hosted"],"license":"MIT","category":"databases-storage","readme_excerpt":"📨 fana Self-hostable disposable email — with an API your tests can actually use. --- Give out a throwaway address, watch mail arrive live, let it vanish on a timer. Then do the same thing from a test suite: create an inbox, trigger the signup, block until the mail lands , and read the one-time code straight out of it. No polling loop, no sleep , no parsing the body yourself. Why this one - Inboxes that are actually private. Mail to an inbox minted through /v1 is stamped with your account at ingestion. It never appears on the website, never reaches the public WebSocket, and answers 404 to anyone else — a guessable address is fine for a throwaway, not for a paying customer's tests. - wait , not poll. One call holds open until a message matches from , subject or since . It costs one request no matter how long it waits. - The code and the link, extracted. Reading a message returns the one-time code and the verification link, ranked by how close each candidate sits to a word naming it — not the first number in the body. - Webhooks for callers that can't hold a connection: signed, retried with backoff, with every attempt and failure readable. - Yours end to end. Your SMTP, your domain, your database. No vendor, and nothing phones home. Quick start - Web → http://localhost:3000 - API → http://localhost:4000/api/health - API reference → http://localhost:3000/docs Send it something without a real MX record, using swaks: Running it for real docs/self-hosting.md is the full walkthrough","default_branch":null,"files":null,"tree":[],"storefront":"/r/JastinXyz","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/JastinXyz/fana/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}