Status
Live · Real-time
Version1.0.0
Engineering Blog

Thoughts,
Stories & Ideas

A space where I share my journey in web development, life, and everything in between.

Tech Stack
frameworkNext.js 15
languageTypeScript
databaseConvex
authBetter Auth
uishadcn/ui
stylingTailwind CSS v4
Latest Writings
Deep Dive
01

Architecture

Built on Next.js 15 App Router with a clean shared-layout pattern, the blog separates public routes from authenticated flows without a gateway page. Server Components handle the heavy lifting; Suspense boundaries keep the shell fast. Convex powers the real-time backend — every query is a live subscription, not a REST poll, meaning the blog feed updates atomically across sessions without a single WebSocket hand-roll.

02

Data Flow

Convex mutations are transactional by design. Create, publish, and delete operations run inside Convex functions that validate schema at the edge before any write hits the database. Better Auth issues session tokens that are forwarded to Convex via the ConvexClientProvider, giving every query a verified identity context — the same token that authenticates the API also scopes which posts a user can mutate.

03

Assets & Search

Images are stored as Convex file references with generated public URLs — no S3 configuration, no signed URL rotation. Full-text search uses a Convex search index with a 'simple' dictionary that handles Amharic/Ge'ez lexical boundaries gracefully. The search component debounces against the Convex reactive query, yielding sub-50ms TTFR on local cache hits.

Engineering Decisions
#DecisionRationale
01Convex over Supabase

Convex's reactive query model eliminates polling entirely. Every feed update is pushed, not pulled. The schema-first approach also means TypeScript types are auto-generated from the database definition — one source of truth from DB to UI.

02Better Auth over NextAuth.js

Better Auth ships with native Convex integration, meaning session tokens are already in the Convex identity context without adapter boilerplate. It also supports Passkey auth out of the box for future additions.

03App Router + Server Components

Zero client-side data fetching on the blog listing page. HTML is streamed from the server with posts already embedded — no loading spinners, no layout shift. Client components are islands, surgically opted in only where interactivity is required.

Author
About the Author

Abdisa Ketema

Full-stack engineer building accessible, useful, and performant web experiences. Obsessed with clean architecture, reactive systems, and the craft of writing software that lasts.

Portfolio

Quick Stats

FrameworkNext.js 15
BackendConvex
AuthBetter Auth
LanguageTypeScript

Site

NextProBlog

Stack

Next.js · Convex · Better Auth

Status

Operational

© 2026 NextProBlog. All rights reserved.