Repository navigation
Releases
freemapper-print v0.11.0
Added
init --coursestakes the event date and the organiser from an IOF XML course file (Event/StartTime/Date,Event/Organiser/Name, as freemapper-courseplan 0.17.0 writes them) into[event], so{date}and{organiser}need no second entry (ADR 0066). A date that is not a plainYYYY-MM-DDis left out.
Changed
- Licence: AGPL-3.0-or-later instead of GPL-3.0-or-later (ADR 0067), like freemapper, freemapper-core and the other app. Whoever runs a modified version as a network service must offer its source. Releases up to now stay GPL-3.0-or-later.
- freemapper-core goes from v0.25.0 to v0.28.0 (ADR 0034 there for the course date, and its licence is AGPL-3.0-or-later, ADR 0035 there). Print output stays the same.
Download the archive for your system, unpack it and start freemapper-print
(Windows: freemapper-print.exe) from a terminal or register it with your AI assistant.
Installation and first steps: see README.md (Deutsch) / README.en.md (English) in the
archive or https://github.com/HenryJobst/freemapper-print#readme
- Windows: freemapper-print-v0.11.0-windows-x86_64.zip
- macOS Apple Silicon (M1 and newer): freemapper-print-v0.11.0-macos-arm64.tar.gz
- macOS Intel: freemapper-print-v0.11.0-macos-x86_64.tar.gz
- Linux: freemapper-print-v0.11.0-linux-x86_64.tar.gz (ARM: linux-arm64)
The .gz files and freemapper-print-update.json with its signature are for freemapper-print update.
What's Changed
- chore(license): AGPL-3.0-or-later (ADR 0067) by @HenryJobst in #2
Full Changelog: v0.10.0...v0.11.0
freemapper-print v0.10.0
Changed
inittakes the contour interval from thefreemapper.tomlnext to the map when it names one ([contours] interval_m, which freemapper writes when the interval differs from the standard of the map kind; core contract v0.25.0, decision 0065). Without it, the proposal for the kind stays. The comment in the project file and the hint afterinitsay where the value comes from.- The core pin moves to freemapper-core v0.25.0.
Download the archive for your system, unpack it and start freemapper-print
(Windows: freemapper-print.exe) from a terminal or register it with your AI assistant.
Installation and first steps: see README.md (Deutsch) / README.en.md (English) in the
archive or https://github.com/HenryJobst/freemapper-print#readme
- Windows: freemapper-print-v0.10.0-windows-x86_64.zip
- macOS Apple Silicon (M1 and newer): freemapper-print-v0.10.0-macos-arm64.tar.gz
- macOS Intel: freemapper-print-v0.10.0-macos-x86_64.tar.gz
- Linux: freemapper-print-v0.10.0-linux-x86_64.tar.gz (ARM: linux-arm64)
The .gz files and freemapper-print-update.json with its signature are for freemapper-print update.
Full Changelog: v0.9.0...v0.10.0
freemapper-print v0.9.0
Added
- The manual now has figures, at the same places in both languages: sheets with title block, logo and passe-partout, a course sheet with its description box, masks for window and corridor orienteering, and the editor in the browser. They are made from the maps of Remo Madella (MOO Challenge Berlin 2025), who confirmed that they may serve as example maps in the public project. The courses on the course sheets come from freemapper-courseplan 0.14.1, and the window figure shows the default windows with their gap. Source and method are in
docs/manual/img/README.md(decision 0062). - The README in both languages shows these figures as its examples, each picture linked to its manual chapter, and a sheet at the top that links to the examples. The "Status" section starts with the current version and its date, and the section on the suite names the pinned freemapper-core version.
- A test (
tests/examples.rs) loads every example project and checks that its map, course file and logos exist and that eachATTRIBUTION.txtnames the map author.
Changed
- The core pin moves to freemapper-core v0.24.0. A PDF leaves out what the map frame cannot show (core decision 0031), so the PDF of a cropped sheet is smaller: 15 to 42 percent on the Gleisdreieck examples, whose map is much larger than the frame, and by 1 percent or less where the map nearly fits. The output stays pixel for pixel the same at 150 dpi, only the bytes differ. Since v0.24.0 a PDF also writes its paths compactly: coordinates rounded to 3 decimals, small shapes relative to their first point (core decision 0032; Bézier fitting was measured and dropped, it saved 8 percent more at five times the pixel differences). The example sheets shrink by about 80 percent, from 25.8 to 5.4 MB, and the tests' reference PDFs and the example PDFs were written again, the former because the tests compare them byte for byte.
- The example projects in
examples/are new, seven of them on the maps "Gleisdreieck" and "Rummelsburger Bucht" by Remo Madella (MOO Challenge Berlin 2025): scales, layouts, competition courses (also as IOF XML), a club training with two courses, window and corridor orienteering, and a recorded MCP session. Each has its own copy of the map, the courses from freemapper-courseplan 0.14.1, the PDFs and a preview. The earlier examples on Lübeck and Berlin maps are test fixtures now, intests/fixtures/examples/. The manual links to the new examples and quotes their output (decision 0064). - Windows from
masks windowno longer overlap (decision 0063). At least 3 mm on paper stay free between two windows, set with--gap(MCP:gap, a field of its own in the editor). Where two controls are too close for that, both windows shrink in proportion to their radius, and the command names them. No window gets smaller than 5 mm; if the gap would need that, the command writes nothing and says what to leave out. Masks written by hand in the project file stay as they are. - A release needs one approval instead of two (decision 0061): only the job that signs uses the
releaseenvironment. Every release is built with the updater and signed; without the signing secret it fails before anything is published.
Download the archive for your system, unpack it and start freemapper-print
(Windows: freemapper-print.exe) from a terminal or register it with your AI assistant.
Installation and first steps: see README.md (Deutsch) / README.en.md (English) in the
archive or https://github.com/HenryJobst/freemapper-print#readme
- Windows: freemapper-print-v0.9.0-windows-x86_64.zip
- macOS Apple Silicon (M1 and newer): freemapper-print-v0.9.0-macos-arm64.tar.gz
- macOS Intel: freemapper-print-v0.9.0-macos-x86_64.tar.gz
- Linux: freemapper-print-v0.9.0-linux-x86_64.tar.gz (ARM: linux-arm64)
The .gz files and freemapper-print-update.json with its signature are for freemapper-print update.
Full Changelog: v0.8.0...v0.9.0
freemapper-print v0.8.0
Added
freemapper-print updateinstalls the newest release over the running program after asking (decision 0060). It checks the minisign signature of the release manifest and the SHA-256 of the program first and installs nothing that does not verify. Switches:--check(exit code 10 when a newer version exists),--yes,--version <X.Y.Z>,--rollbackand--mode notify|install|off. The replaced version stays next to the program asfreemapper-print.previous.- A daily check, at most once in 24 hours and with a limit of 3 seconds, runs after
init,check,exportandrenderand at the start ofmcpandedit. In modenotify(the default) it prints one line on stderr when a newer version exists. In modeinstallit installs the version after a command that ended with exit code 0, never inmcporedit.update --mode offorFREEMAPPER_PRINT_UPDATE=offstops the check. - The check requests only the update manifest and its signature from the GitHub releases, with a User-Agent that names the program, its version and the repository, and sends no data about the person or the project. The setting lives in
settings.tomlin the configuration folder and the record of the last check inupdate-check.jsonin the cache folder;FREEMAPPER_PRINT_CONFIG_DIRandFREEMAPPER_PRINT_CACHE_DIRname other folders. - The MCP server has two more tools,
check_updateandinstall_update(the latter installs only withconfirm: true), and puts a note on its first result when a newer version exists. A program built from source, or by a release built without the signing key, says so and names the releases page.
Changed
- The MCP server has thirteen tools instead of eleven. The release workflow signs an update manifest with the key freemapper uses, and publishes the programs as single gzip files next to the archives; without the signing secret a release is built as before and its programs say they cannot update themselves.
Fixed
- The editor shortens a logo path to its file name whichever system wrote it (
/home/…on Windows as well asC:\…), so the page never shows the folders of another system.
Download the archive for your system, unpack it and start freemapper-print
(Windows: freemapper-print.exe) from a terminal or register it with your AI assistant.
Installation and first steps: see README.md (Deutsch) / README.en.md (English) in the
archive or https://github.com/HenryJobst/freemapper-print#readme
- Windows: freemapper-print-v0.8.0-windows-x86_64.zip
- macOS Apple Silicon (M1 and newer): freemapper-print-v0.8.0-macos-arm64.tar.gz
- macOS Intel: freemapper-print-v0.8.0-macos-x86_64.tar.gz
- Linux: freemapper-print-v0.8.0-linux-x86_64.tar.gz (ARM: linux-arm64)
The .gz files and freemapper-print-update.json with its signature are for freemapper-print update.
Full Changelog: v0.7.0...v0.8.0
freemapper-print v0.7.0
Added
freemapper-print edit: the browser editor (decision 0059). It shows the sheet drawn exactly as in the PDF, lets you move elements with the mouse or the arrow keys and drag control numbers or place them in a form, changes layouts and elements in forms and adds window and corridor masks, also with a typed route and no mouse. The editor checks all sheets and writes the PDFs into a folder whose path you type; Stop ends the export after the sheet in hand.- Every change is written to the project file at once, so there is no Save button. Undo and redo (Ctrl+Z) restore the whole file. If another program changes the file, the page shows a bar with Reload, and undo never writes over the outside change.
- The editor listens on 127.0.0.1 only, and its address carries a random token. The page speaks German or English (
--lang,FREEMAPPER_LANG, else the browser). The manual has a new chapter 12 for it.
Changed
- The core pin moves to freemapper-core v0.21.1 (
freemapper-weband the suite's shared page assets).
Download the archive for your system, unpack it and start freemapper-print
(Windows: freemapper-print.exe) from a terminal or register it with your AI assistant.
Installation and first steps: see README.md (Deutsch) / README.en.md (English) in the
archive or https://github.com/HenryJobst/freemapper-print#readme
- Windows: freemapper-print-v0.7.0-windows-x86_64.zip
- macOS Apple Silicon (M1 and newer): freemapper-print-v0.7.0-macos-arm64.tar.gz
- macOS Intel: freemapper-print-v0.7.0-macos-x86_64.tar.gz
- Linux: freemapper-print-v0.7.0-linux-x86_64.tar.gz (ARM: linux-arm64)
Full Changelog: v0.6.2...v0.7.0
freemapper-print v0.6.2
Added
- A layout can set
page_mm = [width, height](portrait, 10 to 5080 mm a side) instead ofpaper, for a map larger than A3 at map scale (decision 0058).set_layouttakespage_mmtoo;nullgoes back to the paper. A page larger than A3 gets the note that an office printer will not take it. The command linerenderstays on A4 and A3.
Changed
- Core pin moves to freemapper-core v0.20.0 (free page size and the source position of each object in the page builder). Print uses the free page size (see Added); the source positions it does not use yet.
- The map kind and the reader of
freemapper.tomlcome from freemapper-contract (freemapper-core v0.19.0, decision 0057), one type for the suite. Behaviour is unchanged. AGENTS.mdputs the command line first and MCP second: an agent that can run commands does the job with a few blocking calls instead of one turn per tool call. MCP stays the way for assistants without a shell. The command-line section names what only MCP offers (project_info,list_courses,set_layout,set_element,assign_mask) and how to do it in the project file instead.
Download the archive for your system, unpack it and start freemapper-print
(Windows: freemapper-print.exe) from a terminal or register it with your AI assistant.
Installation and first steps: see README.md (Deutsch) / README.en.md (English) in the
archive or https://github.com/HenryJobst/freemapper-print#readme
- Windows: freemapper-print-v0.6.2-windows-x86_64.zip
- macOS Apple Silicon (M1 and newer): freemapper-print-v0.6.2-macos-arm64.tar.gz
- macOS Intel: freemapper-print-v0.6.2-macos-x86_64.tar.gz
- Linux: freemapper-print-v0.6.2-linux-x86_64.tar.gz (ARM: linux-arm64)
Full Changelog: v0.6.1...v0.6.2
freemapper-print v0.6.1
Changed
- The print rules (the profile
iof-print, the map kinds, the symbol size table by print scale, the course symbol sizes) come from freemapper-core v0.16.0 now (decision 0056), so freemapper-courseplan uses the same values as the sheet. Output is unchanged. - The course overprint (start, controls, finish, legs, special objects, control numbers) comes from freemapper-core v0.15.0 now (decision 0055), so the browser editor of freemapper-courseplan draws the same symbols as the sheet. Output is unchanged.
Added
AGENTS.mdtells an AI agent how to install freemapper-print from the release archives and how to use it through MCP or the command line, with the real message texts for the common failures. It is written in English and ships in every release archive next to the READMEs. The manual (chapter 3) and the README say how to have an agent set the program up from it.
Fixed
- A crafted map can no longer multiply the work of a page build through Bézier curves: the renderer flattens at most one million points per path (freemapper-core v0.14.1). Ordinary maps are unchanged.
Download the archive for your system, unpack it and start freemapper-print
(Windows: freemapper-print.exe) from a terminal or register it with your AI assistant.
Installation and first steps: see README.md (Deutsch) / README.en.md (English) in the
archive or https://github.com/HenryJobst/freemapper-print#readme
- Windows: freemapper-print-v0.6.1-windows-x86_64.zip
- macOS Apple Silicon (M1 and newer): freemapper-print-v0.6.1-macos-arm64.tar.gz
- macOS Intel: freemapper-print-v0.6.1-macos-x86_64.tar.gz
- Linux: freemapper-print-v0.6.1-linux-x86_64.tar.gz (ARM: linux-arm64)
Full Changelog: v0.6.0...v0.6.1
freemapper-print v0.6.0
Added
freemapper-print mcpstarts an MCP server on standard input and output, through which an AI agent such as Claude Code works with the program (ADR 0004, ADR 0054). It has eleven tools:project_info,check_projectandlist_coursesread a project;init_project,masks_window,masks_corridor,numbers_accept,set_layout,set_elementandassign_maskwrite into the project file and keep its comments, apart from a few cases the manual lists;export_projectwrites the PDFs. Paths must be absolute. An error comes back with the message the command line prints, and the project file stays as it was. When an export fails at one sheet, the message names the PDFs it wrote before. An input a tool does not know is an error that names it. Calls that write run one after the other, also when the agent sends several at once. The results are JSON. A list of files, sheets, courses, mask variants or assignments has at most 200 entries, plus at most 200 notes; the rest is counted. Where a command-line message names an option, the server names the tool and its input. Chapter 3 of the manual describes the setup with a.mcp.jsonand every tool.set_layout,set_elementandassign_maskchange layouts, sheet elements and assignments in the project file without editing it by hand. They change only the lines that must change and check the changed file before they write it.- When the agent cancels
export_projector closes the connection, the export stops after the sheet it is drawing. The PDFs before it stay whole, and no partial file is left. - Example
mcp-session: a recorded session in which an agent turns the Viktoriapark training into window orienteering, checks it and writes the PDF.
Fixed
- If
freemapper.tomlnames a map kind the program does not know (from a newer freemapper, say), the file no longer counts as broken (ADR 0052). The map kind then comes from the map file or from--kind, andinitstill takes the title from the file. Before, the title was lost and the note for a broken file appeared.
Changed
- The work of the commands now sits in a module
ops, apart from the terminal output, so that the command line and the MCP server share the same steps. The command-line output stays byte-identical, checked with 136 runs in both languages. The library's export loops can stop between two sheets through a callback (export::Proceed); existing callers do not change. - The shared building blocks come from freemapper-core v0.14.0 (candidates without float noise,
MapGrid, the suite contract). Output is unchanged. - The page builder (map, print scale and paper in, finished page out) comes from freemapper-core (ADR 0053). The scale rules stay here; the builder is given the symbol and geometry factors. The example PDFs stay byte-identical.
- The renderer (page model, symbol drawing, PDF writer, Arimo font) comes from freemapper-core as
freemapper-render(ADR 0051). The example PDFs stay byte-identical. - Tests: every test run now reads four maps from freemapper (schoolyard 1:1000, sprint 1:4000, a map from freemapper 0.9.0 and one with an unknown map kind) and compares map kind, title, sheet objects, base area and extent with the expected values from
freemapper-contract(decision 0050). If freemapper changes a tag or a key offreemapper.toml, these tests fail before a sheet is printed wrong.
Download the archive for your system, unpack it and start freemapper-print
(Windows: freemapper-print.exe) from a terminal or register it with your AI assistant.
Installation and first steps: see README.md (Deutsch) / README.en.md (English) in the
archive or https://github.com/HenryJobst/freemapper-print#readme
- Windows: freemapper-print-v0.6.0-windows-x86_64.zip
- macOS Apple Silicon (M1 and newer): freemapper-print-v0.6.0-macos-arm64.tar.gz
- macOS Intel: freemapper-print-v0.6.0-macos-x86_64.tar.gz
- Linux: freemapper-print-v0.6.0-linux-x86_64.tar.gz (ARM: linux-arm64)
Full Changelog: v0.5.1...v0.6.0
freemapper-print v0.5.1
Fixed
- Example
berlin-viktoriapark-training: a new course of 1.8 km with 11 controls on building corners, corners of open land and paths instead of nine controls at building corners. - The scale bar from freemapper v0.9.0 (tag
freemapper:source=scale-bar) counts as part of the information block and is no longer printed as map content. inittakes the title from thefreemapper.tomlnext to the map before it falls back to the file name.
Changed
- The description symbols from Purple Pen come from freemapper-core v0.6.0 (ADR 0049); output is unchanged.
- The shared crates now come from freemapper-core v0.6.0 (Purple Pen writer, object ids). Output is unchanged.
- White-out areas from Purple Pen are named
whiteout-<n>with Purple Pen's own number instead of the place in the file, so deleting or reordering one no longer changes what another means. Check project files that namewhiteout-1and so on withcheck(ADR 0048).
Download the archive for your system, unpack it and start freemapper-print
(Windows: freemapper-print.exe) from a terminal or register it with your AI assistant.
Installation and first steps: see README.md (Deutsch) / README.en.md (English) in the
archive or https://github.com/HenryJobst/freemapper-print#readme
- Windows: freemapper-print-v0.5.1-windows-x86_64.zip
- macOS Apple Silicon (M1 and newer): freemapper-print-v0.5.1-macos-arm64.tar.gz
- macOS Intel: freemapper-print-v0.5.1-macos-x86_64.tar.gz
- Linux: freemapper-print-v0.5.1-linux-x86_64.tar.gz (ARM: linux-arm64)
Full Changelog: v0.5.0...v0.5.1
freemapper-print v0.5.0
Added
- Masks for window and corridor orienteering in the project file (ADR 0045). A
[[masks]]table has an id and
polygons made of an outline and holes, the windows. The points are map mm with the y axis up, as OOM shows them
and ascentre_map_mmtakes them.mask = "…"in[[assignments]]gives a course its mask, and several courses
may share one. On loading, the program checks every mask and reports an error with file, line and field, such
as a hole outside its outline or a ring that crosses itself. - Masks print. On the sheet of a course with a mask the map is missing in the masked area; outside the outline and
in the windows it shows, and overlapping windows make one window. The course overprint, the description box, the
sheet elements and the footer stay visible, the legs between the windows included. Without a mask of its own, a
course gets Purple Pen's white-out areas, each on its own, also where they overlap. A sheet applies at most 1000
masks; when a course has more, the rest are left out andcheckwarns. Sheets without a mask stay the same byte
for byte. masks windowwrites a mask with round windows around the controls of a course (ADR 0047). The radius counts
in millimetres on paper, 15 mm by default;--radius-forgives single controls a radius of their own,
--controlspicks controls by code or number, and--assignprints the course with it. The start and the finish
get a window too, unless--no-startor--no-finishleaves it out. The output and the comment in the project
file name the start and the finish as such, not by the codesSTA1andFIN1. The mask keeps the windows in map
mm; after a change of print scale, run the command again.masks corridorturns a line you give with--pointsinto a corridor as wide as--width(10 mm on paper by
default). There is no automatic corridor. The command refuses a bend too sharp for the width, or a line that
crosses itself, and names the place; for a crossing, the point where the edges meet.- Both commands append the table to the project file as text, with a comment on how it was made; everything
before it stays unchanged. They never change a mask that exists. If the file writes its assignments as
assignments = [...],--assignstops with exit code 2 and leaves the file as it was. checklooks at course sheets with a mask (ADR 0046). It warns when a control, the start or the finish lies
where the mask hides the map, and counts by kind what of the course overprint lies there: marked routes,
crossing points, forbidden routes, out-of-bounds boundaries, out-of-bounds and dangerous areas, texts. The
overprint prints all the same. It also warns when a mask hides the whole map frame, and says for information
when a mask hides nothing in the frame or no course uses it; white-out areas from Purple Pen that hide nothing
share one line per course. It warns when a sheet element or the footer covers part of a window. When the project
file names a white-out area by its number (whiteout-<n>),checksays where that area lies, because the number
follows the order in the course file and can mean another area after a change in Purple Pen. When the check
reaches its limit,checksays that it checked only part of the sheet.- Two examples:
luebeck-training-window(window orienteering with eight controls) and
luebeck-training-corridor(corridor orienteering along three streets of Lübeck's old town). The manual has a
chapter 11 on masks.
Changed
- The note on white-out areas in the course file now starts with "Info:" and no longer counts toward the exit
code ofcheck, because white-outs print. - The program reads a project file of at most 16 MB and refuses a larger one before reading it. A file within the
limits for masks needs about 4 MB at most. - The last line of
checkcounts in the right number: "With notes: 1 of 1 course, 0 of 1 layout sheet."
Download the archive for your system, unpack it and start freemapper-print
(Windows: freemapper-print.exe) from a terminal or register it with your AI assistant.
Installation and first steps: see README.md (Deutsch) / README.en.md (English) in the
archive or https://github.com/HenryJobst/freemapper-print#readme
- Windows: freemapper-print-v0.5.0-windows-x86_64.zip
- macOS Apple Silicon (M1 and newer): freemapper-print-v0.5.0-macos-arm64.tar.gz
- macOS Intel: freemapper-print-v0.5.0-macos-x86_64.tar.gz
- Linux: freemapper-print-v0.5.0-linux-x86_64.tar.gz (ARM: linux-arm64)
Full Changelog: v0.4.0...v0.5.0