Pinned Tweet
Your inbox shouldn't be the main event of your day.
I'm building Stamp, a desktop email app with a simple goal: get through your inbox and get on with your day.
Follow the build: @getstampemail
Join the waitlist → getstamp.email/
Prepit's problem exists even when the app is closed: supplies expire. That's why I think about the return visit, not just onboarding. Can someone identify what needs replacing when they come back months later?
Stamp's reply transition is 200 ms in the development build. But keyboard switching and reduced motion need an immediate path too. Animation should help explain where the writing surface moved, not get between you and your reply.
For Stamp's reply layout, the checks included light and dark themes, keyboard use and reduced motion. A feature isn't only its default mouse interaction. Try the same task with a different input method before calling it finished.
I’m building Stamp, a desktop email app.
You’ll be able to try it soon. Join the waitlist at getstamp.email/
Stamp's side-by-side view has adjustable widths. That lets reading-heavy and writing-heavy replies use the same layout without forcing a fixed 50/50 split. Start with a sensible default, then let the person adjust the balance.
Before removing an old server after a migration, check DNS caches. In my Hetzner move, some resolvers still returned the old address after the new server was ready. 'DNS updated' and 'everyone reaches the new server' are different milestones. #Laravel
The reason for Stamp's split reply view came from a small frustration: scrolling up to reread the email while composing. The solution wasn't another AI feature. It was keeping the original message next to the reply.
The Stamp demo I want to make is one complete task: open a long email, switch to side-by-side reply, write while checking the original. That shows what the feature changes better than a tour of every button.
I sold a SaaS for $50K+ in 2024 after three months of evening work. That's a sale, not monthly revenue. When sharing a build, label the number: revenue, profit, sale proceeds or recurring revenue. They answer different questions.
A concrete empty-state check for Stamp: distinguish an empty inbox from a failed load. The same blank panel can mean 'you're done' or 'something broke'. The next action should make the difference clear.
For an email app, 'loading' hides several different states. Is the inbox loading, is one message opening, or is sending in progress? My UI review question for Stamp: can the person tell which action they're waiting for?
The $228/year I saved is the Forge subscription saving. It isn't a claim that hosting is free. When comparing setups, separate server costs from management tools, then include the work you'll maintain yourself. #Laravel
A Laravel migration doesn't end at the web server. On Hetzner, I also checked Horizon, workers and the scheduler. Supervisor handles process restarts. If requests work but queued work stops, the product is still broken. #Laravel
A beta feedback request I'd use for Stamp: 'Reply to a long email. Where did you lose your place?' That gives someone a task and gives me a moment to inspect. 'Any feedback?' leaves them to design the test.
Stamp update: the development build lets you read a message beside your reply. You can adjust the column widths. The point is simple: keep the question visible while answering it. No launch claim, just a concrete piece of the build.
When asking an agent to change Stamp's reply layout, the boundary matters: move the reading and writing surfaces, preserve the draft, don't change sending behavior. A specific boundary makes the result much easier to review.
Prepit helps track emergency supplies and expiry dates. A useful test isn't just adding an item: add a near-expiry item, check its date, then check the reminder. The value arrives after the initial setup.
Stamp is a desktop email app. One of the less glamorous jobs is making someone else's HTML comfortable to read. A message can load successfully and still have unreadable text. That's why rendering needs a visual check too.
After moving a Laravel app to Hetzner, I checked the database from the app itself. A healthy database service isn't enough: the deployed app must connect, read and write using its actual configuration. #Laravel
