Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
62cdabc
Add plan: PlanCake 1.0
Menelion Sep 25, 2026
88d10c8
Apply plan review: link and script lockdown, languages, CLI encoding
Menelion Sep 25, 2026
eb10f8e
Act on manual review notes
Menelion Sep 25, 2026
91056dc
Apply second plan review
Menelion Sep 25, 2026
a0355c4
Adapt the template to PlanCake
Menelion Sep 25, 2026
4a2a37c
Host WebView2 and run the JAWS spike
Menelion Sep 25, 2026
4a71fcb
Record JAWS spike results and adjust the plan
Menelion Sep 25, 2026
4205d0c
Parse notes out of a Markdown source
Menelion Sep 25, 2026
04a6a33
Render Markdown with source line ranges and notes
Menelion Sep 25, 2026
a6e0f0c
Write notes to the file safely
Menelion Sep 25, 2026
0c9cdfd
Show the document and talk to the page
Menelion Sep 25, 2026
fd0dff8
Add back and forward between opened files
Menelion Sep 25, 2026
af6cc17
Add, edit and delete notes from the document
Menelion Sep 25, 2026
e6b9789
Render Markdown written in notes
Menelion Sep 25, 2026
f1a6e1f
Drop the button note style
Menelion Sep 25, 2026
e2e696b
Toggle task-list items
Menelion Sep 25, 2026
c36d46f
Show partially checked parent tasks
Menelion Sep 25, 2026
d4d2d59
Start a newly opened file at its first block
Menelion Sep 25, 2026
2a3dd23
Notes list beside the document
Menelion Sep 25, 2026
3a65afd
Name the notes list, follow the document, reload for another file
Menelion Sep 25, 2026
f193d56
Record Task 8 JAWS results
Menelion Sep 25, 2026
2566353
Menu bar and the small dialogs
Menelion Sep 25, 2026
4eff7b2
Follow changes on disk, and one window per file
Menelion Sep 25, 2026
a6a2669
Keep the reading place on reload, and close confirmations with Escape
Menelion Sep 25, 2026
f49b6bf
Record Task 10 JAWS results
Menelion Sep 25, 2026
01b9b54
Open from the clipboard and from a link
Menelion Sep 25, 2026
d2b0da6
Announce the host, not a guessed name, when downloading
Menelion Sep 25, 2026
01897e5
Settings
Menelion Sep 25, 2026
5da14af
Never write a lossy decode of a file that is not UTF-8
Menelion Sep 26, 2026
3e98eb0
Put the closing marker hint into its label
Menelion Sep 26, 2026
fbd0638
Command-line mode
Menelion Sep 26, 2026
22d2653
Updates
Menelion Sep 26, 2026
4b2b864
Add the update public key
Menelion Sep 26, 2026
e939513
Record Task 14 JAWS results
Menelion Sep 26, 2026
0cd481d
Translations
Menelion Sep 26, 2026
f537d27
Record Task 15 JAWS results
Menelion Sep 26, 2026
abe7748
Open the user manual with F1
Menelion Sep 26, 2026
8f7c5f5
Move from block to block with the keyboard
Menelion Sep 26, 2026
8775668
Change the tagline
Menelion Sep 26, 2026
36e7720
Resize the panes from the View menu
Menelion Sep 26, 2026
d1e34f9
Move between blocks with Alt+Shift+arrows
Menelion Sep 26, 2026
3a2e00a
Write the English user manual
Menelion Sep 26, 2026
0cdc24a
Translate the user manual
Menelion Sep 27, 2026
5bdcde0
Add translation glossaries for the manual
Menelion Sep 27, 2026
064a885
Complete Task 16: user manual
Menelion Sep 27, 2026
9495174
Installer, portable zip, winget
Menelion Sep 27, 2026
5866ec8
Update documentation
Menelion Sep 27, 2026
a944c28
Show the focus outline on the current block
Menelion Sep 27, 2026
8421fda
Record the block keys check
Menelion Sep 27, 2026
c68d1af
Address review findings
Menelion Sep 27, 2026
23071a7
Address review findings
Menelion Sep 27, 2026
9f6acf4
Address review findings
Menelion Sep 27, 2026
db6ed2f
Address review findings
Menelion Sep 27, 2026
f24be67
Address review findings
Menelion Sep 27, 2026
32bcf2f
Address review findings
Menelion Sep 27, 2026
aa7b72a
Address review findings
Menelion Sep 27, 2026
fe71032
Make View > Notes list the saved setting
Menelion Sep 27, 2026
cce7c6e
Complete plan: PlanCake 1.0: read and annotate Markdown with a screen…
Menelion Sep 27, 2026
4e126bc
Point CLAUDE.md to the completed plan
Menelion Sep 27, 2026
c91fa87
Make two timing-dependent tests deterministic
Menelion Sep 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ end_of_line = crlf
[*.md]
trim_trailing_whitespace = false

# Inno Setup reads a script or a message file without a BOM in the ANSI code page.
[*.{iss,isl}]
charset = utf-8-bom

[*.{json,yml,yaml}]
indent_size = 2

Expand Down Expand Up @@ -48,6 +52,13 @@ csharp_space_before_colon_in_inheritance_clause = false
csharp_space_after_colon_in_inheritance_clause = true
csharp_preserve_single_line_statements = false

# Keywords (string, char) for declarations, framework types for static members
# (String.IsNullOrEmpty, String.Empty, Char.IsWhiteSpace), as the template writes them;
# dotnet format enforces it (IDE0049).
dotnet_style_predefined_type_for_locals_parameters_members = true
dotnet_style_predefined_type_for_member_access = false
dotnet_diagnostic.IDE0049.severity = warning

# .NET code analysis
dotnet_analyzer_diagnostic.category-security.severity = error
dotnet_analyzer_diagnostic.category-performance.severity = warning
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/dotnet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ jobs:
# Localization.GetCurrentCulture silently falls back to en-US for every language.
- name: Compile translations
shell: pwsh
run: ./src/WinFormsTemplate/locale/scripts/Compile-Translations.ps1 -Strict
run: ./src/PlanCake/locale/scripts/Compile-Translations.ps1 -Strict

- name: Restore dependencies
run: dotnet restore
Expand Down
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -426,3 +426,12 @@ FodyWeavers.xsd

# msgmerge backups
*.bak

# NetSparkle signing keys: the private key must never be committed (see "Updates" in CLAUDE.md).
keys/

# Installer output (built installers, portable zip and appcast)
installer/Output/

# Deploy configuration (contains the SSH host and path)
installer/deploy.json
91 changes: 52 additions & 39 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,43 +1,56 @@
# Changelog

All notable changes to this project are documented here. The format follows
All notable changes to PlanCake are documented here. The format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project uses
[semantic versioning](https://semver.org/spec/v2.0.0.html) driven by GitVersion: a release is
a `vX.Y.Z` tag, and nothing carries a version literal.

## [Unreleased]

### Added

- Test project (xUnit, AwesomeAssertions, coverlet) covering the configuration round trip and
the localization fallback, running on every push.
- GitHub Actions workflow: gettext install, translation compile, `dotnet format` check, build
and test.
- Dependabot for NuGet and Actions, plus release-note categories.
- GitVersion for all version numbers.
- `locale/` scaffolding: the gettext scripts, a POT template and the translation workflow.
- `.gitattributes` normalizing line endings to LF, except in `.bat` and `.cmd`.
- `ExitCode` constants and unhandled-exception logging for background threads and dropped
tasks.
- Portable mode: a `userdata/` folder next to the EXE moves all user data out of `%APPDATA%`.

### Changed

- Target framework raised to `net10.0-windows`; platform pinned to x64.
- `Directory.Build.props` folded into the project file.
- Solution converted to the XML `.slnx` format and moved to the repository root.
- Packages updated to current versions and aligned with the ones shipping applications use.
- `Config.Load` and `Config.Save` no longer show dialogs or call `Application.Exit` from a
static utility class: a missing file is written with the defaults and an unreadable one is
logged and falls back to them, so a bad INI cannot stop the app from starting.
- `Localization` gained `SetLanguage`, a `LanguageChanged` event and a thread-safe catalog,
so the language can be switched at run time.
- `Utils/Constants/Application.cs` renamed to `App.cs`; the old name shadowed
`System.Windows.Forms.Application` in every file that imported it.
- Forms moved under `Ui/`, mirroring the namespace layout of shipping applications.
- Copyright year updated to 2026.

### Removed

- The hardcoded `1.0.0.0` version.
- `BaseOutputPath` / `BaseIntermediateOutputPath` overrides pointing at `$(SolutionDir)`.
a `vX.Y.Z` tag, and nothing carries a version literal. The release notes shown in the update
window come from `changelogs/<version>.md`.

## [1.0.0] — unreleased

### Initial Release

PlanCake lets you read Markdown files comfortably and leave notes right where they belong. It
was made for the long implementation plans that AI coding assistants write, and works with any
Markdown file. It runs as a window, or without one from the command line.

### Features

- **Read Markdown as a document**: real headings, lists, tables and code blocks instead of hash
signs and asterisks, with GitHub-style tables, task lists, footnotes and more. Zoom from 50 to
300 percent.
- **Leave notes on any block**: click a paragraph, heading, list item, table row or code block,
or press Enter on it, and type a note. PlanCake writes it straight into the `.md` file, right
after that block, between a pair of markers (`[usernote]` … `[/usernote]` by default). There
is nothing to save and no side file.
- **Notes in the document and in a list**: notes show after their blocks, with the Markdown in
them formatted, and in a notes list beside the document. Edit, delete, delete all, jump from
note to note with F9 and Shift+F9, and undo and redo everything PlanCake writes.
- **Check off tasks**: task-list checkboxes toggle from the document and write `[x]` or `[ ]` to
the file, after a question that can be turned off.
- **Open files every way**: from the command line, the Open dialog, drag and drop, the clipboard
(a copied file or path), and a link, which is downloaded to the Downloads folder (GitHub file
links work as they are). Links between Markdown files open in the same window, with Back and
Forward.
- **One window per file**: opening a file that is already open brings its window to the front,
so two windows never write into the same file.
- **Follows changes on disk**: when something else changes the file, PlanCake reloads it and
keeps your reading position, or asks first if you prefer. A note is never written over a
change you have not seen.
- **Safe with older files**: a file in a legacy encoding opens read-only unless you let PlanCake
convert it to UTF-8, and a file whose encoding cannot be recognized is never changed.
- **Command line** for scripts and AI assistants: `plancake list` (text or JSON), `check` (exit
code 3 while notes remain), `clear` and `export` to a standalone HTML page, with other markers
for a single run.
- **Keyboard, mouse and screen readers alike**: every action works from the keyboard alone and
with the mouse, block-to-block movement with Alt+Shift+Down and Up Arrow, and status messages
that screen readers speak wherever the focus is. Keyboard shortcuts are listed in the Help
menu.
- **Settings** for the interface and document languages, the note markers, what Enter and a
click do, confirmations, reloading and update checks, applied without a restart.
- **Six languages**: English, Russian, Ukrainian, French, Hebrew (with a right-to-left
interface) and German, for the interface, the user manual (F1) and the installer. The
document language is set apart from the interface language.
- **Automatic updates**, signed, with adjustable frequency.
- **Installer, portable zip and winget** (`Oire.PlanCake`). The installer puts `plancake` on the
`PATH` and installs the .NET 10 Desktop Runtime and the WebView2 Runtime when missing.
Loading
Loading