Tidemark
unlistedby real-fruit-snacks
Replace {{variables}} with YAML frontmatter values on demand
Obsidian plugin for variable substitution in markdown via YAML frontmatter
Define variables in YAML frontmatter, reference them with {{variable}} syntax anywhere in your document, then copy or replace with a single command. Supports nested properties, arrays, default values, and syntax highlighting. Perfect for pentesting workflows, CTF notes, and reusable note templates.
Quick Start • Variable Syntax • Commands • Configuration • Use Cases • Architecture
Highlights
|
Variable Replacement
Replace Syntax Highlighting Color-coded variables in the editor: green for existing values, orange for variables with defaults, red for missing. See variable status at a glance without running anything. Nested Properties
Access nested YAML with dot notation: |
Quick Copy Copy current line, selection, or entire document with variables replaced directly to clipboard. Paste commands straight into your terminal with values already filled in. Variable List & Context Menu Use List All Variables to see every variable grouped by status, edit values, and navigate to locations. Right-click any variable to set its value directly. Flexible Configuration Custom delimiters, default values, case-insensitive matching, array join separators, missing value text, notification levels. Every aspect is configurable through Obsidian settings. |
Quick Start
Prerequisites
| Requirement | Version | Purpose |
|---|---|---|
| Obsidian | 1.0+ | Plugin host |
| Node.js | 18+ | Building from source (optional) |
Install
From Community Plugins:
- Open Obsidian Settings > Community Plugins
- Click "Browse" and search for "Tidemark"
- Click Install, then Enable
Manual Installation:
# Download from latest release
# Copy main.js, manifest.json, styles.css to .obsidian/plugins/tidemark/
Build from Source
# Clone repository
git clone https://github.com/Real-Fruit-Snacks/Tidemark.git
cd Tidemark
# Install dependencies
npm install
# Build plugin
npm run build
# Copy to vault
cp main.js manifest.json styles.css /path/to/vault/.obsidian/plugins/tidemark/
Verification
# Open Obsidian
# Settings > Community Plugins > Enable Tidemark
# Create a note with frontmatter variables
# Open Command Palette > "Tidemark: Copy current line (replaced)"
Variable Syntax
Basic Variable
{{variableName}}
Variable with Default Value
{{port:1-1000}}
{{username:root}}
{{protocol:https}}
Nested Properties (Dot Notation)
---
target:
ip: 10.10.10.1
port: 8080
credentials:
user: admin
---
curl http://{{target.ip}}:{{target.port}}
ssh {{credentials.user}}@{{target.ip}}
Array Handling
---
ports:
- 22
- 80
- 443
---
Open ports: {{ports}}
# Result: Open ports: 22, 80, 443
Commands
Access via Command Palette (Ctrl/Cmd+P), then type "Tidemark":
| Command | Description |
|---|---|
| Copy current line (replaced) | Copy line to clipboard with variables replaced |
| Copy selection (replaced) | Copy selected text with variables replaced |
| Copy document (replaced) | Copy entire document with variables replaced |
| Replace in selection | Permanently replace variables in selection |
| Replace all in document | Replace all variables in document body |
| Replace in document and filename | Replace in document and rename file |
| Rename file (replace variables) | Rename file with variables replaced |
| List all variables | View and edit all variables |
| Set variable value | Set/edit variable at cursor position |
Configure keyboard shortcuts in Obsidian Settings > Hotkeys > search "Tidemark".
Configuration
Access via Settings > Community Plugins > Tidemark:
Delimiters
| Setting | Default | Description |
|---|---|---|
openDelimiter | {{ | Characters marking variable start |
closeDelimiter | }} | Characters marking variable end |
defaultSeparator | : | Separator for default values ({{var:default}}) |
Behavior
| Setting | Default | Description |
|---|---|---|
missingValueText | [MISSING] | Text when variable not found |
supportNestedProperties | true | Enable dot notation for nested properties |
caseInsensitive | false | Match variables regardless of case |
arrayJoinSeparator | , | Characters used to join array values |
preserveOriginalOnMissing | false | Keep {{var}} if not found instead of replacing |
notificationLevel | all | all, errors, or none |
Visual
| Setting | Default | Description |
|---|---|---|
highlightVariables | true | Color-code variables in editor |
highlightColors.exists | auto | Color for set variables |
highlightColors.missing | auto | Color for missing variables |
highlightColors.hasDefault | auto | Color for variables with defaults |
Use Cases
Pentesting Workflow
Create template notes for different target types:
---
IPAddress:
hostname:
---
# Recon Commands
nmap -sV -sC {{IPAddress}}
nikto -h {{IPAddress}}
gobuster dir -u http://{{IPAddress}} -w /path/to/wordlist
# Quick Shell
nc {{IPAddress}} {{port:4444}}
Workflow:
- Duplicate template for each target
- Fill in frontmatter values
- Use Copy current line (replaced) to copy commands with values filled
- Paste directly into terminal
CTF Notes
---
challenge: Web Exploitation 101
flag: CTF{not_found_yet}
url: http://ctf.example.com
---
# {{challenge}}
Target: {{url}}
Flag: {{flag}}
# Commands
curl {{url}}/robots.txt
sqlmap -u "{{url}}/login" --batch
Project Templates
---
project: My New Project
author: {{author:Anonymous}}
date: {{date:TBD}}
repo: {{repo:github.com/user/repo}}
---
# {{project}}
**Author:** {{author}}
**Date:** {{date}}
**Repository:** {{repo}}
Syntax Highlighting
Variables are automatically color-coded in your editor:
| Color | Status | Meaning |
|---|---|---|
| Green | Exists | Variable has a value in frontmatter |
| Orange | Has Default | Variable not set but has a default value |
| Red | Missing | No value and no default |
Colors adapt to light/dark themes automatically (Catppuccin Latte/Mocha). Override with custom hex values in settings.
Architecture
Tidemark/
├── package.json # Dependencies and scripts
├── tsconfig.json # TypeScript configuration
├── esbuild.config.mjs # esbuild bundler config
├── manifest.json # Obsidian plugin manifest
├── styles.css # Plugin styles
│
├── src/
│ ├── main.ts # Plugin entry point, command registration
│ ├── variableReplacer.ts # Core replacement engine
│ ├── frontmatterParser.ts # YAML frontmatter extraction and parsing
│ ├── decorationProvider.ts # CodeMirror syntax highlighting decorations
│ ├── types.ts # TypeScript interfaces and types
│ │
│ ├── commands/ # ── Command Handlers ──
│ │ └── ... # Copy, replace, list, rename commands
│ │
│ └── utils/ # ── Utilities ──
│ └── ... # String helpers, YAML utilities
│
├── assets/ # ── Repository Assets ──
│ └── banner.svg # Project banner (Catppuccin themed)
│
├── docs/ # ── GitHub Pages ──
│ ├── index.html # Project website
│ └── assets/
│ ├── logo-dark.svg # Logo for dark theme
│ └── logo-light.svg # Logo for light theme
│
└── .github/
└── workflows/ # CI/CD pipelines
Tips & Tricks
Quick Command Execution
- Write command templates in your note
- Position cursor on command line
- Use "Copy current line (replaced)" from the command palette
- Paste in terminal
- Execute
Bulk Updates
Use List all variables to:
- See all variables at once
- Quickly identify missing values
- Edit multiple values in sequence
Default Values Strategy
Use default values for common scenarios:
{{port:443}}
{{protocol:https}}
{{method:GET}}
{{timeout:30}}
Troubleshooting
| Problem | Solution |
|---|---|
| Variables not highlighting | Ensure "Highlight Variables" is enabled in plugin settings |
| Variables not replacing | Check spelling (or enable case-insensitive); validate YAML syntax |
| Commands not showing | Ensure plugin is enabled; check Command Palette for "Tidemark" |
| Nested properties not resolving | Verify "Support Nested Properties" is enabled in settings |
Platform Support
| Capability | Desktop | Mobile (iOS) | Mobile (Android) |
|---|---|---|---|
| Variable Replacement | Full | Full | Full |
| Copy to Clipboard | Full | Full | Full |
| Syntax Highlighting | Full | Full | Full |
| Context Menu | Full | Limited | Limited |
| Nested Properties | Full | Full | Full |
| File Rename | Full | Full | Full |
Security
Vulnerability Reporting
Report security issues via:
- GitHub Security Advisories (preferred)
- Private disclosure to maintainers
- Responsible disclosure timeline (90 days)
Do NOT:
- Open public GitHub issues for vulnerabilities
- Disclose before coordination with maintainers
License
MIT License
Copyright © 2026 Real-Fruit-Snacks
THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
THE AUTHORS ARE NOT LIABLE FOR ANY DAMAGES ARISING FROM USE.
Resources
- GitHub: github.com/Real-Fruit-Snacks/Tidemark
- Issues: Report a Bug
- Security: SECURITY.md
- Contributing: CONTRIBUTING.md
- Changelog: CHANGELOG.md
Part of the Real-Fruit-Snacks water-themed security toolkit
Aquifer • armsforge • Cascade • Conduit • Deadwater • Deluge • Depth • Dew • Droplet • Fathom • Flux • Grotto • HydroShot • LigoloSupport • Maelstrom • Rapids • Ripple • Riptide • Runoff • Seep • Shallows • Siphon • Slipstream • Spillway • Sunken-Archive • Surge • Tidemark • Tidepool • Undercurrent • Undertow • Vapor • Wellspring • Whirlpool
Remember: With great power comes great responsibility.
For plugin developers
Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.