vccs
Composable charting components for Vue 3, ported from Recharts
Mostra como palavras, tom e veículos se associam a um político monitorado ao longo do tempo
Translation pending
AI summary · revised during review
DataTypeScript · SvelteGitHub @walteraandradeOnlineOwner 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
Loading the full README. The saved excerpt is shown below.
rashomon — which words stick to a Brazilian political figure
Rashomon collects what Bluesky, Google News, GDELT, the press and the two houses of Congress say about a tracked politician, then draws the words that keep landing next to that name — how often, how surprising, from which outlet, in what tone.
Live at rashomon-five.vercel.app. Node + TypeScript, Hono, PGlite, and a front-end of plain ES modules with no build step.
pnpm ingest writes into a local PGlite database at ./data/pg. PGlite allows one process per directory, so stop the server before ingesting again.Read the full README ↗Rashomon collects what Bluesky, Google News, GDELT, the press and the two houses of Congress say about a tracked politician, then draws the words that keep landing next to that name — how often, how surprising, from which outlet, in what tone.
Live at rashomon-five.vercel.app. Node + TypeScript, Hono, PGlite, and a SvelteKit-prerendered front end (vite build).
pnpm install
pnpm ingest # collect from the default sources
pnpm dev:api # API on http://localhost:3210
pnpm dev # site on http://localhost:5173
pnpm ingest writes into a local PGlite database at ./data/pg. PGlite allows one process per directory, so stop the server before ingesting again.
| Command | What it does |
|---|---|
pnpm ingest [source...] | collect; no argument runs every default source, see sources |
pnpm dev | Vite on 5173, /api proxied to PORT (default 3210) |
pnpm dev:api | the Hono API on PORT (default 3210) |
pnpm build | vite build into build/ |
pnpm reindex | recompute terms, phrases, person matches and candidates from stored docs |
pnpm score | score every unscored (doc, person) pair, see testimony |
pnpm purge <source> | delete one source's docs for a clean re-fetch |
pnpm purge themes | clear GDELT's stored theme terms, the extra_terms column and pre-revision kikori:q8-style testimony rows |
pnpm migrate / pnpm push | create the schema on a managed Postgres, then copy a local PGlite into it |
pnpm export-docs | dump every doc as one JSON line, with the per-person text the scorer sees, for kikori's training set |
pnpm bench / pnpm bench:writes | read and write baselines against their own synthetic database |
pnpm typecheck / pnpm test | tsc plus svelte-check for .svelte, and node --test (in-memory database) plus vitest for component specs |
Run pnpm reindex after editing seed.json or src/extract.ts. Both pnpm typecheck and pnpm test must pass before a PR.
src/collectors/*, same signature, each storing { text, uri, domain, published_at, source, tone }.src/extract.ts normalizes the text and pulls hashtags, words and phrases, then tags the docs whose text names a person in seed.json. Only docs that name someone tracked are stored at all (a doc naming nobody is dropped, and counted as dropped in the ingest log), and every ingest deletes docs older than 21 days.src/graph.ts counts terms per person and computes PMI against the docs in the window that mention any tracked person. pnpm score adds kikori's testimony on top, per (doc, person).src/server.ts is the Hono API and the site is prerendered by SvelteKit from web/routes + src/ui into build/.Two numbers, two different questions. Frequência is how many documents carry the word. PMI is how much more often it lands near this person than chance would give, so it favours the word that is specific rather than merely common. The map's default sort multiplies PMI by ln(1 + count) on purpose, so a term seen twice does not outrank one seen two hundred times.
gkg and gdelt docs carry a tone; every other source stores tone = null. Nothing invents tone for them.lean is a judgment call with citations, not a fact. A domain missing from outlets.json means nobody researched it yet — not that it is neutral.| Document | Covers |
|---|---|
| API reference | every route, its parameters and its response shape |
| Sources | the ten collectors, their rate limits, and seed.json |
| Terms, phrases and outlets | PMI, the phrase lexicon, candidate discovery, editorial lean, tone |
| Testimony | kikori, its contract, its bias, and the label-drift trap |
| Operations | environment, deploy, write batching, indexes, benchmarks, HTTP caching |
| Performance baseline | the committed output of pnpm bench |
| Factory | the spec → build → PR pipeline feature work goes through |
| Agent cost | what an agent spends on a small UI change, measured on three commits (#176) |
src/collectors/* one collector per source, same signature (Strategy)
src/extract.ts normalization, hashtags, words, phrases, person matching
src/phrases.ts the collocation lexicon: staging, the two floors, load
src/store.ts doc and person inserts, shared by ingest and reindex
src/graph.ts the scoring SQL: counts, PMI, term-term links, testimony
src/query.ts query parsers; every parameter is snapped or clamped here
src/scorers/* one scorer per method, same signature
src/server.ts the Hono API (/api/* only)
src/perf.ts opt-in request instrumentation; src/bench*.ts the baselines
web/ app.html (shared head), routes/ (+page.svelte, como-ler, sobre)
src/ui/ front-end modules (format, api, layout, render, figures, app)
public/ atlas.css and image assets
test/ node:test suites; fixture.ts seeds the in-memory database
seed.json tracked people and aliases
outlets.json researched editorial lean per domain
data/ PGlite databases, gitignored
public/index.html and public/atlas-legacy.html, the legacy UI pages, are gone.
Code, comments, commits, branches and PR titles in English. UI copy in pt-BR. Functional style, small pure functions, no classes. Comments only when the why is not obvious.