Synaplan
Open-source AI platform for companies: self-hosted AI agents, GDPR-compliant chatbot widget, RAG knowledge base, WhatsApp and Outlook AI, MCP, multi-model routing. Docker, Kubernetes or hosted in Germ
Tells a small EU online merchant which regulation changes apply to their store — every to-do with a verbatim quote and a source link. Nemotron on Nebius Token Factory + Tavily.
BusinessPython · HTMLGitHub @moiz-lakkadkuttaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Tells a small EU online shop which regulation changes apply to it and what to do by when, with the
source sentence quoted under every to-do. Nothing is invented: a to-do is stored only if its quote is
verbatim in the official page (regwatch/schemas.py, checked in code, never in a prompt).
uv sync --dev
uv run regwatch seed # loads the recorded run in examples/seed-run (idempotent)
uv run regwatch serve # http://localhost:8000 → /month
Demo: https://port8000-jmda1596h1jt4g9.tunnel.applications.eu-west2.nebius.cloud (Nebius Serverless Endpoint regwatch-web-6, eu-west2, deployed 2026-10-27 with four example stores, the agent on and five EU laws; serves the recorded seed run; stays up through judging, Dec 1–15).
| Piece | Role |
|---|---|
Nebius Token Factory — nvidia/Nemotron-3_5-Lightning | document → obligations, each with a verbatim quote (regwatch/understand/normalize.py) |
Nebius Token Factory — nvidia/Nemotron-3-Ultra-550b-a55b | (change, store profile) → applies / doesn't apply / unclear + grounded to-dos (regwatch/understand/classify.py) |
| Nebius Serverless Endpoint + Serverless Job | web app and the crawl, one container image (ops/) |
Tavily search (advanced, include_domains, time_range) + extract (advanced, markdown) | the only ingestion path; one live crawl costs 40 Tavily credits (14 searches, 2 extracts; 2026-10-06) and 52 in the Nebius Job (2026-10-10, more new pages); 56 Tavily credits measured offline against recorded fixtures (24 searches over five regulations) |
Only nine domains are ever searched or extracted (config.SOURCE_DOMAINS): eur-lex.europa.eu,
commission.europa.eu, green-forum.ec.europa.eu, gesetze-im-internet.de, bmj.de, bmuv.de, ihk.de,
help.shopify.com, shopify.com. The feed footer shows the credits and model cost of every crawl.
regwatch/ingest/search.py: Tavily advanced search per (domain × regulation query), domain-filtered, deduped by URL.regwatch/ingest/extract.py: Tavily advanced extract in batches of ≤ 20 URLs → Document (markdown + content hash).regwatch/ingest/diff.py: new / changed / unchanged by content hash; unchanged documents cost no model call.regwatch/understand/normalize.py: Lightning turns a new document into instrument, dates and obligations with verbatim quotes.regwatch/understand/classify.py: Ultra decides applies / doesn't / unclear for the store profile and drafts to-dos.regwatch/jobs/crawl.py: one CrawlRunRow per crawl with Tavily credits and model USD; regwatch crawl --stage all.RegChange.validate_quotes() (quote is a substring of the full page) and
Applicability.ungrounded_todos() (a to-do's quote is one of the obligations) must be empty before
anything is stored — and classify_all re-checks at the store boundary.REGWATCH_REPORT_EMAIL)./profile — six fields (country, ship-to, categories, platform, company size, where the goods come from; the last two may be "not sure"); no account, no email./feed — changes grouped by regulation with applies / doesn't / unclear pills; footer with credits and USD./month — to-dos bucketed Already in force → Due this month → Coming up → No fixed date; check-off persists (htmx). / lands here./change/<id> — why it applies in your profile's terms, to-dos with their quote and source link, obligations, source metadata.No keys needed (recorded Tavily and model replies from tests/fixtures/):
uv sync --dev
uv run regwatch seed
uv run regwatch crawl --stage all --backend fixtures --llm-backend fixtures --no-out # prints "… 56 Tavily credits …"
uv run regwatch serve
With keys: copy .env.example to .env, set TAVILY_API_KEY= and NEBIUS_API_KEY=, then
uv run regwatch crawl (live search + extract + both models; writes nothing to examples/seed-run).
The demo seed is recorded from such a crawl with uv run regwatch record-seed --url … [--exclude …]
(grounded changes only; undated to-dos skipped; the crawl's Tavily credits carried into the footer).
Schema changes are not migrated — delete a stale local regwatch.db first (the example stores'
slug / name / blurb columns are the one exception: make_engine adds them to an older DB).
The shared demo profile stays locked (REGWATCH_PROFILE_LOCKED=true). The demo URL is open to anyone with
no login, and checking a new store costs about 35 Nemotron 3 Ultra calls (~$0.24), so entering your own store
works only when you run RegWatch yourself. A row of example stores on the feed, month and profile pages
lets a visitor switch between shops whose results were worked out ahead of time (a cookie, nothing
written). Each is examples/seed-run/stores/<slug>.json; the default store (de-furniture, equal to
profile.json) uses the change files' own results, every other store reads
stores/<slug>.applicability.jsonl. uv run regwatch classify-presets fills that file: Nemotron 3
Ultra on each (store, seed change) pair that has no line yet, the same enforce() grounding and
ungrounded_todos() check as the crawl, one appended line per result. A rerun only fills gaps, so
after new change files are recorded it classifies just those; regwatch seed then loads them.
On a change marked unclear, a button starts an agent: Nemotron 3 Ultra picks one tool per step — search one allow-listed domain (Tavily basic depth), read a page it was shown, ask you a multiple-choice question, or decide — and each step is shown with its Tavily credits and model cost. Its to-dos pass the same enforce() grounding as the crawl, an evidence quote must be verbatim in a page it read, and a reason that cites no quote or answer of yours is dropped (an applies / does_not left without one becomes unclear). The result is shown only to the visitor who ran it; the shared seed rows are never written. Caps in code: 6 model steps and 10 Tavily credits per run, $1 of model tokens and 60 Tavily credits per UTC day (counted in the app's database, which resets when the Endpoint restarts) for all visitors together, 5 runs per visitor per hour. REGWATCH_AGENT_ENABLED=false (the default) hides it, and agent spend is not counted in the feed footer's credits per crawl.
The public URL serves the recorded run in examples/seed-run (recorded with regwatch record-seed from the sixth live crawl: 4 documents, 40 Tavily credits; re-classified on 2026-10-14 for a small company, 26 changes; plus 7 changes from 5 documents appended on 2026-10-15 with record-seed --append from a live crawl of the green-claims, packaging and product-safety acts: 43 Tavily credits; 33 changes in all); the Serverless Job runs the same image with the live crawl entrypoint against a freshly seeded database — Job #1 on 2026-10-10 re-ingested the 4 seed documents as unchanged and left them alone (52 new documents, 47 new changes, 52 Tavily credits, $0.2464 in model tokens; a second pass over one database adding nothing is verified offline by tests/test_crawl_all.py::test_crawl_all_twice_is_idempotent) — live results reach the URL by re-recording the seed and rebuilding the image, not by a shared database, because Serverless Endpoints have no persistent volume we could verify.
One image, two modes (ops/entrypoint.sh serve|crawl; crawl exits 2 without both keys and never uses
fixtures). Console values: ops/serverless-endpoint.yaml, ops/serverless-job.yaml; step-by-step: docs/runbook-nebius.md.
A daily schedule exists as .github/workflows/daily-crawl.yml (Jobs have no cron field) but is switched off.
Live figures come from the sixth live crawl (2026-10-06: seed + crawl --stage all on a fresh database), priced at
the Token Factory catalog prices checked 2026-10-10 (Lightning $0.06 / $0.24, Ultra $1.00 / $3.00 per Mtok). Offline
figures are fixture replays and are labelled as such.
| Item | Figure | Basis |
|---|---|---|
| Tavily credits per crawl | 40 live (14 searches, 2 extracts); 56 offline (24 searches, 1 extract of 16 URLs; the three regulations added 2026-10-15 replay empty searches) | usage on every Tavily response; documented pricing for the offline row |
| Lightning (normalise), 29 documents → 60 changes | 682,890 prompt / 58,210 completion tokens, 115 calls | $0.0549 live |
| Ultra (classify), 60 changes | 102,279 prompt / 84,830 completion tokens, 61 calls | $0.3568 live |
| Full crawl | 8 min 03 s | $0.4117 live in model tokens + 40 Tavily credits |
| Grounding | live: 105 to-dos stored, 0 ungrounded; offline: quotes verbatim first try 20/22 | validate_quotes, ungrounded_todos |
Prices live in Settings (.env.example). Tooling friction with numbers: FEEDBACK.md.
Pre-approved: if live classification of the EU Deforestation Regulation proves unreliable, EUDR is dropped and the withdrawal function stays; everything else is unchanged.
.github/workflows/daily-crawl.yml stays off, because a crawl's results
reach the URL only by re-recording the seed and redeploying. Crawls run on demand.REGWATCH_REPORT_EMAIL
(set on the demo).REGWATCH_AGENT_ENABLED); the public Endpoint has it on, with keys
and the read-only demo profile (runbook step 12), capped at $1 and 24 Tavily credits per day. From the next
image there is also an all-time cap over every agent step in the database (REGWATCH_AGENT_TOTAL_USD, default
$10; REGWATCH_AGENT_TOTAL_CREDITS, default 300). Once either is used up, the agent switches itself off.docs/issues.md.Directive (EU) 2023/2673 (withdrawal button, § 356a BGB, from 19 June 2026) and Regulation (EU) 2023/1115 (EUDR, as amended by Regulation (EU) 2025/2650: medium and large operators from 30 December 2026, micro and small operators from 30 June 2027). Added 2026-10-15: Directive (EU) 2024/825 (green claims and guarantee information, applied from 27 September 2026), Regulation (EU) 2025/40 (PPWR, applies from 12 August 2026; the e-commerce empty-space rule from 1 January 2030) and Regulation (EU) 2023/988 (GPSR, applies from 13 December 2024).
MIT