Search...Search plugins and themes...
⌘K
Sign in
  • Get started
  • Download
  • Pricing
  • Enterprise
  • Account
  • Obsidian
  • Overview
  • Sync
  • Publish
  • Canvas
  • Mobile
  • Web Clipper
  • CLI
  • Learn
  • Help
  • Developers
  • Changelog
  • About
  • Roadmap
  • Blog
  • Resources
  • System status
  • License overview
  • Terms of service
  • Privacy policy
  • Security
  • Community
  • Plugins
  • Themes
  • Discord
  • Forum / 中文论坛
  • Merch store
  • Brand guidelines
Follow us
DiscordTwitterBlueskyThreadsMastodonYouTubeGitHub
© 2026 Obsidian

Vellum

ZavielZaviel34 downloads

Mobile mockups for plugins and vault apps: lay out screens on real phone frames, saved as small JSON files your coding agent reads and builds from.

Add to Obsidian
  • Overview
  • Scorecard
  • Updates13

Mobile mockups for Obsidian plugins and vault apps, designed with your coding agent.

English · 繁體中文

You edit screens on a phone, Vellum keeps them as JSON files, your agent reads and writes the same files

Sketch your plugin's screens on a real phone frame, inside your vault. Vellum keeps each screen as a small JSON file: your agent reads exactly where everything is and builds the plugin to match, with no screenshots and no long descriptions. Colours, fonts and icons come from your Obsidian theme, so the mockup already looks like the plugin.

The JSON is a layout intent, not native layout code. It maps directly to HTML and CSS, so to Obsidian plugins; for SwiftUI or Compose, see the FAQ.

Install · Quick start · With your agent · File format · FAQ

A home screen with flip-card numbers A stocks screen A spending screen A savings screen

Screens of ZeLedger, a personal finance app built in Obsidian, designed in Vellum with Claude Code. Every number is made up.

The Vellum editor: the screens tree, the phone, and the settings of the chosen block

Features


Real devices
iPhone 12 – 17, Pixel 8, Galaxy S24 / S25, or any size, with cut-outs and safe areas.

Portrait and landscape
A layout for each, one switch for the whole editor.

Blocks and gravity
Text and shapes keep an anchor point, an offset, and hug / fixed / fill sizes.

Pictures and icons
Images by address or vault path; Lucide icons by name.

Frames
Screens share a layout and store only what they change.

Snapping
Edges, middles, margins and neighbours, with guide lines.

Screen map
Every screen as a tree, joined by how you get there.

Its own window
A full editor on a computer, a bottom sheet on a phone.

Plain JSON
One file per screen, one block per line. Small diffs.

The map: every screen as a tree, joined by how you get there
Map: every screen as a tree; mocks have a dashed outline

Install

  • BRAT: add the beta plugin zelvet-velvet/vellum.
  • Manual: copy main.js, manifest.json and styles.css from the latest release into <vault>/.obsidian/plugins/vellum/, then enable Vellum.

Quick start

  1. Click Vellum in the ribbon. The editor opens on Screens/.
  2. New Screen, add a block, place items in it.
  3. Ctrl+S to save.

Want sample screens? Copy examples/Vellum Demo.md into your vault.

With your agent

Any agent that reads and writes files works: Claude Code, Codex, Cursor. No plugin API, no server.

  1. The agent drafts your app's screens, or proposes new ones.
  2. You adjust them in the editor and leave a Note on what to change.
  3. The agent builds from the screens you changed.
The stocks screen

The card with the mix bars, as its file holds it:

{"name": "Card 2", "kind": "card",
 "x": 16, "y": 397, "w": 396, "h": 182, "items": [
  {"type": "text", "v": "MIX VS YOUR TARGET", "size": 12},
  {"type": "text", "v": "4 WARNINGS", "dx": 286, "color": "dim"},
  {"type": "text", "v": "Stock ETF", "dy": 29, "size": 15},
  {"type": "rect", "dy": 54, "w": 396, "h": 16, "fill": "dim"}
]}

One screen is one small file. The agent reads exactly where each thing is, and changes only what it needs to.

Read github.com/zelvet-velvet/vellum's README for the file format.
Write each page of my app as a Vellum screen in Design/Screens, one JSON file per screen.
Use real text, pictures by https address and icons by Lucide name. Keep ids stable.
Draw a card's background or outline with the block's own fill / stroke, and a chip or tile with the text's own box,
not with rectangles under them.

[!TIP] Frames belong to what they frame: a block has its own fill, stroke and sides, a text its own box. A rectangle drawn as a frame (an older screen) shows Make it the block's look or Make it the text's box when you choose it.

Ask for two or three mocks ("mock": true) as sub screens and keep the one you like. The agent can write while the editor is open: Vellum reloads the files and never overwrites your unsaved edits.

The screens of Morellonomicon and ZeLedger were designed this way, with Claude Code.

File format

flowchart LR
  D["Doc<br/>device, safe areas"] --> P["Page<br/>one screen"]
  P --> B["Block<br/>x, y, w, h, kind"]
  B --> I["Item<br/>text · rect · ellipse · line<br/>img · icon · row · col"]
  P -. "inherit: true" .-> F["Parent page<br/>used as its frame"]

A folder holds one JSON file per screen, plus _doc.json for the device and the screen order. Show it in a note with:

```vellum
src: Design/Screens
```
{"id": "home", "name": "Home", "blocks": [
  {"id": "b1", "name": "Title", "kind": "nav", "x": 16, "y": 70, "w": 370, "h": 44, "items": [
    {"id": "t1", "type": "text", "v": "HOME", "font": "display", "size": 32, "g": "l"}]}]}
Field reference
Level Fields
Doc device; safe, safeLand (top bottom left right, each optional)
Page name, note, parent, link (how you get there), inherit (true: the parent is its frame), device, bg, mock, blocks, land (the landscape layout)
Block name, kind, note, x y w h (screen points), bleed (true: may go into the safe areas), its own look: fill stroke sw r and sides (the outline on some sides only: "b", "tb"…), items
Any item g (anchor: tl t tr l c r bl b br), dx dy, w h (a number, "hug" or "fill"), op, note
text v size wt font color ls lh upper, and a box of its own: fill stroke sw r pad (a chip, a tile, a button; with a set h the text sits in its middle)
rect ellipse line fill stroke sw r (r: one radius, or four: [tl, tr, br, bl])
img src (https://… or a vault path), fit (cover · contain · fill), pos (CSS object-position), r
icon name (Lucide), color size sw
row col items gap pad main cross, fill stroke sw r

Frames. A page with "inherit": true draws its parent's blocks under its own. An own block with the same id replaces the parent's one; the page stores only its own blocks.

Colours and fonts. Items use theme names (paper text dim line tile loud accent; ui display mono), set in Settings → Vellum, or any CSS value. The editor's own panels follow your Obsidian theme, or the Editor theme colours in the same settings.

Shortcuts

← → ↑ ↓ Nudge 1 pt, with Shift one grid step
Ctrl Z · Ctrl Shift Z Undo · redo
Ctrl D · Delete Duplicate · delete
Ctrl S Save
Alt / Shift while dragging No snapping · keep the shape
Hold a number box, then drag up / down Change it (a click types; ↑ ↓ step it, with Shift ×10)

FAQ

Does Vellum use the network?

Only to show a picture whose src is an https:// address, as an image in a note would. Vellum makes no requests of its own.

Can I use it for a native iOS or Android app?

Yes, as a sketch your agent translates. Inside a block, items are placed the way native layouts work:

Vellum SwiftUI Compose
anchor point (g) alignment Alignment
"hug" / "fill" .fixedSize() / .frame(maxWidth: .infinity) wrapContentSize() / fillMaxWidth()
row / col HStack / VStack Row / Column

Blocks themselves sit at fixed positions on the screen, so the agent turns those into stacks and spacing.

Does it work on a phone?

Yes. The editor takes the full screen, with its settings in a bottom sheet.

Where is unsaved work kept?

On the device, in Obsidian's storage for that vault, until you save.

How do I build it?
npm install && npm run check && npm run build
npm run install-vault -- /path/to/vault

Support

Vellum is free and made in my spare time. If it helps you, a coffee keeps it going.

HealthExcellent
ReviewSatisfactory
About
Sketch mobile app screens inside your vault using real phone frames and your Obsidian theme's colors, fonts and icons. Save each screen as a compact JSON layout intent that maps to HTML/CSS and supports device presets, portrait/landscape, snapping, frames and images for agent-driven builds.
InterfaceCanvasDrawing
Details
Current version
0.8.3
Last updated
2 days ago
Created
5 days ago
Updates
13 releases
Downloads
34
Compatible with
Obsidian 1.6.6+
Platforms
Desktop, Mobile
License
MIT
Report bugRequest featureReport plugin
Sponsor
Ko-fi
Author
ZavielZavielzelvet-velvet
github.com/zelvet-velvet
GitHubzelvet-velvet
  1. Community
  2. Plugins
  3. Interface
  4. Vellum

Related plugins

Draw in Canvas

Draw freehand annotations on Obsidian JSON Canvas files.

Excalidraw

Visual PKM powerhouse. Create and edit Excalidraw drawings.

Advanced Canvas

Supercharge your canvas experience. Create presentations, flowcharts and more.

Hider

Hide interface elements such as tooltips, status bar, titlebar, and more.

Meta Bind

Make your notes interactive with inline input fields, metadata displays, and buttons.

Mermaid Tools

Improved Mermaid.js experience: visual toolbar with common elements and more.

Note Toolbar

Add customizable toolbars to your notes.

Editing Toolbar

The Editing Toolbar is modified from cMenu, which provides more powerful customization settings and has many built-in editing commands to be a MS Word-like toolbar editing experience.

Force note view mode

Force the view mode for a note by using frontmatter: YAML block with 'obsidian_ui_mode' as key.

Agent Client

Chat with Claude Code, Codex, Gemini CLI, and more via the Agent Client Protocol — right from your vault.