vccs
Composable charting components for Vue 3, ported from Recharts
A map of every building documented so far — 8,473 addresses in San Francisco, each with a cited page of permits, assessments and history.
DataHTML · PythonGitHub @nolastanOnlineOwner 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
An encyclopedia of the built environment
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A map-less (for now), crowd-editable encyclopedia of the built environment —
one rich, Wikipedia-style page per building, starting with the Castro / Eureka
Valley neighborhood of San Francisco. Live at https://knowthis.place.
There is deliberately no CMS, no database, no build framework:Read the full README ↗A map-less (for now), crowd-editable encyclopedia of the built environment — one rich, Wikipedia-style page per building, starting with the Castro / Eureka Valley neighborhood of San Francisco. Live at https://knowthis.place.
There is deliberately no CMS, no database, no build framework:
data.json
(the single source of truth — structured facts with citations, plus any prose
in a narrative field), assets/ (openly licensed media), and index.html
(the generated page). Keeping facts and prose in one file means the two can't
drift into conflict.index.html is a build artifact, not a template render at request time.
Pages are composed from a shared design system — a CSS component library
(shared/site.css) of stat tiles, a visual timeline, charts,
and icons, plus a tiny progressive-enhancement layer
(shared/site.js: web components for the Street View still,
the Mapbox locator map, and chart tooltips). The JS only enhances — every
page renders completely from its HTML alone, so pages stay static and
crawlable.
Consistency is enforced by a small contract checked in CI — see
shared/AGENTS.md and scripts/validate.py.data.json is edited forever after.
scripts/seed_pages.py joins the DataSF datasets and
writes the first data.json + index.html for every parcel that has no page
yet; seed never returns to a page it has written, so a second run creates
nothing. Everything after that first draft (corrections, research, a
building's story, reader feedback) is a person or an agent editing
data.json and re-running seed_pages.py render <path>, which rewrites the
HTML from the data in place. Nobody edits index.html: validate.py fails
if a page's HTML is not exactly what the renderer produces from its
data.json, which is what keeps the two from drifting.AGENTS.md files through
the tree; the live city APIs are cataloged in
DATA-SOURCES.md.data.json / assets/,
re-renders index.html from it, and opens a pull request that closes the
issue.main is the deploy — .github/workflows/deploy.yml
builds the site from the merged sources and publishes it to GitHub Pages.CLAUDE.md The map: which file to read for which job
AGENTS.md Agent constitution — the rules core
REFERENCE.md data.json schema, page types, seeding, the
reasoning behind the rules
DATA-SOURCES.md Catalog of live city APIs agents draw from
index.html Site homepage — the one hand-written page
san-francisco/
castro/
AGENTS.md Neighborhood-specific guidance
<street-slug>/<number>/ One directory per building (see AGENTS.md)
historic-districts/<slug>/ One page per historic district — the buildings
inside it and the streets it runs through,
generated by `seed_pages.py districts`
shared/
AGENTS.md The page contract: hard rules, key → block map
BLOCKS.md The block library — what the renderer produces
site.css The only stylesheet (component library)
site.js Enhancement layer (progressive web components)
site-config.json Site URL, repo URL, Maps embed key,
Mapbox token
research/
AGENTS.md Research rulebook: the run and its rules
RUNBOOK.md The procedure for a run, step by step
LESSONS.md 147 traps that already cost a session — grep it
SOURCES.md Register of every source mined, and leads
TRIAGE.md What a prospecting pass found, per held lead
sources/<id>.md One dossier per source: access, cautions,
coverage log
findings/ The chain of custody, one file per batch
schema/ The findings JSON schema + a worked example
manifests/ Parcel lists produced here, seeded by the script
tools/check.py Research consistency checks (stdlib only)
news/
AGENTS.md News rulebook: what an entry is, privacy
PIPELINE.md Per-stage detail: cursors, the screen, the markup
feeds.json Register of every feed, and how each misbehaves
state/cursors.json What each feed has been considered up to
queue/<date>.json One poll run: what to read, what was skipped, why
items/<feed>/*.json Findings files — research schema, research resolver
tools/poll.py Fetch, screen, queue, advance the cursors
tools/read.py Read queued articles; report the addresses in them
design/
AGENTS.md Design module entry: direction of truth, layers
PRINCIPLES.md Portable design judgement
CONVENTIONS.md How design work is done in this repo
PAPER.md paper.design tool quirks
IMPLEMENTATION.md Tokens, type, rem→px, metrics, icons
RULES-OF-THUMB.md Generated: the distilled corpus
META.md / GAPS.md Learning notes; cases /ui had to guess at
scripts/
build_site.py The build: every generator below, in the one
order that works. Actions runs it on deploy
seed_pages.py Writes the first draft of pages that don't
exist yet, from the DataSF APIs; `render`
rewrites a page's index.html from its data.json
permit_redactions.json Names stripped from permit text before it's saved
validate.py CI contract checks (stdlib only)
build_sitemap.py Regenerates sitemap.xml (a sitemap index)
and sitemaps/ — one child per neighborhood
build_map_index.py Regenerates shared/addresses.geojson
build_link_index.py Regenerates shared/nearby.json — each
page's nearby pages, for lateral links
build_corpus_index.py Regenerates corpus.jsonl — one line per
address page, for corpus-wide questions
build_stats.py Regenerates the dashboard at /stats/
corpus.jsonl One line per address page — path, year, use,
district, earliest date, sources, hook. Derived,
but committed, so a corpus-wide question costs
a grep rather than a build
.github/
ISSUE_TEMPLATE/page-feedback.yml
workflows/{deploy,feedback-agent,news,refresh,validate}.yml
None of the site is in that tree. Every index.html under
san-francisco/, sitemap.xml, sitemaps/, shared/addresses.geojson,
shared/nearby.json and stats/index.html are built from the files above and
gitignored; the repository is 18,013 tracked files rather than 35,688 because
of it. REFERENCE.md → The site is built, not
committed has the reasoning and
the two exceptions.
python3 scripts/build_site.py --serve # build, then http://localhost:8517
Nothing to install — Python 3.9 and the standard library. The build takes
about a minute; --no-build --serve skips it and serves what is already
there. Use port 8517 and no other: the Mapbox token and the Google Maps embed
key are URL-restricted to it, so the maps only render there.
repo_url in shared/site-config.jsonknowthis.placeANTHROPIC_API_KEY Actions secret; install the Claude GitHub App for this repopage-feedback label (Issues → Labels → New label). GitHub
silently ignores labels an issue form references but that don't exist, which
leaves feedback issues unlabeled and the agent workflow skipped.main: require PR review (you)knowthis.place,
and put it in shared/site-config.jsonpk.…) for the homepage map and the
per-page locator maps, URL-restricted to knowthis.place and
http://localhost:8517, and put it in shared/site-config.json as
mapbox_token. Address pages request one Static Images call per view, so
watch the account's monthly request count as coverage growsVerified: datepython3 scripts/seed_pages.py plan --neighborhood "Castro/Upper Market"
python3 scripts/seed_pages.py seed --neighborhood "Castro/Upper Market" \
--city san-francisco --area castro
python3 scripts/build_site.py
python3 scripts/validate.py
plan reports what would be written and why parcels are skipped; seed writes
the new pages and rebuilds the street hubs. seed only ever creates — it skips
any address that already has a page, so re-running it is safe and is a no-op
unless new parcels have appeared. Raw dataset rows are cached in
.cache/ (gitignored) and each fetch resumes where it left off, so an
interrupted run is cheap to restart. --neighborhood takes the SF Planning
analysis-neighborhood name as it appears in the datasets.
python3 research/tools/check.py --stats
The research module is where sources are found, mined and turned into citable facts. It runs on files rather than conversations — a register, a dossier per source, structured findings, and GitHub issues — so a scan that takes six sessions across three agents doesn't lose its place. Start at research/AGENTS.md, and grep research/LESSONS.md for whatever you are about to do.
The bias is toward sources search engines can't see: newspaper OCR, out-of-print books, neighborhood newsletters, PDF survey reports. A pass that reads a whole book and yields four citable facts is a good pass.
python3 news/tools/poll.py poll # every open feed
python3 news/tools/poll.py status # where the cursors stand
python3 news/tools/read.py news/queue/<date>.json
The news module runs daily in CI (.github/workflows/news.yml) and asks a different question from research: not what has never been written about this address, but what was written about it this week. Nine feeds, a cursor apiece, a cheap screen that throws out the Oakland stories and the ones that could not be about a building, and a reader's judgement on the rest. A handful of buildings a day survive that, and most of them have no page yet — 10,828 pages is a small slice of the city — so the module seeds the parcel and puts the story on the page it just made. Start at news/AGENTS.md.
Any Claude Code session in this repo picks up CLAUDE.md automatically — a
one-page map that routes to the rules core for the job at hand. Use an
agent for the work a script can't do — verifying a reader's feedback,
researching a building's history, writing the prose for a page that has a story
— not for seeding pages from city data.
sitemap.xmlresearch and needs-human (same trap as page-feedback — GitHub
silently drops labels that don't exist). Older issues also carry
per-stage labels (research:extract and friends) from when a stage was
the unit of work; the module no longer files them.