Technologies
The stack we build with, and the parts of it we built ourselves.
Languages
Python
3.14The default language for ForkTex backends, standardised on 3.14 across the ecosystem.
TypeScript
5Every web and mobile surface, in strict mode, with API types generated rather than written.
C#
Fiscal-device integration, where the vendor relay is a .NET service.
Java
Used for JVM-based delivery where a client stack required it.
Bash
Entrypoints and operational scripts, kept thin enough to read at a glance.
SQL
Schema and query work, written through an ORM rather than assembled as strings.
Runtimes
Docker
The unit of deployment everywhere — the same image runs locally and in production.
Node.js
24 / 20 LTSBuild and server runtime for every TypeScript surface.
iOS / Android
Mobile targets reached from one codebase, alongside a web build.
Ubuntu
24.04 LTSThe provisioning target for managed servers, pinned to an LTS release.
Frameworks
FastAPI
The API framework behind every ForkTex service, async from the route down to the driver.
React
19The component model shared by every web and mobile client.
Next.js
16App Router, server rendering by default, for public sites and operator consoles alike.
Expo
One codebase reaching iOS, Android, and web without three separate builds.
React Native
Native mobile clients sharing types and API layer with the web.
Angular
Long-run maintenance and feature work on an existing operator frontend.
NestJS
Maintained and extended on an inherited Node backend.
Spring
JVM service framework, used where a client stack was already committed to it.
Libraries
Pydantic
v2Validation and serialisation at every boundary — the wire shape is a declared type.
pytest
The test runner in every Python repository, async mode on by default.
Ruff
Formatting and linting, identical locally and in CI, as one gate atom.
SQLAlchemy
2.x asyncThe data-access layer everywhere, async, with no hand-assembled SQL strings.
Alembic
Schema migrations, applied on startup so an environment cannot drift behind the code.
Redux Toolkit
Client state, paired with generated API bindings rather than hand-written fetches.
RTK Query
Typed data fetching generated from the API schema — see the codegen practice.
Tailwind CSS
4Styling for every web surface, themed through CSS custom properties.
Jinja2
Template rendering for documents and transactional email.
React Hook Form
Form state and validation without re-rendering a page on every keystroke.
WeasyPrint
HTML to PDF for issued documents — invoices, reports, certificates.
Zod
Runtime schema validation on the client, matched to the server contract.
Playwright
Browser automation for data acquisition and full-stack verification.
Data Stores
PostgreSQL
17 / 16The default database, and often the queue and the scheduler too.
MinIO
S3-compatible object storage, self-hosted, for documents and uploads.
Redis
7Caching and task brokering where a round trip needs to disappear.
Qdrant
Self-hosted vector search behind retrieval pipelines — no managed dependency.
MySQL
Operated and tuned on an inherited production system.
MongoDB
Document storage, reached through the substrate facade where a case calls for it.
Queues & Workflows
Infrastructure
Terraform
Declarative cloud infrastructure on client estates already standardised on it.
Ansible
Provisioning and release automation for managed servers.
HAProxy
Slot routing that makes a blue-green cutover a proxy change, not a restart.
Nginx
Edge termination and static serving, generated rather than hand-configured.
Cloud Providers
ForkTex Cloud
Our own deployment platform: a manifest becomes a running, TLS-terminated system.
AWS
Delivered into client AWS estates, managed as code rather than by console.
Microsoft Azure
Functions, AI Search, Service Bus and storage on client-mandated Azure estates.
Cloudflare
DNS and edge protection, and the challenge path for automatic certificates.
Hetzner
European compute underneath ForkTex Cloud, with data staying in the EU.
AI & Retrieval
Model Context Protocol
Existing APIs projected as agent-callable tools, without a second implementation.
OpenAI
GPT models, used interchangeably with other providers behind one capability layer.
Retrieval-Augmented Generation
Grounded answers over a document set, where retrieval quality is the real bottleneck.
Vector Search
Embedding-based retrieval, self-hosted, with reranking over raw similarity.
Anthropic
Claude models behind reasoning, extraction and structured-output workloads.
Multi-Modal Extraction
Structured records pulled from PDFs, images and spreadsheets under a declared schema.
Engineering Practices
OpenAPI Code Generation
One schema generates every client. No hand-written wire model is allowed to drift.
Blue-Green Deployment
A new version proves itself healthy before traffic moves, and rollback is a route change.
Testcontainers
Tests run against real PostgreSQL and Redis, because a mock encodes what we believe.
Drift Checking
Generated artefacts are regenerated and byte-diffed in CI, so a hand edit fails loudly.
Keyset Pagination
Pagination that stays constant-time at page 500 instead of reading and discarding rows.
ForkTex Libraries
Built by ForkTexForkTex Substrate
0.11The shared Python library every service composes: four primitives and eight facades.
ForkTex Documents
Structured data to canonical model to block tree to PDF. A document is a view, never a source.
ForkTex Scraping
Acquire public data, and be able to prove afterwards exactly what was acquired.
ForkTex Grid
Tables, columns and relations declared at runtime rather than at deploy time.
ForkTex Knowledge
Documentation as typed JSON, rendered to markdown, retrievable within a token budget.
ForkTex Archetypes
Built by ForkTexForkTex Standards
Built by ForkTexThe One-Command Gate
One command decides whether a change is done, and CI runs exactly that command.
ForkTex Standard of Delivery
Checkable atoms gathered into levels, so delivery maturity is measured rather than claimed.
The Error Envelope
An error carries a code, not a status — the transport decides what a code means.
The Wire Contract
camelCase on the wire, snake_case in Python, with no hand-written translation layer.
UTC Timestamps
One module decides how a moment becomes text: always UTC, always the same shape.
UUIDv7 Identifiers
Time-ordered identifiers, never truncated — a slice is a collision, not a shortening.