Skip to content

ENG-1837 Add a public status in the database - #1106

Draft
maparent wants to merge 33 commits into
Restrict_my_accountsfrom
eng-1837-add-a-public-status-in-the-database
Draft

maparent wants to merge 33 commits into
Restrict_my_accountsfrom
eng-1837-add-a-public-status-in-the-database

Conversation

@maparent

@maparent maparent commented Jun 5, 2026 •

Copy link
Copy Markdown
Collaborator

@linear-code

linear-code Bot commented Jun 5, 2026

Copy link
Copy Markdown

ENG-1837

@supabase

supabase Bot commented Jun 5, 2026 •

Copy link
Copy Markdown

Updates to Preview Branch (eng-1837-add-a-public-status-in-the-database) ↗︎

Deployments Status Updated
Database ✅ Tue, 20 Oct 2026 14:17:52 UTC
Services ✅ Tue, 20 Oct 2026 14:17:52 UTC
APIs ✅ Tue, 20 Oct 2026 14:17:52 UTC

Tasks are run on every commit but only new migration files are pushed.
Close and reopen this PR if you want to apply changes from existing seed or migration files.

Tasks Status Updated
Configurations ✅ Tue, 20 Oct 2026 14:17:53 UTC
Migrations ❌ Tue, 20 Oct 2026 14:17:53 UTC
Seeding ⏸️ Tue, 20 Oct 2026 14:17:35 UTC
Edge Functions ⏸️ Tue, 20 Oct 2026 14:17:35 UTC

❌ Branch Error • Tue, 20 Oct 2026 14:17:54 UTC

Remote migration versions not found in local migrations directory.

View logs for this Workflow Run ↗︎.
Learn more about Supabase for Git ↗︎.

Comment thread packages/database/supabase/migrations/20260605142437_public_resource_access.sql Outdated

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 3 potential issues.

View 2 additional findings in Devin Review.

Open in Devin Review

Comment thread packages/database/supabase/migrations/20260605142437_public_resource_access.sql Outdated
Comment thread packages/database/supabase/schemas/account.sql Outdated
Comment thread packages/database/supabase/migrations/20260605142437_public_resource_access.sql Outdated
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch 2 times, most recently from 425bdec to ece1239 Compare June 5, 2026 15:29
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch from ece1239 to 3457d0c Compare June 22, 2026 13:52
@vercel

vercel Bot commented Jun 22, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
discourse-graph Ready Ready Preview Oct 20, 2026 2:19pm UTC

Request Review

@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch from 3457d0c to 57eb25a Compare June 29, 2026 21:06
@mdroidian
mdroidian marked this pull request as draft July 30, 2026 20:18
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch from 57eb25a to 4258f48 Compare August 1, 2026 16:38
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch from 4258f48 to 9ba89b3 Compare August 23, 2026 18:33
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch from 9ba89b3 to 4b6e181 Compare August 26, 2026 20:58
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch from 4b6e181 to dccec7a Compare August 26, 2026 21:43
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch from dccec7a to 51d4cdc Compare August 26, 2026 21:56
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch from 51d4cdc to fa2a57f Compare September 18, 2026 14:04
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch from fa2a57f to ac45012 Compare September 28, 2026 02:30
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch from ac45012 to 036e2e7 Compare October 4, 2026 01:07
@maparent
maparent force-pushed the eng-1837-add-a-public-status-in-the-database branch 2 times, most recently from 036e2e7 to 301bf0c Compare October 8, 2026 20:04
KarolaKirsanow and others added 28 commits October 9, 2026 13:18
* scaffold draft

* add link

* add template lab link

* add zoteroroam imgs

* add images

* add canvas images

* convert to mdx

* Remove unused merton-canvas images

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: johnny1093 <46250921+jsmorabito@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…1535)

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…1372)

* scaffold pkm

* add images

* update pkm draft

* canvas rec

* callout

* typo

* edits

* add canvas images

* add gif

* add text

* add query images

* update search & query

* revise images

* Update apps/website/content/roam/use-cases/build-utilize-personal-knowledge-base.mdx

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>

* typos

* Update build-utilize-personal-knowledge-base.mdx

- removed advanced node search image & caption
- edited ref to dg native search
- edited ref to wikilinks

* Update build-utilize-personal-knowledge-base.mdx

remove ref to "vault"

* Update apps/website/content/roam/use-cases/build-utilize-personal-knowledge-base.mdx

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>

* Revert unrelated changes and fix MDX formatting

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: graphite-app[bot] <96075541+graphite-app[bot]@users.noreply.github.com>
Co-authored-by: johnny1093 <46250921+jsmorabito@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* scaffold sharing doc

* update figures

* article draft
…width on landing page (#1538)

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
…text-only About section on landing page (#1539)

* ENG-2380 Extract shared section header and align Foundations section width on landing page

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* ENG-2316 Replace current About page and Tool choice section with new text-only About section on landing page

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* Prototype an inline Roam relations browser

* Use the Roam component mount lifecycle helper

* Show and sort relations by creation date

* Format relation dates as Month Day, Year

* Batch relation endpoint reads in an asynchronous query
* ENG-2406 Refine the inline Roam relations browser

* ENG-2406 Address relations browser review findings

* ENG-2406 Inherit host text color for relation headers

* ENG-2406 Preserve native header button contrast
* Replace Node-only deps so the plugin can load on mobile

gray-matter requires `fs` and mime-types requires `path` at module load,
so both throw at plugin load on Obsidian mobile. Replace them with local
utilities and stop marking Node builtins external, so a future Node import
fails the build instead of shipping.

The mime table is generated from mime-db rather than curated: the caller
skips every `text/` attachment, so an extension missing from it would
silently start uploading transcluded notes as binary assets.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4E8D4VYPYHG3FRYDTXXG58A

* Teach the obsidian test stub parseYaml

parseFrontmatter now calls parseYaml, which the stub did not export, so
importRelations' tests read every frontmatter as empty. Obsidian's parseYaml
is `YAML.parse` from the `yaml` package, so the stub delegates to it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Ship the plugin with isDesktopOnly false

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Document that Obsidian mobile support is limited

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4EK4RJSMRSJP7DA5VCAXSWG

* Pin parseFrontmatter's behaviour and fix a misdirected comment

The engine swap and the swallowed parse error had no tests of their own,
and the comment on the markdown-link replacer pointed at the image pass
as being above it when it runs below.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4EK777W55T20BNRYMHXH4RD

* Stop a prototype-named extension aborting asset sync

An attachment named `x.constructor` read an inherited member out of the
mime table, and the caller's `.startsWith` on it threw and ended the
node's asset sync. `mime-types` returned the default here, so this was a
regression. Null-prototyping the table makes the miss structural.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H0QVME2ME0S3ENM6X7V6AP

* Say that advanced features are desktop only

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H7Q15TT8N88A88452CJCZE

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
…#1536)

* ENG-2323 Reject unsupported placeholders in Obsidian node formats

The Format field now blocks formats with placeholders other than {content},
using the same placeholder rule as decorateTitle. Also removes the unused
apps/obsidian/src/utils/validateNodeFormat.ts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H5SWF8GGWS6A6NNMTMCZ0Y

* ENG-2323 Add return type to validateNodeFormat test helper

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H6BVH4WB0P9JDH4MNKJ9F4

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#1521)

* ENG-2366 Show candidate nodes as results in Roam advanced node search

Add a "Show candidate nodes" toggle to the advanced search toolbar. When on,
blocks tagged with a node type's tag join the MiniSearch index and semantic
search keeps candidate block hits alongside node pages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M474H71Q8ZZST0ZFWWRX9DSH

* ENG-2366 Match type filters on every tag a candidate block carries

A block tagged with two node types stayed one row under the first type, so
filtering by its other type hid it. Record all candidate types on the row and
match the type filter against any of them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4754R1FVHXMFEVNF5410CHJ

* ENG-2366 Show the candidate tag and page under candidate results

Mirror Obsidian's candidate subtitle: each candidate row shows its node type
tags and the page it lives on under the title. Candidate data moves into one
`candidate` field that also carries the page title.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4CANTF2BM1N2ANFDWDG596E

* ENG-2366 Match candidate tags case-insensitively

Node tag matching elsewhere in the plugin ignores case (getCleanTagText), so
candidate search now finds blocks tagged with any casing of a node type's tag
and strips those tags from the row title.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4W7R2BKBGEWZWNHDS8NXSNR

* ENG-2366 Skip the search index build while the dialog is closed

Closing the dialog with candidates on re-ran the index effect and started a
candidate scan that the reset immediately cancelled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4W80RE4RHTEQRKM97EXHAEW

* ENG-2366 Address review findings on candidate tags and docked rows

- Read `#[[tag]]` configs as the tag page title, and only strip a tag when it
  ends at a non-letter in any script.
- Outline the candidate badge even when its node type has no color.
- Docked candidate rows open their block directly and drop data-link-title,
  so Roam never resolves them as a page by title.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4W89ND2QTXT1NBC7P3X1XJ6

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
The Cloud laboratory section holds the only link to matsulab.com and will be
removed. Link "MATSU Lab" in the Foundations Sharing card to the same URL and
"Matt Akamatsu" to his GitHub profile, each kept in a shared constant. Hover
and keyboard focus show the same light gray pill as the Share button in the
card, without shifting the row.

ScaledStage hides its content from assistive tech, so add an opt-in
`interactive` mode that exposes it as a group for stages containing links.
The card's transparent gradient overlay no longer intercepts clicks.

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Framework-free simulation for the animated graph background (nodes, edges
that draw themselves, pulses, cursor capture, text-avoidance fading), plus a
server-side helper that reads the pulse and edge colors from the shared
Tailwind config. Includes unit tests for both. Nothing renders these yet.

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* Add animated graph background to the landing page hero

Replace the static hero image with a light-themed canvas animation built on
the graph background utilities: self-drawing edges, occasional pulses,
cursor attraction, and nodes that fade behind the headline and buttons.
Respects prefers-reduced-motion and pauses when off screen.

The header now has an explicit height (--header-height) that the hero reads
to slide underneath it, and is translucent on pages that opt in with
data-translucent-header, which is only the homepage hero.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* Resize the graph canvas when the display pixel ratio changes

Moving the window to a display with a different density changes
devicePixelRatio without resizing the canvas, so the bitmap kept its old
resolution and looked blurry. Track the applied ratio, resize the bitmap when
either size or ratio changes, and re-run on pixel ratio media query changes.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Switch the contact section and footer to the light palette so they alternate
with the surrounding sections, raise the footer copyright contrast, and add
the graph background animation to the footer (without cursor following).

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* ENG-2143 Add Roam and Obsidian round-trip tests

* ENG-2143 Restore importer tests and take round-trip titles from the Obsidian push

* ENG-2143 Pin import warnings and resolve Roam aliases on Windows

* ENG-2143 Test each app's half of the source round trip in its own suite

Entire-Checkpoint: 01M4DP96WR8PGFFVJ9JD1Z1EHG

* ENG-2143 Cover plain-ID imported Sources and mock the relation fetch

Entire-Checkpoint: 01M4DTHXD8CKN8P4VJDDFBCD77
… project filters (#1552)

* DIS-617 Use Obsidian plugin label instead of assorted tasks project in ticket skill

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

* DIS-617 Address review feedback on Obsidian label handling

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* ENG-2417 Restore gray-matter for Obsidian CI tests

* ENG-2417 Use existing YAML tooling in Obsidian import tests
…oam search preview (#1537)

* ENG-2367 Scroll to a candidate result in context of its page in the Roam search preview

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H5VZE41NEK55DN1838KCQ5

* ENG-2367 Type the flash cleanup's return

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H5X6KPB0FEMKQJG412E3E5

* ENG-2367 Unmount the preview render only after it settles

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H6EGPGW6M0R764KZ9MC20S

* ENG-2367 Reset preview scroll when moving from a candidate to a node result

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H6RZBX9NGXPWPTYMF6PS91

* ENG-2367 Preview candidates as the zoomed block, expanded

Per review, drop the full-page preview with scroll and flash. A candidate
keeps the zoomed block with breadcrumbs, forced open so its children show
without writing :block/open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Declare gray-matter for the Obsidian import tests

ENG-2143 (#1529) added tests importing gray-matter without declaring it for
apps/obsidian, which fails check-types on main. Test-only, so a devDependency.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ENG-2367 Start each search preview scrolled to the top

Expanded candidates make previews taller, so the previous result's scroll
offset showed up more often.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M53DXGES2G3VBH79GFCSGHJ7

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* ENG-2228 Add link support to tldraw text shapes in Obsidian

Text shapes could not carry a link, so a canvas narrative could not open the
source its text stands for. tldraw gates its Edit link action on the duck-type
`'url' in shape.props`, and TLTextShape has no such prop -- so this is a schema
change, not UI wiring. Adding the prop lights up the stock menu item, and a
retroactive migration backfills `url: ""` on pre-existing text records, which is
required both for validation and for those shapes to become link-eligible.

The ticket names page links as the primary target, so the prop uses a wider
protocol allowlist than tldraw's T.linkUrl (which permits only http/https/
mailto) and tldraw's EditLinkDialog is forked, since it rejects non-http
protocols on input before the schema sees them. The fork keeps geo shapes on the
strict validator, as their url prop is still stock. Clicking an obsidian:// link
resolves it in-app rather than via the OS protocol handler.

Both shape-util registration sites now share baseShapeUtils: the schema and the
editor are built from separate arrays and nothing asserts they agree.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Restrict text links to obsidian://open, and fix icon placement

The protocol allowlist admitted any obsidian: URI, and the click handler only
called preventDefault once it had parsed an open URL -- so anything else
(advanced-uri's commandid, new?file=&content=) fell through to the anchor and
reached the OS handler, letting a shared canvas act on the reader's vault in one
click. Only obsidian://open with a file param is accepted now, and any obsidian:
href is swallowed regardless of whether it parses.

The link icon sat on the text: tldraw parks it in a geo shape's empty top-right
corner, but a text shape is exactly as big as its text. It now sits just past the
right edge. The override needs both class names -- styles.css is concatenated
ahead of the vendored tldraw CSS, so one class ties on specificity and loses on
source order, which had silently dropped the zoomed-out hide too.

Also restores the two guards the edit-link override had dropped, so the dialog
can no longer open empty; stops an invalid Enter writing the "https://" fallback
that both validators reject; scopes the obsidian:// hint to text shapes, since
the dialog also serves geo; and makes the shape-util swap assert rather than
silently no-op.

Removes the unit tests and vitest setup at the author's request.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Hoist link icon to icons.ts, and replay app migrations for schema-less files

The icon SVG now follows the TOOL_ARROW_ICON_SVG pattern and is applied
inline the way tldraw's own HyperlinkButton does, so the vendored
tl-hyperlink__icon class supplies size and color and the data URI is no
longer duplicated in styles.css.

processInitialData's schema fallback now drops only this plugin's own
sequence ids. Substituting the full current schema told loadSnapshot the
records were already migrated, so the url backfill was skipped and
store.put threw.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Use one schema fallback on both canvas load paths

readDocumentRecords, the path that runs when the backing markdown changes
on disk, had its own copy of the fallback and still substituted the full
current schema. Both call sites now share schemaBeforeAppMigrations.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Store text-shape links in meta and render them from an overlay

Michael asked us to compare meta.url against the props schema change before
committing to it, and to see how much stock tldraw we could reuse. Both point
the same way.

meta is validated as T.jsonValue, so existing canvases load untouched: the
migration, the schema fallback and its two call sites are gone, along with the
code flagged in review. The deciding argument is compatibility, not code volume
-- a file written with props.url and opened by an older build throws
Unexpected property and renders a blank canvas, while meta.url loads, is
ignored, and round-trips intact. Canvas files are markdown synced between
machines on different plugin versions, so that mattered more than keeping the
props-gated menu item for free.

Rendering the icon from InFrontOfTheCanvas, next to the existing Relations and
DragHandle overlays, means the stock text shape is never subclassed at all, so
the custom shape util and the two-shape-util-lists hazard go with it. The
trade is that the icon does not rotate with the shape, is not clipped by a
frame, and draws above shapes stacked over the text.

A two-line patch keeps tldraw's own Edit link item: useHasLinkShapeSelected
gates on 'url' in props, so it now also accepts text shapes -- always, the way
geo qualifies through a props.url that defaults to "". Gating on the presence
of meta.url instead would have made the first link unaddable.

Click gestures now match discourse nodes: plain opens the sidebar, cmd opens a
new tab, cmd+alt splits. Since meta is unvalidated, the URL allowlist is
re-applied when reading it rather than relying on the schema.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Trim two comments to the two-line limit

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Move the overlay's static styles out of JSX

apps/obsidian/AGENTS.md forbids hardcoded inline styles. Only the per-shape
left/top can be inline; the container, the button placement and the icon mask
are now classes, with the mask data URI passed as a custom property.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

* Normalise text-link URLs and stop page links reaching the OS handler

A delegated review found the allowlist and the click guard disagreeing. `new URL`
strips leading control characters, so " obsidian://open?vault=Other&file=x"
passed `isAllowedTextLinkUrl` while a raw prefix test said it was not an
obsidian URL -- so preventDefault never ran and the anchor handed the URI to the
OS handler, skipping the cross-vault check. getTextShapeLinkUrl now returns the
parsed form and every protocol test derives from the parser. Host comparison is
case-insensitive too: obsidian: is a non-special scheme, so WHATWG left
obsidian://Open uppercased and the link was rejected outright.

A page link is no longer placed in href at all. Middle-click and the context
menu bypass onClick, so the URI escaped that way regardless of the guard.

Also from the review: the wrong-tool branch of the edit-link override returned
instead of falling through, so invoking it from a non-select tool switched tool
and silently did nothing; upstream opens the dialog. The dialog's
selection-changed guard compared types and could never fire, because the tracked
parent re-renders with the new shape -- keying the inner component by shape id
resets its state instead. The overlay now culls to the viewport and skips hidden
shapes rather than scanning the whole page each camera frame.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Entire-Checkpoint: 01M3TGQGPWAVEG55KD1P9NKX28

* Prototype: patch tldraw so geo shapes get page links too

Not for merge -- a comparison branch against 5253da0, which ships a two-line
eligibility patch and keeps a vendored hyperlink button.

Patches @tldraw/validate so linkUrl accepts obsidian://open?file=, editing the
check body rather than the protocol Set so advanced-uri's commandid stays
rejected. Patches tldraw to export HyperlinkButton, dispatch a cancelable
tldraw.navigate-link event from it, and keep non-web URIs out of href. One
listener in the app then serves every link button tldraw renders, so geo, note
and image shapes get the same in-app open and cross-vault check as text.

App code drops 477 -> 434 lines: the vendored button and our own allowlist go,
and the dialog's text-vs-geo validator split collapses. Patch surface grows
26 -> 241 lines across two packages, and becomes a behaviour patch on a shared
component rather than a predicate flip.

Verified over CDP: the five text-link scenarios still pass, and a geo shape now
accepts an obsidian page link, omits href, and opens it in the sidebar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Entire-Checkpoint: 01M3WAA741724YSM5FFQ91Q97J

* Prototype C: one dialog hint for every shape type

Validation was unified across shape types but the hint still told geo
shapes "Enter a URL." Also drops the unused T import and the never-narrowed
isValid call that tripped two lint warnings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Drop the vendored link icon now that tldraw's button is used

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Fix review findings on the link patch and listener

The CJS hunk called a bare useCallback the file never imports. The listener
now normalises stored geo links before parsing, since the patched validator
accepts `Obsidian://` and leading whitespace.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Match stock edit-link guard and clear the text resize handle

Stock edit-link is a no-op outside the select tool; the override switched
tools instead. The text-link button sat on the shape's right-edge resize
target, so a press there opened the link rather than resizing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H0A8S531N9Q5XZTXNYKCNC

* Keep page links off bookmark shapes

A bookmark links its title with a raw href rather than HyperlinkButton, so a
page link there would reach the OS handler and skip the same-vault check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H0NW3MN4QX44TBKQFRF6J6

* Reject page links for bookmarks before the https fallback

The missing-protocol fallback parsed `https://obsidian://open?…` as a valid
https URL, so a bookmark still saved a mangled link.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H0R1R4MVE9PNY1BE3QF3YM

* Keep a page link pasted after the dialog's prefilled https://

The input starts as https://, so pasting a page link after it produced
https://obsidian://…, which parses as a web URL and saved silently.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H3VPANDJZBD31YAET7ZWGM

* Keep every malformed page link away from the https fallback

An obsidian:// value the validator rejects fell through to the
missing-protocol fallback and saved as https://obsidian://… on every shape.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entire-Checkpoint: 01M4H47KFXF427H52MWP79Q6ZT

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>

This branch was successfully deployed

1 active deployment
Preview — b6608c03 Deployed Oct 20, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants