diff --git a/.agents/plugins/api_marketplace.json b/.agents/plugins/api_marketplace.json index bd87e4200..e3b190dd4 100644 --- a/.agents/plugins/api_marketplace.json +++ b/.agents/plugins/api_marketplace.json @@ -1,7 +1,7 @@ { "name": "clinical-kb-api-local", "interface": { - "displayName": "Clinical KB local" + "displayName": "PsychSift local" }, "plugins": [ { diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index f164c3d06..af6b5e799 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -1,7 +1,7 @@ { "name": "clinical-kb-local", "interface": { - "displayName": "Clinical KB local" + "displayName": "PsychSift local" }, "plugins": [ { diff --git a/.agents/skills/database-skills.md b/.agents/skills/database-skills.md index 8301eb670..0e8abb3fc 100644 --- a/.agents/skills/database-skills.md +++ b/.agents/skills/database-skills.md @@ -1,6 +1,6 @@ # Database skills catalog Run `npm run skills` to render the current categories from `catalog.json` and explanations from each canonical skill's frontmatter. -Run `npm run check:skills` to prove that every canonical skill and compatibility alias has valid local metadata and that all Claude, Cursor, and Clinical KB plugin skills satisfy shared safety policies. +Run `npm run check:skills` to prove that every canonical skill and compatibility alias has valid local metadata and that all Claude, Cursor, and PsychSift plugin skills satisfy shared safety policies. The `skills` skill uses this generated view, explains each unique skill in the chat, and recommends the smallest useful set for the current request. Compatibility aliases remain callable but are not counted or displayed as separate skills. diff --git a/.github/workflows/live-domain-monitor.yml b/.github/workflows/live-domain-monitor.yml index e5d7c3f0c..4611e5f8c 100644 --- a/.github/workflows/live-domain-monitor.yml +++ b/.github/workflows/live-domain-monitor.yml @@ -37,8 +37,8 @@ jobs: body="$(curl -sSL --fail --max-time 30 --retry 2 --retry-delay 10 --retry-all-errors "$LIVE_DOMAIN_URL/")" # The dashboard hydrates client-side (ssr:false), so assert on the # server-rendered document title, not client-rendered brand text. - echo "$body" | grep -q "Clinical KB" || { - echo "::error::Root responded but does not serve the Clinical KB document" + echo "$body" | grep -q "PsychSift" || { + echo "::error::Root responded but does not serve the PsychSift document" echo "First 300 bytes of response for diagnosis:" echo "$body" | head -c 300 exit 1 diff --git a/docs/brand/preview.html b/docs/brand/preview.html index 171775954..e2df335b8 100644 --- a/docs/brand/preview.html +++ b/docs/brand/preview.html @@ -526,7 +526,7 @@
The PsychSift mark
@@ -554,7 +554,7 @@

The set

@@ -564,7 +564,7 @@

The set

@@ -574,7 +574,7 @@

The set

@@ -584,7 +584,7 @@

The set

@@ -594,7 +594,7 @@

The set

@@ -605,13 +605,13 @@

The set

@@ -637,6 +637,12 @@

How it is built

ends of each stroke the two edges simply run into each other, and that crossing is the point — a sharp cusp, not a rounded cap.

+

+ The round point is placed by the same rule as the cut, not by eye. Its centre is exactly the centre of the throat + arc — the circle whose arc forms the concave face that cups it — so the crescent of white between the two is a + constant 7.2646 units all the way round, with no variation at all. Anywhere else in that bay the crescent tapers. + One measured width of negative space, twice: down the middle, and around the point. +

How it is built - + @@ -675,7 +681,7 @@

How it is built

class="edge b" d="M10.8397 97.54 A18.9638 18.9638 0 0 0 24.0003 70.3687 A13.91 13.91 0 0 1 24.2156 57.3713 L35.7966 36.3105 A58.982 58.982 0 0 1 50.8485 53.3959 A31.245 31.245 0 0 1 10.8397 97.54 Z" /> - + @@ -743,9 +749,15 @@

How it is built

The point - 60.4716, 17.3581 + 44.8724, 20.0286 + 10.4586 + concentric with the throat — a constant 7.2646 crescent + + + Small-size point + 54.8724, 20.0286 10.4586 - 43.95 along the cut, 14.90 off it + slid 10 out of the cradle; crescent opens to 11.55 @@ -760,15 +772,18 @@

Down to 16 px

rendered at true size

- The 4.2-unit gap between the two strokes is the first thing to close up. The second row is a separate cut for - small sizes: each facing edge moves 1.5 units away from the other, widening the gap to 7.2. Only those two lines - move, so the outer silhouette is the one in the primary file. + Two gaps close up first: the 4.2-unit cut between the strokes, and the 7.26-unit crescent around the point. The + second row is the small-size variant, which opens both. Each facing edge of the cut moves 1.5 units away from the + other, widening it to 7.2; only those two lines move, so the outer silhouette is the one in the primary file. The + point slides 10 units out of its cradle, opening the crescent to 11.55 and widening the ink box, so this variant + also carries its own centring. The three travel as a set. Below about 20 px the point fuses into the S whatever is + done — that is the size, not the placement.

Primary markpsychsift-mark.svg
Down to 16 px
Down to 16 px
Down to 16 px
Down to 16 px
Down to 16 px
Down to 16 px
Down to 16 px
Down to 16 px
Down to 16 px
Down to 16 px
Down to 16 px
Down to 16 px
Down to 16 px
Lockups
psychsift-lockup-horizontal.svg
psychsift-lockup-horizontal-tagline.svg
psychsift-lockup-horizontal-reverse.svg
psychsift-lockup-stacked.svg @@ -936,7 +951,15 @@

Lockups

05

Colours

+ the symbol carries the colour
+

+ In the application the mark has no tile at all: the S is drawn in the accent colour, standing directly on the + page, so on a white ground it reads as a mark rather than an app-store tile dropped into the chrome. The tile + survives only where the format cannot be transparent and something has to be painted — the .ico, the Apple touch + icon and the Android icons — and there it is the surface colour, not a brand colour. The navy tile below is the + brand sheet's own, for use away from the app. +

@@ -950,12 +973,22 @@

Colours

- + - + + + + + + + + + + + @@ -1046,7 +1079,7 @@

Clear space and misuse

> Clear space and misuse
@@ -1119,7 +1152,7 @@

Clear space and misuse

@@ -1131,7 +1164,7 @@

Clear space and misuse

@@ -1143,7 +1176,7 @@

Clear space and misuse

@@ -1248,14 +1281,19 @@

The files

09

Still open

- two for the owner; one now settled + one for the owner; two now settled
01

- Two taglines. The brand sheet gives "CLARITY. EVIDENCE. BETTER CARE." in its header and "Clinical - clarity. Evidence. Better care." in its footer. The lockup uses the first. One of them should be retired. + The strapline — chosen, on trial. The application now sets "From question to source" under the + wordmark: it names the exact job the app does, and it promises a route to evidence rather than an answer, + which is the honest claim for a reference tool that is not validated decision support. It replaces + "Source-backed clinical search". The brand sheet's own two taglines — "CLARITY. EVIDENCE. BETTER CARE." in its + header and "Clinical clarity. Evidence. Better care." in its footer — are still both in the sheet, and the + tagline lockup still carries the first. Once the strapline is confirmed, one line should serve everywhere and + the other two retired.

diff --git a/docs/brand/psychsift-logo.md b/docs/brand/psychsift-logo.md index 8f0726b83..1b280ae97 100644 --- a/docs/brand/psychsift-logo.md +++ b/docs/brand/psychsift-logo.md @@ -157,24 +157,43 @@ approximately — true is what fixes the cut's position; see **The middle line** ### The point -A circle of radius **10.4586** centred at **(60.4716, 17.3581)**. - -Measured against the cut, its centre sits **43.95 units along** the cut from the cut's midpoint and -**14.90 units off** it, on the lower stroke's side. Its nearest approach to the S is 13.65 units — -a little over three times the width of the cut, which is what keeps it reading as a separate -particle rather than part of the letter. +A circle of radius **10.4586** centred at **(44.8724, 20.0286)** — which is exactly the centre of +the throat arc. + +That is the whole of the placement rule. Because the point shares its centre with the arc that cups +it, the crescent of white between them is a **constant 7.2646 units** all the way round — 17.7232 +less the point's own 10.4586 — with zero variation. It is the same idea as the straight cut between +the two strokes: negative space of one measured width, not a gap that happens to look about right. +Move the point off that centre and the crescent immediately starts to taper. Its clearance to the +lower stroke is 8.18 units. + +**The small-size point** sits 10 units further out, at **(54.8724, 20.0286)**, opening the crescent +from 7.26 to 11.55. It travels with the widened cut as a set — the wider ink box it produces also +needs its own centring transform, and mixing one variant's point with the other's placement puts +the glyph off-centre in the tile. Below about 20 px the crescent is under two pixels and the point +fuses into the S whatever is done; that is the size, not the placement. + +Two earlier positions are worth recording, because both were wrong in instructive ways. It sat at +(60.4716, 17.3581) until 2026-08-28, well clear of the S to the upper right. The nearest point on +the entire S was the upper stroke's sharp tip, aimed straight at the circle from 13.65 units — 2.2 +px at a 16 px icon, which antialiasing closes. A sharp point aimed at a circle reads as contact +even when the numbers say otherwise. Dropping it 7 units to (60.4716, 24.3581) fixed the contact +reading and opened the approach to 18.46 units, but left it floating: too far out, and unrelated to +any curve in the mark. Cradling it in the throat resolves both, and gives the mark a hint of the +**P** in PsychSift alongside the S. An earlier draft of these files had it at (58.9234, 16.5279) with radius 10.2165. That was a measurement error, not a decision: 1.8 units in and 2.3% small, which crowded the S's shoulder and made the point look like a stray rather than a counterweight. -With the point included, the glyph spans 0 to 70.93 horizontally and 0 to 100.38 vertically. +With the point included, the glyph spans 0 to 55.33 horizontally and 0 to 100.38 vertically. +The small-size variant, whose point sits further out, spans 0 to 65.33 by the same 0 to 100.38. ### The tile A square with a corner radius of **3/16 of its side** (18.75%). The glyph is scaled to **80% of the tile height** and its ink bounding box — S and point together — is centred in the tile. At 512 px -that leaves 112 px clear on the left and right and 51 px top and bottom. +that leaves 143 px clear on the left and right and 51 px top and bottom. An earlier draft weighted the placement 46% of the way from the S's own centre toward the glyph's right edge, on the theory that the light point should not drag the heavy S leftward. It @@ -183,18 +202,28 @@ bounding box is both simpler and visibly right. ### Small sizes -At 32 px and below the 4.2-unit cut closes up. `psychsift-favicon.svg` is a separate optical cut for -that range: the gap is widened to **7.2 units** by moving each facing edge 1.5 units away from the -other, and the blends are re-solved against the lines they now meet. Because only the facing edges -move, the outer silhouette is identical to the one in the primary file. Use it for favicons, browser -tabs, and anything rendered under 32 px. +At 32 px and below two things close up: the 4.2-unit cut between the strokes, and the 7.26-unit +crescent around the point. `psychsift-favicon.svg` is a separate optical variant for that range, and +it changes both. + +The cut is widened to **7.2 units** by moving each facing edge 1.5 units away from the other, with +the blends re-solved against the lines they now meet. Because only the facing edges move, the outer +silhouette is identical to the one in the primary file. + +The point slides **10 units out of its cradle**, to (54.8724, 20.0286), opening the crescent to +11.55 units. That widens the ink bounding box to 65.33, so this variant also carries its own +centring transform; the three changes are one set and must not be mixed with the primary variant's +placement. Below about 20 px the crescent is under two pixels and the point fuses into the S +whatever is done — that is the size, not the placement. + +Use this variant for favicons, browser tabs, and anything rendered under 32 px. ### The maskable icon `psychsift-mark-maskable.svg` is full-bleed, because Android crops adaptive icons to whatever shape the launcher uses. Everything that must survive that crop has to sit inside a centred circle of **66.7% of the icon's width**. The glyph is scaled to **62% of the height**, which puts its furthest -ink 168 px from the centre of a 512 px icon against the 171 px the safe circle allows. Do not raise +ink 160 px from the centre of a 512 px icon against the 171 px the safe circle allows. Do not raise that 62%: an earlier draft used 58% with a different centring and still put ink 176 px out, outside the safe circle. diff --git a/docs/design-system.md b/docs/design-system.md index f9a9cea09..5b4337676 100644 --- a/docs/design-system.md +++ b/docs/design-system.md @@ -258,12 +258,32 @@ image"}` — never a possibly-empty variable alone. Do not re-draw the paths by hand: they are the exact output of the construction recorded in `docs/brand/psychsift-logo.md`, whose master artwork is in `public/brand/`, and the two strokes are one path plus its point reflection — which is the only reason the cut between them stays - parallel. `app/icon.svg` deliberately uses the mark's small-size cut (a wider gap), because that - is the file browsers render at 16–32 px. -- **The tile colour is not the brand's.** `BRAND_LIGHT.tile` / `BRAND_DARK.tile` are pinned to - `--clinical-accent` per theme by `tests/design-token-contract.test.ts`, so the mark rides the - application's accent rather than the brand sheet's Deep Navy. Putting the mark on navy means - moving that accent, which is an application-wide decision — not a brand-asset one. + parallel. `app/icon.svg` and `favicon.ico` deliberately use the mark's **small-size set**, because + they are the files browsers render at 16–32 px: the widened cut (`BRAND_STROKE_PATH_SMALL`), the + point slid out of its cradle (`BRAND_POINT_SMALL`), and the centring that the wider ink box needs + (`BRAND_GLYPH_TRANSFORM_SMALL`). Those three travel together — mixing one with the other + variant's placement puts the glyph off-centre in the tile — and `brandMarkInner(colors, true)` + selects all three from the single `small` flag so a caller cannot pick them apart. +- **The brand sheet is mirrored into `public/`.** `docs/brand/preview.html` is the generated + construction record; `public/brand/preview.html` is a byte-identical copy so the Developer Hub's + "Brand and design" card can link to it as a static file (`/brand/preview.html`). It is the one + hub panel that is not an app route, so `HubPanel.external` marks it, `PanelCard` renders it as a + real anchor rather than a `` (the client router has no entry for a file), and + `tests/developer-hub-panels.test.ts` both excludes it from the route-existence check and holds + the two copies identical by hash — a stale copy would show a retired mark to the one reader most + likely to trust it. Regenerate the doc, then copy it over the served one. +- **In the app the mark has no tile.** `BrandMark` draws the symbol alone, filled + `--clinical-accent`, standing directly on the page ground — so on a white page it reads as a + mark rather than an app-store tile pasted into the chrome. It uses + `BRAND_GLYPH_TRANSFORM_BARE`, which scales the glyph to fill its box, so it occupies the same + slot the tiled version did. The tiled form survives only where the format has no transparency + to fall back on: `favicon.ico`, `apple-icon`, and the PWA raster icons. +- **The tile is the ground, the ink is the brand.** `BRAND_*.ink` is pinned to `--clinical-accent` + and `BRAND_*.tile` to `--surface-raised`, per theme, by `tests/design-token-contract.test.ts`. + So the symbol rides the application's accent and the tile only ever matches the surface behind + it. The brand sheet's Deep Navy tile lives on in `public/brand/psychsift-mark.svg` for use off + the app; putting the in-app mark on navy would mean moving the accent, which is an + application-wide decision, not a brand-asset one. ## 11. What NOT to do diff --git a/docs/site-map.md b/docs/site-map.md index 8b7d5bdd3..2c27e0735 100644 --- a/docs/site-map.md +++ b/docs/site-map.md @@ -1,10 +1,10 @@ -# Clinical KB Site Map +# PsychSift Site Map This file is generated by `npm run docs:update` (or `npm run sitemap:update` directly). Run `npm run sitemap:check` to verify it is current. ## Main product routes -- `/` - Main Clinical KB shell. Source: `src/app/(search-app)/page.tsx`. +- `/` - Main PsychSift shell. Source: `src/app/(search-app)/page.tsx`. - `/calculators` - Compatibility redirect to the shared home at `/?mode=calculators`; a submitted `?q=…&run=1` forwards to `/calculators/search`. Source: `src/app/(search-app)/calculators/page.tsx`. - `/calculators/search` - Browsable calculator catalogue and scored results. An empty query lists every calculator; a submitted query narrows the same list. Source: `src/app/(search-app)/calculators/search/page.tsx`. - `/caring-contacts` - Caring Contacts workspace — a synthetic, non-clinical demonstration of caring-contact follow-up. Standalone: it owns its own navigation and is entered from the Tools catalogue. Source: `src/app/caring-contacts/page.tsx`. diff --git a/plugins/clinical-kb/.codex-plugin/plugin.json b/plugins/clinical-kb/.codex-plugin/plugin.json index 67e4aaf1c..f310515e6 100644 --- a/plugins/clinical-kb/.codex-plugin/plugin.json +++ b/plugins/clinical-kb/.codex-plugin/plugin.json @@ -1,26 +1,26 @@ { "name": "clinical-kb", "version": "0.1.0", - "description": "Repo guidance for Clinical KB, a Next.js clinical reference RAG app.", + "description": "Repo guidance for PsychSift, a Next.js clinical reference RAG app.", "author": { - "name": "Clinical KB maintainers", + "name": "PsychSift maintainers", "url": "https://github.com/BigSimmo" }, "repository": "https://github.com/BigSimmo/Database", "keywords": ["clinical-kb", "nextjs", "rag", "supabase", "clinical-safety", "local-development"], "skills": "./skills/", "interface": { - "displayName": "Clinical KB", - "shortDescription": "Work safely in the Clinical KB Next.js and Supabase RAG repo.", - "longDescription": "Clinical KB provides repo-specific Codex guidance for local server safety, Next.js 16 conventions, Supabase project safety, no-API verification, clinical governance checks, and focused verification choices.", - "developerName": "Clinical KB maintainers", + "displayName": "PsychSift", + "shortDescription": "Work safely in the PsychSift Next.js and Supabase RAG repo.", + "longDescription": "PsychSift provides repo-specific Codex guidance for local server safety, Next.js 16 conventions, Supabase project safety, no-API verification, clinical governance checks, and focused verification choices.", + "developerName": "PsychSift maintainers", "category": "Developer Tools", "capabilities": ["Read", "Write"], "websiteURL": "https://github.com/BigSimmo/Database", "defaultPrompt": [ - "Run the safe Clinical KB local server.", - "Verify my Clinical KB change without API calls.", - "Review this Clinical KB RAG change." + "Run the safe PsychSift local server.", + "Verify my PsychSift change without API calls.", + "Review this PsychSift RAG change." ], "brandColor": "#0B6F86" } diff --git a/plugins/clinical-kb/README.md b/plugins/clinical-kb/README.md index f99b1d08d..5e2cfe5e4 100644 --- a/plugins/clinical-kb/README.md +++ b/plugins/clinical-kb/README.md @@ -1,4 +1,4 @@ -# Clinical KB Codex Plugin +# PsychSift Codex Plugin This plugin follows the repo-local structure used by `openai/plugins`: diff --git a/plugins/clinical-kb/skills/clinical-kb-workflow/SKILL.md b/plugins/clinical-kb/skills/clinical-kb-workflow/SKILL.md index 48fb55cf5..ee4b0318f 100644 --- a/plugins/clinical-kb/skills/clinical-kb-workflow/SKILL.md +++ b/plugins/clinical-kb/skills/clinical-kb-workflow/SKILL.md @@ -1,11 +1,11 @@ --- name: clinical-kb-workflow -description: Use when working in the D:\Repos\Database Clinical KB repo, especially for local run, UI/browser QA, Supabase/OpenAI/RAG changes, clinical governance, dependency/upload shortcuts, or choosing verification. +description: Use when working in the D:\Repos\Database PsychSift repo, especially for local run, UI/browser QA, Supabase/OpenAI/RAG changes, clinical governance, dependency/upload shortcuts, or choosing verification. --- -# Clinical KB Workflow +# PsychSift Workflow -Use this skill for `D:\Repos\Database`, the Clinical KB Next.js clinical reference RAG app. +Use this skill for `D:\Repos\Database`, the PsychSift Next.js clinical reference RAG app. Root `AGENTS.md` remains authoritative. If these notes drift, inspect the repo before acting. ## Repo Basics diff --git a/public/brand/preview.html b/public/brand/preview.html new file mode 100644 index 000000000..e2df335b8 --- /dev/null +++ b/public/brand/preview.html @@ -0,0 +1,1324 @@ +PsychSift Mark + + + + + +
+
+ The PsychSift mark +
+

PsychSift

+

The mark, rebuilt as true vector geometry — every curve a circle with a stated centre and radius.

+
+
+
+
Drawn 28 Aug 2026
+
Primary file 863 bytes
+
Curves 4 arcs, 1 line, 1 circle
+
Source public/brand/
+
+ +
+
+ 01 +

The set

+ 13 SVG · 2 PNG +
+

+ One mark, cut for the grounds it actually has to sit on. The checkered stage shows where each file is transparent. +

+
+
+
+ +
+
Primary markpsychsift-mark.svg
+
+
+
+ +
+
On brand bluepsychsift-mark-blue.svg
+
+
+
+ +
+
On a light tilepsychsift-mark-light.svg
+
+
+
+ +
+
Maskablepsychsift-mark-maskable.svg
+
+
+
+ +
+
Small-size cutpsychsift-favicon.svg
+
+
+
+
+ +
+
+ +
+
+
Glyph, no tilepsychsift-glyph-*.svg
+
+
+
+ +
+
+ 02 +

How it is built

+ glyph units, S height = 100 +
+

+ The gap down the middle is drawn first, and it is one straight line. Each stroke's facing edge is that line, + offset by half the gap, so the two edges are exactly parallel — one width the whole way down, and neither can + curve against the other. Each stroke is then built out from its own edge: an outer sweep on a circle centred on + its own radius, tangent to the top and left of its box; a flatter arc two-thirds of the way down that hooks the + tail into a long fine point; a throat under the head; and a single blend that carries the throat onto the cut. + Both blends bend the same way, away from the other stroke, so nothing on either facing edge turns over. At both + ends of each stroke the two edges simply run into each other, and that crossing is the point — a sharp cusp, not a + rounded cap. +

+

+ The round point is placed by the same rule as the cut, not by eye. Its centre is exactly the centre of the throat + arc — the circle whose arc forms the concave face that cups it — so the crescent of white between the two is a + constant 7.2646 units all the way round, with no variation at all. Anywhere else in that bay the crescent tapers. + One measured width of negative space, twice: down the middle, and around the point. +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
Deep Navy #0D1B2AThe tile; and the S on light groundsThe brand-sheet tile, and the S on light grounds
White #FFFFFFThe S and the point, on navyThe S on navy; and the ground of every app icon
Accent Blue#1D6FB8The S in the application, light theme — the accent token
Accent Blue, dark#74BDF0The S in the application, dark theme
Brand Blue
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SegmentCentrerRole
The cut44.6629118.806°one straight line; both facing edges are it, offset ±2.1
Outer sweep29.2009, 29.200929.2009upper outer edge, head to two-thirds down
Tail hook51.5937, 16.141855.1234draws the tail to a point
Throat44.8724, 20.028617.7232the scoop under the head
Blend17.4753, 33.932413.0carries the throat onto the cut
Head cusp41.3675, 2.655436°outer sweep meets throat, sharp
Tail cusp18.0434, 59.879381°the cut meets the tail hook, sharp
Lower stroke55.1029, 100.3813×−1.07the upper stroke, turned and 7% larger — exactly the same path
The point44.8724, 20.028610.4586concentric with the throat — a constant 7.2646 crescent
Small-size point54.8724, 20.028610.4586slid 10 out of the cradle; crescent opens to 11.55
+
+
+ + +
+
+ 03 +

Down to 16 px

+ rendered at true size +
+

+ Two gaps close up first: the 4.2-unit cut between the strokes, and the 7.26-unit crescent around the point. The + second row is the small-size variant, which opens both. Each facing edge of the cut moves 1.5 units away from the + other, widening it to 7.2; only those two lines move, so the outer silhouette is the one in the primary file. The + point slides 10 units out of its cradle, opening the crescent to 11.55 and widening the ink box, so this variant + also carries its own centring. The three travel as a set. Below about 20 px the point fuses into the S whatever is + done — that is the size, not the placement. +

+
Primary markpsychsift-mark.svg
+
+
+ 16 +
+
+ 20 +
+
+ 24 +
+
+ 32 +
+
+ 48 +
+
+ 64 +
+
+ 96 +
+
+
Small-size cutpsychsift-favicon.svg — use at 32 px and below
+
+
+ 16 +
+
+ 20 +
+
+ 24 +
+
+ 32 +
+
+ 48 +
+
+ 64 +
+
+ 96 +
+
+
+ +
+
+ 04 +

Lockups

+ Inter Display SemiBold, outlined +
+

+ The wordmark is embedded as outlines, so the lockups render identically on a machine that has never seen Inter. +

+
+
+ psychsift-lockup-horizontal.svg +
+
+ psychsift-lockup-horizontal-tagline.svg +
+
+ psychsift-lockup-horizontal-reverse.svg +
+
+ psychsift-lockup-stacked.svg +
+
+ psychsift-wordmark.svg +
+
+
+ +
+
+ 05 +

Colours

+ the symbol carries the colour +
+

+ In the application the mark has no tile at all: the S is drawn in the accent colour, standing directly on the + page, so on a white ground it reads as a mark rather than an app-store tile dropped into the chrome. The tile + survives only where the format cannot be transparent and something has to be painted — the .ico, the Apple touch + icon and the Android icons — and there it is the surface colour, not a brand colour. The navy tile below is the + brand sheet's own, for use away from the app. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameHexWhere it is used
Deep Navy#0D1B2AThe brand-sheet tile, and the S on light grounds
White#FFFFFFThe S on navy; and the ground of every app icon
Accent Blue#1D6FB8The S in the application, light theme — the accent token
Accent Blue, dark#74BDF0The S in the application, dark theme
Brand Blue#2563EBThe blue tile; the lockup tagline
Cool Gray#F2F4F7The light tile
+
+
+ +
+
+ 06 +

What changed from the original

+
+

+ The mark on the brand sheet is the design. Measured from a high-resolution view of it, arc by arc, at the 50% + level of its anti-aliased edges — the one place on a blurred edge the blur does not bias. Three earlier drafts got + it wrong in instructive ways, and every error came from trusting a measurement the source could not support. +

+
+
+ 01 +

+ The terminals are sharp. At the size the original was first sampled, a sharp point blurs into a rounded + blob. The first draft fitted that blur and gave the mark rounded club-ends. Both tips are genuine cusps. +

+
+
+ 02 +

+ The tail leaves the main sweep. The second draft put the whole outer edge on one circle. It is not: + two-thirds of the way down, the outer edge peels away and hooks out — by three full units at the tip. That + hook is what draws the tail into a long fine point. Nearest-point fitting had hidden it; comparing coverage + against the original's grey levels showed it at once. +

+
+
+ 03 +

+ The middle line is one straight cut. Two drafts got this wrong the same way. The first gave each + stroke's facing edge its own circle, curving opposite ways, and the gap swelled from 5.4 units at its ends to + 8.6 in the middle. The second made both edges arcs of one circle, which fixed the width but left a 7.5-unit + blend reading as a knuckle on the spine. The strokes are now divided by a single straight line and each facing + edge is that line, offset — parallel by construction, so the gap cannot open and neither edge can curve + against the other. +

+
+
+ 04 +

+ The two blue points are gone, and the glyph is now centred in its tile rather than pressed against the + right edge. +

+
+
+ 05 +

+ The second stroke's outline stays 7% larger — kept, not corrected. Forcing the two to be identical + measurably worsens the match and opens the channel between them, which is the tension the mark depends on. +

+
+
+
+ +
+
+ 07 +

Clear space and misuse

+ the four rules that matter +
+

+ Keep a margin of at least one quarter of the mark's height clear on every side — of type, of image edges, of other + logos. The mark is already inset inside its own tile; this margin is measured from the tile. +

+
+
+ + + + + + + + clear space = 1/4 of the height + 1/4 + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
RuleWhy
Never re-space the two strokes + the gap is a constructed 4.2 units; widening it breaks the one relationship the mark is built on +
Never stretch it + every curve is a true circle; a non-uniform scale turns them into ellipses and the cut stops being + parallel +
Never add a shadow or gradient + the mark is one flat colour on one flat ground, and it has to survive being printed in black +
Never place the navy mark on a mid-tone + use psychsift-mark-light.svg on pale grounds and + psychsift-lockup-horizontal-reverse.svg on dark ones +
Never re-trace a PNGstart from the SVG; the raster exports exist only for systems that refuse vectors
+
+
+
+
+
+ +
+
+ Do not stretch itthe circles become ellipses and the cut stops being parallel +
+
+
+
+ +
+
+ Do not add a shadow or gradientthe mark is one flat colour on one flat ground +
+
+
+
+ +
+
+ Do not re-space the strokesthe 4.2-unit gap is the relationship the mark is built on +
+
+
+
+ +
+
+ Do not put it on a mid-toneuse the light file on pale grounds, the reverse on dark +
+
+
+
+ +
+
+ 08 +

The files

+ 13 SVG · 2 PNG · public/brand/ +
+

+ Every file here is generated from the same geometry, so they cannot drift apart. If the mark ever changes, all + fifteen are rebuilt together. +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FileUse it for
psychsift-mark.svgthe primary mark, navy tile — the default everywhere
psychsift-mark-blue.svgon brand blue
psychsift-mark-light.svgon a light tile, for pale backgrounds
psychsift-mark-maskable.svgfull-bleed square for PWA install and Android adaptive icons
psychsift-favicon.svgbrowser tabs and anything under 32 px
psychsift-glyph-white.svgthe glyph alone, white, no tile
psychsift-glyph-navy.svgthe glyph alone, navy, no tile
psychsift-glyph-mono.svgthe glyph in currentColor, for inlining
psychsift-lockup-horizontal.svgmark plus wordmark, light backgrounds
psychsift-lockup-horizontal-reverse.svgthe same, dark backgrounds
psychsift-lockup-horizontal-tagline.svgwith CLARITY. EVIDENCE. BETTER CARE.
psychsift-lockup-stacked.svgmark above wordmark, for narrow spaces
psychsift-wordmark.svgthe wordmark alone
psychsift-mark-1024.pngraster export, where SVG is refused
psychsift-mark-maskable-1024.pngraster export of the maskable icon
+
+

+ The mark carries role="img" and a <title>, so a screen reader announces it as + "PsychSift" when it is inlined. Next to the word PsychSift, mark it aria-hidden instead, so the name + is not read twice. +

+
+ +
+
+ 09 +

Still open

+ one for the owner; two now settled +
+
+
+ 01 +

+ The strapline — chosen, on trial. The application now sets "From question to source" under the + wordmark: it names the exact job the app does, and it promises a route to evidence rather than an answer, + which is the honest claim for a reference tool that is not validated decision support. It replaces + "Source-backed clinical search". The brand sheet's own two taglines — "CLARITY. EVIDENCE. BETTER CARE." in its + header and "Clinical clarity. Evidence. Better care." in its footer — are still both in the sheet, and the + tagline lockup still carries the first. Once the strapline is confirmed, one line should serve everywhere and + the other two retired. +

+
+
+ 02 +

+ Inter or Geist. The sheet specifies Inter throughout; the running application sets its interface in + Geist. The wordmark here is outlined artwork so it is unaffected either way, but a wordmark set live in Geist + would not match it. +

+
+
+ 03 +

+ The tail tips — settled. Both tails end in a clean angled cut at about 81°. A flatter tail hook would + draw them into finer points, closer to the blurry original; it was drawn, compared and rejected by the owner + on 2026-08-28. Fine points thin both strokes, they belong with a curved middle rather than a straight one, and + they are the first thing to disappear at 16 px. Do not revisit this without a reason the three of those do not + already answer. +

+
+
+
+ +
+ Master artwork in public/brand/ · construction recorded in docs/brand/psychsift-logo.md · + wordmark set in Inter, SIL Open Font License 1.1 +
+
diff --git a/public/brand/psychsift-favicon.svg b/public/brand/psychsift-favicon.svg index 4c98f6d1d..61e4ebf1a 100644 --- a/public/brand/psychsift-favicon.svg +++ b/public/brand/psychsift-favicon.svg @@ -1 +1 @@ -PsychSiftSimplified PsychSift mark for favicon and small sizes. +PsychSiftSimplified PsychSift mark for favicon and small sizes. diff --git a/public/brand/psychsift-glyph-mono.svg b/public/brand/psychsift-glyph-mono.svg index cbe702b61..b834fb774 100644 --- a/public/brand/psychsift-glyph-mono.svg +++ b/public/brand/psychsift-glyph-mono.svg @@ -1 +1 @@ -PsychSiftThe PsychSift glyph. +PsychSiftThe PsychSift glyph. diff --git a/public/brand/psychsift-glyph-navy.svg b/public/brand/psychsift-glyph-navy.svg index 54a385c72..1a649ba3a 100644 --- a/public/brand/psychsift-glyph-navy.svg +++ b/public/brand/psychsift-glyph-navy.svg @@ -1 +1 @@ -PsychSiftThe PsychSift glyph. +PsychSiftThe PsychSift glyph. diff --git a/public/brand/psychsift-glyph-white.svg b/public/brand/psychsift-glyph-white.svg index bfaaa2d0d..221d3c44f 100644 --- a/public/brand/psychsift-glyph-white.svg +++ b/public/brand/psychsift-glyph-white.svg @@ -1 +1 @@ -PsychSiftThe PsychSift glyph. +PsychSiftThe PsychSift glyph. diff --git a/public/brand/psychsift-lockup-horizontal-reverse.svg b/public/brand/psychsift-lockup-horizontal-reverse.svg index cff09a14c..fd575004b 100644 --- a/public/brand/psychsift-lockup-horizontal-reverse.svg +++ b/public/brand/psychsift-lockup-horizontal-reverse.svg @@ -1 +1 @@ -PsychSiftThe PsychSift horizontal lockup. +PsychSiftThe PsychSift horizontal lockup. diff --git a/public/brand/psychsift-lockup-horizontal-tagline.svg b/public/brand/psychsift-lockup-horizontal-tagline.svg index 5eb53d6db..cf2858af2 100644 --- a/public/brand/psychsift-lockup-horizontal-tagline.svg +++ b/public/brand/psychsift-lockup-horizontal-tagline.svg @@ -1 +1 @@ -PsychSiftThe PsychSift horizontal lockup. +PsychSiftThe PsychSift horizontal lockup. diff --git a/public/brand/psychsift-lockup-horizontal.svg b/public/brand/psychsift-lockup-horizontal.svg index df84c62c1..95dfc1bfb 100644 --- a/public/brand/psychsift-lockup-horizontal.svg +++ b/public/brand/psychsift-lockup-horizontal.svg @@ -1 +1 @@ -PsychSiftThe PsychSift horizontal lockup. +PsychSiftThe PsychSift horizontal lockup. diff --git a/public/brand/psychsift-lockup-stacked.svg b/public/brand/psychsift-lockup-stacked.svg index cc1faa59b..392c5c753 100644 --- a/public/brand/psychsift-lockup-stacked.svg +++ b/public/brand/psychsift-lockup-stacked.svg @@ -1 +1 @@ -PsychSiftThe PsychSift stacked lockup. +PsychSiftThe PsychSift stacked lockup. diff --git a/public/brand/psychsift-mark-1024.png b/public/brand/psychsift-mark-1024.png index 3b873a770..8a19bc642 100644 Binary files a/public/brand/psychsift-mark-1024.png and b/public/brand/psychsift-mark-1024.png differ diff --git a/public/brand/psychsift-mark-blue.svg b/public/brand/psychsift-mark-blue.svg index 807a0af89..af50d38e2 100644 --- a/public/brand/psychsift-mark-blue.svg +++ b/public/brand/psychsift-mark-blue.svg @@ -1 +1 @@ -PsychSiftThe PsychSift mark on brand blue. +PsychSiftThe PsychSift mark on brand blue. diff --git a/public/brand/psychsift-mark-light.svg b/public/brand/psychsift-mark-light.svg index 3e55c874e..379f46119 100644 --- a/public/brand/psychsift-mark-light.svg +++ b/public/brand/psychsift-mark-light.svg @@ -1 +1 @@ -PsychSiftThe PsychSift mark on a light tile. +PsychSiftThe PsychSift mark on a light tile. diff --git a/public/brand/psychsift-mark-maskable-1024.png b/public/brand/psychsift-mark-maskable-1024.png index 69633acd3..d03850279 100644 Binary files a/public/brand/psychsift-mark-maskable-1024.png and b/public/brand/psychsift-mark-maskable-1024.png differ diff --git a/public/brand/psychsift-mark-maskable.svg b/public/brand/psychsift-mark-maskable.svg index a42d1a7b6..52dea9535 100644 --- a/public/brand/psychsift-mark-maskable.svg +++ b/public/brand/psychsift-mark-maskable.svg @@ -1 +1 @@ -PsychSiftFull-bleed PsychSift mark with a maskable safe zone. +PsychSiftFull-bleed PsychSift mark with a maskable safe zone. diff --git a/public/brand/psychsift-mark.svg b/public/brand/psychsift-mark.svg index b36ac67f6..dda3ccdad 100644 --- a/public/brand/psychsift-mark.svg +++ b/public/brand/psychsift-mark.svg @@ -1 +1 @@ -PsychSiftThe PsychSift mark: two counter-turning strokes forming an S, with a settled point. +PsychSiftThe PsychSift mark: two counter-turning strokes forming an S, with a settled point. diff --git a/public/offline.html b/public/offline.html index 9a628a723..68c90e6c7 100644 --- a/public/offline.html +++ b/public/offline.html @@ -7,7 +7,7 @@ - Clinical KB is offline + PsychSift is offline - + - + diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 68e93cede..9659cc5a6 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -58,13 +58,13 @@ const geistMono = localFont({ }); const baseMetadata: Metadata = { - applicationName: "Clinical KB", - title: "Clinical KB", + applicationName: "PsychSift", + title: "PsychSift", description: "Private medical guideline RAG knowledge base", robots: PRIVATE_APP_ROBOTS_METADATA, appleWebApp: { capable: true, - title: "Clinical KB", + title: "PsychSift", statusBarStyle: "black-translucent", }, }; diff --git a/src/app/manifest.ts b/src/app/manifest.ts index 26d3e4eba..997d2d746 100644 --- a/src/app/manifest.ts +++ b/src/app/manifest.ts @@ -7,8 +7,8 @@ import type { MetadataRoute } from "next"; // so light/dark can update without a static PWA manifest colour lock. export default function manifest(): MetadataRoute.Manifest { return { - name: "Clinical KB", - short_name: "Clinical KB", + name: "PsychSift", + short_name: "PsychSift", description: "Private medical guideline RAG knowledge base", id: "/", start_url: "/", @@ -35,7 +35,7 @@ export default function manifest(): MetadataRoute.Manifest { ], shortcuts: [ { - name: "Ask Clinical KB", + name: "Ask PsychSift", short_name: "Ask", description: "Open a source-backed clinical question", url: "/?mode=answer&focus=1", diff --git a/src/app/mockups/answer-evidence-popups/page.tsx b/src/app/mockups/answer-evidence-popups/page.tsx index 717000552..ed974bf1c 100644 --- a/src/app/mockups/answer-evidence-popups/page.tsx +++ b/src/app/mockups/answer-evidence-popups/page.tsx @@ -60,7 +60,7 @@ function Shell({ children }: { children: ReactNode }) {

- Clinical KB mockup + PsychSift mockup

diff --git a/src/app/mockups/calculators-bedside-sheet/page.tsx b/src/app/mockups/calculators-bedside-sheet/page.tsx index fdfd598da..882b86fce 100644 --- a/src/app/mockups/calculators-bedside-sheet/page.tsx +++ b/src/app/mockups/calculators-bedside-sheet/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { CalculatorsBedsideSheetMockup } from "@/components/calculator-mockups"; export const metadata: Metadata = { - title: "Calculators Bedside Sheet Mockup - Clinical KB", - description: "Multi-scale bedside assessment sheet with a running session summary for Clinical KB.", + title: "Calculators Bedside Sheet Mockup - PsychSift", + description: "Multi-scale bedside assessment sheet with a running session summary for PsychSift.", }; export default function CalculatorsBedsideSheetMockupRoute() { diff --git a/src/app/mockups/calculators-clinical-console/page.tsx b/src/app/mockups/calculators-clinical-console/page.tsx index baf66eeb2..509caa888 100644 --- a/src/app/mockups/calculators-clinical-console/page.tsx +++ b/src/app/mockups/calculators-clinical-console/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { CalculatorsClinicalConsoleMockup } from "@/components/calculator-mockups"; export const metadata: Metadata = { - title: "Calculators Clinical Console Mockup - Clinical KB", - description: "Split-pane psychiatry calculator console with a live score ticker for Clinical KB.", + title: "Calculators Clinical Console Mockup - PsychSift", + description: "Split-pane psychiatry calculator console with a live score ticker for PsychSift.", }; export default function CalculatorsClinicalConsoleMockupRoute() { diff --git a/src/app/mockups/calculators-directory-grid/page.tsx b/src/app/mockups/calculators-directory-grid/page.tsx index 811927db5..5bce7f632 100644 --- a/src/app/mockups/calculators-directory-grid/page.tsx +++ b/src/app/mockups/calculators-directory-grid/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { CalculatorsDirectoryGridMockup } from "@/components/calculator-mockups"; export const metadata: Metadata = { - title: "Calculators Directory Grid Mockup - Clinical KB", - description: "Searchable psychiatry calculator directory with expand-in-place scoring for Clinical KB.", + title: "Calculators Directory Grid Mockup - PsychSift", + description: "Searchable psychiatry calculator directory with expand-in-place scoring for PsychSift.", }; export default function CalculatorsDirectoryGridMockupRoute() { diff --git a/src/app/mockups/calculators-guided-flow/page.tsx b/src/app/mockups/calculators-guided-flow/page.tsx index eeab3f746..98c2fd103 100644 --- a/src/app/mockups/calculators-guided-flow/page.tsx +++ b/src/app/mockups/calculators-guided-flow/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { CalculatorsGuidedFlowMockup } from "@/components/calculator-mockups"; export const metadata: Metadata = { - title: "Calculators Guided Flow Mockup - Clinical KB", - description: "Phone-first one-question-at-a-time psychiatry calculator flow for Clinical KB.", + title: "Calculators Guided Flow Mockup - PsychSift", + description: "Phone-first one-question-at-a-time psychiatry calculator flow for PsychSift.", }; export default function CalculatorsGuidedFlowMockupRoute() { diff --git a/src/app/mockups/calculators-popup-sheet/page.tsx b/src/app/mockups/calculators-popup-sheet/page.tsx index ef91a5d44..96837a8ed 100644 --- a/src/app/mockups/calculators-popup-sheet/page.tsx +++ b/src/app/mockups/calculators-popup-sheet/page.tsx @@ -3,9 +3,9 @@ import type { Metadata } from "next"; import { CalculatorsPopupSheetMockup } from "@/components/calculator-mockups"; export const metadata: Metadata = { - title: "Calculators Popup Sheet Mockup - Clinical KB", + title: "Calculators Popup Sheet Mockup - PsychSift", description: - "Search-first psychiatry calculators page where each calculator opens as a desktop dialog or mobile bottom sheet for Clinical KB.", + "Search-first psychiatry calculators page where each calculator opens as a desktop dialog or mobile bottom sheet for PsychSift.", }; export default function CalculatorsPopupSheetMockupRoute() { diff --git a/src/app/mockups/calculators-search-page/page.tsx b/src/app/mockups/calculators-search-page/page.tsx index 2e39887c4..025ec4dfd 100644 --- a/src/app/mockups/calculators-search-page/page.tsx +++ b/src/app/mockups/calculators-search-page/page.tsx @@ -3,9 +3,9 @@ import type { Metadata } from "next"; import { CalculatorsSearchPageMockup } from "@/components/calculator-mockups"; export const metadata: Metadata = { - title: "Calculators Search Page Mockup - Clinical KB", + title: "Calculators Search Page Mockup - PsychSift", description: - "Search-results-shell psychiatry calculators page listing every calculator as a tile with a domain rail and popup scoring for Clinical KB.", + "Search-results-shell psychiatry calculators page listing every calculator as a tile with a domain rail and popup scoring for PsychSift.", }; export default function CalculatorsSearchPageMockupRoute() { diff --git a/src/app/mockups/calculators-search/page.tsx b/src/app/mockups/calculators-search/page.tsx index 804b0a21d..f80b6dc1a 100644 --- a/src/app/mockups/calculators-search/page.tsx +++ b/src/app/mockups/calculators-search/page.tsx @@ -3,9 +3,9 @@ import type { Metadata } from "next"; import { CalculatorsSearchDetailMockup } from "@/components/calculator-mockups"; export const metadata: Metadata = { - title: "Calculators Search Mockup - Clinical KB", + title: "Calculators Search Mockup - PsychSift", description: - "Search-first psychiatry calculators page with individual calculator detail view and score-linked next clinical actions for Clinical KB.", + "Search-first psychiatry calculators page with individual calculator detail view and score-linked next clinical actions for PsychSift.", }; export default function CalculatorsSearchMockupRoute() { diff --git a/src/app/mockups/calculators-show-all/page.tsx b/src/app/mockups/calculators-show-all/page.tsx index 2fb4a04a2..98e907d10 100644 --- a/src/app/mockups/calculators-show-all/page.tsx +++ b/src/app/mockups/calculators-show-all/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { CalculatorsShowAllDirectionsMockup } from "@/components/calculator-mockups"; export const metadata: Metadata = { - title: "Calculators Show all buttons - Clinical KB", + title: "Calculators Show all buttons - PsychSift", description: "Recommended Show all chip plus two polished phone alternatives. The homes are identical except the chip.", }; diff --git a/src/app/mockups/care-plan/page.tsx b/src/app/mockups/care-plan/page.tsx index f8890508e..1cffe3e42 100644 --- a/src/app/mockups/care-plan/page.tsx +++ b/src/app/mockups/care-plan/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { CarePlanRoutePage } from "./route-page"; export const metadata: Metadata = { - title: "Care Plan prototype · Clinical KB", + title: "Care Plan prototype · PsychSift", description: "A fully synthetic, memory-only prototype for continuity planning in recurrent emergency care.", }; diff --git a/src/app/mockups/caring-contacts/page.tsx b/src/app/mockups/caring-contacts/page.tsx index 5ce20c921..fa6c583b7 100644 --- a/src/app/mockups/caring-contacts/page.tsx +++ b/src/app/mockups/caring-contacts/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { CaringContactRoutePage } from "./route-page"; export const metadata: Metadata = { - title: "Caring Contact prototype · Clinical KB", + title: "Caring Contact prototype · PsychSift", description: "A fully synthetic, one-way Caring Contact coordination prototype.", }; diff --git a/src/app/mockups/development/clinical-trust/page.tsx b/src/app/mockups/development/clinical-trust/page.tsx index 57988e86b..2079031bf 100644 --- a/src/app/mockups/development/clinical-trust/page.tsx +++ b/src/app/mockups/development/clinical-trust/page.tsx @@ -5,7 +5,7 @@ import { ArrowLeft } from "lucide-react"; import { ClinicalTrustCockpit } from "@/components/developer-area/clinical-trust-cockpit"; export const metadata: Metadata = { - title: "Clinical trust · Developer · Clinical KB", + title: "Clinical trust · Developer · PsychSift", description: "Administrator-only quality feedback, source-impact, and content-maturity evidence.", }; diff --git a/src/app/mockups/development/documentation/page.tsx b/src/app/mockups/development/documentation/page.tsx index dc6f4cab6..6d47c6841 100644 --- a/src/app/mockups/development/documentation/page.tsx +++ b/src/app/mockups/development/documentation/page.tsx @@ -15,7 +15,7 @@ import { } from "@/lib/developer-area/repo-awareness-snapshot"; export const metadata: Metadata = { - title: "Documentation · Developer · Clinical KB", + title: "Documentation · Developer · PsychSift", description: "Every committed document, its area of the repository, and whether the docs index lists it.", }; diff --git a/src/app/mockups/development/ingestion/page.tsx b/src/app/mockups/development/ingestion/page.tsx index a66abf073..79a40885f 100644 --- a/src/app/mockups/development/ingestion/page.tsx +++ b/src/app/mockups/development/ingestion/page.tsx @@ -5,7 +5,7 @@ import { PanelPageShell } from "@/components/developer-area/hub/panel-page-shell import { resolveLiveFreshness } from "@/lib/developer-area/freshness"; export const metadata: Metadata = { - title: "Ingestion · Developer · Clinical KB", + title: "Ingestion · Developer · PsychSift", description: "Whether an uploaded document actually indexed — queued, processing, finished, or stuck — read live.", }; diff --git a/src/app/mockups/development/ledger/page.tsx b/src/app/mockups/development/ledger/page.tsx index 32fed581b..130f4ece5 100644 --- a/src/app/mockups/development/ledger/page.tsx +++ b/src/app/mockups/development/ledger/page.tsx @@ -12,7 +12,7 @@ import { } from "@/lib/developer-area/ledger-snapshot"; export const metadata: Metadata = { - title: "Task ledger · Developer · Clinical KB", + title: "Task ledger · Developer · PsychSift", description: "Every outstanding task, recommendation and issue, read from the committed ledger snapshot.", }; diff --git a/src/app/mockups/development/page.tsx b/src/app/mockups/development/page.tsx index 4d1b1d9e3..5ff711fed 100644 --- a/src/app/mockups/development/page.tsx +++ b/src/app/mockups/development/page.tsx @@ -10,7 +10,7 @@ import { loadLedgerSnapshot } from "@/lib/developer-area/ledger-snapshot"; import { resolveDeploymentCommitSha } from "@/lib/observability/sentry-release"; export const metadata: Metadata = { - title: "Developer · Clinical KB", + title: "Developer · PsychSift", description: "In-progress surfaces and repository state, reachable only to a signed-in administrator account.", }; diff --git a/src/app/mockups/development/review-state/page.tsx b/src/app/mockups/development/review-state/page.tsx index 1ce04a9a7..8d153b48f 100644 --- a/src/app/mockups/development/review-state/page.tsx +++ b/src/app/mockups/development/review-state/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { ReviewStatePageContent } from "@/components/developer-area/hub/review-state-page-content"; export const metadata: Metadata = { - title: "Review state · Developer · Clinical KB", + title: "Review state · Developer · PsychSift", description: "Every immutable review record: which ref was reviewed, at which head, with what outcome.", }; diff --git a/src/app/mockups/development/routes/page.tsx b/src/app/mockups/development/routes/page.tsx index f8b3c12dd..b0718db3d 100644 --- a/src/app/mockups/development/routes/page.tsx +++ b/src/app/mockups/development/routes/page.tsx @@ -12,7 +12,7 @@ import { PanelPageShell } from "@/components/developer-area/hub/panel-page-shell import { loadRepoAwarenessSnapshot, resolveRepoFreshness } from "@/lib/developer-area/repo-awareness-snapshot"; export const metadata: Metadata = { - title: "Routes and modes · Developer · Clinical KB", + title: "Routes and modes · Developer · PsychSift", description: "Every page route, redirect, API route and app mode, read from the committed repository snapshot.", }; diff --git a/src/app/mockups/development/test-health/page.tsx b/src/app/mockups/development/test-health/page.tsx index 78e4b2a55..7e2fbb566 100644 --- a/src/app/mockups/development/test-health/page.tsx +++ b/src/app/mockups/development/test-health/page.tsx @@ -6,7 +6,7 @@ import { QuarantineList } from "@/components/developer-area/hub/quarantine-list" import { loadRepoAwarenessSnapshot, resolveRepoFreshness } from "@/lib/developer-area/repo-awareness-snapshot"; export const metadata: Metadata = { - title: "Test health · Developer · Clinical KB", + title: "Test health · Developer · PsychSift", description: "Quarantined tests, why each was quarantined, and when its quarantine lapses.", }; diff --git a/src/app/mockups/document-navigation-contract/page.tsx b/src/app/mockups/document-navigation-contract/page.tsx index 3739903c5..9a824d919 100644 --- a/src/app/mockups/document-navigation-contract/page.tsx +++ b/src/app/mockups/document-navigation-contract/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentNavigationContractMockups } from "@/components/document-navigation-contract-mockups"; export const metadata: Metadata = { - title: "Document navigation against the chrome contract - Clinical KB", + title: "Document navigation against the chrome contract - PsychSift", description: "Two complete document-navigation candidates at desktop, tablet, and phone, built to the shipped header and footer behaviour.", }; diff --git a/src/app/mockups/document-navigation-final-review/page.tsx b/src/app/mockups/document-navigation-final-review/page.tsx index 72cf0b5b6..038106df6 100644 --- a/src/app/mockups/document-navigation-final-review/page.tsx +++ b/src/app/mockups/document-navigation-final-review/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentNavigationFinalReviewMockups } from "@/components/document-navigation-final-review-mockups"; export const metadata: Metadata = { - title: "Document navigation, final review - Clinical KB", + title: "Document navigation, final review - PsychSift", description: "Two final document-navigation versions at desktop, tablet, and phone, with every issue from the study resolved.", }; diff --git a/src/app/mockups/document-navigation-final/page.tsx b/src/app/mockups/document-navigation-final/page.tsx index 79a9cd047..83c0468ec 100644 --- a/src/app/mockups/document-navigation-final/page.tsx +++ b/src/app/mockups/document-navigation-final/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentNavigationFinalMockups } from "@/components/document-navigation-final-mockups"; export const metadata: Metadata = { - title: "Document navigation, final design - Clinical KB", + title: "Document navigation, final design - PsychSift", description: "The final document navigation design: segment-track header row and a two-column section grid, at desktop, tablet, and phone.", }; diff --git a/src/app/mockups/document-navigation-pane/page.tsx b/src/app/mockups/document-navigation-pane/page.tsx index f3638f10b..77242caf4 100644 --- a/src/app/mockups/document-navigation-pane/page.tsx +++ b/src/app/mockups/document-navigation-pane/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentNavigationPaneMockups } from "@/components/document-navigation-pane-mockups"; export const metadata: Metadata = { - title: "Document navigation pane mockups - Clinical KB", + title: "Document navigation pane mockups - PsychSift", description: "Three navigation panes anchored to the universal header for the document page, shown on desktop, tablet, and phone.", }; diff --git a/src/app/mockups/document-navigation-perfected/page.tsx b/src/app/mockups/document-navigation-perfected/page.tsx index dca4dbdef..7637e5396 100644 --- a/src/app/mockups/document-navigation-perfected/page.tsx +++ b/src/app/mockups/document-navigation-perfected/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentNavigationPerfectedMockups } from "@/components/document-navigation-perfected-mockups"; export const metadata: Metadata = { - title: "Document navigation, perfected - Clinical KB", + title: "Document navigation, perfected - PsychSift", description: "The final document navigation build, including the phone hide and reveal cycle and documents with fewer sections.", }; diff --git a/src/app/mockups/document-phone-fused-directions/page.tsx b/src/app/mockups/document-phone-fused-directions/page.tsx index 89fac1545..9ec47701b 100644 --- a/src/app/mockups/document-phone-fused-directions/page.tsx +++ b/src/app/mockups/document-phone-fused-directions/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentPhoneFusedDirectionsMockups } from "@/components/document-phone-fused-directions-mockups"; export const metadata: Metadata = { - title: "Document phone fused row directions - Clinical KB", + title: "Document phone fused row directions - PsychSift", description: "Three directions built on the fused phone title row for the document page.", }; diff --git a/src/app/mockups/document-phone-title-refined/page.tsx b/src/app/mockups/document-phone-title-refined/page.tsx index bb5945ab7..6d54c263f 100644 --- a/src/app/mockups/document-phone-title-refined/page.tsx +++ b/src/app/mockups/document-phone-title-refined/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentPhoneTitleRefinedMockups } from "@/components/document-phone-title-refined-mockups"; export const metadata: Metadata = { - title: "Document phone title refined mockups - Clinical KB", + title: "Document phone title refined mockups - PsychSift", description: "Three corrected variants of the fused phone title row for the document page.", }; diff --git a/src/app/mockups/document-phone-title/page.tsx b/src/app/mockups/document-phone-title/page.tsx index 32fe1c767..cb6851249 100644 --- a/src/app/mockups/document-phone-title/page.tsx +++ b/src/app/mockups/document-phone-title/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentPhoneTitleMockups } from "@/components/document-phone-title-mockups"; export const metadata: Metadata = { - title: "Document phone title mockups - Clinical KB", + title: "Document phone title mockups - PsychSift", description: "Three ways to keep the document title visible on a phone alongside the navigation pane.", }; diff --git a/src/app/mockups/document-phone-zero-chrome/page.tsx b/src/app/mockups/document-phone-zero-chrome/page.tsx index 404350d27..c037bddbb 100644 --- a/src/app/mockups/document-phone-zero-chrome/page.tsx +++ b/src/app/mockups/document-phone-zero-chrome/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentPhoneZeroChromeMockups } from "@/components/document-phone-zero-chrome-mockups"; export const metadata: Metadata = { - title: "Document phone navigation, zero new chrome - Clinical KB", + title: "Document phone navigation, zero new chrome - PsychSift", description: "Section navigation on the document page that adds no permanent phone chrome and no second scroll owner.", }; diff --git a/src/app/mockups/document-search-evidence-lens/page.tsx b/src/app/mockups/document-search-evidence-lens/page.tsx index b23844c34..3b52a7132 100644 --- a/src/app/mockups/document-search-evidence-lens/page.tsx +++ b/src/app/mockups/document-search-evidence-lens/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentSearchMockupPage } from "@/components/document-search-mockups"; export const metadata: Metadata = { - title: "Document Search Evidence Lens Mockup - Clinical KB", + title: "Document Search Evidence Lens Mockup - PsychSift", description: "Document search evidence lens mockup with selected source proof in view.", }; diff --git a/src/app/mockups/document-search-triage-board/page.tsx b/src/app/mockups/document-search-triage-board/page.tsx index 959f58f66..7ee8a9c21 100644 --- a/src/app/mockups/document-search-triage-board/page.tsx +++ b/src/app/mockups/document-search-triage-board/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { DocumentSearchMockupPage } from "@/components/document-search-mockups"; export const metadata: Metadata = { - title: "Document Search Triage Board Mockup - Clinical KB", - description: "Discovery-first document library triage board mockup for Clinical KB.", + title: "Document Search Triage Board Mockup - PsychSift", + description: "Discovery-first document library triage board mockup for PsychSift.", }; export default function DocumentSearchTriageBoardMockupRoute() { diff --git a/src/app/mockups/document-search/page.tsx b/src/app/mockups/document-search/page.tsx index c35ddd4b3..23c46c04c 100644 --- a/src/app/mockups/document-search/page.tsx +++ b/src/app/mockups/document-search/page.tsx @@ -4,8 +4,8 @@ import { Suspense } from "react"; import { MasterDocumentIndex } from "@/components/master-document-flow-mockups"; export const metadata: Metadata = { - title: "Document Search Mockups - Clinical KB", - description: "Master runnable document-search UX flow for Clinical KB document mode.", + title: "Document Search Mockups - PsychSift", + description: "Master runnable document-search UX flow for PsychSift document mode.", }; import { DocumentSearchPageSkeleton } from "@/components/mode-home-page-skeleton"; diff --git a/src/app/mockups/document-search/search/page.tsx b/src/app/mockups/document-search/search/page.tsx index 9e2326423..23b93c236 100644 --- a/src/app/mockups/document-search/search/page.tsx +++ b/src/app/mockups/document-search/search/page.tsx @@ -2,7 +2,7 @@ import type { Metadata } from "next"; import { Suspense } from "react"; import { MasterDocumentSearch } from "@/components/master-document-flow-mockups"; -export const metadata: Metadata = { title: "Document Search Mockup - Clinical KB" }; +export const metadata: Metadata = { title: "Document Search Mockup - PsychSift" }; export default function DocumentSearchMockupRoute() { return ( diff --git a/src/app/mockups/document-search/source-overlays/page.tsx b/src/app/mockups/document-search/source-overlays/page.tsx index c414d5f96..6ce29ae81 100644 --- a/src/app/mockups/document-search/source-overlays/page.tsx +++ b/src/app/mockups/document-search/source-overlays/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { SourceOverlayRedesignMockups } from "@/components/source-overlay-redesign-mockups"; export const metadata: Metadata = { - title: "Source Overlay Redesign Mockups - Clinical KB", + title: "Source Overlay Redesign Mockups - PsychSift", description: "Document scope and source library overlay redesign mockups for desktop and phone.", }; diff --git a/src/app/mockups/document-search/source/evidence/page.tsx b/src/app/mockups/document-search/source/evidence/page.tsx index 6d291518d..da34deb83 100644 --- a/src/app/mockups/document-search/source/evidence/page.tsx +++ b/src/app/mockups/document-search/source/evidence/page.tsx @@ -4,7 +4,7 @@ import { Suspense } from "react"; import { MasterEvidenceDetail } from "@/components/master-document-flow-mockups"; export const metadata: Metadata = { - title: "Evidence Detail Mockup - Clinical KB", + title: "Evidence Detail Mockup - PsychSift", description: "Functional evidence object mockup for tables, quotes, images, and source page context.", }; diff --git a/src/app/mockups/document-search/source/page.tsx b/src/app/mockups/document-search/source/page.tsx index cb9c3cf34..406d02fdd 100644 --- a/src/app/mockups/document-search/source/page.tsx +++ b/src/app/mockups/document-search/source/page.tsx @@ -2,7 +2,7 @@ import type { Metadata } from "next"; import { Suspense } from "react"; import { MasterDocumentReader } from "@/components/master-document-flow-mockups"; -export const metadata: Metadata = { title: "Document Reader Mockup - Clinical KB" }; +export const metadata: Metadata = { title: "Document Reader Mockup - PsychSift" }; export default function DocumentReaderMockupRoute() { return ( diff --git a/src/app/mockups/document-top-navigation/page.tsx b/src/app/mockups/document-top-navigation/page.tsx index adb72b4c0..aec4ed915 100644 --- a/src/app/mockups/document-top-navigation/page.tsx +++ b/src/app/mockups/document-top-navigation/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { DocumentTopNavigationMockups } from "@/components/document-top-navigation-mockups"; export const metadata: Metadata = { - title: "Document navigation menu mockups - Clinical KB", + title: "Document navigation menu mockups - PsychSift", description: "Three responsive document-page navigation concepts for phone, tablet, and desktop.", }; diff --git a/src/app/mockups/favourites-phone-perfected/page.tsx b/src/app/mockups/favourites-phone-perfected/page.tsx index c05030b89..27fa67142 100644 --- a/src/app/mockups/favourites-phone-perfected/page.tsx +++ b/src/app/mockups/favourites-phone-perfected/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { FavouritesPhonePerfectedMockupsPage } from "@/components/favourites-phone-perfected-mockups"; export const metadata: Metadata = { - title: "Favourites Phone Perfected Mockup - Clinical KB", + title: "Favourites Phone Perfected Mockup - PsychSift", description: "Phone-first Favourites page mockup drawn across every signed-in state.", }; diff --git a/src/app/mockups/filter-sheet-restyle/page.tsx b/src/app/mockups/filter-sheet-restyle/page.tsx index b3cfd2ed3..9b006140c 100644 --- a/src/app/mockups/filter-sheet-restyle/page.tsx +++ b/src/app/mockups/filter-sheet-restyle/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { FilterSheetRestyleMockupsPage } from "@/components/filter-sheet-restyle-mockups"; export const metadata: Metadata = { - title: "Filter sheet restyle · three styles - Clinical KB", + title: "Filter sheet restyle · three styles - PsychSift", description: "Three style directions for the shared filter sheet, drawn on the formulation specimen, with the segmented bar repurposed as a result-scope control.", }; diff --git a/src/app/mockups/mode-dropdown/page.tsx b/src/app/mockups/mode-dropdown/page.tsx index e4f4aecaa..7189feacd 100644 --- a/src/app/mockups/mode-dropdown/page.tsx +++ b/src/app/mockups/mode-dropdown/page.tsx @@ -179,7 +179,7 @@ export default function ModeDropdownMockupPage() {

- Clinical KB mockup + PsychSift mockup

diff --git a/src/app/mockups/phone-inpage-navigation/page.tsx b/src/app/mockups/phone-inpage-navigation/page.tsx index e3fdfa1ce..955ed1018 100644 --- a/src/app/mockups/phone-inpage-navigation/page.tsx +++ b/src/app/mockups/phone-inpage-navigation/page.tsx @@ -497,7 +497,7 @@ export default function PhoneInPageNavigationMockup() {
- Clinical KB · design exploration + PsychSift · design exploration Phone-first, 390px canvas diff --git a/src/app/mockups/phone-mode-sheet-yes/page.tsx b/src/app/mockups/phone-mode-sheet-yes/page.tsx index d8c475c25..7acbd7643 100644 --- a/src/app/mockups/phone-mode-sheet-yes/page.tsx +++ b/src/app/mockups/phone-mode-sheet-yes/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { PhoneModeSheetYesMockups } from "@/components/phone-mode-sheet-yes-mockups"; export const metadata: Metadata = { - title: "Phone mode sheet YES 01 perfected - Clinical KB", + title: "Phone mode sheet YES 01 perfected - PsychSift", description: "Perfected phone Choose mode sheet: sectioned clinical list with all review findings closed, plus the icon-deck alternate.", }; diff --git a/src/app/mockups/privacy-live-signal-perfected/page.tsx b/src/app/mockups/privacy-live-signal-perfected/page.tsx index ba762aa00..93cb64cc4 100644 --- a/src/app/mockups/privacy-live-signal-perfected/page.tsx +++ b/src/app/mockups/privacy-live-signal-perfected/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { PrivacyLiveSignalPerfectedMockups } from "@/components/privacy-live-signal-perfected-mockups"; export const metadata: Metadata = { - title: "Privacy Live Signal perfected - Clinical KB", + title: "Privacy Live Signal perfected - PsychSift", description: "Perfected Live Signal direction for /privacy — sticky obligation chrome, gists, region ticker, desktop+phone.", }; diff --git a/src/app/mockups/privacy-page-directions/page.tsx b/src/app/mockups/privacy-page-directions/page.tsx index 06a4c42cb..5af1a94b4 100644 --- a/src/app/mockups/privacy-page-directions/page.tsx +++ b/src/app/mockups/privacy-page-directions/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { PrivacyPageDirectionsMockups } from "@/components/privacy-page-directions-mockups"; export const metadata: Metadata = { - title: "Privacy page directions - Clinical KB", + title: "Privacy page directions - PsychSift", description: "Three elevated redesign directions for /privacy with desktop and phone frames, grounded in Clinical White / Sky Graphite.", }; diff --git a/src/app/mockups/services-filter-options/page.tsx b/src/app/mockups/services-filter-options/page.tsx index 6a1f76e66..8e8de58bf 100644 --- a/src/app/mockups/services-filter-options/page.tsx +++ b/src/app/mockups/services-filter-options/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { ServicesFilterOptionsMockupsPage } from "@/components/services-filter-options-mockups"; export const metadata: Metadata = { - title: "Services filter · three options - Clinical KB", + title: "Services filter · three options - PsychSift", description: "Round two of the services filter study: the fix that can ship now, the recommended build, and the bolder move that evicts presets from the sheet — at desktop and phone.", }; diff --git a/src/app/mockups/services-filter-refined/page.tsx b/src/app/mockups/services-filter-refined/page.tsx index 95c38dc3f..1d822a3e1 100644 --- a/src/app/mockups/services-filter-refined/page.tsx +++ b/src/app/mockups/services-filter-refined/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { ServicesFilterRefinedMockupsPage } from "@/components/services-filter-refined-mockups"; export const metadata: Metadata = { - title: "Services filter · three directions - Clinical KB", + title: "Services filter · three directions - PsychSift", description: "Three redesign directions for the services filter sheet, at desktop and phone, with live facet counts from the 219-service catalogue snapshot.", }; diff --git a/src/app/mockups/settings-search-clinical/page.tsx b/src/app/mockups/settings-search-clinical/page.tsx index 9d3eb3639..5eaf4ed19 100644 --- a/src/app/mockups/settings-search-clinical/page.tsx +++ b/src/app/mockups/settings-search-clinical/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { SettingsSearchMockupPage } from "@/components/settings-search-mockups"; export const metadata: Metadata = { - title: "Search Settings Clinical Mockup - Clinical KB", - description: "Search-first ChatGPT-style clinical defaults settings mockup for Clinical KB.", + title: "Search Settings Clinical Mockup - PsychSift", + description: "Search-first ChatGPT-style clinical defaults settings mockup for PsychSift.", }; export default function SettingsSearchClinicalMockupRoute() { diff --git a/src/app/mockups/settings-search-general/page.tsx b/src/app/mockups/settings-search-general/page.tsx index df9b3793d..aace7e4aa 100644 --- a/src/app/mockups/settings-search-general/page.tsx +++ b/src/app/mockups/settings-search-general/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { SettingsSearchMockupPage } from "@/components/settings-search-mockups"; export const metadata: Metadata = { - title: "Search Settings General Mockup - Clinical KB", - description: "Search-first ChatGPT-style general settings mockup for Clinical KB.", + title: "Search Settings General Mockup - PsychSift", + description: "Search-first ChatGPT-style general settings mockup for PsychSift.", }; export default function SettingsSearchGeneralMockupRoute() { diff --git a/src/app/mockups/settings-search-privacy/page.tsx b/src/app/mockups/settings-search-privacy/page.tsx index f29dd5d2a..c90104f19 100644 --- a/src/app/mockups/settings-search-privacy/page.tsx +++ b/src/app/mockups/settings-search-privacy/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { SettingsSearchMockupPage } from "@/components/settings-search-mockups"; export const metadata: Metadata = { - title: "Premium Account Hub Mockup - Clinical KB", - description: "Premium ChatGPT-style account and app hub settings mockup for Clinical KB.", + title: "Premium Account Hub Mockup - PsychSift", + description: "Premium ChatGPT-style account and app hub settings mockup for PsychSift.", }; export default function PremiumAccountHubMockupRoute() { diff --git a/src/app/mockups/therapy-navigation-context/page.tsx b/src/app/mockups/therapy-navigation-context/page.tsx index 3f59a2177..efb44e99d 100644 --- a/src/app/mockups/therapy-navigation-context/page.tsx +++ b/src/app/mockups/therapy-navigation-context/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { TherapyNavigationContextMockups } from "@/components/therapy-navigation-mockups/context"; export const metadata: Metadata = { - title: "Therapy navigation B · Context row - Clinical KB", + title: "Therapy navigation B · Context row - PsychSift", description: "Direction B for the Therapy navigation panel: a two-line context row with a weighted stage track and a jump panel, shown at desktop, tablet and phone.", }; diff --git a/src/app/mockups/therapy-navigation-dock/page.tsx b/src/app/mockups/therapy-navigation-dock/page.tsx index da9073251..68c6398c3 100644 --- a/src/app/mockups/therapy-navigation-dock/page.tsx +++ b/src/app/mockups/therapy-navigation-dock/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { TherapyNavigationDockMockups } from "@/components/therapy-navigation-mockups/dock"; export const metadata: Metadata = { - title: "Therapy navigation C · Working-set dock - Clinical KB", + title: "Therapy navigation C · Working-set dock - PsychSift", description: "Direction C for the Therapy navigation panel: navigation as a readout of the therapy, basket and artifacts you are carrying, shown at desktop, tablet and phone.", }; diff --git a/src/app/mockups/therapy-navigation-rail/page.tsx b/src/app/mockups/therapy-navigation-rail/page.tsx index 56be553c4..00a4fe294 100644 --- a/src/app/mockups/therapy-navigation-rail/page.tsx +++ b/src/app/mockups/therapy-navigation-rail/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { TherapyNavigationRailMockups } from "@/components/therapy-navigation-mockups/rail"; export const metadata: Metadata = { - title: "Therapy navigation A · Grouped rail - Clinical KB", + title: "Therapy navigation A · Grouped rail - PsychSift", description: "Direction A for the Therapy navigation panel: three ranked groups on a rail, shown at desktop, tablet and phone.", }; diff --git a/src/app/mockups/tools-action-workbench/page.tsx b/src/app/mockups/tools-action-workbench/page.tsx index 1a9a4cc07..3f94c5bc0 100644 --- a/src/app/mockups/tools-action-workbench/page.tsx +++ b/src/app/mockups/tools-action-workbench/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { ToolsActionWorkbenchMockup } from "@/components/tools-page-mockups/rectangle-direction-mockups"; export const metadata: Metadata = { - title: "Tools Action Workbench Mockup - Clinical KB", - description: "Rectangle-first action workbench Tools page mockup for Clinical KB.", + title: "Tools Action Workbench Mockup - PsychSift", + description: "Rectangle-first action workbench Tools page mockup for PsychSift.", }; export default function ToolsActionWorkbenchMockupRoute() { diff --git a/src/app/mockups/tools-clinical-lanes/page.tsx b/src/app/mockups/tools-clinical-lanes/page.tsx index 4c5615bc8..a76358dcb 100644 --- a/src/app/mockups/tools-clinical-lanes/page.tsx +++ b/src/app/mockups/tools-clinical-lanes/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { ToolsClinicalLanesMockup } from "@/components/tools-page-mockups/rectangle-direction-mockups"; export const metadata: Metadata = { - title: "Tools Clinical Lanes Mockup - Clinical KB", - description: "Rectangle-first clinical lane Tools page mockup for Clinical KB.", + title: "Tools Clinical Lanes Mockup - PsychSift", + description: "Rectangle-first clinical lane Tools page mockup for PsychSift.", }; export default function ToolsClinicalLanesMockupRoute() { diff --git a/src/app/mockups/tools-command-center/page.tsx b/src/app/mockups/tools-command-center/page.tsx index fb3d9b101..916890e7a 100644 --- a/src/app/mockups/tools-command-center/page.tsx +++ b/src/app/mockups/tools-command-center/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { ToolsPageMockupPage } from "@/components/tools-page-mockups"; export const metadata: Metadata = { - title: "Tools Command Center Mockup - Clinical KB", - description: "Task-first Tools page mockup for Clinical KB.", + title: "Tools Command Center Mockup - PsychSift", + description: "Task-first Tools page mockup for PsychSift.", }; export default function ToolsCommandCenterMockupRoute() { diff --git a/src/app/mockups/tools-search-directions/page.tsx b/src/app/mockups/tools-search-directions/page.tsx index 1cc9c5920..f3cdf4ac3 100644 --- a/src/app/mockups/tools-search-directions/page.tsx +++ b/src/app/mockups/tools-search-directions/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { ToolsSearchDirectionsMockups } from "@/components/tools-search-directions-mockups"; export const metadata: Metadata = { - title: "Tools search directions mockups - Clinical KB", + title: "Tools search directions mockups - PsychSift", description: "Three directions for the Tools search results state, built from the real tools catalogue.", }; diff --git a/src/app/mockups/tools-search-mode/page.tsx b/src/app/mockups/tools-search-mode/page.tsx index bd1f144a9..bcc719fe0 100644 --- a/src/app/mockups/tools-search-mode/page.tsx +++ b/src/app/mockups/tools-search-mode/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { ToolsSearchModeMockup } from "@/components/tools-page-mockups/tools-search-mode-mockup"; export const metadata: Metadata = { - title: "Perfected Tools Results Mode Mockup - Clinical KB", + title: "Perfected Tools Results Mode Mockup - PsychSift", description: "Responsive Tools results page with the universal search composer and adaptive tool details.", }; diff --git a/src/app/mockups/tools-split-clinical-brief/page.tsx b/src/app/mockups/tools-split-clinical-brief/page.tsx index ea580c5ae..137cecbd8 100644 --- a/src/app/mockups/tools-split-clinical-brief/page.tsx +++ b/src/app/mockups/tools-split-clinical-brief/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { ToolsSplitPaneRefinedMockup } from "@/components/tools-page-mockups/split-pane-refined-mockups"; export const metadata: Metadata = { - title: "Tools Split Clinical Brief Mockup - Clinical KB", + title: "Tools Split Clinical Brief Mockup - PsychSift", description: "Refined split-pane Tools mockup with clinical brief and mobile popup.", }; diff --git a/src/app/mockups/tools-split-compact-sheet/page.tsx b/src/app/mockups/tools-split-compact-sheet/page.tsx index 013a78603..be7c3c1d3 100644 --- a/src/app/mockups/tools-split-compact-sheet/page.tsx +++ b/src/app/mockups/tools-split-compact-sheet/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { ToolsSplitPaneRefinedMockup } from "@/components/tools-page-mockups/split-pane-refined-mockups"; export const metadata: Metadata = { - title: "Tools Split Compact Sheet Mockup - Clinical KB", + title: "Tools Split Compact Sheet Mockup - PsychSift", description: "Refined split-pane Tools mockup with compact mobile action sheet.", }; diff --git a/src/app/mockups/tools-split-pane/page.tsx b/src/app/mockups/tools-split-pane/page.tsx index 48c11a143..f9f06eda1 100644 --- a/src/app/mockups/tools-split-pane/page.tsx +++ b/src/app/mockups/tools-split-pane/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { ToolsPageMockupPage } from "@/components/tools-page-mockups"; export const metadata: Metadata = { - title: "Tools Split Pane Mockup - Clinical KB", - description: "Split-pane Tools directory mockup for Clinical KB.", + title: "Tools Split Pane Mockup - PsychSift", + description: "Split-pane Tools directory mockup for PsychSift.", }; export default function ToolsSplitPaneMockupRoute() { diff --git a/src/app/mockups/tools-split-safety-deck/page.tsx b/src/app/mockups/tools-split-safety-deck/page.tsx index 6bb3c3846..d2a4414dd 100644 --- a/src/app/mockups/tools-split-safety-deck/page.tsx +++ b/src/app/mockups/tools-split-safety-deck/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { ToolsSplitPaneRefinedMockup } from "@/components/tools-page-mockups/split-pane-refined-mockups"; export const metadata: Metadata = { - title: "Tools Split Safety Deck Mockup - Clinical KB", + title: "Tools Split Safety Deck Mockup - PsychSift", description: "Refined split-pane Tools mockup with safety-focused clinical organisation.", }; diff --git a/src/app/mockups/tools-task-directory/page.tsx b/src/app/mockups/tools-task-directory/page.tsx index 2d8945635..7148d3469 100644 --- a/src/app/mockups/tools-task-directory/page.tsx +++ b/src/app/mockups/tools-task-directory/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { ToolsTaskDirectoryMockup } from "@/components/tools-page-mockups/task-directory-mockup"; export const metadata: Metadata = { - title: "Tools Task Directory Mockup - Clinical KB", - description: "Task-grouped, row-dense Tools directory mockup for Clinical KB.", + title: "Tools Task Directory Mockup - PsychSift", + description: "Task-grouped, row-dense Tools directory mockup for PsychSift.", }; export default function ToolsTaskDirectoryMockupRoute() { diff --git a/src/app/mockups/tools-workflow-board/page.tsx b/src/app/mockups/tools-workflow-board/page.tsx index 8175f40a2..46010f748 100644 --- a/src/app/mockups/tools-workflow-board/page.tsx +++ b/src/app/mockups/tools-workflow-board/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { ToolsPageMockupPage } from "@/components/tools-page-mockups"; export const metadata: Metadata = { - title: "Tools Workflow Board Mockup - Clinical KB", - description: "Workflow-grouped Tools page mockup for Clinical KB.", + title: "Tools Workflow Board Mockup - PsychSift", + description: "Workflow-grouped Tools page mockup for PsychSift.", }; export default function ToolsWorkflowBoardMockupRoute() { diff --git a/src/app/opengraph-image.tsx b/src/app/opengraph-image.tsx index 5bc48bd26..81b7300d4 100644 --- a/src/app/opengraph-image.tsx +++ b/src/app/opengraph-image.tsx @@ -2,7 +2,7 @@ import { ImageResponse } from "next/og"; import { brandMarkDataUri } from "@/lib/brand-image"; -export const alt = "Clinical KB — private medical guideline knowledge base"; +export const alt = "PsychSift — private medical guideline knowledge base"; export const size = { width: 1200, height: 630 }; export const contentType = "image/png"; @@ -23,7 +23,7 @@ export default function OpengraphImage() { >
-
Clinical KB
+
PsychSift
Private medical guideline knowledge base

, diff --git a/src/app/privacy/page.tsx b/src/app/privacy/page.tsx index 6d86b037f..675fc0864 100644 --- a/src/app/privacy/page.tsx +++ b/src/app/privacy/page.tsx @@ -3,8 +3,8 @@ import type { Metadata } from "next"; import { PrivacyQuietSignalPage } from "@/components/privacy-quiet-signal-page"; export const metadata: Metadata = { - title: "How Clinical KB handles your data", - description: "Learn what Clinical KB processes, where data is handled, and how long information is retained.", + title: "How PsychSift handles your data", + description: "Learn what PsychSift processes, where data is handled, and how long information is retained.", }; /** diff --git a/src/app/reference/colour-coding/page.tsx b/src/app/reference/colour-coding/page.tsx index caa171dd4..633b389a9 100644 --- a/src/app/reference/colour-coding/page.tsx +++ b/src/app/reference/colour-coding/page.tsx @@ -6,7 +6,7 @@ import { SHARED_APP_HOME_ROUTE } from "@/lib/reference-routes"; import { cn, searchPageCanvas, searchPageContainer, searchPageShellStandalone } from "@/components/ui-primitives"; export const metadata: Metadata = { - title: "Colour coding reference — Clinical KB", + title: "Colour coding reference — PsychSift", description: "The site-wide badge colour system: what each tone means and which signals are flagged in each content area.", }; diff --git a/src/app/safety-plan/page.tsx b/src/app/safety-plan/page.tsx index f404cff09..595641214 100644 --- a/src/app/safety-plan/page.tsx +++ b/src/app/safety-plan/page.tsx @@ -3,7 +3,7 @@ import type { Metadata } from "next"; import { PatientSafetyPlan } from "@/components/patient-safety-plan"; export const metadata: Metadata = { - title: "Safety plan generator - Clinical KB", + title: "Safety plan generator - PsychSift", description: "Build an identifier-free patient safety plan with the Stanley-Brown six steps in a transient browser session, then export it through an approved clinical workflow.", }; diff --git a/src/components/ClinicalDashboard.tsx b/src/components/ClinicalDashboard.tsx index 61c6a20d2..205f0ddf3 100644 --- a/src/components/ClinicalDashboard.tsx +++ b/src/components/ClinicalDashboard.tsx @@ -1629,13 +1629,13 @@ function ClinicalDashboardContent({ function searchNetworkFailure(label: string) { const offline = typeof navigator !== "undefined" && !navigator.onLine; - const origin = typeof window !== "undefined" ? window.location.origin : "Clinical KB"; + const origin = typeof window !== "undefined" ? window.location.origin : "PsychSift"; return makeSearchError( offline ? `${label} could not run because the browser is offline.` : isDeployedClinicalKb() - ? `${label} could not reach Clinical KB at ${origin}. Check your connection and try again shortly.` - : `${label} could not reach Clinical KB at ${origin}. The local server may still be starting or restarting; retry shortly or run npm run ensure.`, + ? `${label} could not reach PsychSift at ${origin}. Check your connection and try again shortly.` + : `${label} could not reach PsychSift at ${origin}. The local server may still be starting or restarting; retry shortly or run npm run ensure.`, undefined, true, ); diff --git a/src/components/answer-chat-perfected-mockups.tsx b/src/components/answer-chat-perfected-mockups.tsx index f52c36ed2..3d1990f66 100644 --- a/src/components/answer-chat-perfected-mockups.tsx +++ b/src/components/answer-chat-perfected-mockups.tsx @@ -1287,7 +1287,7 @@ export function AnswerChatPerfectedMockupsPage() {

diff --git a/src/components/answer-chat-perfected-v2-mockups.tsx b/src/components/answer-chat-perfected-v2-mockups.tsx index 5110501a3..7c2f9774e 100644 --- a/src/components/answer-chat-perfected-v2-mockups.tsx +++ b/src/components/answer-chat-perfected-v2-mockups.tsx @@ -1680,7 +1680,7 @@ export function AnswerChatPerfectedV2MockupsPage() {

diff --git a/src/components/answer-chat-redesign-mockups.tsx b/src/components/answer-chat-redesign-mockups.tsx index 941a6b071..d87d833e3 100644 --- a/src/components/answer-chat-redesign-mockups.tsx +++ b/src/components/answer-chat-redesign-mockups.tsx @@ -1312,7 +1312,7 @@ export function AnswerChatRedesignMockupsPage() {

diff --git a/src/components/answer-loading-redesign-mockups.tsx b/src/components/answer-loading-redesign-mockups.tsx index 12b08b08f..f3929bbed 100644 --- a/src/components/answer-loading-redesign-mockups.tsx +++ b/src/components/answer-loading-redesign-mockups.tsx @@ -860,7 +860,7 @@ export function AnswerLoadingRedesignMockupsPage() {

Do not enter the patient's name, date of birth, or record number. Enter only the minimum plan - details and support contacts needed. Working content is kept only in this browser tab; Clinical KB - does not save it or send it to a server. + details and support contacts needed. Working content is kept only in this browser tab; PsychSift does + not save it or send it to a server.

@@ -901,7 +901,7 @@ export function PatientSafetyPlan() { data-print-hide className="mb-3 rounded-lg border border-[color:var(--border)] bg-[color:var(--surface-subtle)] px-3 py-2 text-2xs font-semibold leading-5 text-[color:var(--text-muted)]" > - Copying, printing, or saving a PDF moves the plan outside Clinical KB. Add any patient identifier only after + Copying, printing, or saving a PDF moves the plan outside PsychSift. Add any patient identifier only after export, using your organisation's approved clinical record and handling process.

diff --git a/src/components/privacy-live-signal-perfected-mockups.tsx b/src/components/privacy-live-signal-perfected-mockups.tsx index d5f7d410a..2b96c2496 100644 --- a/src/components/privacy-live-signal-perfected-mockups.tsx +++ b/src/components/privacy-live-signal-perfected-mockups.tsx @@ -72,13 +72,13 @@ const SECTIONS: Section[] = [ heading: "What this tool is", short: "Tool", gist: "Clinical reference KB — not a patient-record system", - body: "Clinical KB is a knowledge base over clinical reference material. It is not a patient-record system and its provider-backed features do not ask for patient identifiers. The Safety Plan Generator accepts sensitive working content and support contacts but deliberately omits a patient-identifier field.", + body: "PsychSift is a knowledge base over clinical reference material. It is not a patient-record system and its provider-backed features do not ask for patient identifiers. The Safety Plan Generator accepts sensitive working content and support contacts but deliberately omits a patient-identifier field.", }, { heading: "What is collected", short: "Collected", gist: "Questions, docs, telemetry — safety-plan work stays in-tab", - body: "Questions, generated answers, account identifiers, administrator-provided documents, retrieved excerpts, document metadata, and operational or retrieval telemetry may be processed. Free text and source material can contain sensitive information. Safety-plan working content is different: it remains in the current browser tab and is not sent to the application service or stored by Clinical KB.", + body: "Questions, generated answers, account identifiers, administrator-provided documents, retrieved excerpts, document metadata, and operational or retrieval telemetry may be processed. Free text and source material can contain sensitive information. Safety-plan working content is different: it remains in the current browser tab and is not sent to the application service or stored by PsychSift.", }, { heading: "How questions are handled", @@ -102,7 +102,7 @@ const SECTIONS: Section[] = [ heading: "Retention", short: "Retention", gist: "30-day queries · 90-day logs · hourly cache purge", - body: "Repository migrations configure 30-day retention for RAG query records, 90-day retention for retrieval logs and query-miss telemetry, and a bounded hourly purge of expired response-cache rows when the database scheduler is available. The operator must verify that those scheduled jobs are active. Administrator-provided documents remain until removed under the applicable process. Safety-plan working content has no Clinical KB retention: it is discarded when the component is cleared or the tab is closed. Clipboard, print, and PDF copies are outside the app and must follow the organisation's approved record-handling process.", + body: "Repository migrations configure 30-day retention for RAG query records, 90-day retention for retrieval logs and query-miss telemetry, and a bounded hourly purge of expired response-cache rows when the database scheduler is available. The operator must verify that those scheduled jobs are active. Administrator-provided documents remain until removed under the applicable process. Safety-plan working content has no PsychSift retention: it is discarded when the component is cleared or the tab is closed. Clipboard, print, and PDF copies are outside the app and must follow the organisation's approved record-handling process.", }, { heading: "Your responsibilities", diff --git a/src/components/privacy-page-directions-mockups.tsx b/src/components/privacy-page-directions-mockups.tsx index 040842091..4087fe056 100644 --- a/src/components/privacy-page-directions-mockups.tsx +++ b/src/components/privacy-page-directions-mockups.tsx @@ -33,12 +33,12 @@ const SECTIONS: Section[] = [ { heading: "What this tool is", short: "Tool", - body: "Clinical KB is a knowledge base over clinical reference material. It is not a patient-record system and its provider-backed features do not ask for patient identifiers. The Safety Plan Generator accepts sensitive working content and support contacts but deliberately omits a patient-identifier field.", + body: "PsychSift is a knowledge base over clinical reference material. It is not a patient-record system and its provider-backed features do not ask for patient identifiers. The Safety Plan Generator accepts sensitive working content and support contacts but deliberately omits a patient-identifier field.", }, { heading: "What is collected", short: "Collected", - body: "Questions, generated answers, account identifiers, administrator-provided documents, retrieved excerpts, document metadata, and operational or retrieval telemetry may be processed. Free text and source material can contain sensitive information. Safety-plan working content is different: it remains in the current browser tab and is not sent to the application service or stored by Clinical KB.", + body: "Questions, generated answers, account identifiers, administrator-provided documents, retrieved excerpts, document metadata, and operational or retrieval telemetry may be processed. Free text and source material can contain sensitive information. Safety-plan working content is different: it remains in the current browser tab and is not sent to the application service or stored by PsychSift.", }, { heading: "How questions are handled", @@ -58,7 +58,7 @@ const SECTIONS: Section[] = [ { heading: "Retention", short: "Retention", - body: "Repository migrations configure 30-day retention for RAG query records, 90-day retention for retrieval logs and query-miss telemetry, and a bounded hourly purge of expired response-cache rows when the database scheduler is available. The operator must verify that those scheduled jobs are active. Administrator-provided documents remain until removed under the applicable process. Safety-plan working content has no Clinical KB retention: it is discarded when the component is cleared or the tab is closed. Clipboard, print, and PDF copies are outside the app and must follow the organisation's approved record-handling process.", + body: "Repository migrations configure 30-day retention for RAG query records, 90-day retention for retrieval logs and query-miss telemetry, and a bounded hourly purge of expired response-cache rows when the database scheduler is available. The operator must verify that those scheduled jobs are active. Administrator-provided documents remain until removed under the applicable process. Safety-plan working content has no PsychSift retention: it is discarded when the component is cleared or the tab is closed. Clipboard, print, and PDF copies are outside the app and must follow the organisation's approved record-handling process.", }, { heading: "Your responsibilities", @@ -85,7 +85,7 @@ const directions: Array<{ name: "Statement theatre", verdict: "Brand-led first viewport", summary: - "First screen is one composition: Clinical KB mark, display title, and a full-bleed amber obligation band — then a calm 68ch reading column. Desktop pins a graphite command rail; phone keeps sticky glass chrome below the notch.", + "First screen is one composition: PsychSift mark, display title, and a full-bleed amber obligation band — then a calm 68ch reading column. Desktop pins a graphite command rail; phone keeps sticky glass chrome below the notch.", strengths: ["Hero reads as brand, not a form", "Obligation is the loudest plane", "Almost no card chrome"], cost: "Long scroll on phone with no section jump.", }, @@ -298,7 +298,7 @@ function TheatreFrame({ phone = false }: { phone?: boolean }) {
-

Clinical KB

+

PsychSift

Privacy

@@ -341,7 +341,7 @@ function TheatreFrame({ phone = false }: { phone?: boolean }) {
-

Clinical KB

+

PsychSift

Privacy & data handling

@@ -404,7 +404,7 @@ function PassportFrame({ phone = false }: { phone?: boolean }) {

- Clinical KB · sealed brief + PsychSift · sealed brief

Privacy & data handling diff --git a/src/components/privacy-quiet-signal-page.tsx b/src/components/privacy-quiet-signal-page.tsx index ee473f2e7..cdcd7d712 100644 --- a/src/components/privacy-quiet-signal-page.tsx +++ b/src/components/privacy-quiet-signal-page.tsx @@ -245,7 +245,7 @@ export function PrivacyQuietSignalPage() { {privacyCopy.pageTitle}

- Understand what information Clinical KB handles, where it is processed, how long it is retained, and + Understand what information PsychSift handles, where it is processed, how long it is retained, and what you need to do before using it.

@@ -264,7 +264,7 @@ export function PrivacyQuietSignalPage() { Coverage
- Applies to every Clinical KB mode + Applies to every PsychSift mode
@@ -295,7 +295,7 @@ export function PrivacyQuietSignalPage() { id="privacy-important-heading" className="text-2xs font-extrabold uppercase tracking-kicker text-[color:var(--warning-text)]" > - Before you use Clinical KB + Before you use PsychSift

{PRIVACY_IMPORTANT_SHORT} diff --git a/src/components/pwa-lifecycle.tsx b/src/components/pwa-lifecycle.tsx index 6b3c38392..5c2329858 100644 --- a/src/components/pwa-lifecycle.tsx +++ b/src/components/pwa-lifecycle.tsx @@ -201,7 +201,7 @@ function InstallBenefits() { function InstallManualSteps() { return ( -

    +
    1. 1. Tap Share