Open source
Hash
A Hashnode-style blogging platform, and 100+ stars for it
The project where I actually learned full stack. I picked Hashnode because I liked the product and the design, and because rebuilding something good makes you face the same decisions its team faced. Every part of it is mine — schema, architecture, decisions — not a clone tutorial followed to the end. It is archived now and still the repo people find first.
- Role
- Solo — full stack
- Timeline
- 2023
- Status
- Archived
- Stack
- Next.js, T3 Stack, TypeScript, Drizzle ORM, Stripe, Tailwind CSS

01 — Context
The problem
Curiosity, mostly. I wanted to build a full product and I did not know how yet.
I learned more from this one project than from everything before it: how a feed gets ranked, how publications can own their own space, how payments hang together. I chose Hashnode because the product was interesting and, at the time, the design was as good as anything on the web.
02 — Decisions
How I approached it
One set of types, everywhere
Built on the T3 stack, so the database schema, the API and the components all share the same types. Renaming a column breaks the build instead of the site.
Recommendations, kept simple
The feed needed to feel personal, but I had neither the data nor the time for anything clever. So posts are scored with weights — tags you read, people you follow, how recent it is, how well it is doing — and sorted by the result.
Publications, my first go at ownership
Anyone can own a publication with its own look and its own writers. It was the first time I had to think about who owns what and who is allowed to do what, which is the idea WorkForge is now built on.
The README as part of the product
I wrote up the architecture, the schema and how to run it locally. That, more than any single feature, is why people starred it.
03 — Structure
How it fits together
- Interface
Next.js · Rich editor · Drafts saved locally
Edits survive a closed tab; syncing catches up afterwards.
- API
tRPC · T3 Stack · Stripe
One set of types from the schema to the component.
- Data
Drizzle ORM · Follow graph · Cursor pagination
The feed is ranked in the query, one page at a time.
- Community
Architecture README · Documented env · 100+ stars
The write-up was treated as part of the project.
04 — Problem solving
What was actually hard
Problem
I was learning React and Next.js while building the thing I was learning them for. Every feature arrived with a concept I had not met yet.
Solution
Tutorials, blog posts and a lot of trial and error. Slower than being taught, and the parts I got wrong the first time are the ones I still remember.
05 — Result
Where it landed
- GitHub stars
- 100+
- Feed
- Weighted recommendations
- Editor
- Drafts saved locally
- Learning
- More than anything since
What I'd do differently
I would rebuild the foundations. Better pagination, a real recommendation and personalisation system, Redis in front of the slow queries, and publications on their own subdomains instead of paths. I would tighten the security, generate the table of contents automatically, and spend longer on the interface. It was the right project to learn on, and almost none of the decisions in it would survive me making them a second time.