Insights

Engineering Notes

Technical notes, updates, and essays from the team.

Hello from Agbey Tech

10 January 2025 — Agbey Team

Welcome

This is the first post in the Agbey Tech engineering blog. We're a software engineering studio based in Accra, Ghana — building digital products and infrastructure for clients across Africa and beyond.

"The best software is invisible to its users. They simply get things done."

We created this blog to share what we learn: hard-won lessons from production incidents, architecture trade-offs we've wrestled with, and opinions about how to build for the long term.


What You'll Find Here

We'll write about all layers of the stack. Here's a rough idea of the categories:

  • Engineering deep-dives — detailed explorations of a technical decision, pattern, or tool
  • Case studies — anonymised breakdowns of client projects: what the problem was, what we built, and what we'd do differently
  • Principles & craft — our views on software design, team process, and code quality
  • Tooling & infrastructure — reviews and guides for the tools we use day-to-day

Our Stack in 2025

Here's what we're currently shipping with:

Layer Technology
Frontend Next.js 15 (App Router), React 19, Tailwind CSS v4
Backend Node.js, Prisma ORM, PostgreSQL
Queues BullMQ on Redis
Infra Vercel (frontend), Railway / Render (API)
Monitoring OpenTelemetry, Datadog

A Small Code Sample

Every engineering blog needs a code sample in the first post. Here's our preferred way to create a typed, validated API route in Next.js:

import { z } from "zod";
import { NextRequest, NextResponse } from "next/server";

const schema = z.object({
  email: z.string().email(),
  name: z.string().min(2),
});

export async function POST(req: NextRequest) {
  const body = await req.json();
  const parsed = schema.safeParse(body);

  if (!parsed.success) {
    return NextResponse.json(
      { error: parsed.error.flatten() },
      { status: 400 },
    );
  }

  // ... do work
  return NextResponse.json({ success: true });
}

Input validation at the boundary, typed response, no magic — this is how every route in our apps starts.


Stay in Touch

If you have questions, feedback, or want to work together, the contact page is the best place to start.

Get in touch →