Skip to content

feat(web): add blog link next to docs in landing header - #685

Merged
mthines merged 1 commit into
mainfrom
feat/landing-header-blog-link
Oct 11, 2026
Merged

mthines merged 1 commit into
mainfrom
feat/landing-header-blog-link

Conversation

@dash0-dev

@dash0-dev dash0-dev Bot commented Oct 11, 2026

Copy link
Copy Markdown
Contributor

Why

Almost all blog sessions land directly on /blog from external links; the landing page only reaches the blog through a small footer icon, so visitors already on the site rarely find it.

What changed

  • Landing header (/login) shows a Blog link right after Docs, from the sm breakpoint (640px) up.
  • Below sm it stays hidden, like Docs, so the mobile header keeps room for the GitHub icon and Sign in.
  • Docs and Blog share one class constant so their style and breakpoint can't drift apart.

How to verify

  • Open the preview at /login: Blog appears beside Docs at ≥ 640px, and both are hidden at 375px.

Notes for reviewers

No user-facing docs or llms.txt update: this adds a link to an existing public page, not a new capability.

Blog traffic arrives almost entirely from external links; the landing page
only links to /blog from a footer icon. Show a Blog link beside Docs from the
sm breakpoint up, hidden on mobile like Docs.

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown
Contributor

The dashboard preview for this PR — redeployed on each push that changes the web app.

Project Deployment Actions Updated
lorekit Ready Ready Preview Oct 11, 2026 4:40am UTC

Preview always points at this PR's latest commit; Deployment is the immutable build of afe7bb9. · Comment /web-preview to force a redeploy. · Workflow logs

@mthines
mthines marked this pull request as ready for review October 11, 2026 04:47
@mthines
mthines self-requested a review as a code owner October 11, 2026 04:47
@mthines
mthines merged commit 06b904c into main Oct 11, 2026
19 checks passed
@dash0-dev

dash0-dev Bot commented Oct 11, 2026 •

Copy link
Copy Markdown
Contributor Author

Darkplane would approve this pull request. Score 83.14 of 100, threshold 75. Blast radius 97, Evidence quality 62, Change footprint 90.

Darkplane would approve this pull request. It scored 83.14 of 100, clearing the threshold of 75. The pull request was already closed or merged, so Darkplane did not approve it.

  • 🟡 Evidence quality scored 62.
    The change is a small UI link in packages/web/src/app/(auth)/login/page.tsx. The checks that finished passed: typecheck, test and lint, the Storybook interaction and visual tests, and the Vercel preview deploy. The PR adds no test for the link and has no human review. Many checks are neutral, and two were still running.
The other 2 criteria
  • 🟢 Blast radius scored 97.
    The change touches only packages/web/src/app/(auth)/login/page.tsx (+9/-4). It adds a /blog link in the landing header and moves the shared link classes into one constant. The /blog route already exists under packages/web/src/app/blog, so the link isn't dead, and reverting is a single-file change.
  • 🟢 Change footprint scored 90.
    The change touches one UI file, packages/web/src/app/(auth)/login/page.tsx (+9/-4). It pulls the existing Docs link's class string into a shared constant and adds a matching Blog Link to /blog. This is a small, mechanical presentational edit with no logic, auth, or data changes. I did not check whether a /blog route exists.

An AI evaluator produced these scores from the diff, the repository history, and the pull request text. The pull request text is author-controlled, so treat the scores as signals rather than proof. Reviewed for commit afe7bb9.

Was this decision right? Give feedback

dash0-dev Bot added a commit that referenced this pull request Oct 11, 2026
…nto, honest next steps

Raises the PR's honest copy to a marketing page that sells:

- Hero leads with the problem and resolves it in one fixation
  ("Your coding agents forget. LoreKit remembers."), the README's own framing.
  The install command gets the amber frame and the page's only filled button;
  trust points move under it, to the moment of the click.
- The live demo becomes the hero's product shot, directly below it, and tilts
  flat as it scrolls in (CSS view() timeline, transform-only, flat at rest).
- New "01 / the problem" before/after, and a "03 / what you get" bento that
  absorbs MemoryCost and adds review-comment learning, one store for every
  tool, and grooming — each with a small picture of the behaviour.
- One heading system (mono numbered eyebrow, 30-36px title) and two repeated
  signature moves (lk-glow-frame, lk-gradient-text) across every section.
- Sticky blurred header; the Blog link from #685 now lives in the shared
  LandingHeader (the merge kept the slim /login).

Copy corrected against the CLI: install with a blank token still writes the
hosted MCP entry, so "works offline with no account" directly under the
command promised a setup one command does not produce. The hero and the
closing card now name both real paths — hosted (sign in, paste a token) and
offline (skip the token, switch to local mode) — at equal weight. Webhook
lessons are described as candidates that expire, matching webhook.ts.

Review findings applied: AuthHashCatcher comment no longer claims a move;
LandingBackdrop uses tokens, not hex; StepBadge replaces the duplicated
class; one GitHubMark replaces four inline copies of the SVG path.

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
mthines added a commit that referenced this pull request Oct 11, 2026
…login (#679)

* feat(web): rebuild the landing page as a marketing page, split from /login

`/` redirected every anonymous visitor to `/login`, so the front door was an
auth route titled "Sign in": a form before an explanation, with the product's
strongest verifiable claims — one command, works with no account, MIT,
self-hostable — below the fold of a page nobody had a reason to scroll.

`/` is now the marketing page and `/login` does only the job its URL names.
The hero's primary action is the install command rather than sign-in, because
the CLI's offline mode needs no account and an auth-first ordering described a
requirement that does not exist.

Three overstated claims are corrected: "never asks the same question twice"
(an absolute the retrieval model cannot guarantee), a bare "Free" badge (now
"Free · 5,000 memories", the actual free-plan cap), and a flat Claude Code /
Cursor / Codex list (Codex is feature-flagged and experimental). Two new
sections state what the page was missing: where lore physically lives, and
what LoreKit does not do.

* feat(web): make the landing page persuade — product shot, problem, bento, honest next steps

Raises the PR's honest copy to a marketing page that sells:

- Hero leads with the problem and resolves it in one fixation
  ("Your coding agents forget. LoreKit remembers."), the README's own framing.
  The install command gets the amber frame and the page's only filled button;
  trust points move under it, to the moment of the click.
- The live demo becomes the hero's product shot, directly below it, and tilts
  flat as it scrolls in (CSS view() timeline, transform-only, flat at rest).
- New "01 / the problem" before/after, and a "03 / what you get" bento that
  absorbs MemoryCost and adds review-comment learning, one store for every
  tool, and grooming — each with a small picture of the behaviour.
- One heading system (mono numbered eyebrow, 30-36px title) and two repeated
  signature moves (lk-glow-frame, lk-gradient-text) across every section.
- Sticky blurred header; the Blog link from #685 now lives in the shared
  LandingHeader (the merge kept the slim /login).

Copy corrected against the CLI: install with a blank token still writes the
hosted MCP entry, so "works offline with no account" directly under the
command promised a setup one command does not produce. The hero and the
closing card now name both real paths — hosted (sign in, paste a token) and
offline (skip the token, switch to local mode) — at equal weight. Webhook
lessons are described as candidates that expire, matching webhook.ts.

Review findings applied: AuthHashCatcher comment no longer claims a move;
LandingBackdrop uses tokens, not hex; StepBadge replaces the duplicated
class; one GitHubMark replaces four inline copies of the SVG path.

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>

* fix(web): align the before/after rows and turn how-it-works into one flow

From review of the preview:

- Before/after: the speaker column was 44px, so "agent ›" wrapped its chevron
  onto a second line on every agent row, and the long memory.write row wrapped
  too — the two transcripts drifted out of day-for-day alignment. Columns are
  now sized in ch (nowrap), the rows are short enough to stay on one line, and
  the cards sit side by side only from lg.
- How it works: the README ASCII box rendered with its top-right corner one
  column short of the right edge, left-aligned in a frame twice its width, and
  the step cards' connecting rule showed only as stubs in the gaps. Replaced
  both with one flow — session A → memory.write → store → memory.list →
  session B — where each step is a node and the calls label the arrows
  (vertical below lg). Uses the same fix/ssr-window lesson as the live demo.
- Two-sentence headings put the gradient payoff on its own line instead of
  breaking mid-sentence ("…starts from / zero. Yours…").

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>

* feat(web): measure the home page — reading depth, sections, and every CTA

Reuses the blog's reading model rather than inventing a second one:
ReadingTelemetry now mounts on / with contentType 'landing' (slug 'home'),
measured against the hero-to-closing-card wrapper. The home page therefore
emits the same content.scroll_depth / content.section_read / content.read
events as a blog post, split by lorekit.content.type.

- sections.ts is the single source of the eight section heading ids; every
  section imports its id from it and the page hands the ordered list to the
  telemetry, so a renamed heading cannot silently drop out of the data
  (sections.spec.ts pins the list).
- landing.cta_clicked (cta x placement, both closed unions) via one
  LandingLink for every link on the page: header, hero GitHub pill, the
  hero's hosted/offline choice, the closing card. get-token vs offline-guide
  from the hero is the direct read on which path visitors want.
- landing.demo_tab_selected: which demo use case a visitor picks (the
  auto-playing first tab is not counted).
- GetStartedButton (only caller was the closing card) folds into it as a
  tracked link.
- docs/otel.md: new landing.* table; the Content section no longer claims
  /docs is tracked — it never mounted ReadingTelemetry.

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>

* feat(web): lead with the learning loop — why LoreKit is not just a CLAUDE.md

The "01" example ("Zod, not Yup" written once, read back) argued for a
rules-file line, not for LoreKit. Replaced it with the thing a rules file
cannot do:

- "01 / why not just a CLAUDE.md?" — Your CLAUDE.md is frozen. Your lore
  keeps learning. A month in the life of one lesson, in four beats, each a
  shipped mechanic: LEARNS (agent writes it on friction, unprompted),
  RECALLS (a teammate's failing call gets it matched by the error text),
  PROMOTES (seen 3x -> permanent rule), PRUNES (unopened 90 days ->
  archived, restorable). Tries go 4 -> 1 -> 0, the loop closes back to the
  start, then a CLAUDE.md vs LoreKit table states it plainly — and positions
  LoreKit as how you find out what earns a place in your CLAUDE.md.
- Hero: "LoreKit remembers." -> "LoreKit makes them learn."; the lede now
  names the loop (write on friction, recall on the error, promote, archive).
- Live demo: the static "Code conventions" tab becomes "Promotion" — a CI
  flake seen for the third time gets promoted to a rule; next session is
  green first time. Tab telemetry id code-conventions -> promotion.
- Scroll-staggered card rise (lk-step) and a rail drawn as the section
  enters (lk-draw); transform-only, finished at rest.
- Section id the-problem -> learning-loop (sections.ts, docs/otel.md).

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>

* fix(web): un-overlap 01 and 02 — loop is the why, how-it-works is setup + team

From the preview review:

- 01 visual bugs: the rail through the stage icons ran between each
  stage's day label and verb (labels sat beside the icon on the rail's
  line) — labels now sit under the icon. Transcripts get a fixed four-line
  height so outcomes line up across cards (no more bottom-pinned text with
  gaps). The "and round again" label no longer masks the dashed line with
  an opaque box that didn't match the glow; it sits under the line.
- 02 retold 01's loop (write -> store -> read). Now it answers how the day-4
  teammate got the lesson: connect each agent (install's real status lines;
  Cursor is three copied files), lessons stay with their repo (narrow ->
  broad scope ladder in the scope colours), one shared set for the team
  (bind repo::acme/* to the org; members read+write one copy, CI reads
  with an lk_ro_ token, unbound stays personal). "Wire it once. The whole
  team learns." No arrow labels to cramp.
- Bento: "One store for every tool" duplicated the new team step; replaced
  with "Every lesson in plain sight" (Lore Explorer + greppable markdown).

Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>

---------

Co-authored-by: mads.thines <[email protected]>
Co-authored-by: dash0-dev[bot] <257284812+dash0-dev[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant