✅ Introduction
The Scimax Capture system provides a quick and efficient way to capture notes, tasks, ideas, and snippets without interrupting your workflow. Inspired by Emacs org-capture, it allows you to define templates that automatically format and file your captured content to the right location.
✅ What is Capture?
Capture is a fast note-taking system that:
Collects information quickly with minimal keystrokes
Uses templates to structure your notes consistently
Automatically files content to the appropriate location
Supports various capture types (TODOs, notes, journal entries, code snippets, etc.)
Includes context from where you initiated the capture (links, selection, clipboard)
✅ Key Features
Template-based capture: Define reusable templates for different types of content
Flexible targeting: Capture to end of file, under specific headlines, or in date trees
Context awareness: Automatically includes links to source location, timestamps, and selected text
Quick capture commands: Fast shortcuts for common captures (TODO, note)
Preview before saving: Optional preview of captured content before filing
Custom variables: Rich template language with placeholders, timestamps, and prompts
✅ Philosophy
The capture system follows the principle of "capture first, organize later." Instead of interrupting your flow to decide where something belongs or how to format it, you simply invoke a capture template and let the system handle the details. This reduces friction and helps you maintain focus on your primary task.
✅ Getting Started
✅ Your First Capture
The quickest way to capture a TODO is:
Press C-c c (or run Scimax: Capture)
Select the "Todo" template (or press `t')
Enter your task description
Press Enter
Your TODO is now filed to `todo.org' without leaving your current context.
Quick TODO Capture
For even faster TODO capture, use the dedicated quick capture command:
Press C-c t (or run Scimax: Quick Capture TODO)
Type your task
Press Enter
This bypasses the template picker and goes straight to TODO capture.
Capturing with Context
When you invoke capture with text selected:
Select some text in your editor
Press `C-c c'
Choose a template (e.g., "Code Snippet")
The selected text is automatically included in your capture
The capture system also includes a link back to where you initiated the capture, making it easy to return to context later.
Capture Templates
Built-in Templates
Scimax comes with several built-in templates:
Todo Template (`t')
Captures a TODO item to todo.org:
,* TODO Task description
Note Template (`n')
Captures a quick note to notes.org:
,* Note title
[2026-01-13 Mon 14:30]
Note content here...
Journal Template (`j')
Captures a journal entry to journal.org in a date tree:
,* 2026
,** 2026-01 January
,*** 2026-01-13 Monday
,**** [2026-01-13 Mon 14:30] Entry title
Entry content...
Meeting Template (`m')
Captures structured meeting notes to meetings.org:
,* Meeting: Subject
<2026-01-13 Mon 14:00>
,** Attendees
Names...
,** Agenda
,** Notes
,** Action Items
Code Snippet Template (`s')
Captures code snippets to snippets.org:
,* Description
:PROPERTIES:
:CREATED: [2026-01-13 Mon 14:30]
:SOURCE: [[file:/path/to/source.ts::42]]
:END:
,#+BEGIN_SRC python
selected code here
,#+END_SRC
Bookmark Template (`b')
Saves bookmarks to bookmarks.org:
,* [[https://example.com][Page Title]]
[2026-01-13 Mon 14:30]
Optional notes about the bookmark...
Viewing All Templates
To see all available templates:
Run Scimax: List Capture Templates
Or press `C-c c' to see the template picker
Each template shows:
Its key (single letter shortcut)
Template name and description
Target file
Creating Custom Templates
Using the Template Creator
The easiest way to create a template is with the interactive creator:
Run Scimax: Create Capture Template
Enter a key (e.g., `r' for "Research note")
Enter a name (e.g., "Research Note")
Specify the target file (e.g., `research.org')
Choose where to insert (end of file, under headline, date tree)
Enter the template content
The template is saved to your VS Code settings and immediately available.
Manual Template Configuration
You can also define templates directly in settings.json:
{
"scimax.capture.templates": [
{
"key": "r",
"name": "Research Note",
"description": "Capture research findings",
"file": "research.org",
"template": "* %^{Topic}\n%U\n\n%?",
"target": {
"type": "file+headline",
"headline": "Research Notes"
}
}
]
}
Template Structure
Each template has these properties:
| Property | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Single character or short key |
name | string | Yes | Display name |
description | string | No | Longer description |
file | string | Yes | Target file path |
template | string | Yes | Template content with placeholders |
target | object | No | Where to insert content (see below) |
properties | object | No | Properties to add to entry |
tags | array | No | Tags to add to entry |
Template Syntax
Templates use a powerful placeholder system to insert dynamic content.
Basic Placeholders
| Placeholder | Description | Example |
|---|---|---|
%? | Final cursor position | * TODO Task%? |
%i | Initial content (selection or clipboard) | Description: %i |
%t | Date (inactive timestamp) | [2026-01-13 Mon] |
%T | Date and time (active timestamp) | <2026-01-13 Mon 14:30> |
%u | Date (inactive timestamp) | [2026-01-13 Mon] |
%U | Date and time (inactive timestamp) | [2026-01-13 Mon 14:30] |
%n | User name | john |
%f | Source file name | source.ts |
%F | Source file full path | /path/to/source.ts |
%% | Literal percent sign | % |
Interactive Prompts
| Placeholder | Description | Example |
|---|---|---|
%^{prompt} | Prompt for input | %^{Task description} |
%^{prompt\vert{}default} | Prompt with default value | %^{Priority\vert{}HIGH} |
%^t | Prompt for date | Asks for date input |
%^T | Prompt for date and time | Asks for date/time input |
%^g | Prompt for tags | Prompts for comma-separated tags |
Link Placeholders
| Placeholder | Description | Result |
|---|---|---|
%a | Annotation (link to source) | [[file:/path/to/source.ts::42]] |
%A | Annotation with description | [[file:/path/to/source.ts::42][source.ts:42]] |
%l | Literal link | file:/path/to/source.ts::42 |
Expression Placeholders
| Placeholder | Description | Example |
|---|---|---|
%(format-time-string "%Y-%m") | Custom date format | 2026-01 |
%(current-time) | ISO timestamp | 2026-01-13T14:30:00.000Z |
Examples
Simple TODO with prompt
,* TODO %^{Task}
When captured, prompts for "Task" and creates:
,* TODO Write documentation
Note with timestamp and link back to source
,* %^{Title}
%U
%i
Source: %a
Creates:
,* Meeting notes
[2026-01-13 Mon 14:30]
Discussed project timeline
Source: [[file:/home/user/project.org::25]]
Meeting template with multiple prompts
,* %^{Meeting subject}
%T
,** Attendees
%^{Attendees}
,** Agenda
%?
Prompts for subject and attendees, places cursor under Agenda.
Capture Targets
Capture targets determine where your captured content is inserted.
File Target (`file')
Appends to the end of the file.
{
"target": {
"type": "file"
}
}
With prepend: true, inserts at the beginning (after file-level keywords):
{
"target": {
"type": "file",
"prepend": true
}
}
Headline Target (file+headline)
Inserts under a specific headline. If the headline doesn't exist, it's created.
{
"target": {
"type": "file+headline",
"headline": "Inbox"
}
}
This finds or creates a headline * Inbox and appends content as a child.
With prepend: true, inserts right after the headline:
{
"target": {
"type": "file+headline",
"headline": "Inbox",
"prepend": true
}
}
Date Tree Target (file+datetree)
Creates a hierarchical date tree structure:
,* 2026
,** 2026-01 January
,*** 2026-01-13 Monday
,**** Your captured content here
{
"target": {
"type": "file+datetree"
}
}
Perfect for journal entries and time-based organization.
Default Target
If no target is specified, content is appended to the end of the file:
{
"file": "notes.org",
"template": "* %^{Note}\n%?"
}
Running Capture
Capture Command
The main capture command opens the template picker:
Command: Scimax: Capture
Keybinding: C-c c
This shows all available templates. Select one to begin capture.
Capture by Key
If you know the template key, you can capture directly:
Command: Scimax: Capture by Key
Enter the template key (e.g., `t' for TODO)
Quick Capture Commands
For common captures, use dedicated quick capture commands:
Quick TODO
Command: Scimax: Quick Capture TODO
Keybinding: C-c t
Directly captures a TODO without showing the template picker.
Quick Note
Command: Scimax: Quick Capture Note
Directly captures a note.
Capture Process
Invoke capture: Press C-c c or run a quick capture command
Select template: Choose from the picker (or skip if using quick capture)
Fill prompts: Enter values for any %^{prompt} placeholders
Preview (optional): Review the captured content
Confirm: Press "Capture" to file the content
The captured content is inserted at the target location, and you receive a confirmation message.
Advanced Capture Features
Capturing with Selection
When you have text selected:
Select text in the editor
Press `C-c c'
Choose a template
The selected text is available as %i in your template. Perfect for:
Capturing code snippets
Quoting text
Collecting research excerpts
Capturing with Context Links
Templates can include links back to where you initiated the capture:
`%a' creates a link to the source location
%A creates a link with description (filename:line)
`%l' creates a literal link string
Example template:
,* %^{Note}
%U
%i
Source: %A
Creates:
,* Important finding
[2026-01-13 Mon 14:30]
Selected text here
Source: [[file:/home/user/research.org::42][research.org:42]]
Capture Preview
Enable preview to review content before filing:
{
"scimax.capture.showPreview": true
}
When enabled, you can:
See the expanded template content
Review formatting and placement
Cancel or confirm the capture
Auto-open After Capture
Configure whether to open the target file after capture:
{
"scimax.capture.openAfterCapture": true
}
When enabled, the target file opens and the cursor jumps to the captured content.
Capture to Journal
Capture integrates seamlessly with the journal system.
Journal Capture Template
The built-in journal template (j) uses date tree targeting:
{
"key": "j",
"name": "Journal",
"file": "journal.org",
"template": "* %U %^{Entry title}\n%?",
"target": {
"type": "file+datetree"
}
}
Custom Journal Captures
Create specialized journal capture templates:
Daily Reflection
{
"key": "d",
"name": "Daily Reflection",
"file": "journal.org",
"template": "* Daily Reflection\n** What went well\n%^{Wins}\n** What to improve\n%^{Improvements}\n** Tomorrow's focus\n%?",
"target": {
"type": "file+datetree"
}
}
Quick Log Entry
{
"key": "l",
"name": "Log Entry",
"file": "journal.org",
"template": "* %U - %^{What happened?}",
"target": {
"type": "file+datetree"
}
}
Integrating with Journal Directory
You can point capture templates to your journal directory:
{
"scimax.capture.defaultDirectory": "~/scimax-journal",
"scimax.capture.templates": [
{
"key": "j",
"name": "Journal Entry",
"file": "2026/01/13/2026-01-13.org",
"template": "* %T %^{Entry}\n%?"
}
]
}
Or use the journal's date structure dynamically with date tree targeting.
Capture to Inbox
A common GTD workflow uses an "inbox" for quick captures that are processed later.
Inbox Setup
Create an inbox file (`inbox.org')
Define a capture template targeting it
{
"key": "i",
"name": "Inbox",
"file": "inbox.org",
"template": "* %^{Quick capture}\n%U\n%?\n\nSource: %a"
}
Inbox with Categories
Use headlines to organize inbox items:
{
"key": "it",
"name": "Inbox - Task",
"file": "inbox.org",
"template": "* TODO %^{Task}\n%U",
"target": {
"type": "file+headline",
"headline": "Tasks"
}
}
{
"key": "ii",
"name": "Inbox - Idea",
"file": "inbox.org",
"template": "* %^{Idea}\n%U\n%?",
"target": {
"type": "file+headline",
"headline": "Ideas"
}
}
Creates structure:
,* Tasks
,** TODO Review pull request
[2026-01-13 Mon 14:30]
,* Ideas
,** Build automated testing framework
[2026-01-13 Mon 14:35]
Configuration
Settings Overview
| Setting | Type | Default | Description |
|---|---|---|---|
scimax.capture.templates | array | [ ] | Custom capture templates |
scimax.capture.defaultDirectory | string | "" | Default directory for capture files |
scimax.capture.showPreview | boolean | true | Show preview before capture |
scimax.capture.openAfterCapture | boolean | true | Open file after capture |
Default Directory
Set a default directory for all capture files:
{
"scimax.capture.defaultDirectory": "~/org"
}
Template file paths are resolved relative to this directory:
{
"scimax.capture.defaultDirectory": "~/org",
"scimax.capture.templates": [
{
"key": "t",
"name": "Todo",
"file": "todo.org", // Resolves to ~/org/todo.org
"template": "* TODO %^{Task}\n%?"
}
]
}
File Path Resolution
Capture resolves file paths in this order:
Absolute paths: /home/user/notes/todo.org - used as-is
Home directory: `/org/todo.org - expands `'' to home directory
Default directory: todo.org - resolves relative to defaultDirectory
Workspace: todo.org - resolves relative to first workspace folder
Configuring Preview
Control whether to show preview before saving:
{
"scimax.capture.showPreview": true
}
When enabled:
Preview shows the expanded template content
You can choose "Capture", "Preview", or "Cancel"
Preview opens content in a temporary editor
When disabled:
Content is captured immediately
Faster workflow for trusted templates
Auto-open Behavior
Control whether the target file opens after capture:
{
"scimax.capture.openAfterCapture": true
}
When enabled:
Target file opens in editor
Cursor jumps to captured content
Useful for immediately expanding on the capture
When disabled:
Capture happens in background
You stay in your current file
Faster workflow for quick captures
Complete Example Configuration
{
"scimax.capture.defaultDirectory": "~/org",
"scimax.capture.showPreview": false,
"scimax.capture.openAfterCapture": false,
"scimax.capture.templates": [
{
"key": "t",
"name": "Todo",
"description": "Quick TODO capture",
"file": "todo.org",
"template": "* TODO %^{Task}\n%U\n%?"
},
{
"key": "n",
"name": "Note",
"file": "notes.org",
"template": "* %^{Title}\n%U\n\n%?\n\nSource: %a",
"target": {
"type": "file+headline",
"headline": "Quick Notes"
}
},
{
"key": "j",
"name": "Journal",
"file": "journal.org",
"template": "* %U %^{Entry}\n%?",
"target": {
"type": "file+datetree"
}
},
{
"key": "m",
"name": "Meeting",
"file": "meetings.org",
"template": "* %^{Subject}\n%T\n** Attendees\n%^{Attendees}\n** Notes\n%?\n** Action Items\n",
"properties": {
"MEETING_DATE": "%t"
},
"tags": ["meeting"]
}
]
}
Common Capture Workflows
GTD Workflow
Inbox Processing
Quick capture everything: Use C-c c → i to capture to inbox
Process inbox regularly: Review inbox.org daily
Refile to projects: Move items to appropriate project files
Archive processed items: Keep inbox clean
Inbox Template
{
"key": "i",
"name": "Inbox",
"file": "inbox.org",
"template": "* %^{Capture}\n%U\n%?\n\nContext: %a"
}
Research Workflow
Collect Sources
{
"key": "r",
"name": "Research Source",
"file": "research.org",
"template": "* %^{Source}\n:PROPERTIES:\n:URL: %^{URL}\n:ADDED: %U\n:END:\n\n** Summary\n%?\n\n** Quotes\n%i",
"target": {
"type": "file+headline",
"headline": "Sources"
}
}
Usage:
Select a quote from a paper/article
Press `C-c c' → `r'
Enter source name and URL
The quote is captured in the "Quotes" section
Code Documentation Workflow
Capture Code Examples
{
"key": "c",
"name": "Code Example",
"file": "code-snippets.org",
"template": "* %^{Description}\n:PROPERTIES:\n:LANGUAGE: %^{Language|typescript|python|javascript}\n:SOURCE: %a\n:CREATED: %U\n:END:\n\n#+BEGIN_SRC %\\2\n%i\n#+END_SRC\n\n** Notes\n%?",
"tags": ["code", "example"]
}
Usage:
Select code in editor
Press `C-c c' → `c'
Describe the code and specify language
Creates a documented code snippet with link back to source
Meeting Notes Workflow
Before Meeting
Capture meeting agenda:
{
"key": "ma",
"name": "Meeting Agenda",
"file": "meetings.org",
"template": "* MEETING %^{Subject}\nSCHEDULED: %^t\n** Attendees\n%^{Attendees}\n** Agenda\n%?\n** Notes\n\n** Action Items\n",
"properties": {
"MEETING_TYPE": "%^{Type|standup|planning|review|1on1}"
}
}
During Meeting
Use quick note capture for rapid notes:
{
"key": "mn",
"name": "Meeting Note",
"file": "meetings.org",
"template": "* %T - %^{Note}\n%?",
"target": {
"type": "file+headline",
"headline": "Meeting Notes"
}
}
After Meeting
Capture action items:
{
"key": "mt",
"name": "Meeting Action Item",
"file": "todo.org",
"template": "* TODO %^{Action Item}\nDEADLINE: %^t\n:PROPERTIES:\n:MEETING: %^{Meeting}\n:ASSIGNED: %^{Assignee}\n:END:\n%?",
"tags": ["meeting-action"]
}
Daily Planning Workflow
Morning Review
{
"key": "p",
"name": "Daily Plan",
"file": "journal.org",
"template": "* Daily Plan\n** Top 3 Priorities\n1. %^{Priority 1}\n2. %^{Priority 2}\n3. %^{Priority 3}\n** Schedule\n%?\n** Notes\n",
"target": {
"type": "file+datetree"
}
}
Evening Review
{
"key": "dr",
"name": "Daily Review",
"file": "journal.org",
"template": "* Daily Review\n** Completed\n%^{What did you complete?}\n** Wins\n%^{What went well?}\n** Learn\n%^{What did you learn?}\n** Tomorrow\n%?",
"target": {
"type": "file+datetree"
}
}
Knowledge Base Building
Capture Learnings
{
"key": "l",
"name": "Learning",
"file": "knowledge.org",
"template": "* %^{What did you learn?}\n:PROPERTIES:\n:TOPIC: %^{Topic|programming|design|business|other}\n:LEARNED: %U\n:SOURCE: %a\n:END:\n\n%?\n\n** Related\n",
"tags": ["learning"]
}
Capture Questions
{
"key": "q",
"name": "Question",
"file": "questions.org",
"template": "* QUESTION %^{Question}\n%U\n\n** Context\n%?\n\n** Potential Answers\n\n** Resolution\n",
"tags": ["question"]
}
When you find the answer, update the "Resolution" section.
Commands Reference
Main Commands
| Command | Description | Keybinding |
|---|---|---|
Scimax: Capture | Open capture template picker | C-c c |
Scimax: Capture by Key | Capture using template key | |
Scimax: Quick Capture TODO | Fast TODO capture | C-c t |
Scimax: Quick Capture Note | Fast note capture | |
Scimax: Create Capture Template | Create new template interactively | |
Scimax: List Capture Templates | View all available templates | |
Scimax: Configure Capture Templates | Open capture settings |
Template Management Commands
| Command | Description |
|---|---|
Scimax: Create Capture Template | Interactive template creation |
Scimax: List Capture Templates | Show all templates |
Scimax: Configure Capture Templates | Open settings.json for capture |
Keybindings
Default Keybindings
| Keybinding | Action | Context |
|---|---|---|
C-c c | Open capture picker | Global |
C-c t | Quick TODO capture | Global |
Custom Keybindings
Add custom keybindings in keybindings.json (C-k C-s to open):
Quick Capture Note
{
"key": "ctrl+c n",
"command": "scimax.capture.note"
}
Capture to Inbox
{
"key": "ctrl+c i",
"command": "scimax.captureByKey",
"args": "i"
}
Journal Capture
{
"key": "ctrl+c j",
"command": "scimax.captureByKey",
"args": "j"
}
Context-aware Keybindings
Capture only when editing org files:
{
"key": "ctrl+c c",
"command": "scimax.capture",
"when": "editorLangId == org"
}
Tips and Best Practices
Start Simple
Begin with a few basic templates:
TODO capture
Note capture
Journal entry
Add specialized templates as needs emerge.
Use Consistent File Organization
Keep capture files organized:
~/org/ ├── inbox.org # Unprocessed captures ├── todo.org # Active tasks ├── projects/ # Project-specific files │ ├── project-a.org │ └── project-b.org ├── journal.org # Journal entries ├── notes.org # General notes └── archive.org # Completed items
Process Inbox Regularly
Set a schedule to process inbox.org:
Daily: Quick review and refile urgent items
Weekly: Deep review, refile everything
Leverage Context Links
Always include %a or %A in templates to link back to source:
Source: %a
This makes it easy to jump back to context when reviewing captures.
Combine with Agenda
Capture TODO items with timestamps to make them appear in the agenda:
,* TODO %^{Task}
SCHEDULED: %^t
%?
Create Domain-Specific Templates
For specialized work, create focused templates:
Bug Report Template
{
"key": "bug",
"name": "Bug Report",
"file": "bugs.org",
"template": "* BUG %^{Description}\n:PROPERTIES:\n:REPORTED: %U\n:SEVERITY: %^{Severity|high|medium|low}\n:COMPONENT: %^{Component}\n:END:\n\n** Steps to Reproduce\n%?\n\n** Expected Behavior\n\n** Actual Behavior\n\n** Environment\n",
"tags": ["bug"]
}
Feature Request Template
{
"key": "feat",
"name": "Feature Request",
"file": "features.org",
"template": "* FEATURE %^{Feature}\n:PROPERTIES:\n:REQUESTED: %U\n:PRIORITY: %^{Priority|high|medium|low}\n:EFFORT: %^{Effort|small|medium|large}\n:END:\n\n** Description\n%?\n\n** Use Case\n\n** Technical Notes\n",
"tags": ["feature"]
}
Disable Preview for Speed
For templates you trust, disable preview for faster capture:
{
"scimax.capture.showPreview": false,
"scimax.capture.openAfterCapture": false
}
This makes capture nearly instantaneous.
Use Keyboard-driven Workflow
Memorize keys for your most common captures:
`C-c c' → `t' → Task description → Enter (TODO)
`C-c c' → `j' → Entry title → Enter (Journal)
`C-c t' → Task → Enter (Quick TODO)
With practice, capture becomes muscle memory.
Troubleshooting
Template Not Appearing in Picker
Check `settings.json' for syntax errors
Ensure template has required fields: key, name, file, template
Reload window (`C-S-P' → `Reload Window')
Capture File Not Created
Check file path in template configuration
Ensure directory exists or use absolute path
Check `scimax.capture.defaultDirectory' setting
Verify write permissions
Template Placeholders Not Expanding
Verify placeholder syntax: %^{Prompt} not $^{Prompt}
Check for typos in placeholder names
Some placeholders require context (e.g., `%a' needs source file)
Cursor Position (`%?') Not Working
Ensure `%?' is in template
Open file after capture (scimax.capture.openAfterCapture: true)
The cursor jumps to `%?' position when file opens
Date Tree Not Creating Structure
Verify target type: "type": "file+datetree"
Ensure template is capturing to correct file
Check file for malformed existing date tree structure
Advanced Topics
Template Hooks (Future)
Future versions may support JavaScript hooks for advanced template behavior:
{
"beforeCapture": "return { customData: 'value' }",
"afterCapture": "console.log('Captured!')"
}
Dynamic Template Selection (Future)
Future versions may support conditional template selection based on context.
Template Inheritance (Future)
Future versions may support template inheritance for sharing common configuration.
Appendix
Complete Template Reference
| Field | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Unique template key (1-5 characters) |
name | string | Yes | Display name |
description | string | No | Long description |
file | string | Yes | Target file path |
template | string | Yes | Template content with placeholders |
type | string | No | Entry type (entry, item, table-line) |
target | object | No | Target location configuration |
properties | object | No | Properties to add to entry |
tags | array | No | Tags to add to entry |
timestamp | boolean | No | Whether to add timestamp |
immediate | boolean | No | Skip confirmation before saving |
Placeholder Reference
| Placeholder | Expansion |
|---|---|
%? | Cursor position |
%i | Initial content (selection) |
%a | Annotation link |
%A | Annotation link with description |
%l | Literal link |
%c | Clipboard content |
%t | Date (inactive) |
%T | Date and time (active) |
%u | Date (inactive) |
%U | Date and time (inactive) |
%^t | Prompt for date |
%^T | Prompt for date and time |
%^g | Prompt for tags |
%^{prompt} | Interactive prompt |
%^{prompt\vert{}default} | Prompt with default |
%k | Template key |
%K | Template name |
%n | User name |
%f | Source file name |
%F | Source file path |
%% | Literal % |
%\n | Newline |
%(expression) | Evaluated expression |
Target Type Reference
| Target Type | Description |
|---|---|
file | End or beginning of file |
headline | Under specific headline |
file+headline | File then headline |
file+datetree | Hierarchical date tree |
Example Templates Library
See examples/capture-templates.json in the Scimax repository for a collection of ready-to-use templates for various workflows.