This roadmap has two layers:
- Release roadmap: the default order of work for shipping usable versions.
- Feature inventory: the broader backlog of implemented, planned, and experimental work.
The release roadmap wins when priorities conflict. Exploration is still useful, but every release should have one clear promise and a small set of acceptance tests.
Current repo state: 0.0.1-dev / pre-alpha source development.
Current capability level: roughly 0.2.x-alpha feature maturity. Core editing work is significantly ahead of release infrastructure, so the first public binary does not need to start at 0.1.0 if the changelog honestly explains what already exists.
Recommended first public binary: 0.2.0-alpha.1.
Why:
- Basic vector editing, selection, undo/redo, delete, clipboard, segment hover, snapping pieces, transform tools, glyph thumbnails/search, boolean operations, and some variable/text work already exist.
- Public release basics are not done yet: no release tags, no root changelog, no release workflow, no signed/notarized binary, no published artifacts, and version files disagree.
Promise: a tester can install Shift, launch it, open a font, and try the existing core editor without building from source.
Scope:
- GitHub Release with release notes and checksums.
- Version files aligned.
- Root
CHANGELOG.md. - macOS artifact, signed and notarized if possible.
- Windows and Linux artifacts if CI can produce them without derailing the release.
- README and
shift.graphicsuse the same alpha language. - Known limitations documented prominently.
- Existing editor workflows are not blocked by obvious packaging/native-module issues.
Acceptance tests:
- Download the release artifact on a clean macOS machine.
- Launch the app without Gatekeeper workarounds, or clearly label the build as unsigned if signing is deferred.
- Open a UFO/TTF/OTF.
- Select a glyph, edit points, undo/redo, copy/paste, and close the app.
Promise: a tester can use Shift on a toy font and verify save/reopen/export behavior.
Scope:
- UFO save and Save As are reliable enough for alpha testing.
- Dirty state and close/quit save prompts are trustworthy.
- Reopen after save preserves expected glyph edits.
- TTF/OTF export path exists for simple fonts.
- Export errors are visible and actionable.
- Round-trip tests cover representative UFO edits.
- Data-loss risks are documented.
Acceptance tests:
- Open UFO, edit glyph, save, quit, reopen, verify edit.
- Save As to a new UFO and reopen it.
- Export a simple TTF/OTF and install or inspect it externally.
- Try saving a non-writable source format and verify Shift forces Save As.
Promise: a tester can work across multiple glyphs without fighting navigation or glyph metadata.
Scope:
- Recent files are functional.
- Glyph grid supports the common navigation path.
- Glyph add, duplicate, delete, and rename basics.
- Unicode/name editing basics.
- Open Recent and core File/Glyph menu items.
- Keyboard navigation in the grid.
- Basic validation for empty/missing/problem glyphs if cheap.
Acceptance tests:
- Open a font, find a glyph by name/unicode/character, edit it, move to another glyph, return to the first.
- Add or duplicate a glyph and save/reopen.
- Rename or edit unicode metadata and verify the result survives save/reopen where supported.
Promise: contour editing feels useful beyond simple point movement.
Scope:
- Boolean operations are stabilized in the UI.
- Remove overlap or path direction cleanup, whichever is more valuable first.
- Shape tools for rectangle/ellipse if they support real glyph work.
- Better point/segment indicators: extrema, open endpoints, smooth tangent lines, or equivalent.
- Measurement/guides if they unblock precision work.
- Zoom to selection / center glyph.
Acceptance tests:
- Draw overlapping contours, run boolean/remove-overlap workflow, save/reopen.
- Build a simple glyph from shapes and manual point edits.
- Use precision aids to align or measure a contour without guessing.
Promise: Shift can represent and edit composite glyph workflows at an alpha level.
Scope:
- Component data model and snapshots.
- Add component to glyph.
- Move/transform component.
- Render component bounds/ghosting.
- Decompose component.
- Basic anchors.
- Simple accented glyph generation path.
Acceptance tests:
- Build an accented glyph from a base and mark component.
- Move/transform a component and save/reopen.
- Decompose a component and continue editing outlines.
Promise: Shift can inspect and test variable font/designspace workflows, even if editing is incomplete.
Scope:
- Designspace loading is user-facing.
- Master switching.
- Add/remove or copy master workflow if feasible.
- Interpolation preview is reliable enough for tester feedback.
- Named instances.
- Instance export for simple cases.
- Compatibility errors are understandable.
Acceptance tests:
- Open designspace, switch masters, preview interpolation.
- Detect incompatible glyphs and show a useful message.
- Export or generate a simple instance.
Promise: a tester can evaluate glyphs in text context.
Scope:
- Sidebearing handles or numeric sidebearing editing.
- Spacing strings and presets.
- Preview/proofing panel.
- Waterfall view.
- Basic kerning preview or editing if ready.
- HarfBuzz shaping preview if the plumbing is ready.
Acceptance tests:
- Edit spacing for a glyph while viewing it in context.
- Save/reopen spacing changes.
- Preview a sample string at multiple sizes.
Promise: a type designer can complete a small real task end-to-end, and the beta line is primarily about fixing bugs.
Scope:
- Feature freeze for the 1.0 core workflow.
- Packaging works on the supported platforms.
- macOS signing/notarization is mandatory.
- Windows/Linux packaging status is clearly documented.
- Documentation for install, open, edit, save, export, and known limitations.
- Crash/diagnostic story or at least useful error reporting.
- File-format/data-loss risks have explicit tests.
Acceptance tests:
- Complete a small real project from install to exported font.
- Verify clean install on each supported platform.
- Verify release notes, changelog, and website match the actual release state.
Promise: Shift is a production-quality font editor for the documented core workflow.
Scope:
- Main workflow is dependable: install, open/create, edit, save/reopen, export.
- Documentation is sufficient for non-contributors.
- Compatibility and file-format expectations are explicit.
- Update path exists or the absence of auto-update is intentional and documented.
- Known critical data-loss issues are fixed.
Use these rules when deciding what to work on next:
- If the current milestone has a broken acceptance test, fix that before adding unrelated feature surface.
- Prefer work that completes an end-to-end workflow over work that adds isolated capability.
- Keep experimental work behind the current release promise unless it directly reduces release risk.
- Patch releases fix regressions only; minor releases add a new workflow promise.
- Beta means feature freeze for the beta line, not a larger feature bucket.
These are allowed to jump around when energy is high, but they should not silently become release blockers:
- Components and accents.
- Variable fonts.
- Spacing and kerning.
- OpenType feature editing.
- Scripting.
- AI/MCP integration.
- Collaboration.
- Advanced rendering/performance work.
Data Model
- Font container with metadata (family, style, version) and metrics (UPM, ascender, descender, cap height, x-height)
- Glyph structure with unicode indexing, contours, and x-advance
- Contour with open/closed state and point list
- Point with on-curve/off-curve type, smooth flag, and position
- Entity ID system (ContourId, PointId) for stable references
- Vec2 math utilities
Edit Operations
- EditSession ownership model for glyph editing
- Add/remove points
- Move points (single and batch)
- Add/remove contours
- Open/close contours
- Toggle smooth property on points
- Insert point before existing point (for bezier construction)
Pattern-Based Editing
- Rule matching system with pattern templates
- Rules: MoveRightHandle, MoveLeftHandle, MoveBothHandles
- Rules: MaintainTangencyRight, MaintainTangencyLeft
- Automatic tangency maintenance for smooth points
- Pattern expansion for rule matching
Font I/O
- UFO format loading (via norad library)
- Binary font loading (TTF/OTF via skrifa library)
- FontLoader with adaptor pattern for extensibility
- Font compilation to binary (via fontc)
Serialization
- Snapshot types (GlyphSnapshot, ContourSnapshot, PointSnapshot)
- TypeScript type generation via ts-rs
- JSON serialization for cross-language communication
- CommandResult pattern for operation responses
- FontEngine NAPI class
- Font loading from file path
- Edit session lifecycle (start/end)
- Point operations via NAPI
- Contour operations via NAPI
- Snapshot retrieval (JSON and native object variants)
- Unified edit operation with automatic rule matching
Architecture
- Electron desktop app (main/preload/renderer)
- React with TypeScript
- Tailwind CSS styling
- Zustand state management
- React Router navigation
NativeBridge TypeScript Layer
- EditingManager - point and contour mutations
- SessionManager - session lifecycle
- InfoManager - font metadata access
- HistoryManager - undo/redo structure
- IOManager - file operations structure
- Reactive signals for snapshot state
Editor System
- Editor controller class
- Scene with reactive path building from snapshots
- Viewport with coordinate transforms (screen ↔ UPM)
- Pan and zoom (wheel + tool)
- Zoom to cursor position (Cmd+/Cmd-)
- SelectionManager for point selection state
- FrameHandler for batched redraws
- Command pattern infrastructure
- Reactive signals for state management
Drawing Tools
- Pen tool with state machine
- Click to place anchor points
- Drag to create bezier handles
- Click on first point to close contour
- Custom pen cursor
- Select tool with state machine
- Click to select single point
- Shift+click to toggle in selection
- Box selection (drag on empty space)
- Drag to move selected points (with undo support)
- Arrow keys to nudge (small/medium/large increments)
- Double-click to toggle smooth
- Hand tool for panning
- Tool switching via toolbar or keyboard shortcuts (v, p, h, s, space)
Rendering
- Path2D abstraction for platform independence
- Segment parsing (line, quadratic, cubic bezier)
- Handle rendering with state (idle, hovered, selected)
- Handle types: corner, smooth, control, first, last, direction indicator
- Guide lines (ascender, cap height, x-height, baseline, descender, sidebearings)
- Bounding rectangle for multi-point selection
- Contour direction indicator
- Fill/stroke mode toggle
UI Components
- EditorView canvas with layered rendering
- GlyphGrid overview (Adobe Latin 1 charset)
- Toolbar with tool icons and tooltips
- Metrics display (cursor position)
- Custom cursor for pen tool
- Titlebar, NavigationPane, SidePane structure
Undo/Redo
- CommandHistory with reactive signals (canUndo, canRedo)
- Batching support (beginBatch/endBatch for grouped operations)
- Wire
Cmd+Z→CommandHistory.undo() - Wire
Cmd+Shift+Z→CommandHistory.redo() - Menu items for Undo/Redo (Edit menu integration)
- All point operations create proper Commands (Add, Move, Remove)
Delete Operations
-
Delete/Backspacekey →removePoints()on selection - Menu item for Delete (Edit menu integration)
- Font file opening in app (loader exists, UI integration needed)
- Shape tool (placeholder only)
Clipboard Operations
-
Cmd+C- copy selected points (serialize to clipboard) -
Cmd+X- cut (copy + delete) -
Cmd+V- paste (same position as copied) - Support pasting between glyphs
- SVG path import (paste SVG from Figma, Illustrator, etc.)
Selection Improvements
-
Cmd+A- select all points in glyph -
Escape- deselect all - Double-click on segment → select entire contour
Segment Hit Testing
- Hit testing for bezier segments (not just points)
- Calculate nearest point on curve (parametric)
- Configurable hover threshold
Segment Hover Rendering
- Track
hoveredSegmentIdin Select tool state - Highlight hovered segment (different stroke color/width)
- Show control handles when hovering near curve
- Cursor change on segment hover (crosshair)
Point Insertion
- Click on hovered segment → insert point at t parameter
- Preview point position while hovering
- Alt+click to split segment
- Option+click upgrade segment
Visual Indicators
- Extrema point markers
- Inflection point markers
- Curvature comb visualization (optional)
- Open contour endpoint markers
- Smooth point tangent lines
Additional Drawing Tools
- Ruler tool (measure distance/angle between points)
- Knife tool (cut contours at intersection)
- Bend curves with mouse (drag segment to reshape)
- Shape tool: rectangles with corner radius
- Shape tool: circles and ellipses
- Shape tool: regular polygons (triangle, pentagon, etc.)
Grid System
- Configurable grid (spacing, subdivisions)
- Snap to grid toggle (
Gkey) - Visual grid overlay (optional)
Metric Snapping
- Snap to baseline, x-height, cap height, ascender, descender
- Snap to sidebearings (0, xAdvance)
- Visual indicator when snapped
Point Snapping
- Snap to other points in glyph
- Snap to horizontal/vertical alignment
- Smart guides (temporary alignment lines)
Angle Constraint
- Hold
Shiftto constrain to 0°/45°/90° - Perpendicular constraint for smooth points
Measurement & Guidelines
- Measurement tool (measure distance/angle between any two points)
- Draggable global guidelines
- Per-glyph local guidelines
- Guideline snapping
Tools Panel (Sidebar)
- Align tools (left, center, right, top, middle, bottom)
- Distribute tools (horizontal, vertical spacing)
- Transform panel (move X/Y, scale, rotate, skew/shear)
- Numeric input fields for precise transforms
- Flip horizontal/vertical
- Rotate 90°/180°
Grid Panel Improvements
- Glyph thumbnails (render actual outlines)
- Visual indicator: empty vs. has content
- Grid zoom (cell size slider)
- List view alternative
- Search by glyph name, unicode, or character
- Filter: show only empty / filled / charset subset
- Multi-select glyphs in grid
- Right-click context menu
- Keyboard navigation (arrows, Enter to open)
Character Set Management
- Multiple charset definitions (Adobe Latin 1-5, Google Fonts Latin, etc.)
- Charset selector dropdown
- Custom charset creation
- Language coverage checker
Glyph Operations
- Add glyph (by unicode or name)
- Duplicate glyph
- Delete glyph (with component usage warning)
- Generate from template (accented letters)
Unicode & Naming
- Unicode character database (
@shift/glyph-info— glyph names, categories, decomposition, charsets, FTS5 search) - Editable unicode codepoint in glyph info panel
- Support multiple unicodes per glyph
- Unencoded glyphs (
.notdef, ligatures) - AGL (Adobe Glyph List) name lookup
- Rename glyph with cascade
Boolean Operations
- Union (merge overlapping contours)
- Subtract (cut one contour from another)
- Intersect (keep only overlapping area)
- Difference (XOR - exclude overlap)
Path Cleanup
- Remove overlap (flatten to non-overlapping paths)
- Correct path direction (outer clockwise, inner counter-clockwise)
- Reverse contour direction
- Remove redundant points (on-curve points on straight lines)
Path Modification
- Offset path (grow/shrink contours)
- Round corners (add curves at corners)
- Add corners (convert smooth to corner)
- Simplify path (reduce point count while maintaining shape)
Data Model
- ComponentRef structure (glyph reference, transform, metrics flag)
- Add components array to Glyph struct
- Snapshot serialization for components
Component Creation
- Drag glyph from grid as component
- Component picker modal
- Quick add:
Cmd+Shift+C→ type glyph name
Component Editing
- Move/transform components in editor
- Numeric transform inputs in panel
- "Use my metrics" toggle
- Reorder components (stacking)
Component Display
- Render components dimmed/ghosted
- Show component bounds
- Jump to base glyph (double-click)
Decomposition
- Decompose single component → local contours
- Decompose all → flatten glyph
- Decompose on export option
Anchors
- Define named anchors (top, bottom, ogonek)
- Visual anchor editor
- Mark-to-base positioning
Designspace Support
- Load
.designspacefiles - Parse axis definitions (wght, wdth, ital, custom)
- Named instances
Masters Editing
- Master list panel
- Switch between masters
- Add/remove masters
- Copy glyph between masters
Interpolation
- Compatibility checker (point/contour count)
- Interpolation preview slider
- Intermediate master insertion
- Extrapolation warning
Instance Generation
- Instance preview panel
- Batch instance export
- STAT table generation
Sidebearing Editing
- Draggable sidebearing handles in editor
- Numeric sidebearing input in glyph info panel
- Link sidebearings (left = right)
- Copy metrics from another glyph
Spacing View
- Text layout view (multiple glyphs on same canvas)
- Double-click glyph in text view to edit
- Spacing string presets (HOHOHOnnnooo, etc.)
- Custom spacing strings
- Adjust spacing while viewing in context
Kerning Editor
- Visual kerning pair editor
- Kern class management (group similar letters)
- Kerning preview in context
- Import/export kerning data
- Auto-kerning suggestions
Metrics Classes
- Width classes (glyphs that share metrics)
- Sync metrics across class members
- Metrics inheritance
Loading Improvements
- File → Open dialog (UFO, TTF, OTF)
- Drag-and-drop font files
- Recent files list
- Variable font axis reading from binary
Saving
- UFO write-back (preserve unmodified files)
- Auto-save drafts
- Backup on save
- Modified indicator in title bar
Compilation
- Incremental compilation (only changed glyphs)
- Background compilation (non-blocking)
- Progress indicator
- Error/warning panel with clickable locations
- Output format selection (TTF, OTF, WOFF, WOFF2)
Hinting & Shaping
- Auto-hinting via ttfautohint
- HarfBuzz shaping preview
- OpenType feature testing
- Pixel preview at multiple ppem sizes
Preview Panel
- Preview glyph in context with other glyphs
- Configurable preview strings (before/after current glyph)
- Real-time update as glyph is edited
- Multiple preview lines
- Preview size slider
Waterfall View
- Same text at multiple sizes (12, 16, 24, 36, 48, 72pt)
- Configurable size list
- Pixel rendering preview (simulated rasterization)
Sample Text & Proofing
- Sample text presets (pangrams, language samples)
- Custom sample text input
- Adhesion text (show only glyphs that exist)
- Dark mode preview (light-on-dark testing)
Comparison Tools
- Compare similar glyphs side-by-side (n/m, o/c, b/d)
- Overlay glyphs for comparison
- Compare across masters (variable fonts)
Feature Editor
- Visual GSUB rule editor (substitutions)
- Visual GPOS rule editor (positioning)
- Feature code syntax highlighting
- Feature code validation/error checking
Common Features
- Ligature editor (ffi, fl, etc.)
- Stylistic alternates management
- Small caps mapping
- Oldstyle/lining figures toggle
- Fractions builder
Feature Testing
- Live feature preview toggle
- Test specific features in isolation
- Language/script selector for testing
Landing Page
- Welcome screen on app launch
- Recent files list
- New font / Open font buttons
- Quick start templates
Multi-Tab Editing
- Multiple glyph tabs open simultaneously
- Tab bar with glyph names/characters
- Close/reorder tabs
- Keyboard shortcuts to switch tabs (Cmd+1-9, Cmd+Shift+[ ])
- Tab context menu (close others, close all)
Glyph Info Sidebar
- Unicode codepoint display/edit
- Glyph name
- Advance width (x-advance)
- Left/right sidebearings
- Vertical metrics (if applicable)
- Kerning pairs involving this glyph
- Component list (if composite)
- Contour/point count summary
Inspector Panel
- Selected point coordinates (editable)
- Point type toggle
- Contour info (point count, closed/open)
- Transform inputs (panel)
Menu System
- File: New, Open, Open Recent, Close, Save, Save As, Revert, Export, Quit
- Edit: Undo, Redo, Cut, Copy, Paste, Delete, Select All, Deselect
- Glyph: Previous, Next, Go to..., Add, Duplicate, Delete, Reverse Contours
- Point: Convert to Corner/Smooth, Add, Delete, Align, Distribute
- View: Zoom In/Out, Fit, Show Grid, Show Guides, Show Metrics
- Font: Font Info, Metrics, Kerning, Features
- Window: Glyph Grid, Preview, Spacing
- Debug: Toggle Debug Overlay, Show IDs, Performance Stats
- Help: Documentation, Shortcuts, About
Debug Menu
- Toggle debug overlay
- Point/contour ID labels
- Performance statistics (fps, render time)
- Snapshot JSON inspector
- Force redraw
Preferences Panel
- General (auto-save, default UPM)
- Editor (grid size, snap threshold, handle size)
- Appearance (theme, colors)
- Shortcuts (customizable keybindings)
Workflow Improvements
- Zoom to selection (fit view to selected points)
- Center glyph in view
- Lock layers (prevent accidental edits)
- Template/background layer (reference image)
- Find/replace contours (search for shape, replace with another)
- Glyph notes/comments (annotations per glyph)
- Multiple selection across glyphs (batch edit)
Validation & Quality
- Validation panel (check for common issues)
- Open path detection
- Wrong direction warning
- Missing extrema points
- Overlapping points detection
- Outline consistency checker
macOS
- Signed
.appbundle -
.dmginstaller - Notarization
- Universal binary (Intel + Apple Silicon)
- Auto-updater (Sparkle)
Windows
- NSIS or WiX installer
- Code signing
- Auto-updater
Linux
- AppImage
- .deb package
- .rpm package
Release Infrastructure
- GitHub Actions CI/CD
- Automated changelog
- Version bumping workflow
- Crash reporting
TypeScript/JavaScript Scripting
- Script runner panel (paste & run)
- Script library (save/load)
- Typed API with autocomplete
- Script marketplace/sharing
Script API Surface
interface ShiftScriptContext {
font: FontAPI;
selection: SelectionAPI;
ui: { alert, prompt, progress };
geometry: { distance, pointOnBezier, ... };
}Phase 1: File Sync
- Conflict detection on load
- Merge UI for conflicts
Phase 2: Lock-Based
- "User A is editing glyph X" locks
- Real-time presence indicators
Phase 3: CRDT (Advanced)
- Yjs or Automerge integration
- Peer-to-peer or relay server
MCP Server
- Expose Shift as MCP server
- Tools: getGlyph, movePoint, addContour, exportPreview
- Claude can read/write font data
AI-Assisted Features
- Auto-spacing suggestions
- Consistency checker ("these curves have different tension")
- Interpolation compatibility helper
- Style matching ("make this glyph match the weight")
Cowork Mode (Experimental)
- Real-time AI observation
- Suggestions as you draw
- Candidate glyph generation
The authoritative milestone plan is the release roadmap at the top of this file. This section is a compact index.
- Release infrastructure and installable binaries.
- Existing core vector editing exposed to testers.
- Clear alpha limitations.
- Save/reopen loop.
- Save As and dirty state.
- Basic TTF/OTF export.
- Round-trip tests.
- Recent files.
- Better glyph grid navigation.
- Glyph add/duplicate/delete/rename.
- Unicode/name editing basics.
- Stabilized boolean/path operations.
- Shape and precision workflow improvements.
- Better contour indicators and validation basics.
- Component data model.
- Component editing/rendering/decomposition.
- Anchors.
- Accented glyph generation basics.
- User-facing designspace workflow.
- Master switching.
- Interpolation preview.
- Named instances and simple instance export.
- Sidebearing editing.
- Spacing strings.
- Preview/proofing panel.
- Waterfall view.
- Feature freeze for the 1.0 core workflow.
- Cross-platform packaging.
- Documentation.
- File-format and data-loss hardening.
- Production-quality documented core workflow.
- Signed distributions.
- Clear compatibility and update posture.
Testing
- Increase Rust unit test coverage
- Integration tests for native bindings
- Frontend component tests
- E2E tests (Playwright)
- Visual regression tests
Performance
- WebGL/GPU path rendering
- Off-screen canvas for grid thumbnails
- Web Workers for computation
- Virtual scrolling for large glyph sets
- Snapshot diffing for minimal redraws
Developer Experience
- Native module hot reload
- State persistence across reloads
- Component storybook
- Mock NativeBridge for frontend dev
Code Quality
- Oxlint for linting
- tsgo for type checking
- Pre-commit hooks (format, lint, typecheck, test)
- Remove debug logging from production
- Consolidate duplicate types
- Document public APIs
- Architecture decision records