Skip to content
ALGOLOGIX

Product & platform

Backend & APIs

Typed, observable services with contracts your clients can rely on. Boring in the way infrastructure should be boring — which mostly means the failure modes were thought about before they happened.

  • FastAPI
  • Node
  • Go
  • GraphQL
  • WebSockets
  • Event-driven
  • Queues & workers

What we build

Typed HTTP APIs
A generated, versioned contract that clients build against without guessing.
Streaming endpoints
Server-sent events or WebSockets where tokens or updates arrive as they happen.
Event-driven services
Queues, workers and idempotent consumers, sized for your real traffic shape.
Integration layers
The adapters between your systems and everyone else's, with retries and backoff.
Observability baseline
Traces, structured logs, metrics and alerts, wired before the first deployment.

Problems this solves

  • Problem
    A dependency has a bad minute and the whole product goes down with it.
    Approach
    Timeouts, retries with backoff, circuit breaking and a defined degraded mode for every external call.
    Outcome
    A slow dependency degrades one feature instead of taking the service with it.
  • Problem
    The same job runs twice and something is charged twice.
    Approach
    Idempotency keys, exactly-once semantics at the boundary that matters, and consumers written to be safely replayed.
    Outcome
    Retries stop being dangerous, which is what makes the queue useful.
  • Problem
    When something is wrong, nobody can say where.
    Approach
    Distributed tracing across every hop with structured logs correlated by request, from the first sprint.
    Outcome
    An incident becomes a query rather than a guess.

How we approach it

  1. Discover

    We start from the contract your clients need and the load they will put on it. Throughput, payload shape and failure behaviour are far cheaper to agree now than once something depends on them.

  2. Design

    The API is designed as a contract — typed, versioned and specific about what happens when it fails. Idempotency and retries are decided here, not added after the first duplicate charge.

  3. Engineer

    Types are generated from one schema, so client and server cannot disagree. Instrumented as it is built, so the traces already exist the first time something is slow.

  4. Evaluate & harden

    Load tested to the number agreed in Discover and then past it, so you know the shape of the failure rather than only the ceiling. Auth and dependency review before anything is exposed.

  5. Launch & operate

    Dashboards and alerts that point at a cause rather than a symptom, each with a runbook. Deploys are boring, which is the whole objective.

What we build it with

A typed streaming endpoint that stops generating the moment the caller disconnects — the cheapest performance work there is.

api/ask.py
"""A typed streaming endpoint that stops when the client does."""

from fastapi import FastAPI, Request
from pydantic import BaseModel
from sse_starlette.sse import EventSourceResponse

app = FastAPI()


class Ask(BaseModel):
    question: str
    conversation_id: str | None = None


@app.post("/v1/ask")
async def ask(body: Ask, request: Request):
    async def events():
        async for token in answer(body.question):
            # The caller hung up. Stop paying for the rest of it.
            if await request.is_disconnected():
                break
            yield {"event": "token", "data": token}

        yield {"event": "done", "data": "[DONE]"}

    return EventSourceResponse(events())

Backend & APIs

  • FastAPI
  • Node.js
  • Go — Fiber, Chi
  • GraphQL — Strawberry, Apollo
  • WebSockets
  • Server-Sent Events
  • Kafka

Databases

  • PostgreSQL

Observability & evaluation

  • OpenTelemetry
The full inventory

Related work

  • Retail · 2026

    Turning supplier documents into records

    A document-extraction pipeline for a retail group, classifying and extracting structured records from supplier invoices and delivery notes arriving in every format a supplier felt like using.

    Documents extracted without human review
    • generative ai
    • data engineering analytics
    • backend apis
    Read turning supplier documents into records
  • Logistics · 2026

    A voice agent that handles the overnight queue

    An inbound voice agent for a freight operator, handling status enquiries and booking amendments outside staffed hours, with a clean handover into the morning queue.

    Overnight calls handled without a person
    • conversational voice ai
    • agentic ai
    • backend apis
    Read a voice agent that handles the overnight queue

Questions we get asked

Which language do you build services in?

Python with FastAPI when the work sits close to models or data, TypeScript when it sits close to the product, Go when a hot path justifies it. The deciding factor is usually which one your team can maintain, not which one is fastest on a benchmark.

REST or GraphQL?

REST for service-to-service and anything cacheable; GraphQL when a client genuinely needs to compose its own queries across many resources. Both get a typed, generated contract — the mistake is picking either one as a default without asking who is calling it.

Can you work with our existing services?

Yes. Most of this work is integration rather than greenfield. We map the current call graph and failure modes first, and we are explicit about what we are changing and what we are leaving alone.

How do you handle scale?

By measuring first. We load test against your real traffic shape, find the actual bottleneck — usually the database or a synchronous external call — and fix that, rather than scaling everything horizontally and paying for it forever.

Tell us what you are trying to ship.

A first call is 30 minutes and costs nothing. Bring the problem rather than a spec — the useful part is usually working out whether this is the right shape of solution at all.