Ontic Entia
// log in

// registration is not allowed at this time

Trailer Release

live

Get pinged the second dispatch releases your trailer

read more show less

Watches the New Kenosha DC Route-Trailer Numbers sheet once a minute and pushes a notification, or a full alarm, the moment a trailer number lands next to a route you watch. The Board tab shows the whole active tab in release order. Android only. Installing: tap Download, then open the file. Android asks once to allow installs from your browser. Play Protect then says it hasn't seen an app from this developer before: tap More details, then Install anyway (or Scan app, then install). That warning appears once per phone because the app isn't on the Play Store. Updates arrive inside the app as an Update bar; tap GET and install over the top. After installing: allow notifications, add your route number (or tap it on the Board), and turn on the bell if you want it to ring like an alarm. Set the app's battery setting to Unrestricted so a sleeping phone still wakes for it.

  • Flutter
  • Firebase
  • Apps Script

Driver Utility Suite

live PWA · ready

Internal driver tooling — GFS DUS API wrapper with AI-generated route briefings

read more show less

An internal companion app for route drivers at a GFS distribution center. Wraps the upstream DUS REST API (distribution centers, stops, routes, employee lookups) with local caching, session management, and AI-generated plain-English briefings for the day's route. Auth flow: user logs in with their DUS credentials, the app exchanges them for a JWT + refresh pair (1h / 5h lifetimes), and maintains a server-side session backed by Redis. Role claims (ROLE_ROUTE_UPDATE, ROLE_ACTIVITY_MAINTAIN, etc.) gate what's visible. JWT verification + refresh logic lives in src/lib/server/jwt.ts. Data path: route and DC data is fetched from the GFS backend, cached in Redis (hot-read) and SQLite (persistent via better-sqlite3). An Ollama integration (src/lib/server/ollama.ts) turns structured route payloads into natural-language format instructions drivers can scan quickly on a phone. Installed as a PWA (static/manifest.json + sw.js) so drivers can add-to-homescreen and use it offline-ish. Stack: SvelteKit 2.50 + Svelte 5 + Tailwind 4 on adapter-node, containerized, served at dus.onticentia.ai behind the Cloudflare tunnel. Internal-use only — no public sign-up.

  • sveltekit
  • svelte-5
  • typescript
  • tailwindcss-4
  • better-sqlite3
  • redis
  • ioredis
  • jwt
  • ollama
  • docker
  • adapter-node
  • pwa

AnimeTime

live PWA · ready

Free, ad-free anime schedule and catalogue in ten languages — TVDB-backed, TMDB-enriched, AniList-scheduled

read more show less

A free, ad-free anime schedule and catalogue. The week view buckets every airing episode in the viewer's own timezone; season pages list each cour with scores, filters and one-click follows; a Top 20 ranks the series people are actually opening; and My shows keeps a local watchlist with an optional private token so Sonarr can pull it as an import list. The UI and the catalogue itself are served in ten languages (English, German, Spanish, French, Italian, Japanese, Brazilian and European Portuguese, Simplified and Traditional Chinese), and it installs as a PWA. Data: TVDB is the structural backbone (series → seasons → episodes in aired order), TMDB adds artwork, keywords and cross-reference ids, and AniList supplies scores, relations and the airing calendar. An ingest pipeline reconciles the sources into one Postgres store, translations trickle in on a cron, and refreshes run on view with cooldowns so upstream calls stay minimal; last-good copies in Redis carry the site through an AniList outage. Stack: SvelteKit 2 / Svelte 5 on adapter-node, Tailwind 4, Drizzle, Paraglide i18n, Stripe for donations. The request pipeline does its own abuse control behind Cloudflare: bot fingerprinting, per-IP and per-city rate limits, a penalty box and a crawler allow/block policy, all managed from an admin page with a live visitor globe. Private repo; production is live at animetime.tv.

  • sveltekit
  • svelte-5
  • typescript
  • tailwindcss-4
  • drizzle-orm
  • postgres
  • redis
  • paraglide-i18n
  • pwa
  • stripe
  • cloudflare
  • tvdb
  • tmdb
  • anilist
  • docker
  • adapter-node

Interpres MCP

live

Multi-tenant knowledge base as a remote MCP server on one Cloudflare Worker — D1 + FTS5, exact cosine search, live custom tools in a QuickJS sandbox

read more show less

A multi-tenant, text-only knowledge base exposed as a remote MCP server, running as a single Cloudflare Worker. The one deploy is simultaneously an operator admin UI (tenants, collections, documents, tools, keys, activity, settings) and an MCP endpoint that serves many client applications, each scoped by its Bearer API key to its own tools and datasets. One MCP server to rule them all. Storage is right-sized for the workload. D1 (SQLite) is the single source of truth: relational data, chunk text, embeddings as packed Float32 BLOBs, and an FTS5 keyword index. KV is a hot-path cache only (key hash to scope, global settings). The corpus is small enough to hold every vector in memory, so brute-force exact cosine replaces pgvector and Vectorize with no recall loss. No Postgres, Redis, Hyperdrive, R2, or Containers. Search is a JS reimplementation of the old hybrid SQL query: FTS5 keyword ranking plus cosine similarity over the tenant-scoped candidate set, fused with Reciprocal Rank Fusion, deduped to the parent chunk, and hydrated with parent text. Search can be pinned to a single document without widening the collection scope. Per-tenant opt-in enhancers add HyDE, multi-query expansion, and Gemini reranking. Ingestion uses topic-aware hierarchical chunking: parent boundaries follow explicit split markers, then headings, then sentence packing; ~128-token children are embedded with a document-and-section header prepended (contextual retrieval) while stored content stays clean. Embeddings and generation go through Cloudflare AI Gateway to Gemini, with Workers AI as a drop-in alternative. Tools per key: rag_search, rag_list_collections, rag_get_chunk, rag_get_document, Brave web_search / news_search / image_search / place_search, wikipedia, calculate, and a tools_search meta-tool (BM25F-lite) for lazy tool discovery. Operators, or agents via create_custom_tool, write new tools as JS that runs live in a QuickJS WASM sandbox on the Worker with generate, tenant-scoped search, and opt-in fetch bridges. No redeploy: save and the next session sees the tool. Per-key server instructions steer the client. Isolation: scope is resolved once per request from the key hash (KV-cached) and every repository read and write requires a tenantId argument, so cross-tenant leaks are prevented by type signatures rather than by remembering a WHERE clause. Operator surfaces sit behind Cloudflare Access with the JWT verified at the origin against the team JWKS; workers.dev is disabled so the custom domain is the only door. Stack: SvelteKit + adapter-cloudflare, D1 + FTS5, KV, Drizzle ORM + migrations, AI Gateway to Gemini or Workers AI, @modelcontextprotocol/sdk (Streamable HTTP), quickjs-emscripten, jose, zod, vitest. First-run setup wizard stores provider keys in D1, so no secrets are needed to go live. Provisioning and deploy scripts create D1 and KV, patch wrangler.toml, apply remote migrations, and deploy in one command.

  • sveltekit
  • svelte-5
  • typescript
  • cloudflare-workers
  • adapter-cloudflare
  • d1
  • sqlite-fts5
  • workers-kv
  • ai-gateway
  • gemini-api
  • workers-ai
  • drizzle-orm
  • model-context-protocol
  • quickjs-wasm
  • cloudflare-access
  • jose
  • zod
  • vitest
  • wrangler