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
Politics Civic and council reporting
Sports Local league reporting
Weather Conditions and severe-weather alerts
Broadcast AI anchor video from approved articles
Advertising Network ad delivery
Social Distribution to each town’s channels

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.

◦ Early access · invite only s-m-r-tcapture → licenseSvelteKit + Electronhosted 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.

30+ repositories · one stack

will@happyvertical.com

LEVEL 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
article.ts
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?');

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
adapters.ts
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.