Content Types¶
Glassy organises your work into a few well-defined types. Each has its own storage rules, AI affordances, and reader experience. Understanding the differences helps you build a workflow that matches how you actually think.
Canonical note types (beta.29+; canvas added in v2.40.0)¶
For API and MCP integrations, the canonical notes.type values are text,
checklist, draw, youtube, music, rss, spotify, vimeo, and canvas
— nine values, and shared/noteTypes.json in the application repo is the
single source of truth for the list. The MCP glassy_note_create /
glassy_note_update tools expose it as their type enum, and the database
enforces it with a CHECK constraint, so a value outside the list is rejected
rather than silently coerced.
These are distinct from capture categories such as Article and Repo below.
Legacy values normalize as follows: drawing → draw; rich, image,
voice, and voice_recording → text. Use canonical values for new writes;
voice recording metadata and audio remain a separate content surface.
canvas — the one type allowed to embed live content¶
A canvas note is a first-class page rather than a card: it renders in its own
viewer, and also full-screen at #/canvas/<id> for dashboards and build logs
that need the whole viewport. Both routes share one renderer, so what you see in
the modal is what you see full-screen.
Because a canvas may embed live external content, it is the only note type under an origin-scoped embed policy:
- The server publishes the permitted hostnames at
/api/capabilitiesunderrenderers.canvas.allowedOrigins; the renderer applies that list. - Only absolute
http(s)or protocol-relative (//host/…) URLs count as external. A relative URL is same-origin by definition and always renders — it cannot leave your instance. - Anything resolving to a hostname not on the allowlist is blocked, and the renderer refuses the whole canvas rather than quietly dropping one embed. That is deliberate: a dashboard missing half its frames should not look like it rendered successfully.
If a canvas you expected to render comes up refused, the blocked hostnames are
named in the UI — add the origin to the allowlist rather than pasting the content
in as a text note, which would lose the layout.
Upgrading note: canvas was added to the canonical list in v2.40.0. Because
SQLite cannot alter a CHECK constraint, existing databases were migrated by a
table rebuild that introspects its own columns and verifies its row count before
committing; a database whose constraint already admits canvas skips the rebuild
entirely.
The four primary types¶
| Type | What it stores | Counts toward storage? | AI features |
|---|---|---|---|
| Note | Rich Markdown with attachments | Yes | Full (summarise, rewrite, tag, embed) |
| Bookmark | URL plus optional title, description, tags | No | Limited (auto-tag on save, KB search) |
| Capture | Structured web content from the Companion | Yes | Full (rendered with the immersive reader) |
| Voice memo | Audio + transcript | Yes (audio) | Whisper transcription, semantic search on transcript |
Notes and captures render as rich Markdown documents. Bookmarks are lightweight URL-only records — they don't count toward your storage quota, which makes them ideal for quick saves you might not revisit. Voice memos pair an audio file with a Whisper transcript so you can search the words later.
Structured capture types (v2.9.0+)¶
When you save from the Glassy Capture extension with Smart capture enabled, you choose one of four structured types. The choice shapes the metadata header and the reader layout:
| Type | Best for | Metadata captured | Reader treatment |
|---|---|---|---|
| Article | Long-form editorial | abstract, DOI, language | Two-pane reader with hero image and progress bar |
| Video | YouTube, Vimeo | videoId, provider, channel, duration | Embedded player above prose |
| Repo | GitHub, GitLab | owner, repo, stars, language, license, topics | Header card with repo stats above the README |
| Bookmark | Quick URL with tags | none | Standard bookmark view |
Rule Engine (Settings → Rules) can auto-assign a type by URL pattern, so github.com/* always arrives as a Repo and youtube.com/* as a Video.
Choosing the right type¶
Ask two questions:
- Is it yours or someone else's? Yours → Note. Someone else's URL you want to revisit → Bookmark. Someone else's content you want to actually read and cite → Capture.
- Will you search the full text later? If yes → Note or Capture (both are full-text indexed). If no → Bookmark is enough.
How the types interact¶
- A bookmark can be promoted to a capture. Open a bookmark, click Save as capture — the URL is re-fetched with Readability and stored as a full capture with metadata.
- A capture can be turned into a note. Open a capture, click Detach to note — the Markdown body becomes editable, the source URL stays in the header.
- A note can be published. Open a note, toggle Public in the header — anyone with the link can read it on your Public Window.
- A voice memo can become a note. Open a voice memo, click Detach transcript — the Whisper text becomes a new editable note.
Tags: one policy everywhere (beta.41+)¶
Tags are the one piece of metadata every content type shares, and until v2.36.0-beta.41 there were three different rules for them depending on where the tag came from — the notes API, the capture/extension endpoints, and the AI auto-tag lane each sanitised differently. A tag you typed could arrive stored in a different shape than a tag an agent wrote or the AI suggested.
There is now one policy, applied identically to notes, bookmarks, captures, extension writes, AI auto-tagging and MCP:
| Rule | Behaviour |
|---|---|
| Maximum tags per item | 20 |
| Maximum tag length | 64 characters |
| Letter case | Lowercased — AI, ai and ai are the same tag |
| Leading/trailing whitespace | Trimmed |
| Accents, spaces and punctuation inside a tag | Preserved |
| Control characters and newlines | Rejected |
| Empty after trimming | Rejected |
| Duplicates | Collapsed |
The change you will actually notice: tags keep their words. Résumé used to
come back as rsum and release notes as releasenotes on the AI auto-tag lane,
because that lane stripped every non-alphanumeric character. Both now survive
intact (lowercased, as above). If you have old tags that were mangled this way,
they are still mangled — the fix applies to new writes, and renaming a tag in the
tag manager is the way to repair the old ones.
Invalid tags are refused, not quietly rewritten
A write carrying a tag that breaks these rules is rejected with
422 INVALID_TAGS, and the response names every offending tag with its
reason, lists the tags that were acceptable, and restates the limits. That
is deliberate: silently storing something different from what was sent is the
worst possible behaviour for an automation caller, because the divergence is
invisible until a later read.
Storage caps¶
| Tier | Total storage | Per-file limit |
|---|---|---|
| Free | 10 MB | 2 MB |
| Pro | 200 MB | 25 MB |
| Clear | 200 MB | 25 MB |
Bookmarks never count. Notes, captures, voice memos, and attachments share the per-tier cap. Storage fills up from largest files first — old voice memos are usually the biggest line item.
Learn more¶
- Capture Pipeline — how each capture type is built
- GlassyKeep — the bookmark + capture reader
- Search and Discovery — find anything across all types
- Import and Export — bring data in, take data out