Skip to content

Releases

freemapper-print v0.11.0

Choose a tag to compare

@github-actions github-actions released this 15 Nov 16:51

Added

  • init --courses takes 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 plain YYYY-MM-DD is 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

Choose a tag to compare

@github-actions github-actions released this 13 Nov 16:20

Changed

  • init takes the contour interval from the freemapper.toml next 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 after init say 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

Choose a tag to compare

@github-actions github-actions released this 13 Nov 10:09

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 each ATTRIBUTION.txt names 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, in tests/fixtures/examples/. The manual links to the new examples and quotes their output (decision 0064).
  • Windows from masks window no 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 release environment. 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

Choose a tag to compare

@github-actions github-actions released this 12 Nov 17:13

Added

  • freemapper-print update installs 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>, --rollback and --mode notify|install|off. The replaced version stays next to the program as freemapper-print.previous.
  • A daily check, at most once in 24 hours and with a limit of 3 seconds, runs after init, check, export and render and at the start of mcp and edit. In mode notify (the default) it prints one line on stderr when a newer version exists. In mode install it installs the version after a command that ended with exit code 0, never in mcp or edit. update --mode off or FREEMAPPER_PRINT_UPDATE=off stops 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.toml in the configuration folder and the record of the last check in update-check.json in the cache folder; FREEMAPPER_PRINT_CONFIG_DIR and FREEMAPPER_PRINT_CACHE_DIR name other folders.
  • The MCP server has two more tools, check_update and install_update (the latter installs only with confirm: 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 as C:\…), 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

Choose a tag to compare

@github-actions github-actions released this 12 Nov 06:57

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-web and 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

Choose a tag to compare

@github-actions github-actions released this 12 Nov 06:37

Added

  • A layout can set page_mm = [width, height] (portrait, 10 to 5080 mm a side) instead of paper, for a map larger than A3 at map scale (decision 0058). set_layout takes page_mm too; null goes back to the paper. A page larger than A3 gets the note that an office printer will not take it. The command line render stays 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.toml come from freemapper-contract (freemapper-core v0.19.0, decision 0057), one type for the suite. Behaviour is unchanged.
  • AGENTS.md puts 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

Choose a tag to compare

@github-actions github-actions released this 11 Nov 08:52

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.md tells 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

Choose a tag to compare

@github-actions github-actions released this 11 Nov 03:19

Added

  • freemapper-print mcp starts 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_project and list_courses read a project; init_project, masks_window, masks_corridor, numbers_accept, set_layout, set_element and assign_mask write into the project file and keep its comments, apart from a few cases the manual lists; export_project writes 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.json and every tool.
  • set_layout, set_element and assign_mask change 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_project or 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.toml names 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, and init still 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 of freemapper.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

Choose a tag to compare

@github-actions github-actions released this 10 Nov 16:56

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.
  • init takes the title from the freemapper.toml next 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 name whiteout-1 and so on with check (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

Choose a tag to compare

@github-actions github-actions released this 10 Nov 02:15

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 as centre_map_mm takes 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 and check warns. Sheets without a mask stay the same byte
    for byte.
  • masks window writes 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-for gives single controls a radius of their own,
    --controls picks controls by code or number, and --assign prints the course with it. The start and the finish
    get a window too, unless --no-start or --no-finish leaves it out. The output and the comment in the project
    file name the start and the finish as such, not by the codes STA1 and FIN1. The mask keeps the windows in map
    mm; after a change of print scale, run the command again.
  • masks corridor turns a line you give with --points into 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 = [...], --assign stops with exit code 2 and leaves the file as it was.
  • check looks 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>), check says 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, check says 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 of check, 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 check counts 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