Tidemark

unlisted

by real-fruit-snacks

Replace {{variables}} with YAML frontmatter values on demand

Updated 1mo agoMIT
View on GitHub
Tidemark

TypeScript Platform License

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 StartVariable SyntaxCommandsConfigurationUse CasesArchitecture


Highlights

Variable Replacement Replace {{variables}} with YAML frontmatter values on demand. Copy to clipboard or permanently replace in-document. Supports nested properties, arrays, and default values.

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: {{server.ip}}, {{credentials.user}}. Array indexing with {{items[0]}}. Toggle nesting on or off per your workflow.

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

RequirementVersionPurpose
Obsidian1.0+Plugin host
Node.js18+Building from source (optional)

Install

From Community Plugins:

  1. Open Obsidian Settings > Community Plugins
  2. Click "Browse" and search for "Tidemark"
  3. 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":

CommandDescription
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 selectionPermanently replace variables in selection
Replace all in documentReplace all variables in document body
Replace in document and filenameReplace in document and rename file
Rename file (replace variables)Rename file with variables replaced
List all variablesView and edit all variables
Set variable valueSet/edit variable at cursor position

Configure keyboard shortcuts in Obsidian Settings > Hotkeys > search "Tidemark".


Configuration

Access via Settings > Community Plugins > Tidemark:

Delimiters

SettingDefaultDescription
openDelimiter{{Characters marking variable start
closeDelimiter}}Characters marking variable end
defaultSeparator:Separator for default values ({{var:default}})

Behavior

SettingDefaultDescription
missingValueText[MISSING]Text when variable not found
supportNestedPropertiestrueEnable dot notation for nested properties
caseInsensitivefalseMatch variables regardless of case
arrayJoinSeparator, Characters used to join array values
preserveOriginalOnMissingfalseKeep {{var}} if not found instead of replacing
notificationLevelallall, errors, or none

Visual

SettingDefaultDescription
highlightVariablestrueColor-code variables in editor
highlightColors.existsautoColor for set variables
highlightColors.missingautoColor for missing variables
highlightColors.hasDefaultautoColor 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:

  1. Duplicate template for each target
  2. Fill in frontmatter values
  3. Use Copy current line (replaced) to copy commands with values filled
  4. 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:

ColorStatusMeaning
GreenExistsVariable has a value in frontmatter
OrangeHas DefaultVariable not set but has a default value
RedMissingNo 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

  1. Write command templates in your note
  2. Position cursor on command line
  3. Use "Copy current line (replaced)" from the command palette
  4. Paste in terminal
  5. 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

ProblemSolution
Variables not highlightingEnsure "Highlight Variables" is enabled in plugin settings
Variables not replacingCheck spelling (or enable case-insensitive); validate YAML syntax
Commands not showingEnsure plugin is enabled; check Command Palette for "Tidemark"
Nested properties not resolvingVerify "Support Nested Properties" is enabled in settings

Platform Support

CapabilityDesktopMobile (iOS)Mobile (Android)
Variable ReplacementFullFullFull
Copy to ClipboardFullFullFull
Syntax HighlightingFullFullFull
Context MenuFullLimitedLimited
Nested PropertiesFullFullFull
File RenameFullFullFull

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


Part of the Real-Fruit-Snacks water-themed security toolkit

AquiferarmsforgeCascadeConduitDeadwaterDelugeDepthDewDropletFathomFluxGrottoHydroShotLigoloSupportMaelstromRapidsRippleRiptideRunoffSeepShallowsSiphonSlipstreamSpillwaySunken-ArchiveSurgeTidemarkTidepoolUndercurrentUndertowVaporWellspringWhirlpool

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.