Skip to content

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
github.com/ujen5173/hash
Hash screenshot

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

01

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.

02

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.

03

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.

04

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

01

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.