Public Workspace
SEO / Visibility Plan
Track how the portal will support public discovery while keeping unlisted and private content protected. This page is safe to publish and acts as the shared plan + tracker hub.
Implementation checklist
Status labels align with Not started, In progress, and Done.
| Task | Status |
|---|
A) Visibility system
Portal content uses a clear visibility flag so the UI, search engines, and snapshotting logic can agree on what is safe to show.
Definitions
- Public: discoverable, listed, and indexable.
- Unlisted: accessible by direct link, but hidden from listings and search.
- Private: requires auth or membership checks before any content is rendered.
Policy engine outputs
canView: viewer has read access.canEdit: viewer can edit or moderate.canList: show in portal listings or feeds.shouldIndex: allow search engine indexing.shouldSnapshot: generate HTML snapshot for bots.
Default rules by content type
| Content type | Default visibility | Listing behavior |
|---|---|---|
| Notes | Private | Visible to the author and invited teammates only. |
| Discussions | Public | Public discussions appear in the public index; unlisted threads stay hidden. |
| Dashboards | Unlisted | Direct-link access for shared dashboards, no global listings. |
B) Indexing strategy
Indexing treats public pages like documents, not databases.
Documents, not databases
Public pages ship as stable HTML snapshots so crawlers see a cohesive document. GunJS then hydrates the live session for humans.
HTML-first + hydration
- Generate HTML snapshots for public routes.
- Serve snapshots to bots and to first-time visitors.
- Hydrate with GunJS data after load to keep the UI live.
Snapshot storage options
- Vercel Blob for immutable HTML snapshots.
- Vercel KV / Redis for cached HTML strings.
- Static object storage (S3-compatible) for backup snapshots.
C) SEO controls
Meta robots rules
- Public:
index,follow - Unlisted:
noindex,nofollow - Private:
noindex,nofollow+ auth gate
Sitemap rules
Only public routes appear in sitemap.xml. Unlisted and private content never appears.
robots.txt rules
Disallow private and unlisted sections to keep crawlers away from gated paths.
D) Implementation plan
Phase 1: Visibility flags + noindex
Introduce the visibility field, policy helper, and meta robots rules.
Phase 2: Snapshots
Generate HTML snapshots for public pages and hydrate with GunJS on load.
Phase 3: Sitemap + robots
Publish sitemap.xml and robots.txt for public-only content.
Phase 4: Analytics
Track public discovery without adding external analytics scripts.
Definition of done
- Visibility flags exist on every content type.
- Policy helper drives UI gating and indexability decisions.
- Public routes ship HTML snapshots and hydrate with GunJS.
- Sitemaps include public routes only.
- Private/unlisted routes are blocked from indexing.
- Public pages include canonical URLs and OpenGraph tags.
Progress tracker
Checklist progress is stored in your browser only.