SEO: every page ships a complete, shareable head
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 5/5
- Estimated time
- Over a week
- Newbie friendliness
- 30/100
- Issue type
- Feature
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- next.js, typescript
- Domain
- web-dev
Research direction
Start with app/layout.tsx and the route-specific generateMetadata implementations, then inspect app/api/looks/[id]/image/route.ts and app/api/products/[id]/image/route.ts. Review the route inventory and existing metadata examples such as cards/[id] and editions/[id]. Done means the checklist passes for all public, private, and token-addressed routes, including raster OG images, locale alternates, sitemap, and robots files.
Written by the indexing model from the issue text.
Description
Standing issue — do not close. SEO decays every time a route is added or a layout is reshaped.
This one stays open permanently: do not close it — not after a fix lands, not when the
checklist comes back clean. It is re-audited periodically and every pass is recorded in the log
at the bottom.
The bar
Every route a person can land on or paste into a chat window renders, without JavaScript:
- a specific
<title>anddescription— not the site default; openGraph(title,description,url,type,siteName,locale) and atwittercard;- an OG image that is raster (PNG/JPEG), at least 1200×630, and reachable by an anonymous crawler;
- a canonical URL, plus
alternates.languagesfor every locale inLOCALE_TAGS; robotsdirectives matching the page's privacy — private Looks and token-addressed pagesnoindex.
And once, at app level: metadataBase, app/sitemap.ts, app/robots.ts.
Baseline (832a1a6)
The title/description half is already done: all 20 page routes export generateMetadata with a real,
page-specific title and description, and app/layout.tsx:39 sets the %s · Lookline template.
Entirely missing:
openGraph/twitter— zero occurrences in the repo.metadataBase,app/sitemap.ts,app/robots.ts,alternates— none.opengraph-image— none.
Route-specific notes:
| Route | Note |
|---|---|
/l/[token], /a/[token] |
The share surfaces. These are what actually gets pasted into LINE or Messenger, so the OG image matters here most — and they must stay noindex, being token-addressed. |
/looks/[id] |
The generated Look image already lives in R2 and is served by app/api/looks/[id]/image/route.ts; the OG image should reuse it rather than re-render. Must respect canView — a private Look cannot leak a preview to a crawler. |
/p/[id] |
app/api/products/[id]/image/route.ts returns SVG, which Facebook, X and LINE will not render as an OG image. A product OG image needs a raster path. |
/trends |
Public and the strongest organic landing surface. Worth a real OG image, not a generic one. |
/me, /bag, /checkout, /checkout/done, /login, /admin |
Should be noindex. |
Per-pass checklist
- Every route added since the last pass has OG + Twitter + canonical.
- Every OG image URL returns 200, raster, ≥ 1200×630, to an unauthenticated request.
- Private and token-addressed routes are
noindex; public routes are not accidentallynoindex. -
sitemap.tslists exactly the public routes — no tokens, no private Looks. - Descriptions are page-specific and read as a sentence, not a keyword list.
-
alternates.languagescovers every locale inLOCALE_TAGS.
Log
| Date | Commit | Pass | Notes |
|---|---|---|---|
| 2026-09-19 | 832a1a6 | baseline | Gaps recorded above. Nothing implemented yet. |
| 2026-09-19 | 73bbc4f | auto | clean — 832a1a6..73bbc4f touches no route, no metadata and no component. |
| 2026-09-19 | c86a24d | auto | clean — 73bbc4f..c86a24d touches no route, no metadata and no component. |
| 2026-09-19 | 3d4e4a1 | auto | clean — c86a24d..834b2ee touches no route, no metadata and no component. |
| 2026-09-20 | 52ef4fa | auto | Two routes added in a 76-commit range: /previews/new and /previews/[id]. Both export generateMetadata with a real title, matching the repo standard, and both are owner-gated (notFound() for anonymous or non-owner), so neither is crawler-reachable. Both inherit the repo-wide gap — no openGraph, twitter, canonical or robots anywhere. The route count in this issue's baseline goes from 20 to 22. Not a regression; it is the standing gap. |
| 2026-09-20 | 8475f6e | auto | Progress on a baseline blocker. fb69641 deleted the SVG product renderer, so /api/articles/[id]/image now serves the article's real photograph out of R2 as image/webp instead of drawn SVG. The baseline table named that SVG as the reason /p/[id] had no viable OG image; a raster source now exists. The declaration itself is still missing — no openGraph anywhere — so the gap stands, but the blocker under it is gone. |
| 2026-09-20 | ad48e14 | auto | The first OG images in the repo land, and one gap fixed (#54). cards/[id] and editions/[id] each set metadataBase + openGraph and ship an opengraph-image.tsx (1200×630 PNG); verify/[code] sets metadataBase + openGraph without an image. Route inventory moved 22 → 31: twelve added (cards, collections ×3, editions, me/friends, me/personas, shop-talk, studio ×2, verify ×2), three removed with Asks (/a/[token], /asks/[id], /asks/new). Eleven of the twelve export generateMetadata; /me/friends did not and fell back to the bare Lookline default — fixed. Still open repo-wide: no twitter card anywhere, no canonical, no alternates.languages, no app/sitemap.ts, no app/robots.ts, and 28 of 31 routes have no openGraph. |
| 2026-09-20 | 437f498 | auto | clean — no route, metadata or component touched. The range is CI, Renovate config, and one query swap on /collections/[id]. |
| 2026-09-20 | ee3ea39 | auto | clean — no route, metadata or OG surface touched. |
- Dominant language
- TypeScript
- Stars
- 0
- Forks
- 1
- Avg merge
- 54m
- Merged PRs (30d)
- 49
Getting set up
This project ships no dev container, Dockerfile or contributing guide, so setting up is up to you: start from its README, and see our first-contribution guide for the general steps.
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from JacobLinCool/lookline
-
Dependency DashboardOpen
Difficulty 5/5 Over a week Newbie friendliness 20/100
JacobLinCool/lookline#55 ·
Maintainers usually reply within 1 day
-
[搜尋] 串接新版商品屬性:篩選、自然語言/語音、facet 與 URL 狀態一致May be free again @JacobLinCool claimed this 30 days ago, and no pull request is open. Open
JacobLinCool/lookline#31 · 1 assignee ·
Maintainers usually reply within 1 day
-
performance standing ux
Difficulty 4/5 3-5 days Newbie friendliness 38/100
JacobLinCool/lookline#6 ·
Maintainers usually reply within 1 day
-
standing ux
Difficulty 5/5 Over a week Newbie friendliness 35/100
JacobLinCool/lookline#5 ·
Maintainers usually reply within 1 day
-
cost performance standing
Difficulty 5/5 Over a week Newbie friendliness 25/100
JacobLinCool/lookline#4 ·
Maintainers usually reply within 1 day
All issues in JacobLinCool/lookline
Similar issues
-
e2e-failure ready-to-code
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
redhat-developer/rhdh-plugin-export-overlays#4460 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
Maintainers usually reply within 1 day
-
docs(api): openapi.yaml still documents gif-tools optimize colors as 2-256 instead of 2, 4, 16, 256Openarea: backend documentation priority: low
Difficulty 2/5 1-3 hours Newbie friendliness 84/100
snapotter-hq/SnapOtter#2919 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 77/100
obsidianmd/pele#39 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
biomejs/biome#12475 · 1 comment ·
Maintainers usually reply within 1 day