File format & storage

Every note is a Markdown file with a YAML-style frontmatter block, sitting in a folder in your repo. No database, no proprietary container, nothing you need DevNotes+ to read.

Folder layout

your-project/
  .devnotes/
    .gitignore        # ignores everything by default
    tags.json         # tag definitions (committed, shared with the team)
    templates.json    # your custom note templates
    assets/           # images pasted or dragged into notes
    <id>.md           # one file per note

The folder is created at the workspace root the first time you make a note, and each note is a separate file named after its ID. Nothing is stored outside the project, and nothing is sent anywhere.

A note file

---
id: n-k3f9a2
title: Why the 60s retry floor
tags: reference
starred: true
createdAt: 1756166400000
updatedAt: 1756252800000
shared: true
branch: fix/rate-limit-copy
owner: Hiba Chaabnia
codeLink_file: src/github/client.js
codeLink_line: 60
codeLink_lineContent: const RETRY_FLOOR_MS = 60_000;
---
Retrying at the exact `x-ratelimit-reset` timestamp still 403'd on
4 of 50 runs — GitHub rounds the header down to the second.

Everything below the closing --- is the note body, in ordinary Markdown. Everything above it is metadata.

Frontmatter fields

Only the first six are always present. The rest appear when the corresponding feature is used, and are simply absent otherwise.

FieldTypeMeaning
idstringNote ID. Matches the filename. Required — a file without one is skipped.
titlestringNote title.
tagsstringComma-separated tag IDs, e.g. bug,todo.
starredbooleanWhether the note is starred.
createdAtnumberUnix timestamp in milliseconds.
updatedAtnumberUnix timestamp in milliseconds.
sharedbooleanPresent and true when the note is un-ignored in .devnotes/.gitignore.
branchstringGit branch this note is scoped to. Absent means visible on every branch.
ownerstringGit user name of whoever created the note.
archivedbooleanPresent and true when archived.
remindAtnumberUnix timestamp in milliseconds for the reminder.
linked_notesstringComma-separated IDs of related notes.
codeLink_filestringWorkspace-relative path of the linked file.
codeLink_linenumber1-based line number.
codeLink_lineContentstringThe text of that line when the link was made, used to recover the anchor when code moves.
github_urlstringLinked issue or PR URL.
github_repostringowner/repo.
github_numbernumberIssue or PR number.
github_typestringissue or pr.
github_statusstringopen, closed or merged.
github_titlestringTitle of the linked issue or PR.

Frontmatter rules

The parser handles a deliberately small subset of YAML, so that reading a note never depends on a YAML library and never fails in a surprising way:

Images

Images pasted or dragged into the editor are written to .devnotes/assets/ and referenced from the note with a normal Markdown image link:

![screenshot](.devnotes/assets/2026-08-26-panel.png)

When you share a note, DevNotes+ scans its body for these references and un-ignores the matching asset files, so images travel with the note through git.

Editing notes by hand

You can. The files are yours, and DevNotes+ watches the folder — edit a note in another editor, or pull a teammate's change, and the sidebar picks it up without a reload.

Two things to preserve if you do: keep the id matching the filename, and keep the frontmatter block intact. A file missing its id is skipped with a warning rather than shown as a broken note.

Editing conflicted files

If a note contains git conflict markers, resolve it through the conflict panel rather than by hand where you can — see sharing with your team. DevNotes+ detects the markers and will treat the file as conflicted until they are gone.

Why plain files

The format is the feature. Because notes are Markdown in your repo: