LEVEL 2 · PRODUCT
Local news network infrastructure · anytown.ai
anytown.ai
Shared infrastructure for a network of town newsrooms, with editors signing off on every release.
The problem
Local newsrooms can’t staff every council meeting, game and weather alert. The collection work is automatable; the editorial judgement is not.
What it does
- Automation collects council agendas, weather feeds, league schedules and ad inventory
- Editors review the sources, run facts-and-safety checks, and sign off before publishing
- They own corrections and disclosures — the editorial chain is in the product
Live and public at anytown.ai. Six desks run the network: Politics, Sports, Weather, Broadcast, Advertising, Social.
LEVEL 1 · PRODUCT
Media asset pipeline · ergot.io
ergot.io
A media asset pipeline in three stages — capture in, process in the factory, license out the market — with provenance kept at every step.
The problem
Media piles up on cards and drives with no record of where it came from — and licensing it later means reconstructing that story by hand.
What it does
- Ingest: browser and desktop capture workspaces plus a local-first daemon bring media in with provenance recorded at the door
- Factory: a control-plane dashboard routes assets through processing nodes — local or remote — in staged, repeatable transforms
- Market: licensing, sales and supplier records travel with the asset
01 · Ingest
Capture / media in
Browser and desktop capture workspaces, plus a local-first capture daemon, pull media straight off devices — provenance recorded from the first byte.
02 · Factory
Process + manage
A control-plane dashboard routes assets through processing nodes, local or remote, with staged and repeatable transforms.
03 · Market
License + sell
Licensing, sales and supplier records live with the asset, so the provenance chain ships with the deliverable.
ergot.io is live and taking early-access invites; the same tenant-aware product deploys as a hosted service or self-hosted.
LEVEL G · STUDIO
Independent software studio · EST. 2025
HAPPYVERTICAL
Built from the ground up for humans and agents alike.
Products upstairs: ergot.io, a media asset pipeline in early access, and anytown.ai, a live network of town newsrooms. Open source below: the s-m-r-t framework, and the SDK it stands on.
We run on the stack we ship: anytown.ai's newsrooms run on s-m-r-t — the same open framework, and the same SaaS starter, we hand to everyone else.
will@happyvertical.comLEVEL P1 · FRAMEWORK
Agentic application framework · s-m-r-t.dev
s-m-r-t
Extend one base class and s-m-r-t generates the database schema, REST API, CLI, and MCP tools for your AI agents.
The problem
Wiring an object to a database, an API, a CLI and agent-callable tools is four integrations you maintain by hand. s-m-r-t generates them from one class.
What it does
- Extend SmrtObject → auto DB schema + migrations, REST API, CLI, and MCP tools
- AI methods on every object: is(), do(), describe()
- Vector embeddings + semantic search; object memory with confidence scoring
- Model-agnostic, event-driven, no vendor lock
import { smrt, SmrtObject } from '@happyvertical/smrt-core';
@smrt()
class Article extends SmrtObject {
title = '';
body = '';
}
// generated for free: DB + migrations, REST,
// CLI, and MCP tools your agents can call.
await article.do('summarise in one line');
await article.is('ready to publish?');Also on this floor
The template you clone to get multi-tenant auth, Stripe subscriptions, usage metering and agents wired up from day one.
Clone on GitHub ↗We plan your software with you — interview to PRD + SDD, committed to a repo you own. Build it yourself, or hand it to an agentic project manager.
Start planning ↗Everything else on this page is built on it — the framework is sold by its output, not by promises about itself.
LEVEL P2 · FOUNDATION
Vendor-agnostic adapter layer · github.com/happyvertical/sdk
HAVE SDK
Thirty packages that hide vendors behind one interface — getAI(), getDatabase(), getFilesystem() — so swapping providers is a config change, not a refactor.
The problem
Vendor SDKs leak into application logic until swapping a model or a database means a rewrite. The SDK isolates those operations behind stable adapter interfaces.
What it does
- getAI() — one client for OpenAI, Anthropic, Gemini, Bedrock and local models: chat, streaming, embeddings, vision, TTS
- getDatabase() — SQLite, Postgres and DuckDB behind one query interface, pgvector included
- getFilesystem() / getCache() — local disk to Google Drive, memory to Redis or S3, same API
- Every package reads HAVE_* env vars and ships an AGENT.md so agents write correct code against it
import { getAI } from '@happyvertical/ai';
import { getDatabase } from '@happyvertical/sql';
const ai = await getAI({ type: 'anthropic' });
const db = await getDatabase({ type: 'postgres' });
// swap providers in config — not in code
const s = await ai.message('Summarise the day.');
await db.insert('summaries', { content: s.content });The bedrock under s-m-r-t and everything upstairs: anytown.ai's desks and ergot's pipeline call their vendors through these adapters.