Back to projects

Case Study

Hivehub

An open publishing platform where thoughtful writing finds its audience.

RoleFrontend Developer
Stack
TypescriptChakra UIFirebaseTiptap Rich EditorFramer MotionVite
Hivehub screenshot

The Problem

Medium's paywalled model increasingly buries free content. Hivehub was built as an alternative — a platform where writers publish openly and readers discover through genuine curation, not algorithms optimised for engagement.

Key Technical Decisions

1

Chose Tiptap over Quill for the editor because Tiptap's extension API let us build a custom slash-command menu for inserting code blocks, images, and dividers — the kind of writing tools technical writers actually need.

2

Used Firebase Realtime Database (not Firestore) for the feed and follow counts, these are high-read, low-write operations where real-time sync added genuine UX value (follow counts update live).

3

Used Framer Motion for page transitions and article reveal animations — the reading experience needed to feel deliberate, not snappy.

Hivehub screenshot

Challenges & Solutions

Challenge

Tiptap's default output is a JSON document tree, but displaying it required a custom renderer that respected the styling conventions of the platform.

Solution

Built a recursive `TiptapRenderer` component that walked the JSON node tree and mapped each node type to a styled React component.

Challenge

The feed needed to show posts from followed users only, which Firestore's query model doesn't support natively (no JOIN equivalent).

Solution

Stored followed user IDs in an array and used Firestore's `in` operator with batched queries — limited to 10 per batch, merged and sorted client-side.

Hivehub screenshot

Outcome

Delivered a fully working publishing platform with rich editing, user feeds, and real-time interactions. The Tiptap renderer in particular became a reusable pattern I've used in later projects.

What I Learned

Firestore's query limitations force you to think carefully about your data model upfront. Denormalising early (storing author info on each post) saved me from painful migrations later.