diff options
| author | benj <benj@rse8.com> | 2026-04-09 16:10:08 +0800 |
|---|---|---|
| committer | benj <benj@rse8.com> | 2026-04-09 16:10:08 +0800 |
| commit | c041641634650c31e03c70dcad132fd94cb08e63 (patch) | |
| tree | 8f714a6fc0a66b05b2e43afec75808fd29002a42 /landing/layouts/index.html | |
| parent | 5f56e0eaf8030f78077fc93b441296bb51fe9331 (diff) | |
| download | tidyindex-c041641634650c31e03c70dcad132fd94cb08e63.tar tidyindex-c041641634650c31e03c70dcad132fd94cb08e63.tar.gz tidyindex-c041641634650c31e03c70dcad132fd94cb08e63.tar.bz2 tidyindex-c041641634650c31e03c70dcad132fd94cb08e63.tar.lz tidyindex-c041641634650c31e03c70dcad132fd94cb08e63.tar.xz tidyindex-c041641634650c31e03c70dcad132fd94cb08e63.tar.zst tidyindex-c041641634650c31e03c70dcad132fd94cb08e63.zip | |
Rework landing page with editorial layout, new demo, and LLM CTA
Replaces the generic SaaS template look with a left-aligned editorial
design — Fraunces serif headlines, monospace section markers (§ 01,
§ 02 …), hairline rules, and a quieter palette where the blue earns
its place rather than splashing on every surface.
The hero now leads with a real product demo (§ 01): one IRS 990 dataset
shown in three consumption shapes — a single normalized JSON record, a
JSONL bulk slice, and a token-efficient prose summary — instead of the
old fake-macOS code window. Each shape carries source-link receipts
back to the original filing, which doubles as a credibility signal and
a working illustration of the "every record has a receipt" promise.
§ 03 introduces a coverage widget driven by data/catalog.toml: four
auto-scrolling category windows (securities, government, regulatory,
science) showing 60 hand-picked datasets with seamless CSS-only
infinite-scroll loops, fade masks, hover-pause, and a
prefers-reduced-motion fallback that converts the windows into manually
scrollable lists.
Adds a discoverable /llms.txt at the static root — a markdown-light,
human-readable site description aimed at LLM agents — wired up via
<link rel="alternate"> in <head>, a comment in robots.txt, and a small
mono "for agents · GET /llms.txt →" satellite link sitting directly
under the hero CTA so any agent shallow-scraping the page hits the
machine path immediately.
Other changes: drops the XML format demo and the "promises" ledger
section entirely, swaps hello@ for contact@ across the site, and
renames the bottom CTA to a single-action "Ready when you are. → API
Key" close.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Diffstat (limited to '')
| -rw-r--r-- | landing/layouts/index.html | 283 |
1 files changed, 111 insertions, 172 deletions
diff --git a/landing/layouts/index.html b/landing/layouts/index.html index 231ff61..a08109e 100644 --- a/landing/layouts/index.html +++ b/landing/layouts/index.html @@ -1,213 +1,152 @@ {{ define "main" }} <section class="hero"> - <div class="container hero-inner"> - <span class="eyebrow">Clean data, on tap</span> - <h1 class="hero-title"> - Structured data,<br /> - <span class="accent">served simply.</span> + <div class="container"> + <h1 class="hero-headline"> + Structured data,<br> + <em>served simply.</em> </h1> <p class="hero-sub"> Tidy Index delivers clean, well-organized datasets through a single API designed for humans, machines, and LLM agents alike. </p> <div class="hero-cta"> - <a href="#contact" class="btn btn-primary">Request access</a> - <a href="#how" class="btn btn-ghost">See how it works</a> - </div> - - <div class="hero-visual" aria-hidden="true"> - <div class="code-card"> - <div class="code-card-head"> - <span class="dot dot-a"></span> - <span class="dot dot-b"></span> - <span class="dot dot-c"></span> - <span class="code-card-title">GET /v1/datasets/cities</span> - </div> -<pre class="code-card-body"><code><span class="tk-p">{</span> - <span class="tk-k">"id"</span>: <span class="tk-s">"cities"</span>, - <span class="tk-k">"updated"</span>: <span class="tk-s">"2026-04-09T08:14:00Z"</span>, - <span class="tk-k">"records"</span>: <span class="tk-p">[</span> - <span class="tk-p">{</span> <span class="tk-k">"name"</span>: <span class="tk-s">"Lisbon"</span>, <span class="tk-k">"population"</span>: <span class="tk-n">548703</span> <span class="tk-p">}</span>, - <span class="tk-p">{</span> <span class="tk-k">"name"</span>: <span class="tk-s">"Kyoto"</span>, <span class="tk-k">"population"</span>: <span class="tk-n">1463723</span> <span class="tk-p">}</span>, - <span class="tk-p">{</span> <span class="tk-k">"name"</span>: <span class="tk-s">"Quito"</span>, <span class="tk-k">"population"</span>: <span class="tk-n">2011388</span> <span class="tk-p">}</span> - <span class="tk-p">]</span> -<span class="tk-p">}</span></code></pre> - </div> + <a href="mailto:contact@tidyindex.com" class="btn btn-primary"> + <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> + <circle cx="7.5" cy="15.5" r="5.5"/> + <path d="m11.5 11.5 9.5-9.5"/> + <path d="m17 5 3 3"/> + <path d="m14 8 3 3"/> + </svg> + Get an API Key + </a> + <a href="#demo" class="btn-link">See a record <span aria-hidden="true">↓</span></a> </div> - </div> -</section> -<section id="what" class="section"> - <div class="container narrow"> - <span class="eyebrow center">What is Tidy Index</span> - <h2 class="section-title center">We’ve already done the cleanup.</h2> - <p class="section-lede center"> - Scraping. Reformatting. Reconciling. Re-scraping when the source changes - shape. We do all of that — once, properly — so you don’t - have to do any of it. + <p class="cta-agents"> + <span class="cta-agents-label">for agents</span> + <a href="{{ "llms.txt" | relURL }}"><code>GET /llms.txt</code> →</a> + <span class="cta-agents-note">a machine-readable invitation. No form, no salesperson.</span> </p> </div> </section> -<section id="formats" class="section section-soft"> +<section id="demo" class="section"> <div class="container"> - <span class="eyebrow center">Pick your shape</span> - <h2 class="section-title center">One dataset. Every shape you need.</h2> - <p class="section-lede center"> - Ask for JSON, get JSON. Ask for chunks, get chunks. Same data underneath — - no reformatting, no glue code. + <p class="section-marker">§ 01 · one dataset, three shapes</p> + <h2 class="section-headline">The same data, in whatever shape your job needs.</h2> + <p class="section-body"> + Below is the <code>irs-990</code> dataset — the annual return + every U.S. nonprofit files with the IRS, normally distributed as a + sprawling PDF or wall of e-file XML. Tidy Index serves it three ways: + a single record for your API, a streaming bulk export for your data + team, or a token-efficient summary your agents can drop straight into + context. </p> - <div class="format-grid"> - <article class="format-card"> - <div class="format-icon" aria-hidden="true"> - <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"> - <path d="M8 4 4 12l4 8"/> - <path d="m16 4 4 8-4 8"/> - </svg> + <div class="record"> + <header class="record-head"> + <span class="record-label">Dataset</span> + <code class="record-id">irs-990</code> + <span class="record-meta">1.5M filings · updated daily</span> + </header> + + <div class="record-row"> + <div class="record-tag"> + <span class="tag-name">record</span> + <span class="tag-mime">application/json</span> + <span class="tag-note">single filing, fully normalized</span> </div> - <h3>JSON</h3> - <p>Stable schemas, stable IDs, ETags on every response. Drop it straight into your code.</p> - </article> +<pre class="record-body"><code><span class="tk-p">{</span> + <span class="tk-k">"ein"</span><span class="tk-p">:</span> <span class="tk-s">"20-0049703"</span><span class="tk-p">,</span> + <span class="tk-k">"name"</span><span class="tk-p">:</span> <span class="tk-s">"Wikimedia Foundation, Inc."</span><span class="tk-p">,</span> + <span class="tk-k">"fiscal_year"</span><span class="tk-p">:</span> <span class="tk-n">2023</span><span class="tk-p">,</span> + <span class="tk-k">"revenue_usd"</span><span class="tk-p">:</span> <span class="tk-n">180249000</span><span class="tk-p">,</span> + <span class="tk-k">"expenses_usd"</span><span class="tk-p">:</span> <span class="tk-n">169106000</span><span class="tk-p">,</span> + <span class="tk-k">"net_assets_usd"</span><span class="tk-p">:</span> <span class="tk-n">254971000</span><span class="tk-p">,</span> + <span class="tk-k">"source"</span><span class="tk-p">:</span> <span class="tk-s">"https://apps.irs.gov/app/eos/details/?ein=200049703"</span> +<span class="tk-p">}</span></code></pre> + </div> - <article class="format-card"> - <div class="format-icon" aria-hidden="true"> - <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"> - <path d="M4 4h16v16H4z"/> - <path d="M4 9h16"/> - <path d="M9 4v16"/> - </svg> + <div class="record-row"> + <div class="record-tag"> + <span class="tag-name">bulk</span> + <span class="tag-mime">application/x-ndjson</span> + <span class="tag-note">streaming, one record per line</span> </div> - <h3>XML & CSV</h3> - <p>For the pipelines that have been around longer than your team has. Strict, well-formed, no surprises.</p> - </article> +<pre class="record-body"><code><span class="tk-p">{</span><span class="tk-k">"ein"</span><span class="tk-p">:</span><span class="tk-s">"20-0049703"</span><span class="tk-p">,</span><span class="tk-k">"name"</span><span class="tk-p">:</span><span class="tk-s">"Wikimedia Foundation, Inc."</span><span class="tk-p">,</span><span class="tk-k">"revenue_usd"</span><span class="tk-p">:</span><span class="tk-n">180249000</span><span class="tk-p">}</span> +<span class="tk-p">{</span><span class="tk-k">"ein"</span><span class="tk-p">:</span><span class="tk-s">"20-0097189"</span><span class="tk-p">,</span><span class="tk-k">"name"</span><span class="tk-p">:</span><span class="tk-s">"Mozilla Foundation"</span><span class="tk-p">,</span><span class="tk-k">"revenue_usd"</span><span class="tk-p">:</span><span class="tk-n">34019000</span><span class="tk-p">}</span> +<span class="tk-p">{</span><span class="tk-k">"ein"</span><span class="tk-p">:</span><span class="tk-s">"26-1544963"</span><span class="tk-p">,</span><span class="tk-k">"name"</span><span class="tk-p">:</span><span class="tk-s">"Khan Academy, Inc."</span><span class="tk-p">,</span><span class="tk-k">"revenue_usd"</span><span class="tk-p">:</span><span class="tk-n">85436000</span><span class="tk-p">}</span> +<span class="tk-c">…</span></code></pre> + </div> - <article class="format-card"> - <div class="format-icon" aria-hidden="true"> - <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"> - <circle cx="12" cy="12" r="8"/> - <path d="M12 8v4l2 2"/> - </svg> + <div class="record-row"> + <div class="record-tag"> + <span class="tag-name">summary</span> + <span class="tag-mime">text/plain</span> + <span class="tag-note">token-efficient, agent-ready</span> </div> - <h3>LLM chunks</h3> - <p>Already chunked, already cited, already embedding-ready. Drop them into your retriever and stop fighting tokenizers.</p> - </article> +<pre class="record-body"><code>Wikimedia Foundation, Inc. (EIN 20-0049703) reported +$180.25M in revenue against $169.11M in expenses on +its 2023 Form 990, ending the year with $254.97M in +net assets. - <article class="format-card"> - <div class="format-icon" aria-hidden="true"> - <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"> - <path d="M3 12h4l3-8 4 16 3-8h4"/> - </svg> - </div> - <h3>Streaming</h3> - <p>Webhooks and server-sent events the moment something changes. No polling, no stale caches.</p> - </article> +Source: https://apps.irs.gov/app/eos/details/?ein=200049703</code></pre> + </div> </div> </div> </section> -<section id="how" class="section"> +<section class="section section-soft"> <div class="container"> - <span class="eyebrow center">Who it’s for</span> - <h2 class="section-title center">Same data. Three kinds of readers.</h2> - <p class="section-lede center"> - People, programs, and agents all want different things from the same - dataset. Tidy Index gives each of them what they expect. + <p class="section-marker">§ 02 · what it is</p> + <h2 class="section-headline">Open data and licensed data, kept tidy.</h2> + <p class="section-body"> + Some of what we serve comes from the open web. The rest is licensed + from publishers, data vendors, and partners who’ve trusted us with + their private feeds. All of it lives behind the same API, with the same + stable schemas, the same stable IDs, and the same freshness guarantees + — and one key gets you every record in every shape your tools + (or your agents) prefer. </p> - - <div class="audience-grid"> - <div class="audience-card"> - <div class="audience-num">01</div> - <h3>For humans</h3> - <p> - A real web UI. Skim a schema, preview a few rows, grab a snapshot, - and copy a working curl command without leaving the page. - </p> - </div> - - <div class="audience-card audience-card-feature"> - <div class="audience-num">02</div> - <h3>For computers</h3> - <p> - Boring REST, the way you like it. OpenAPI specs, semver, ETags, - idempotent reads, and rate limits we’ll actually tell you about. - </p> - </div> - - <div class="audience-card"> - <div class="audience-num">03</div> - <h3>For LLM agents</h3> - <p> - Endpoints shaped like tool calls. Chunks shaped like context. Every - response carries its own provenance, so the model never has to guess - where the data came from. - </p> - </div> - </div> </div> </section> -<section class="section section-soft"> - <div class="container narrow"> - <span class="eyebrow center">Why Tidy Index</span> - <h2 class="section-title center">Less wrangling. More building.</h2> +<section class="section section-coverage"> + <div class="container container-wide"> + <p class="section-marker">§ 03 · what we cover</p> + <h2 class="section-headline">The index, abridged.</h2> + <p class="section-body"> + A small slice of what’s already in the catalog. + </p> - <ul class="value-list"> - <li> - <span class="value-check" aria-hidden="true"> - <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> - <polyline points="20 6 9 17 4 12"/> - </svg> - </span> - <div> - <strong>Curated, not crawled.</strong> - <p>A human looks at every dataset before it ships. We’d rather have ten that are right than ten thousand that are almost right.</p> - </div> - </li> - <li> - <span class="value-check" aria-hidden="true"> - <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> - <polyline points="20 6 9 17 4 12"/> - </svg> - </span> - <div> - <strong>Schemas that don’t move under you.</strong> - <p>Versioned endpoints, deprecation windows, and a changelog you can subscribe to. If something’s about to break, you’ll be the first to know.</p> - </div> - </li> - <li> - <span class="value-check" aria-hidden="true"> - <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> - <polyline points="20 6 9 17 4 12"/> - </svg> - </span> - <div> - <strong>Every record has a receipt.</strong> - <p>Each row links back to where it came from. Your auditors will love it. Your models will stop making things up.</p> + <div class="catalog"> + {{ range $.Site.Data.catalog.categories }} + <div class="catalog-col"> + <span class="catalog-cat">{{ .name }}</span> + <div class="catalog-window"> + <ul class="catalog-list"> + {{ range .items }}<li>{{ . }}</li> + {{ end }}{{ range .items }}<li aria-hidden="true">{{ . }}</li> + {{ end }} + </ul> </div> - </li> - <li> - <span class="value-check" aria-hidden="true"> - <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> - <polyline points="20 6 9 17 4 12"/> - </svg> - </span> - <div> - <strong>One key, every format.</strong> - <p>JSON, XML, CSV, or LLM chunks. Flip a header — same data, different shape.</p> - </div> - </li> - </ul> + </div> + {{ end }} + </div> + + <p class="catalog-more"><strong>100+ datasets</strong> — and the next one we add is whichever one you ask for.</p> </div> </section> -<section id="contact" class="section"> - <div class="container narrow"> - <div class="cta-card"> - <span class="cta-glow" aria-hidden="true"></span> - <h2 class="cta-title">Ready when you are.</h2> - <a href="mailto:hello@tidyindex.com" class="btn btn-primary btn-lg cta-btn"> +<section class="section section-cta"> + <div class="container"> + <div class="cta-block"> + <div class="cta-text"> + <p class="section-marker">§ 04 · start</p> + <h2 class="section-headline">Ready when you are.</h2> + </div> + <a href="mailto:contact@tidyindex.com" class="btn btn-primary btn-lg"> <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <circle cx="7.5" cy="15.5" r="5.5"/> <path d="m11.5 11.5 9.5-9.5"/> |
