Public data. Practical decisions.
A daily workspace for Finnish weather, air, mobility, energy, and city signals — with the evidence kept visible.
Try it · Interface · Coverage · Architecture · Run it · Docs
Signal observatory · Helsinki demo snapshot · English UI. The same product is available in 中文.
Everyday decisions in a Finnish city are scattered across weather pages, transit alerts, air-quality maps, energy prices, and municipal sites. ArkiWatch gathers those public signals into two workspaces:
- Today gives you one useful next step, a short plan, and the context that matters for the next few hours.
- Signal observatory is the same data as inspectable evidence: scope, freshness, source health, and a link back to the provider.
What holds them together is that nothing appears without its provenance. Every recommendation keeps its source, fetch time, validity window, and coverage boundary. Fixture data is labelled a snapshot and never dressed up as live.
Beyond that: a grounded assistant whose answers cite the workspace they came from, historical dates you can browse without mistaking them for advice, an honest capability map per city, a bilingual EN / 中文 interface, and optional personal context — saved places, commute, Telegram — when you self-host.
Finland is the current product context, and Helsinki is the most complete city.
The demo needs Node.js 20+ and Corepack / pnpm, but no database, API keys, or provider accounts. Its data and assistant responses use fixtures; map views can still request external map tiles.
corepack enable
pnpm install
pnpm demoOpen localhost:3000 and start in Signal observatory
to inspect the source scope and freshness. Open Today for the recommendation.
Ask the assistant a question and follow its citation back to a workspace.
/about has the product story and the city matrix.
The demo will not pretend fixture data is current. Connect the API when you want live public feeds — see Run it yourself.
ArkiWatch is a provider adapter and decision layer, not the authoritative source for any feed. Configured providers include FMI, HSY, Open-Meteo, Digitransit / HSL, Digitraffic, Fingrid, SYKE, Helsinki Service Map, Helsinki Linked Events, and electricity-price APIs. docs/data-sources.md covers boundaries and operational assumptions.
The table describes adapter capabilities, not current service health. supported means an adapter exists for that city; it does not establish
that a deployment has credentials, a successful fetch, or fresh data. planned
means unsupported today. Check collector status, returned readings, and timestamps in the running instance.
| City | Weather | Air | Transit | Water | City services | Events |
|---|---|---|---|---|---|---|
| Helsinki | supported | supported | supported | supported | supported | supported |
| Espoo | supported | supported | supported | supported | planned | supported |
| Vantaa | supported | supported | supported | supported | planned | planned |
| Tampere | supported | supported | planned | supported | planned | planned |
| Turku | supported | supported | planned | supported | planned | planned |
| Oulu | supported | supported | planned | supported | planned | planned |
Energy and road/rail are national or provider-defined, so picking a city does
not imply a city-specific observation, and Tampere, Turku, and Oulu
recommendations stay regional-only. The machine-readable version of this table
is GET /api/platform/coverage, alongside GET /api/health/data-quality.
Each external API is isolated behind a collector adapter. Raw records keep their
fetch metadata, and the normalized products feed both the guidance and the
inspectable workspaces. contracts/openapi.json is the
static API contract, and it generates the frontend types.
| Layer | Stack |
|---|---|
| Web | Next.js App Router, React, TypeScript, next-intl |
| API | Go 1.25, pgx, explicit PostgreSQL repositories |
| Data | PostgreSQL, Go-owned idempotent schema lifecycle |
| Jobs | Collectors, normalizer, rules, scheduler, backfill, dispatch |
| Quality | go vet, go test, Vitest, Playwright, accessibility smoke tests |
| Operations | Docker, health checks, structured logs, request IDs, source-health metrics |
Source layout: apps/api holds the Go API, collectors, normalizer, scheduler and
schema; apps/web the Next.js workspaces and assistant; then contracts,
docs, and deploy.
Follow Development for prerequisites, environment setup, database initialization, collection, and checks. Start with the public data path; configure personal accounts, Telegram, and the model-backed assistant only when you need them. Deployment covers the optional single-VPS recipe.
Go owns recommendations, validity, source health, and energy calculations; Next.js handles presentation and session transport. See the business boundary before changing these rules.
The documentation index separates product, contributor, and operator reading paths. Public and private records explains which examples belong in Git and which instance values stay private.
Pre-release. The main product paths are implemented; provider availability, geographic coverage, external API limits, and UI details can still change. See Product scope for the assumptions still to validate and recommended completion criteria. Implemented features and passing tests alone do not establish user value or deployment readiness.
If something is unclear, wrong, or over-claimed, open an issue. A new Finnish public source is welcome via the data-source template — license, rate limits, coverage, and the daily decision it would improve. Collectors need fixtures and tests; user-facing copy needs both EN and 中文.
AGPL-3.0-only. PRIVACY.md describes the data boundary for demo, accounts, and self-hosted deployments.
Public data belongs to the providers listed above; ArkiWatch only adapts, timestamps, and explains what it fetched. Most feeds are CC BY 4.0 and need crediting — docs/data-sources.md lists each provider's licence, access requirement, and attribution string. Confirm those terms are still current before deploying a city pack.
