google search index
All checks were successful
CI — Website / Website — typecheck, build (pull_request) Successful in 57s
All checks were successful
CI — Website / Website — typecheck, build (pull_request) Successful in 57s
This commit is contained in:
@@ -22,6 +22,16 @@ Add an entry when a choice is hard to reverse, shapes future work, or a future m
|
||||
|
||||
## Log
|
||||
|
||||
### D-2026-09-03-01 — Website path URLs for Google indexing
|
||||
|
||||
- **Status:** accepted
|
||||
- **Context:** The marketing site used HashRouter (`/#/docs`). Google does not treat hash fragments as indexable URLs. Production already had SPA fallbacks.
|
||||
- **Decision:** Switch to BrowserRouter; prerender unique HTML for `/`, `/docs`, `/contribute`, `/community`; ship `/robots.txt` and `/sitemap.xml`; unknown paths return HTTP 404; rewrite legacy `#/…` hashes on load.
|
||||
- **Alternatives considered:** Keep hashes (rejected: not crawlable as pages); full SSR (rejected: extra stack for a static brochure).
|
||||
- **Consequences:** Coolify/nginx must keep SPA fallback for the four routes. Old social posts with `#/docs` still work via the hash rewrite.
|
||||
- **Verification:** `npm run website:build`; GET `/robots.txt`, `/sitemap.xml`, `/docs` 200 with unique titles; GET `/no-such-page` 404.
|
||||
- **Owner / date:** John Kevin / lead, 2026-09-03
|
||||
|
||||
### D-2026-08-13-01 — VS Code port: shared `src/lib` + native v1 UX
|
||||
|
||||
- **Status:** accepted
|
||||
|
||||
@@ -31,3 +31,4 @@ Tap targets ≥ 40px; body text contrast AA.
|
||||
| Feature list | Two-column hairline rows |
|
||||
| PackageCard | Chrome / VS Code / CLI |
|
||||
| DocsSection | Package docs blocks |
|
||||
| Not found | Unknown path: H1 + Home / Docs |
|
||||
|
||||
@@ -4,8 +4,7 @@
|
||||
|
||||
## Current state
|
||||
|
||||
- **Outcome:** Coolify `Cannot GET /` fixed — website now has a production static server and a Dockerfile.
|
||||
- **Cause:** Nixpacks built Vite `dist/` but had no `start` command; README also told Coolify to publish `/dist` (absolute empty path).
|
||||
- **Shipped:** `packages/website/server.mjs` (`npm start` on `0.0.0.0:$PORT`); `Dockerfile` + `nginx.conf`; `nixpacks.toml` `[start]`; Vite `base` is `/`.
|
||||
- **Verified:** `website:typecheck` + `website:build`; local `node server.mjs` → GET `/` 200 (LexAI HTML), `/healthz` 200, JS asset `text/javascript`.
|
||||
- **Next smallest action:** Redeploy the Coolify app with Base Directory `packages/website` (no leading slash), static site **off**, Dockerfile port 80 or Nixpacks port 3000.
|
||||
- **Outcome:** Website prepared for Google indexing (path URLs, robots, sitemap, unique titles).
|
||||
- **Shipped:** BrowserRouter; hash `#/…` rewrite; `public/robots.txt` + `sitemap.xml`; `src/seo.ts` + `SeoHead`; `inject-seo.mjs`; HTTP 404 + `NotFoundPage`; origin `https://lexai.juankibin.space`.
|
||||
- **Verified:** `website:build` OK. Local `node server.mjs`: `/` `/docs` `/robots.txt` `/sitemap.xml` 200 (docs title unique; sitemap `application/xml`); `/no-such-page` 404.
|
||||
- **Next smallest action:** Redeploy Coolify, then Search Console: verify property, submit sitemap, request index of `/` and `/docs`.
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
| Shared lib | `src/lib/` |
|
||||
| VS Code | `packages/vscode/` |
|
||||
| CLI | `packages/cli/` |
|
||||
| Website | `packages/website/` (Vite React; Home, Docs, Contribute, Community). Production: `npm start` → `server.mjs`, or `Dockerfile` (nginx :80). Coolify base `packages/website`, static site off. |
|
||||
| Website | `packages/website/` (Vite React; Home, Docs, Contribute, Community). BrowserRouter paths `/docs` etc. Origin `https://lexai.juankibin.space`. Production: `npm start` → `server.mjs`, or `Dockerfile` (nginx :80). Coolify base `packages/website`, static site off. |
|
||||
| OSS meta | root `README.md`, `LICENSE`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md` |
|
||||
| Issue/PR templates | `.gitea/ISSUE_TEMPLATE/`, `.gitea/PULL_REQUEST_TEMPLATE.md` |
|
||||
| CI workflows | `.gitea/workflows/ci-{chrome,vscode,cli,website}.yml` (no deploy/release yet) |
|
||||
|
||||
@@ -2,21 +2,21 @@
|
||||
|
||||
> For the owner. What works, how to see it, and what's waiting on you — plain language.
|
||||
|
||||
**Updated:** 2026-08-17 · **Overall:** Website Coolify 404 is fixed in the repo; needs a redeploy
|
||||
**Updated:** 2026-09-03 · **Overall:** Website is ready for Google Search; needs a Coolify redeploy, then Search Console
|
||||
|
||||
## What works now
|
||||
|
||||
- Chrome extension: select on any page → AI action → Replace/Copy
|
||||
- VS Code extension: select in editor → LexAI context menu / Command Palette → selection replaced
|
||||
- Website (`packages/website`): Home, Docs, Contribute, Community — production server answers `GET /` (this was the Coolify `Cannot GET /` failure)
|
||||
- Website (`packages/website`): Home, Docs, Contribute, Community at real paths (`/docs`, not `/#/docs`). `/robots.txt` and `/sitemap.xml` are in the build.
|
||||
|
||||
## See it yourself — website on Coolify
|
||||
|
||||
1. Pull/push this change, then in Coolify set **Base Directory** to `packages/website` (no leading slash).
|
||||
2. Turn **Is it a static site?** **off**.
|
||||
3. Either **Build Pack: Dockerfile** and port **80**, or **Nixpacks** and port **3000**.
|
||||
4. Redeploy, then open the domain — you should see the LexAI home page, not `Cannot GET /`.
|
||||
5. Docs live at `https://your-domain/#/docs`.
|
||||
4. Redeploy, then open `https://lexai.juankibin.space/` — docs at `/docs`.
|
||||
5. In [Google Search Console](https://search.google.com/search-console): add that URL, verify ownership, submit `https://lexai.juankibin.space/sitemap.xml`, request indexing for Home and Docs.
|
||||
|
||||
Local check: `npm run website:build` then `npm run website:start` and visit http://127.0.0.1:3000/
|
||||
|
||||
@@ -24,10 +24,11 @@ Local check: `npm run website:build` then `npm run website:start` and visit http
|
||||
|
||||
| # | Decision | Options (recommended bold) | What it unblocks |
|
||||
| --- | --- | --- | --- |
|
||||
| 1 | Redeploy the Coolify website with the settings above | **Dockerfile + port 80** / Nixpacks + port 3000 | public LexAI site |
|
||||
| 2 | Confirm Cursor mid/strong model picker IDs | **Keep written IDs** / send exact picker strings | reliable Task dispatch |
|
||||
| 3 | Grammarly reference screenshots? | **Later** / capture into `docs/reference/` | Chrome UX gauntlet |
|
||||
| 4 | Publish VS Code extension to Marketplace? | **Stay local for now** / set publisher + publish | public install |
|
||||
| 1 | Redeploy the Coolify website with the settings above | **Dockerfile + port 80** / Nixpacks + port 3000 | public LexAI site + crawlable URLs |
|
||||
| 2 | Google Search Console: verify + submit sitemap | **Do this after redeploy** / later | Google indexing |
|
||||
| 3 | Confirm Cursor mid/strong model picker IDs | **Keep written IDs** / send exact picker strings | reliable Task dispatch |
|
||||
| 4 | Grammarly reference screenshots? | **Later** / capture into `docs/reference/` | Chrome UX gauntlet |
|
||||
| 5 | Publish VS Code extension to Marketplace? | **Stay local for now** / set publisher + publish | public install |
|
||||
|
||||
## Next up — proceeds without you
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ _No active task contracts._
|
||||
|
||||
## Done (recent)
|
||||
|
||||
- **T-WEB-SEO-01** — Google indexing prep for `packages/website` (path URLs, robots/sitemap, unique titles, 404) (2026-09-03).
|
||||
- **T-VSCODE-01** — VS Code LexAI v1 (`packages/vscode`): native commands/menus, Secret Storage, shared `@lib` via esbuild; verified with `vscode:typecheck` + `vscode:build` + root typecheck/tests (2026-08-13).
|
||||
|
||||
## Task contract format
|
||||
|
||||
47
docs/design/website-indexing.md
Normal file
47
docs/design/website-indexing.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# Website indexing (Google)
|
||||
|
||||
## User + job
|
||||
|
||||
Someone searching for a BYO-LLM writing/code assist tool finds LexAI and lands on the matching page (home, docs, contribute, or community). Success: the snippet title and URL match the page they open.
|
||||
|
||||
## Flow
|
||||
|
||||
Search result → HTTPS path (`/`, `/docs`, `/contribute`, `/community`) → page. Old `#/docs` links redirect to `/docs` with no extra click. Unknown paths: one screen, link home. Target: 0 taps after the SERP click.
|
||||
|
||||
## Screen states
|
||||
|
||||
| State | What |
|
||||
| --- | --- |
|
||||
| Success | Existing Home / Docs / Contribute / Community; browser tab title matches the route |
|
||||
| Not found | H1 “Page not found”, one sentence, primary “Home”, secondary “Docs” |
|
||||
| Loading / empty / offline | Unchanged marketing pages (static). No new loading chrome |
|
||||
|
||||
## Components
|
||||
|
||||
Reuse `SiteHeader`, `SiteFooter`, `.page` / `.docs-content` / `.btn`. No new design-system pattern except **Not found** (same as `.page`).
|
||||
|
||||
## Copy (en)
|
||||
|
||||
- Title (404): Page not found
|
||||
- Body: That address is not a LexAI page. Check the URL or go back home.
|
||||
- Primary: Home
|
||||
- Secondary: Docs
|
||||
|
||||
Route titles/descriptions live in `src/seo.ts` (not on-page H1s).
|
||||
|
||||
## Accessibility
|
||||
|
||||
404 is a real `h1`; both actions are text links/buttons ≥ 40px; focus order follows visual order.
|
||||
|
||||
## Acceptance
|
||||
|
||||
1. `/docs`, `/contribute`, `/community` are path URLs (not `#/…`).
|
||||
2. `/robots.txt` allows `/` and names the sitemap.
|
||||
3. `/sitemap.xml` lists the four indexable URLs on `https://lexai.juankibin.space`.
|
||||
4. Each of those URLs has a unique `<title>` and meta description in the HTML file Google fetches.
|
||||
5. Unknown path shows the 404 copy; crawlers get HTTP 404.
|
||||
6. `#/docs` becomes `/docs`.
|
||||
|
||||
## Out of scope
|
||||
|
||||
Search Console verification token, sitemap ping, paid ads, i18n locales beyond en.
|
||||
Reference in New Issue
Block a user