Text is not a keyword.
Title and body use text analyzers. URLs, IDs and categories use keyword fields; timestamps use dates, and confidence uses numeric fields. The mapping affects search and aggregation quality.
Behind the film are resilient crawlers, structured records, search indexes, semantic embeddings, AI agents, and evidence checks. Visitors receive a reviewed data snapshot—not a live model or crawler session.
RSS, crawling, and a supplementary GDELT index support discovery. Extraction, normalization, semantic grouping, classification and evidence checks happen before the website receives its precomputed JSON.
Feeds and sitemaps help identify new URLs. Crawling retrieves permitted article content, while GDELT provides supplementary discovery and coverage checks. Each stage retains its source references.
The published film reads story.json. It does not crawl the news, query a production database, or call a language model when someone visits.
Articles, labels, events, evidence references, and checkpoints.
Text retrieval, filters and aggregation. Rebuildable from source records.
Compressed source HTML, subject to access and retention rules.
News begins as unstructured HTML. Once the text is extracted, normalized, deduplicated, and enriched with NLP labels, it can be stored as an authoritative record and projected into search indexes.
The database preserves authoritative records, search indexes enable retrieval, vectors capture similarity, and object storage retains raw inputs. Select a layer to see why.
Articles, sources, labels, model versions, events, runs, and evidence IDs are stored in auditable relationships. Constraints help maintain integrity.
Transactions, audit trails, checkpoints, and reproducible index rebuilding.
articles → labels → stories → insightsTitle and body use text analyzers. URLs, IDs and categories use keyword fields; timestamps use dates, and confidence uses numeric fields. The mapping affects search and aggregation quality.
Indonesian tokenization, stop words, and local synonyms—such as Transjakarta, TJ, and busway—improve recall across different phrasing.
PostgreSQL remains authoritative. Versioned monthly indexes can be rebuilt and switched behind an alias without changing search clients.
IDs and versions make it possible to investigate a mislabeled article, retrieve supporting coverage, and reproduce an analysis with the same rules and model versions.
| ENTITY | IMPORTANT FIELDS & RELATIONSHIPS | WHY IT EXISTS |
|---|---|---|
| sources | domain, media_name, country, feed_urls, last_ok_at | Track source health, geography and coverage gaps. |
| articles | id, source_id, url_canonical, published_at, body_key, content_hash, story_id | Provide an article identity, fetch lineage and event connection. |
| labels / entities | article_id, task, label, score, model_version, role | Keep topics, sentiment, entities, and model confidence inspectable. |
| stories / embeddings | story_id, n_sources, vector(768), similarity | Support event clustering and semantic retrieval. |
| insights | period, numbers, evidence_ids, verdict, verifier_note | Trace narrative claims and metrics to their supporting articles. |
| runs / eval_runs | stage, n_in, n_out, cost_usd, metrics, model_version | Record batch quality, cost and model changes. |
Publisher, URL, timestamp, raw object key, content hash
↓Topics, sentiment, location, entities, confidence, model version
↓Event cluster, distinct sources, embeddings and evidence
↓Statistics, intervals, evidence IDs, verifier verdict
↓Schema checks, versioned JSON, review, snapshot
Scout monitors sources; Crawler and Dedup run reproducible steps; Classifier handles labels; Analyst drafts findings; Verifier checks evidence; Publisher produces the snapshot. Select an agent to inspect its role.
Reviews new sources, failed feeds and changes in the publisher registry so discovery stays reliable.
A search index makes it fast to find the original coverage behind an insight: article text, people mentioned, dates, topics, and labels. Those labels were produced and checked upstream.
Fetching, orchestration, NLP, transactional storage, search, and snapshot delivery solve different problems. The modules above show where each belongs.
Finding stories is different from extracting them.
Browser rendering only for permitted JavaScript-heavy pages.Scheduling, retries, checkpoints, and review.
Agent decisions can be traced back to their inputs.Local inference first; escalate exceptions.
Not every article needs an expensive model call.Transactional records and search indexes have different jobs.
Search indexes can be rebuilt from authoritative records.Reviewed JSON becomes a static experience.
Visitors never need a live database connection.A robust pipeline distinguishes missing sources, extraction failures, model drift, and unsupported claims. Retries are only one response; some failures require quarantine, manual review, or rollback.
Respect robots.txt, apply per-domain rate limits, avoid bypassing paywalls, and track extraction failures.
Rate-limit policy: 1 request per 2 seconds per domainInsights retain supporting article IDs. Verifier reviews the narrative and deterministic checks confirm numeric claims against computed data.
Only supported findings are exportedDaily LLM budgets, caching, personal-data minimization and retention rules reduce unnecessary risk.
Documented HTML retention policy: 180 daysQuality checks span the entire lifecycle: source discovery, text extraction, similarity, model evaluation, evidence verification, and safe publishing.
Source registry, feed status, robots.txt, crawl schedule.
Fetch, parse, dates, language, location, schema, quarantine.
Canonical URLs, MinHash, embeddings, event windows.
GLiNER2, confidence, LLM review, per-topic evaluation.
Aggregates, denominators, evidence IDs, independent verifier.
JSON validation, versioning, review, backup and rollback.