Changes › freemapper
Changes: freemapper
All notable changes to freemapper are listed here, newest first. The format follows Keep a Changelog.
[Unreleased]
[0.22.0] - 2026-11-15
Added
- Tree cadastres of Köln, Dortmund and Frankfurt am Main (ADR 0065). A WFS answer that names no CRS and gives metres is read in the CRS asked, and field names may hold spaces.
- The training map (ADR 0140):
--trainingonrunandexport(onselectthe page default),training: trueon the MCP toolsstart_pipelineandopen_area_selector, and a box on the area page write<name>-training.omapand<name>-training.pdf, with--ocadalsoocad/<name>-training.ocd. It is for printing and running on as it is, and holds the map and the visible candidates together. So that no symbol lies on another, freemapper joins lines that meet end to end, takes street furniture off streets and squares, draws a park yellow only where the nDSM shows no trees, keeps only buildings, water, contours and the ways a runner can cross inside olive green areas (520; of a dead end a beginning of 1 mm stays when no fence or wall stands in front of it), moves trees, monuments and other point symbols up to 1.5 mm off ways, buildings, water and other points (never into olive green), cuts out what keeps less than the norm's gap (the lower-ranked object gives way; walls and impassable fences are only cut there, never left out whole), and leaves out what is below the norm's minimum size. Where a project has an nDSM but no tree cover yet, the training map keeps its parks whole and a warning says to runfreemapper deriveagain. Carriageways, tracks and paths running side by side still stand side by side there; merging them comes next. Arunkeeps an existing training map and says so,export --trainingstops on one;--forcereplaces it and the base map (the old ones stay as.bak). freemapper builds the training map from the stored data and the content settings, so corrections in OOM do not reach it; to renew only the training map, delete<name>-training.omap(with--ocadalsoocad/<name>-training.ocd) and run again without--force. The base map and the candidates stay the working material for mapping. - Tree cadastres of Leipzig, Frankfurt (Oder), Kiel and Norderstedt (ADR 0065). A tree cadastre can now be a WFS that answers GeoJSON (
[[extra.trees]] format = "wfs-geojson"withtype_nameandoutput_format), andfields.gonenames a field that leaves felled trees out. - Schleswig-Holstein: the tree cadastre of the Hansestadt Lübeck (ADR 0065). A tree cadastre can now be one CSV file of the whole city (
[[extra.trees]] format = "csv"withx_field,y_fieldandseparator); freemapper downloads it whole and cuts it to the area. In the old town of Lübeck 384 trees go onto the map and 43 to the candidates, in place of the OpenStreetMap trees at the same places. The example is rebuilt. - Hamburg: the street tree cadastre with genus, species and crown diameter (ADR 0065). A tree cadastre can now be an OGC API collection (
[[extra.trees]] format = "ogc-api", paged bynextlinks), and its survey date is optional. In Blankenese 13 street trees go onto the map and 4 to the candidates, in place of the OpenStreetMap trees at the same places. The example is rebuilt. - Permit notes: natural monuments and protected landscape features from Schleswig-Holstein, from the INSPIRE service of the protected sites (CC BY 4.0, ADR 0146, addendum). The service has gaps: the natural monuments come almost only from the Kreis Schleswig-Flensburg, the landscape features from Kiel, Lübeck and the Kreise Plön, Schleswig-Flensburg and Stormarn. The notes say so and send the reader to the lower nature authority for the others. The two examples have new notes.
- Permit notes: natural monuments and protected landscape features from Rhineland-Palatinate, from the nature conservation service of the Landesamt für Umwelt (Open Database License, ADR 0146, addendum).
- Rhineland-Palatinate: the landscape model of the LVermGeo RP (ATKIS Basis-DLM, ADR 0147). It is served there only in the AdV Shape schema; freemapper now reads that too (
[[extra.nas]] schema = "shape"). Its objects stay candidates: in Cochem 19 monuments and wayside crosses, 2 watercourses and a well, near Dahn a rock, 3 watercourses and 6 paths. The two examples are rebuilt. - Permit notes: natural monuments and protected landscape features from Lower Saxony, from the NLWKN's map service (ADR 0148). It has no WFS, only ArcGIS REST; freemapper now reads such services as a table too. In Lower Saxony the Landkreise keep the protected biotopes; the notes say so.
- Mecklenburg-Vorpommern: the full ALKIS and the landscape model (ADR 0062, ADR 0135). The full ALKIS puts stairs, walls and bridges straight onto the map: in the old town of Wismar 630 stairs, most of them short steps in front of house doors, and 138 walls; OpenStreetMap walls they double go. The landscape model adds candidates (trees, watercourses, paths). The two examples are rebuilt.
- Permit notes: natural monuments, protected landscape features and legally protected biotopes from ten states (ADR 0146): natural monuments from Brandenburg, Hamburg, Saarland, Saxony, Saxony-Anhalt, Bavaria and Baden-Württemberg, landscape features from Brandenburg, Saxony-Anhalt and Bavaria, protected biotopes from Brandenburg, Berlin, Hamburg, Saarland, Saxony, Hesse and North Rhine-Westphalia. When protected biotopes lie in the area, a hint says that whatever can destroy them or harm them considerably is forbidden and names their types; another names the lower nature authority with the Kreis. Biotopes of one type are one line with their share. The examples of these states have new notes.
- North Rhine-Westphalia and Lower Saxony: the full ALKIS (ADR 0062). In North Rhine-Westphalia it puts walls, retaining walls, stairs, embankment tops, bridges and single trees straight onto the map: 112 more map objects in the old town of Monschau, 113 in the Siebengebirge; OpenStreetMap objects they double go. Lower Saxony records less (bridges, a fountain, walls). The four examples are rebuilt.
- Schleswig-Holstein: objects from the landscape model of the LVermGeo SH (ATKIS Basis-DLM, ADR 0135) as candidates. In the Hüttener Berge that is 48 earth walls, a watercourse and 4 tracks; in Lübeck a watercourse. Both examples are rebuilt.
- Hesse: the full ALKIS and the landscape model of the HVBG (ADR 0135). The full ALKIS adds surveyed stairs to the map, 54 in the old town of Marburg; the landscape model adds candidates as in Bavaria (named trees, small watercourses, a dam and a wall in Marburg, a rock, a spring and a watercourse on the Feldberg). Both examples are rebuilt. For adapters: a manifest may now name one NAS service per model, so a state can serve its cadastre and its landscape model.
Changed
- The 30 examples are rebuilt with the state after ADR 0140: contours run across ways and paved areas (82 instead of 272 contour pieces in Viktoriapark), they are cut out at stairs (460 instead of 332 pieces in Blankenese), fence ticks point away from ways, and doubled OSM water and stairs are gone (7 instead of 12 water areas in the Bürgerpark, 41 instead of 67 OSM stairs in the old town of Bremen). The PDF of each example is now called the check print; the permit notes are unchanged.
- Contours run through ways and paved areas on every map, as ISSprOM 2019-2 (101) asks; this takes back the cut at ways of ADR 0097. They stop at stairs and at the small landform symbols 105, 109 to 112 and 115, on forest maps not at earth walls (105, which ISOM lets contours cross), and still below cliffs. North lines still stop at ways (ADR 0140).
- The ticks of a fence point inside when the fence is closed, otherwise to the olive green area beside it, away from a way along the fence, and to the park. With the same area on both sides they take the side where they overdraw nothing (ADR 0140, amends ADR 0097).
--pdf-candidatesis now called the check print: the base map with every visible candidate, true to position, for checking in the terrain. The file name<name>-candidates.pdfstays. The stronger generalization of cliffs of ADR 0126 and ADR 0134 no longer runs there but on the training map (ADR 0140).- Where there is an nDSM,
derivewrites the tree cover todata/tree-cover.tif: for each 1 m cell the share of ground under at least 3 m of nDSM height. The training map reads it (ADR 0140). - An OSM water area with islands that lies half on water from the cadastre is now dropped as a duplicate, like one without islands; before, freemapper read only its outer ring and kept it. In the Bremen Bürgerpark four such lakes lay 91 to 99 % on ALKIS water. An OSM stair that lies half on a cadastre stair is now dropped too, and the cadastre stair names it in
freemapper:also; in the Bürgerpark that was 6 of 23 (ADR 0140). - The examples overview, the README, the comparison and the manual show small WebP thumbnails; only a click loads the image at full resolution. The examples overview loads 1.6 MB instead of 6.6 MB. The PDF of each example is a link of its own below the image.
scripts/thumbnails.shmakes the thumbnails again after an example or a manual image is rebuilt. - The README links the examples overview at the top, next to the changes. In the examples overview the preview is now the first column.
[0.21.0] - 2026-11-15
Added
- Permit notes: monuments from Schleswig-Holstein (ADR 0145). The Landesamt für Denkmalpflege publishes its list only as one file for the whole state (about 52 MB, new each week, CC BY 4.0). freemapper downloads it the first time, keeps it in the cache and downloads it again only when the server has a newer one. Archaeological monuments and Lübeck's monuments are not in it; the notes say so. The two examples of Schleswig-Holstein have new notes.
- Saxony-Anhalt: objects from the landscape model of the LVermGeo (ATKIS Basis-DLM, ADR 0135), as in Bavaria: cliffs and rocks, springs, dams, monuments, fountains, fences, small watercourses and named trees as candidates, on forest maps also paths OpenStreetMap lacks. Rocks that the model draws as lines are cliff candidates (201) with their ticks turned downhill. In the Bode valley that is 27 cliffs, 20 rocks and 11 paths, in Quedlinburg 7 small watercourses; both examples are rebuilt.
- Permit notes: monuments also from Hesse, Baden-Württemberg, Bremen, Saxony, Brandenburg, Rhineland-Palatinate and North Rhine-Westphalia, from the open services of the monument offices (ADR 0144). When monuments lie in the map area outside Berlin and Hamburg, a new hint names the lower monument authority with the Kreis and the Gemeinde; before, no hint there said whom to ask, in Saarland neither. North Rhine-Westphalia's data are still being gathered, and Brandenburg's lack the Baudenkmale of Potsdam; a source with such gaps now says so in the notes, and the authority hint comes there without a finding too. A Stadtkreis in Baden-Württemberg now counts as its own lower authority like a kreisfreie Stadt, for the nature authority too. For services that answer only in their own CRS, freemapper now asks in metres and converts; it now also reads GML answers with points. A download whose gzip ends early (as with Saxony's monument service) is repeated once without compression. The examples of these states and of Saarland have new notes.
- Permit notes for Baden-Württemberg (ADR 0143): the water protection zones of the LUBW with their zone and the lower water authority in charge. A water protection area now names its authority too where the data give it; the hint then says "ask the lower water authority (untere Wasserbehörde, Landratsamt Ludwigsburg)". Names the register writes in capitals, in quotes and with a number (
\"MAHDENTAL\" 111032) are written as names ("Mahdental"). The notes now name water protection areas in every state. The LUBW does not publish zone I; it comes joined with zone II. - Permit notes: drinking water and medicinal spring protection areas of the Bundesanstalt für Gewässerkunde (BfG, WasserBLIcK, CC BY 4.0) for Bavaria, Lower Saxony, Bremen, Mecklenburg-Vorpommern, Rhineland-Palatinate, Saxony-Anhalt and Saxony (ADR 0142). These are the areas the states report to the BfG, with their names but without zones. The pieces of one area, often one per zone, are joined into one. Names from Lower Saxony that the service garbles ("Börßum") are written right in the notes ("Börßum"). The examples of these seven states have new notes. The BfG has no data for Baden-Württemberg either.
- Permit notes for Saxony (ADR 0139): the Forstbezirk and the Revier of the Staatsbetrieb Sachsenforst, Erholungswald, Naturwaldzellen, Bodenschutzwald and the drinking water protection zones in the forest, from two map services of Sachsenforst (dl-de/by-2-0, "Geodaten Sachsenforst"). A Revier is in charge in the state forest, the lower forest authority of the Landkreis for other forest; the notes say so. The services answer only for single points, so freemapper asks at up to 25 points over the map, up to 50 requests. The notes then say that the shares are estimates and that something between the points can be missing, and for an empty section they do not say "no water protection area" but that nothing is named at the points asked. The examples Bastei and Bautzen have new notes.
- Permit notes for Schleswig-Holstein (ADR 0137): the state forest with its Revier of the Schleswig-Holsteinische Landesforsten, the Naturwald and the water protection areas with their zone, from the Umweltportal of the Landesamt für Umwelt (CC BY 4.0). The service answers GML only; the table source now reads such services too. Names a service writes in capitals ("HÜTTEN") are written as names in the notes ("Hütten").
Changed
- Bavaria: the surface model (DOM20) is read by range, block by block (ADR 0141). freemapper reads only the blocks of 51 m that the map area needs instead of whole tiles of 32 to 56 MB, and a later map in the same tile reads only the blocks it lacks. On the Schmausenbuck that is 92 MB instead of about 212 MB, with the same surface model cell for cell. Copies cached before stay valid.
- Vegetation from laser point clouds (ADR 0138): the green shades 406, 408 and 410 now follow how much stands in the layer a runner moves through, the laser returns between 0.8 and 3 m among all returns below 3 m (from 20 %, 35 % and 50 %). Before, an index also counted the crowns, and tall forest without undergrowth scored almost as high as a thicket, because every flight the states publish is made without leaves. Measured on the Schmausenbuck against the canopy height of the summer pictures, 71 % of the thickets come out green (29 % before) and 7 % of the tall forest (11 % before). Parks and towns get more green areas (Sanssouci 205 instead of 54); forest maps change less, because their smallest area is larger. Pole stands with a clear stem space stay runnable forest. Existing maps get this with
run --force. The nine examples with vegetation are rebuilt.
Fixed
- Bavaria, objects of the landscape model (ADR 0135): a fountain of the model in an OpenStreetMap fountain basin or in drawn water is the basin's jet and goes, as an ALKIS fountain does; in the old town of Regensburg that is 2 of 5. A tower of the model goes beside an OpenStreetMap tower of the other tower symbol (524 and 525 count as one). When a map area leaves Bavaria, the note about removing its stored layers names the landscape model, not the full ALKIS.
- Permit notes: the table of sources showed the placeholder
{year}instead of the year of the fetch for the services of Saarland. It shows the year now, for the BfG too. The two Saarland examples are made again. - A folder adapter that names a built-in raster backend (
backend = "lgb"and the like) got no orthophoto, terrain model or surface model in the download estimate. The built-in backends now estimate their rasters themselves, with the same numbers as the states. The estimates of the built-in states stay as they are (issue #71).
[0.20.0] - 2026-11-14
Added
- Bavaria: objects from the landscape model of the agency (ATKIS Basis-DLM, ADR 0135). Bavaria has no service for its cadastre; springs, cave entrances, named rocks, free-standing towers, monuments and wayside crosses, fountains, fences, dams, small watercourses and named trees now come from there, on forest maps also paths and tracks. The model is made for 1:25 000 and accurate to about 3 m. Its objects therefore stay candidates and go where OpenStreetMap or another source has the same object: a point within 15 m, a line that runs within 10 m of a line of the same kind for 80 % of its length. On the Schmausenbuck 14 candidates stay, 6 of them paths OpenStreetMap lacks; in the old town of Regensburg 10. Both Bavarian examples are rebuilt. For adapters: a NAS service names its model (
[[extra.nas]] model, defaultalkis, newbasis-dlm). - Examples: each of the 30 examples in
examples/now has its permit notes (permits.mdandpermits.json, in German). They show what the notes give in each state, from the Bezirke and monuments of Berlin and Hamburg to the forest administration, water protection areas and classified roads. - Permit notes: a new section names the classified roads through the map area (Autobahn, Bundes-, Landes- or Staats-, Kreisstraße, with their number from OpenStreetMap), and per class a hint that the road traffic authority orders a closure or a crossing with marshals and who usually keeps the road (ADR 0133). It works in every state and comes from the OSM extract freemapper reads already.
- Permit notes: the files freemapper downloads for a whole state (about 32 MB in North Rhine-Westphalia, about 4 MB in Brandenburg) stay in the cache (folder
permits). A new fetch asks only for the date and downloads a file only when the server has a newer one; when it cannot be reached, freemapper uses the kept one (ADR 0132). - Permit notes: water protection areas also from Brandenburg (LfU, one file of about 4 MB) and North Rhine-Westphalia (one file of about 15 MB, also the planned areas, whose zone says "(geplant)"), both as a shapefile for the whole state (ADR 0131). A fetch in North Rhine-Westphalia downloads about 32 MB with it. freemapper reads the fields of a shapefile table without a
.cpgas Latin-1 when they are not UTF-8; umlauts there came out as replacement characters so far. - Permit notes from more states (ADR 0130): water protection areas with their zone from Berlin, Hesse and Saarland; forest functions from Brandenburg (Naturwald, Totalreservat, closed areas, Erholungswald), North Rhine-Westphalia (Naturwaldzellen, wilderness development areas) and Saarland (Naturwaldzellen, Urwald); in Saarland also the Revier of the SaarForst Landesbetrieb in the state forest and the listed buildings. freemapper describes these services only as a table of their layers; each keeps only the fields it reads. A zone the data write only as "I" or "III" is "Schutzzone I" in the notes. Bremen and Baden-Württemberg give no licence for their water protection areas in the service and stay out for now.
- Permit notes for Hamburg (ADR 0129): for a map area in Hamburg the notes name the Bezirk with its Bezirksamt, the public green spaces of the Grünplan, the monuments (garden monuments, ensembles, listed buildings) with the Denkmalschutzamt, the Revierförsterei of the Stadtwald, Bannwald and Erholungswald, and the water protection areas with their zone, all from six services of the Geoportal Hamburg. New for every state with such data: a hint for each water protection area in the area that says whether it is an inner zone (I or II), and hints on recreation forest, protected forest, natural forest and closed forest areas. freemapper takes none of the architects the Hamburg monument list names.
- Permit notes, step 3 (ADR 0124): in Brandenburg, Berlin and North Rhine-Westphalia the notes name the forest administration of the map area, each office with its Revier or district and its share: the Oberförstereien of the Landesbetrieb Forst Brandenburg, the Forstämter of the Berliner Forsten and the Regionalforstämter of Wald und Holz NRW. In North Rhine-Westphalia the share of state forest comes with them. A forest map gets the hint on the office in charge and that the forest owners must agree; in the other states only the second, with the sentence that the notes do not name the office there. In North Rhine-Westphalia a fetch downloads two files of about 17 MB together for this. freemapper takes none of the foresters' names and contact data in those files, not even into
data/permits/. - Forest maps in steep land get contours every 10 m instead of 5 m by themselves (ADR 0125). Steep means: on more than a tenth of the area the 5 m contours would lie closer than 0.35 mm and run into a brown area.
derivesays so in a line;--contour-interval 5keeps 5 m. Among the examples it is the Bode valley and the Bastei. - Bavaria: vegetation from laser point clouds (ADR 0128). With
--content-set vegetation=candidatesor the box on the area page, freemapper loads the laser points of the Bayerische Vermessungsverwaltung and puts open land, forest and the green shades into the candidates map, as in Brandenburg, Berlin, North Rhine-Westphalia, Rhineland-Palatinate and Saarland. A tile of 1 km² mostly has 100 to 600 MB; the estimate counts 250 MB. The date on the candidates is the day of the flight, which freemapper reads from the laser points; older flights do not name it, and there it is the day the file was made. The tiles lie on a third server,geodaten.bayern.de, which the adapter of Bavaria now names (revision 2). The Bavarian flights whose day is known were flown between November and February. Without leaves, shrubs and young growth often come out as runnable forest. The Schmausenbuck example is rebuilt with the vegetation (four tiles, 1.2 GB, flight of 20 December 2021). - Cliffs on forest maps are generalized (ADR 0126). OpenStreetMap maps rock country cliff by cliff; at the Bastei 2144 lines ran into a black area. freemapper reads each cliff on the terrain model: how high the rock stands above its slope and which side is lower. Low stretches go to the candidates map, rock pillars become the area 206, the highest cliffs are kept first and keep the gaps of the ISOM 2017-2; where the tags have no room the top line 201.3 stands, and two cliffs back to back become a rock fin. The cliffs are smoothed, the contours stop only below rock drawn, and knolls on the rock are hidden. The Bastei keeps 256 cliffs, 23 top lines and 26 pillars and fins; no square centimetre is more than 33 % black (before 230 %).
Changed
- Vegetation from laser point clouds (ADR 0136): the outlines now follow the edge of the vegetation instead of the 3 m steps of the cells. freemapper traces them on a raster three times finer and slightly blurred; corners are rounded a little. The nine examples with point-cloud vegetation are rebuilt.
- Cliffs on sprint maps (ADR 0134): sprint maps generalize their cliffs too, by the values of the ISSprOM 2019-2 (minimum height 1.5 m, minimum length 0.9 mm), and their training PDF more (cliffs from 3 m, no top lines without tags).
derivenow keeps the terrain mosaic of a state with tiled terrain for every map; so the ticks of banks and retained walls point downhill there too. - Cliffs on forest maps (ADR 0126): the training PDF generalizes the rock more than the map (cliffs from 5 m above the slope, no top lines without tags, longer pieces), also where the cliffs are only candidates; the candidates map keeps every OSM cliff. A cliff the orthophoto shows as rock goes first in the ranking; for that
derivewritesdata/rock-seen.tiffor forest maps. - Permit notes follow the map area, not the kind of map (ADR 0127). The forest hints and the section "Forest administration" come as soon as OpenStreetMap has forest in the area, also on a sprint or schoolyard map, and also when that cannot be told without an OSM extract. A map in the middle of a town no longer gets them, even when it lies in a Revier of Brandenburg. The operator of a school in the area is now named on every kind of map, not only on schoolyard maps.
- Examples: the Bode valley and the Bastei have contours every 10 m instead of 5 m; on the steep slopes they ran together into a brown area. The rocks of the Bastei come from OSM, not from the terrain model as the examples overview said so far.
Fixed
- Vegetation from laser point clouds: when tiles of different days lie under a map, the candidates now carry the oldest day instead of the newest. An area can lie on any of the tiles, so nothing newer can be said of it.
- Vegetation from laser point clouds: when two runs load the same tile at the same time, each has a partial file of its own. Before, they deleted each other's partial file and left the tile out with a warning. This affected North Rhine-Westphalia, Rhineland-Palatinate, Berlin, Saarland and Bavaria.
[0.19.0] - 2026-11-14
Added
- Bavaria (ADR 0123): maps in all of Bavaria, in UTM zone 32, also east of 12° E. The orthophoto comes from the map service of the Bayerische Vermessungsverwaltung, with the date of the flight. freemapper reads the terrain model (DGM1) tile by tile, about 2.8 MB each. Bavaria has no surface model at 1 m; freemapper takes the DOM20 of 20 cm (about 45 MB per km²), reduces it to 1 m and keeps only the reduced tiles. Bavaria has no service for its cadastre. So buildings and canopies come from the LoD2 tiles, one file per 2 km square (about 3 MB in the country, 60 to 160 MB in a city centre), and the land use from the file of each Kreis at the area (2 to 13 MB). Bridges and walls in LoD2 do not go onto the map. The estimate before the run lists all five downloads. freemapper downloads a cached file again only when the server has a newer one; offline (
--offline) the same map is made. Stairs, walls and embankments from the cadastre and vegetation from point clouds are not there for Bavaria yet. Examples: the old town of Regensburg (sprint map) and the Schmausenbuck in the Nürnberger Reichswald (forest map). Thuringia is now the only state without data sources; the warning for areas beyond the coverage names Thuringia alone. - Examples: a forest map (1:10 000) for every state; besides the Dammheide in Berlin, 13 new ones in
examples/, from the Elbe sandstone at the Bastei to the Bürgerpark in Bremen. They were chosen by relief and path network out of some 30 trial runs. In Brandenburg, North Rhine-Westphalia and Saarland they hold the vegetation from laser point clouds as candidates; in Rhineland-Palatinate the state office's Metalink file does not match the files for the tiles near Dahn, so freemapper leaves them out. The table is in the examples overview.
Changed
- Examples: the 14 sprint maps in
examples/are rebuilt, all but Regensburg, which already comes from the current code. They now show what version 0.18.0 draws. Small compact areas are no longer dropped (ADR 0122), so the old towns have more out-of-bounds areas (520) among the candidates and more paved areas (501.5) on the map: Lübeck has 1834 candidates instead of 1365, Wismar 1660 instead of 1416. With the compact path writer the 14 training maps take 5.6 MB together instead of 10.1 MB. The tables and numbers inexamples/README.en.mdand the comparison of the three content profiles for Cochem are counted again.
Fixed
- Saarland: in forest areas the ALKIS land use was missing with the warning "LVGL ALKIS returned 22 of 26 features in the area", also after a new
fetch. The service lists a forest once per vegetation feature (such as deciduous wood and short-rotation coppice), with the same object id and the same geometry. freemapper keeps one row of them and now counts the others towards the service's matches. A feature repeated on a later page is still an error. At the Saarschleife near Mettlach this brings 684 land use areas and 132 more out-of-bounds candidates.
[0.18.0] - 2026-11-13
Added
- Baden-Württemberg (ADR 0119): maps in Baden-Württemberg, in UTM zone 32. The orthophoto comes from the map service of the LGL, with the flight date of the tile at the centre of the area. freemapper reads the terrain model (DGM1) and the surface model tile by tile out of the 2 km archives of the LGL, about 3.5 MB per tile. The surface is the nDOM1 from the aerial images of a summer flight: it shows the trees in leaf and usually comes from the flight of the orthophoto or the one before it. Buildings and land use come from the ALKIS service of the LGL. It holds whole buildings only, so no canopies, and street areas include the green beside them. OSM comes from the extracts of the four Regierungsbezirke (130 to 215 MB). Credit:
Datenquelle: LGL, www.lgl-bw.de, dl-de/by-2-0 (Daten geändert, <year>). Example: Heidelberg old town and castle. - Bremen (ADR 0121): maps in Bremen and Bremerhaven, in UTM zone 32. The orthophoto comes from the map service of the Landesamt GeoInformation Bremen, which has one layer per flight and city; freemapper takes the newest colour flight of each city (2025) and gives the flight year as the date. It reads the terrain model (DGM1) and the surface model (DOM1) tile by tile out of the archive of the city, about 3.5 MB per tile. Both come from the laser scans of 2017 (Bremen) and 2015 (Bremerhaven); freemapper warns at the fetch that newer buildings and trees may be missing from the nDSM. Bremen has no simplified ALKIS. Buildings, building parts, canopies and land use therefore come from the full ALKIS, which the LGLN runs for Bremen, with the same names as in the other states. The same service gives the surveyed lines as in Brandenburg: stairs, ramps, retaining walls, monuments, embankment tops and bridges. An area in Lower Saxony that reaches into Bremen now gets buildings and land use from Bremen's cadastre there, in place of the warning that it lies outside the supported states; that warning now names Bavaria and Thuringia as examples. The area page shows the aerial photo of the city of Bremen only, not of Bremerhaven. Credit:
© GeoBasis-DE / Landesamt GeoInformation Bremen (<year>), CC BY 4.0, Daten geändert. Example: old town of Bremen and Wallanlagen. - Permit notes in Berlin (ADR 0120): when the map area lies in Berlin,
permits.mdandpermits.jsonalso name the Bezirke with their share, the green spaces with their Bezirk and dedication, the number of public playgrounds, the share of the area owned by the state of Berlin and by the Bund (one line per owner; any other owner is not named and shares the line "Other public owners"), the monuments per kind with up to 20 links into the Denkmaldatenbank, and natural monuments, protected landscape features and areas with special rules. The hints then name, for each Bezirk that is more than an edge of the area, the Ordnungsamt, the Straßen- und Grünflächenamt, the lower monument authority and the lower nature conservation authority of the Bezirksamt. The data come from five services of the Geoportal Berlin (dl-de/zero-2-0, the licence text verbatim in the table of sources). freemapper asks them only when permit notes are wanted and the area lies in Berlin, and only through the hosts of Berlin's adapter. A service that is down takes only its own section with it. A region adapter can now bring such sources (RegionAdapter::permit_sources).permits.jsonstays at schema 1; older files anddata/permits/sources.jsonstill read. Described in the user manual, chapter 12.
Changed
- Smaller PDFs:
--pdfand--pdf-candidateswrite their paths with the compact path writer of freemapper-core 0.26.0 (freemapper-core decision 0033). Path coordinates are rounded to 1/1000 point. Small shapes of four points or more within 7 mm, such as the dots of point symbols, are written relative to their first point, so repeated symbols compress well. The 26 PDFs of the 12 example maps with data (Dammheide left out) shrink by 22 to 79 %, from 16.9 MB to 8.3 MB together; Sanssouci's map goes from 1.45 MB to 304 KB. The maps look the same: rasterised at 150 dpi with poppler, 6 of 113 million pixels differ by more than 12 %. Texts, fonts, colours, page size and the clip to the map area stay as they were. A shape with a coordinate that is not a finite number is left out instead of breaking the page. All libraries of freemapper-core move to v0.26.0; 0.26.0 changes nothing else for freemapper. - School and forest maps: the minimum sizes of the norm now grow with the symbols (ADR 0118). On a school map (symbols at 125 %) the smallest building or canopy is 0.625 mm instead of 0.5 mm, on a forest map at 1:10 000 (150 %) 0.75 mm; likewise the shortest line by ISSprOM 4.5, the smallest areas of out-of-bounds land, paving, green, open land and water, the shortest contour and the smallest contour ring, landforms and the smallest vegetation area. Such maps show a little less small detail. Sprint maps (100 %) stay the same. The contours, landforms and vegetation of an existing project change only when
deriveruns again. The Dammheide example is rebuilt with it. Most of what went are small buildings and canopies in the settlements and short index contours: 560 buildings instead of 757, 7 canopies instead of 24. - Internal: lengths on paper now have a type (ADR 0118). A paper measure (
PaperMm) holds on the printed sheet, a symbol measure (SymbolMm) grows with the symbol enlargement of the map kind and cannot be converted without it. The roughly 45 hand-written conversions to ground metres and map coordinates are replaced; the norm's line gap, line widths and point sizes are written down once inbuild/symbol_measures.rs. No measure changes, the maps stay the same. - Internal: the rule for overlapping walls, fences and hedges now converts its distances like every other rule (addendum to ADR 0118). On a forest map at 1:10 000 two limits move by the last digit of the floating-point number; all other maps compute as before. The shortest stubs of a cut line stay 1 mm on the sheet and do not grow with the symbols; that is now decided. Four tests of the order of the map assembly run without a project folder (
build/assembly.rs).
Fixed
- Baden-Württemberg: when the server answers 404 for the 2 km archive of a block that holds a tile inside the state, the fetch of the terrain now stops with an error that names the archive's address (for the surface model a warning names it), instead of leaving a 1 km hole in the templates with only a warning about a missing tile.
- Small compact areas are no longer dropped as "too narrow" (ADR 0122). Out-of-bounds land, paving, green, open land and water leave out slivers: pieces below (1 mm)² or narrower than 1 mm. The width used to be 2 · area / perimeter, which is only half the side of a square: a square piece needed a side of 2 mm to count as 1 mm wide. Now the short side of the rectangle with the same area and perimeter counts. On forest maps 1 mm of the norm is 15 m on the ground; there, plots up to 30 × 30 m fell out of the out-of-bounds areas and left white holes in the settlements. The Dammheide example now keeps 144 of 146 out-of-bounds areas (113 without the fix) and 9 of 10 open-land areas (2 without). Sprint maps gain a few small pieces, mostly out-of-bounds candidates of 40 to 100 m²; no area that was drawn before is dropped. Strips are as wide as before, and the rule for narrow ALKIS water (a candidate below 2 m mean width) stays.
- Forest maps: the north lines are now 20 mm (1:15 000) or 30 mm (1:10 000) apart, 300 m on the ground, as ISOM 2017-2 requires; before they were 450 m apart, as in ISOM 2000. The Dammheide example is rebuilt with it.
- The OCAD hint after
--ocad: on a forest map freemapper told you to load the ISSprOM 2019 or school symbol set in OCAD. The hint now names the set of the map kind: ISOM 2017-2 for forest maps, ISSprOM 2019 for sprint maps, the IOF school set 2019 for schoolyard maps. The same goes for the summary through MCP and on the area page. The README now names ISOM 2017-2 as well.
[0.17.0] - 2026-11-13
Added
- Forest map example: Dammheide in Berlin, 1:10 000, with the OOM map, the OCAD starting point and the candidates PDF (ADR 0116).
- Forest maps (ADR 0116): the contour interval can be set when making a map:
--contour-interval <metres>|autooninit,deriveandrun, the MCP parametercontour_intervalofcreate_projectandstart_pipeline(0 means automatic), and the field "Contour interval" on the area page, also for an existing project. The choice is saved infreemapper.toml, and the nextderivetraces the contours at it. A value that is no positive number is refused before a project folder is made. - Permit notes (ADR 0117):
freemapper permits <dir>andrun --permitswritepermits.mdandpermits.jsonnext to the map. For the map area the file names the state, Kreis, Amt and Gemeinde from the BKG's VG250, the protected areas of the BfN, further protected areas and the operators and owners from OpenStreetMap, each with its share of the area, and says whom one usually asks. It is a hint, not legal advice. The notes are made only on request; only then does freemapper askgeodienste.bfn.deandsgx.geodatenzentrum.de. It reads the OSM extract from the cache, and--offlinetakes the data stored indata/permits/. The area page has the option "Permit notes" for it, the MCP server the toolpermits_for_area(a job;project_statuscarries the text aspermits_md) andpermitsonstart_pipelineandopen_area_selector.project_statusnow lists the written files (files) of every job. The map,freemapper.tomlandATTRIBUTION.txtstay unchanged. Described in the user manual, chapter 12; the chapters after it move up by one. - Forest maps (ADR 0116, addendum): when the contour interval is not the kind's, for example 2.5 m in a flat forest,
derivewrites it intofreemapper.tomlas[contours] interval_m. freemapper-print reads it there through the suite contract (freemapper-core 0.25.0) and no longer proposes 5 m. Projects at the kind's interval keep their file unchanged. - Forest maps (ADR 0116):
--kind forestmakes a map after ISOM 2017-2 at 1:15 000 (default), 1:10 000 or 1:7500, with the symbols at 100, 150 or 200 %. It is meant for a quick training in small forests. The paths come from OSM and go straight onto the map, sorted into the path classes 502 to 507; stairs become 532. Sidewalks along roads, crossings, driveways and parking aisles are left out. The forest stays white paper: where OSM or ALKIS says forest, freemapper draws no open land, not over ALKIS parks either. The only green is OSM scrub, as a candidate. Contours lie every 5 m, every 2.5 m in flat land;contour_interval_minfreemapper.tomlsets the interval. The symbol set is ISOM 2017-2 from OpenOrienteering Mapper with the colours of IOF Rev. 4. Tried on the Dammheide and the Mittelheide in Berlin. The help, the MCP server and the area page know the kind, its scales and its error messages.
Changed
- freemapper-core 0.25.0: the suite contract knows the scales of the forest map (0.23.0) and the contour interval in
[contours] interval_m(0.25.0), and freemapper writes both. - Internal: placing the objects by the content settings now lives in the new module "map assembly" (
build/assembly.rs, ADR 0115) instead of between the file reads of the project. It reads no file and can be tested with a few objects in memory. First of three steps; the maps stay byte for byte. - Internal: resolving the duplicates between the sources (register before ALKIS before survey before OSM) and the point generalization now live in the map assembly too (
assembly::resolve, ADR 0115, step 2). The project draws the sources and hands them over; the order of the steps is in one place. - Internal: the map assembly now builds the whole map from the data that was read (
assembly::build, ADR 0115, step 3). The project reads the folder in one place and makes the documents from the result; contours, landforms and vegetation are drawn in modules of their own underbuild/. A test can build a map without a project folder. - Internal: which of Berlin's layers are registers is said in one place only, in Berlin's adapter. The rank of duplicate objects, the draw rules for trees and the credit read it from there instead of from lists of their own. Maps and credits do not change (update in ADR 0114).
- Internal: a tree cadastre is asked under the host rules of the adapter that brings it and counts for that adapter's ground. Before, the engine looked the adapter up by the id in the row of the cadastre. Had the row named another adapter of the registry, the cadastre would have been asked for that adapter's ground and under its host rules; with an unknown id it was left out. No adapter of today was affected: a manifest always writes its own id (update in ADR 0114).
Fixed
- Forest maps (ADR 0116): impassable vegetation is ISOM 2017-2 410 instead of the first edition's 411. The path classes 502 to 505 belong to the content group
paths, so--content-set paths=candidatesmoves every path. Stairs taggedincline=downrun uphill as on sprint maps. A forest map no longer fetches the areas and kerbs of the Berlin street survey or the city tree cadastres, which it does not draw. The test whether an area is flat reads the terrain model every 5 m only. The margin names the interval the contours were traced at, also whencontour_interval_mwas changed since. - Hamburg, Saarland, Saxony-Anhalt and adapters from folders: when the surface model cannot be fetched, a model stored earlier stays only if it covers the map area, and the warning names the day it is from. Before, the model of another area stayed in the project with its record, and the warning spoke of a missing nDSM template in every case, even when
derivestill made one from the old model. The other states already behaved this way.
[0.16.0] - 2026-11-13
Added
- Vegetation from laser point clouds in Saarland too (ADR 0105): LVGL offers the 2025 point cloud in six large zip64 archives by district, on the same share as the height models. freemapper reads only the tiles of the map area out of them by byte ranges, about 40 MB per square kilometre, and checks them against the archive's CRC. The scan was made in February without leaves, and the point cloud is thinned to one point per 0.5 m; freemapper still finds the crowns. Checked on the old town of Saarlouis. Saxony gets no point clouds for now: GeoSN took them off its download area in November 2026.
- Vegetation from laser point clouds in Rhineland-Palatinate too (ADR 0105):
fetchloads the LAZ tiles of LVermGeo RP, mostly 110 to 500 MB per square kilometre, and keeps a tile only when its size and SHA-256 match the Metalink file of the state. The day of the scan comes from the metadata of the tile; when the tile is cached, freemapper asks only for that. Checked on the Stadtpark in Mainz. - Vegetation from laser point clouds in Berlin too (ADR 0105): the Geoportal Berlin offers the point cloud only in nine large zip64 archives. freemapper reads just the tiles of the map area out of them by byte ranges, about 240 MB per square kilometre, checks them against the archive's CRC and keeps them in the cache as LAZ (about 100 MB). The 2021 scan was made without leaves, so freemapper recognises dense shrubs there less well. Checked on the Viktoriapark.
Changed
- The manual's pictures of the area page are taken again (area selection, options, progress), with a new picture of the section "What goes onto the map" and all its groups. The hint of the profile "Balanced" on the page now says what the profile does: contours and the areas that shall not be entered along railway tracks go onto the map, and stairs, banks, monuments and passages also come from OpenStreetMap.
- The examples Sanssouci, Viktoriapark, Monschau, Cochem and Saarlouis are rebuilt with
--content-set vegetation=candidates: their training maps now show the vegetation from the point clouds. The map objects of the first four are unchanged; Saarlouis has 109 street areas instead of 32 and the Saar from ALKIS, through the fix of the land uses. Bautzen stays without vegetation, because Saxony offers no point clouds at present. - The boundaries of Lower Saxony and Schleswig-Holstein no longer overlap in the mouth of the Elbe. The cadastres of both states hold the same 89 km² of water off Cuxhaven; freemapper now splits that area at the line of equal distance from the two claim lines (ADR 0113). Maps do not change, the area is open water.
- The adapter guide says what a code adapter can bring beyond the cadastre and the rasters: sets of extra layers and raster templates. ADR 0114 records how Berlin's registers and the K5 moved from the engine into the adapter and what stays open.
- Internal: the engine no longer asks "is this Berlin?" anywhere. The warning about missing buildings, the list of templates and every fetch for an adapter go through the registry; the K5 service lives with Berlin's adapter, the reader of stored layers in
freemapper-sources. A test holds that the engine names no state outside the draw rules and reaches into the adapter crate only at the lines listed there. Maps, messages and files do not change. - Internal: an adapter can name raster templates it fetches with code of its own (
RegionAdapter::templates). Berlin's map 1:5000 (K5) is the first: the engine asks the adapter of the registry and takes the date, the messages and the item of the estimate from there. The template, the messages and the estimate do not change. - Internal: an adapter can name sets of extra layers it fetches with code of its own (
RegionAdapter::extras). Berlin's registers and surveys are the first such set: the engine asks the adapter of the registry instead of calling the Berlin module, and takes the item of the estimate from there too. Maps, messages, files and estimates do not change; the one exception is under "Fixed". - Internal: the extra layers of a project (Berlin's registers, the full ALKIS, the tree cadastres) are fetched, stored, removed and read in one place instead of in three equal copies. A first step towards an engine that names no state; maps, messages and files do not change.
- Internal: the modules in
freemapper::sourcesthat only passed on what has lived infreemapper-adapters-deandfreemapper-sourcessince the adapter work are removed, and so is the raster fetch for Saxony-Anhalt in program code that nothing used any more. The state still fetches through the services its manifest names; maps and requests do not change.
Fixed
- Vegetation from point clouds stops at areas that shall not be entered (520). Before, the forest candidates punched white holes into the olive green private gardens and courtyards of the candidates map and the training PDF, because the white of the forest lies above the olive green in the colour order. On the map this holds for the areas of the map, in the candidates for those of the map and of the candidates (ADR 0105).
freemapper adapters check --livefor an area near Berlin no longer fetches Berlin's registers and the K5 template when another adapter is checked. Before, those requests went out without the host rules of Berlin's adapter, and the next command dropped the records again.- Saarland: the WFS of LVGL writes the land use classes
StrassenverkehrandFliessgewässer. freemapper knew onlyStraßenverkehrandFließgewässer, so Saarland maps lacked the street areas from ALKIS, the rivers from ALKIS and everything that depends on them, and the vegetation from the point cloud put open land on the streets. Every land use class from a WFS is now brought into the LGB spelling, as for Hamburg already; in Rhineland-PalatinateUnland, Vegetationslose Flächethereby readsUnland/Vegetationslose Flächeas everywhere else.
[0.15.0] - 2026-11-12
Added
- New template local relief (
templates/relief.png, layerrelief): the terrain model minus its smoothed mean. Banks, mounds, hollows and ditches stand out light or dark; the general fall of the ground disappears. It is hidden in the map and can be switched on in OOM. - New candidates from the terrain model (ADR 0104): small knolls (109), small elongated knolls (110), small depressions (111), earth banks (104) and, from 3 m high, impassable cliffs (201). They show what the contours of sprint and schoolyard maps miss: play mounds, sledging hills, hollows, terrace edges. A knoll has to be at least 1 m high on a sprint map and 0.5 m on a schoolyard map, and narrow enough that the contours do not show it already. The ticks of banks point down. None are made at buildings, in water or next to walls, fences and banks already drawn. All of them are candidates to be checked in the terrain (all of them belong to the new group
landforms, banks and cliffs too;fullor--content-set landforms=mapputs them on the map, whileslopes=mapstill takes only the banks of ALKIS and OSM); the DGM1 often misses walls narrower than a metre. Knolls and depressions do not come on residential, mixed, commercial and traffic land or in allotments, depressions not within 8 m of a building; cliffs along streets and buildings are offered as impassable walls (515), and bent steps are split into pieces that follow them.derivewrites them todata/landforms.geojson. The ideas come from karttapullautin and omapmaker; the code is written anew. - Vegetation from laser point clouds (ADR 0105), in Brandenburg and North Rhine-Westphalia: open land (401), runnable forest (405), the green shades 406, 408 and 410, and undergrowth (407, 409) as candidates. The new content group
vegetationis off in every profile;--content-set vegetation=candidates(or=map, or the area page) makesfetchload the classified point clouds of LGB or Geobasis NRW for the map area into the shared cache, about 160 MB per square kilometre tile in Brandenburg and mostly 50 to 165 MB in North Rhine-Westphalia (each NRW file is checked against the size its index gives), which the download estimate and the disk check count. They are the first part left out when the disk is short, and a failing download keeps the cached tiles.derivewritesdata/vegetation.geojson, leaving out synthetic fill points, cellar points and bridges, the returns at buildings and the cells whose high returns are mostly single echoes (roofs, also those the cadastre no longer has); the export cuts the areas at buildings, water and paved areas and, where the map already has a park or wood of the same symbol, shows only the part that differs. Checked on Sanssouci and the Volksgarten in Cologne.
Changed
- Internal: the tests run faster. The dependencies are fully optimized in the development build too (built once, then cached); our own crates stay unoptimized. In CI the
checkjob drops from 8 to 10 minutes to 5.5 to 7, the golden net from 2 to 3 minutes to 1 to 2 per system; the outputs of the golden net stayed byte-equal. CI writes line numbers only as debug information, and a newer push to a pull request cancels its older run. A pull request runs on Linux only; with the labelall-systems, and on every push to main, all three systems run. The first debug build after updating compiles the dependencies once more; the release build does not change. - All twelve examples are rebuilt with the default profile
balanced. Ten of them predated the content profiles; now contours, paths, stairs, walls and trees are on their maps, and the candidates are mostly out-of-bounds areas, control sites and earth banks. The comparison page shows one area, Cochem, in the three profilessafe,balancedandfull, with a PDF each. The numbers in the examples overview and the manual are counted again. - MCP: what the server finds wrong with the person's adapter folders at its start (a folder left out, or one that loads with a caveat) now comes once as a note with the first tool result. Before, it went to stderr only, which neither the agent nor the person sees.
- MCP:
preview_layerwith the layermapshows the image of the map objects that the last run wrote next to the map (without the candidates). Before the first run the message namesfreemapper exportorrun. - Two adapters share ground when their common area is more than a hundredth of the smaller region. Before, one inner point of each was tested, so an adapter that reached a third of the way into a state went unnoticed.
adapters list,adapters checkand the warning about the adapters of a project use the new measure. All three now name the regions by name, not by id; the JSON ofadapters listkeeps the ids. - The message about an adapter the program does not have says that a newer freemapper may bring it.
- The message about a redirect freemapper does not follow starts with the refused address and then names, in brackets, the address that redirects there. Before, the address that was asked came first and was called "this address".
- The example Treppenviertel Blankenese is rebuilt with the default profile
balanced: contours, paths and 110 stairs from OpenStreetMap are on the map now (1780 map objects, 755 candidates). The comparison page says which examples were made before the content profiles and gives the measurements for Blankenese and Saarlouis. - Internal: after the adapter work the golden net still records four states (Brandenburg, Berlin, Saxony-Anhalt, Hesse), one of each kind of fetch; the layers that need no recording still check all eleven states that were program code before the rework (Saarland has tests of its own). The fixture store of the tests shrinks from 206 to 79 MB.
Fixed
- Map preview: when the area page is open in two tabs and both change a setting shortly after each other, the overtaken tab no longer shows "A newer preview was asked for meanwhile". It asks again and gets the image of its own settings.
- MCP:
list_layerslists the K5 template only for projects whose area touches Berlin, or when its file is in the folder. Before, every project listed it, and outside Berlin it never got ready. - Saarland: a district archive that cannot be read (renamed, or its server down for a moment) no longer stops the fetch when the tiles of the area are in other archives. When an archive is down, its directory from the last run is used; maps whose tiles are in the cache already are still made. A warning with the address of the archive says so in both cases. A cancel, an address freemapper does not ask and a write error on this computer still stop the fetch at once.
- A folder in the adapter folder whose name starts with a dot (
.git) no longer causes a warning on every command. - A pre-release version of the program (
x.y.z-rc.1) no longer aborts while loading the adapters; it counts as its release. - An estimate with nothing left to download says 0 MB, not
-0.0(estimate_downloadof the MCP server). - In the release archive the links of the READMEs to the examples, the ADRs and the design led nowhere. They now point to the repository.
[0.14.0] - 2026-11-12
Added
- Saarland is the twelfth state (ADR 0111). The orthophoto of 2025 comes from the free map service of the LVGL, the terrain and the surface model of the 2025 laser scan from the district archives of its open-data share (freemapper reads only the 1 km tiles of the area out of archives of up to 1.3 GB), buildings and land use from the service "ALKIS Vereinfacht" of the Geoportal Saarland. All of it is dl-de/by-2-0; maps carry
© GeoBasis DE/LVGL-SL (<year>), dl-de/by-2-0, Daten geändert. The example is Saarlouis old town and fortress. Saarland is the first state added as an adapter: a manifest folder and one raster backend. - Region adapters from a folder (ADR 0082, stage D; ADR 0107). A state or country with standard services (WFS or OGC API Features for ALKIS, WMS and WCS for the rasters) can be added without Rust: a folder with a
manifest.tomland a boundary file. freemapper reads such folders from your adapter folder (freemapper/adaptersin the configuration folder of the system, or the folderFREEMAPPER_ADAPTER_DIRnames). A folder with a defect is left out with a warning that names the file, the line and the key. An adapter from a folder cannot replace a built-in one. The reference indocs/adapters/describes the format; the manifests incrates/adapters/de/manifests/are examples. freemapper adapters listshows every adapter with where it comes from, its revision, the day it was last checked and the hosts it asks;--jsonprints the same as JSON. An adapter that lies on the ground of another one names it, because a map there gets the objects of both.--adapters-from-projectforinit,fetch,derive,exportandrunalso loads the adapters in the folderadaptersof the project folder. Awarning:line names each with the hosts it may ask. The area page and the MCP server never load them, so a project someone passed on cannot bring a data source along.freemapper adapters check <folder>checks the folder of an adapter before it is used or passed on (ADR 0112): whether it would load, and what its author should know (no day of the last check, an id that is built in, a boundary of an odd size). With--live --bbox minLon,minLat,maxLon,maxLatit also asks the services for that box and prints one line per capability, for examplerasters ok: orthophoto, terrain model, surface model. Exit code 0 means it passes, 1 it has findings, 2 the check could not run;--jsonprints the result as JSON.freemapper adapters allow-host <adapter> <host>allows a built-in state one more host, for the day an agency moves a service to a server the state's adapter does not name yet (ADR 0110). The message about the refused address names the host and the exact command. The host is kept inallowed-hosts.tomlin your configuration folder and nowhere else: a project folder, a variable or the MCP server cannot add one. It is checked like a host of a manifest (a DNS name, no address, no port), and freemapper still connects to servers on the internet only.adapters listshows the allowed hosts,adapters disallow-hosttakes one back, and once a release names the host itself freemapper says so and removes the entry.- A guide for contributors in
docs/adapters/(German and English): how to add a state or region, a tutorial that builds an adapter in six steps and ends with a check that passes against real services, and a reference of every key and finding code of the manifest. The guide also says when a manifest is not enough: height models that come as archives or tiles need a backend in Rust, and a folder cannot bring one. FREEMAPPER_ADAPTER_DIRtakes an absolute path. A relative one is ignored with a warning: it would name the folderadaptersof whatever project the command runs in.- OSM stairs (
highway=steps) appear as stairway candidates 532.6 to 532.9 by width, turned round forincline=down, without closed, covered, underground and indoor stairs (ADR 0109). Withbalancedthey go onto the map (groupstairs). An official stair with the same symbol wins. Before, stairs came only from the Berlin registers and the full ALKIS; Hamburg had none. - A preview of the map (ADR 0108). Every export that writes a map also writes
<name>-preview.webpnext to the.omap: the map objects as the map PDF draws them, no candidates, no sheet. The area page shows it in a new section "Map preview" below the run status, and when you change the content profile or a group there, it shows the effect without a run and without saving: within about a second, after a first computation that takes a few seconds. A line says whether the image is the map as generated last or the settings on the page; after a change of area, map kind or scale, or while a drawn area is not saved, it says that a run with "Replace the existing map" is needed. A later fetch does not make the image out of date. If the preview cannot be written, the run says so in a warning and still writes the map, the OCAD files and the PDFs; the list of files of a run names the preview. The.omap, the candidates map, the OCAD files and the PDFs do not change.
Changed
- Requests go to servers on the internet only (ADR 0106). freemapper no longer connects to an address of this computer or of the local network, whether a URL names it, a host name resolves to it or a server redirects to it. This holds for the downloads, the map tiles of the area page and the self-update. A proxy from the environment (
HTTPS_PROXY) still works, also a local one. A request that is not sent says why, in the language of the run. - The requests for a state stay on the hosts its manifest declares, redirects included (at most three): ALKIS, the rasters, the full ALKIS, the tree cadastres, and Berlin's registers and K5 map. A server that sends freemapper on to a host nobody declared gets no request there; the same holds for a fourth redirect in a row, a redirect to
httpand an address in an answer on such a host. The message starts with the refused address, names the state and says what to do. An adapter from a folder is held to its own hosts in the same way and adds none to a built-in state. Before the switch every state was fetched live at two places under this rule. - Internal: the eleven states are manifests plus code (ADR 0107). Each has a folder in
crates/adapters/de/manifests/with its manifest and its boundary file; Saxony-Anhalt needs no raster code any more. The golden net confirms the same requests and byte-identical files. - When a project file names an adapter this freemapper does not have, the message says where adapters come from.
- Internal: the states are region adapters now (ADR 0082, stages B and C; ADR 0102). A state supplies its boundary, its OSM extracts, its ALKIS service, its raster sources, its credit lines and its download estimate through one trait; the engine asks the registry and names no state itself. The enums
RegionandProviderare gone. The code of the eleven states lives in the new cratefreemapper-adapters-de, the generic service readers infreemapper-sources, the shared types infreemapper-adapter-api. Nothing changes for users: the golden net confirms the same requests and byte-identical files for all eleven states, andfreemapper.tomlis read and written as before. - The area page, its content security policy, the message for an area outside the supported states and the MCP instructions take the list of the states from the registry (ADR 0103). The aerial photo layers of the page come from the new endpoint
api/adapters; their names are the same. When the endpoint fails, the page still starts, shows OpenStreetMap only and says why.
Fixed
- When a project file names a provider or a state this freemapper does not know, the error says so and names the id. Before, it was a parser message about an unknown value.
- Tests:
save_creates_the_projectfailed now and then on Windows and Linux. The server answers a POST to a GET route with 405 before it reads the body, and closes the connection when the body arrives only afterwards. The test client kept using that connection. The check now sends the request raw, in one piece. The program itself does not change. - Tests: on Linux the update tests failed now and then with "Text file busy". The test process wrote the copy of the program they start itself, and a child process another test started at the same moment inherited the open file. Now
cpwrites the copy in a process of its own. The program itself does not change. - The area page shows the disk space notes in its own language: what is left out for lack of space, why a run does not start, and that the free space cannot be read. Before, they came in the program's language, so a German page often showed them in English. The same goes for the refusal of an invalid
pdf_sources.
[0.13.0] - 2026-11-12
Added
- The area page offers the content profile (ADR 0101): a collapsed section "What goes onto the map" in the "Create the map" block with the three profiles and one choice per group ("As in the profile", Map, Candidate, Off). The choice is saved with the area, in one write under the revision of
freemapper.toml; a change of the profile keeps the exceptions. freemapper find "<name>"lists the OpenStreetMap places for a name, up to five, those with an area first, each with its id, and ends with theinit --osmcommand for the first area. The line of a match without an area says that it cannot be a map area.--jsonprints the same fields as the MCP toolfind_place. When nothing is found, the command exits with 1; with--jsonit prints[]and exits with 0, asfind_placeanswers. Control characters and bidi overrides from OSM names do not reach the terminal. It runs the same search asfind_placeandinit --place, andinit --placestays as it is. Likeinit,findruns the daily update check.AGENTS.mdnow tells agents on the command line to show the person the matches first and then useinit --osm.
Changed
- Content profiles (ADR 0100): what goes straight onto the map and what stays a candidate is adjustable:
safe(the former state),balanced(the new default: streets with kerbs and green strips and stairs from ALKIS, the registers and the street survey, and walls, fences, hedges, water, trees, tree groups, paths, railways, banks, passages, monuments, towers and above-ground pipelines also from OSM, and the contours and the areas that shall not be entered along railway tracks, go onto the map) andfull(everything). Single groups can differ.init,exportandruntake--contentand--content-set <group>=map|candidates|off, MCPcontentandcontent_set; the choice is saved infreemapper.toml([content]). Contours now also stop at ways when they are on the map. - Paved areas (501.5) get their black border 501.1, as the norm (ISSprOM §4.5) has it (ADR 0099). No border is drawn where an edge already shows: along building outlines, water, existing 501.1 lines (the kerbs of the street survey) and the edge of the map. Paved OSM ways of the class
service(driveways, courtyard roads) come in as 501.6 to 501.9, 501.8 without a width. - OSM ways with a paved surface (asphalt, paving stones, concrete, sett …) now come into the map as lines 501.6 to 501.9 with the black border, like gravel paths (ADR 0098). Before, they were missing where the ALKIS and Berlin areas do not hold them, such as park paths in the Biesdorfer Park; where a paved area lies,
build/firm_paths.rscuts them. Streets and sidewalks keep no rule. - All core crates are pinned to freemapper-core v0.21.1. The buttons of the area page take their text colour from the suite token
--on-accent, and the main buttons their colours from the suite classbutton.primary. They look the same as before. - Point symbols (trees, lamps and others) keep the norm's gap to walls and fences: one that comes closer than 0.15 mm between the outer edges is moved away from the line to that distance, and also keeps the gap to other point symbols (the nearest free spot along the fence or further away). A moved point that runs into the same symbol is left out instead, and the other names it in
freemapper:generalized. On the tick side of a fence the ticks count. Moved points carryfreemapper:moved. - Contours and north lines now stop at ways (paved areas and paths) instead of covering them; leftover pieces under 1 mm on paper go. The norm allows it: north lines may be broken where they obscure small features such as path ends (ISSprOM 2019-2 §4.6). ADR 0097.
- The ticks of fences and banks now point the right way (
build/ticks.rs). A fence turns them to the olive green area (520) beside it; a closed fence, a rectangle say, has them inside, and a fence along a park area (401) on the park side. The ticks of earth banks (104, 104.1), impassable cliffs (201) and retaining walls (513.2) point down the slope, by the terrain model; when it is missing or the ground is flat, a bank takes the direction of the already decided bank beside it, so neighbouring banks no longer face each other. Before, the lines kept the direction of their source. - The documents of a project and the starter project, OCAD and PDF exports moved from
project.rsinto their own moduleproject/export.rs. The public paths and the output stay the same; the golden net (G3, G4 for all states, G5) confirms it byte for byte. - The area page uses the suite's shared page frame from freemapper-core v0.21.0 (ADR 0096, core ADR 0030), which freemapper-courseplan and freemapper-print take up too. It now has a dark mode that follows the system setting; the map itself stays light. Two open windows of the same project, or the page and a run in a terminal, can no longer overwrite each other's
freemapper.tomlunnoticed: when the file changed since the page read it, the page saves nothing, says so in a banner and reads the saved state again; only a second "Save" replaces it, and until then "Create map" does not save on its own. The page's texts now live in the program's catalog (page-*), word for word as before; the server picks the language as before (--lang, then the environment, then the browser, then English), from the browser now the German or English entry ofAccept-Languagewith the highest weight instead of only the browser's first language. The page writes the numbers in its texts for its language, so a German page writes "1.234". All core crates are pinned to v0.21.0. A script that callsapi/savefor an existing project sends therevisionfromapi/projectin the headerX-Freemapper-Revision. - The area selection page now tells when only the data provider changes with a new area (same UTM zone, other state): it showed the plain "saved" message although freemapper had dropped the fetched data.
set_map_areareports the reason (zone_changed,provider_changed), and the answer ofapi/savecarriesprovider_changed. - The download estimate as JSON (
estimate_json) moved from the selection page module into its own module of the command line crate. The MCP server and the browser run no longer depend on the web module for it. No change in output. - The project file and the map no longer depend on the maths library of the system:
freemapper.tomlstores the areas of the orthophoto, the terrain model and the surface model rounded to the millimetre and the area read from OSM to 0.00000001°, and the map's reference point is written to the.omaprounded to the millimetre. Before, these numbers differed in their last digit between Linux, macOS and Windows. Existing projects stay valid; a stored area still covers the map area when it is half a millimetre short. - The library asks for the date and for a file's age in one place (
freemapper::clock). For users one edge case in Rhineland-Palatinate changes: a kept tile list or 404 note whose file date lies in the future now counts as fresh, not as outdated. - Internal: a golden net guards the change from the region enums to region adapters (ADR 0082, stage A). Five layers record what v0.12.0 outputs: the facts per state, how 211 areas on borders are assigned, the requests of a fetch per state, the checksums of every file of a run per state, and the format of the project file. The recorded answers of the services live outside the repository as the prerelease
golden-adapters-1(206 MB);scripts/golden.sh testfetches them and runs all layers. A CI guard requires the trailerGolden-Bless:for every change to the golden files and refuses one in arefactor(commit. Details intests/golden/adapters/README.md.
Fixed
- When the newest release has no update manifest
freemapper-update.json,freemapper updateand the MCP toolscheck_updateandinstall_updatenow say that it cannot install itself and link its release page. Before, they printed a raw "download failed: … HTTP 404". With--version, the message says that the release may not exist. The daily check stays silent in this case, as before. - The daily check after
init,select,fetchandrunnow reports a release whose signature does not match. It prints one warning line on stderr after the command's output, at most once a day, and the exit code stays the same. Before, it said nothing. The MCP server gives the same news once, as a note for the person. - The server of the area page now refuses in the page's language, like the page's texts. That covers a save during a run, a folder held by another run, an area or map kind the server does not take, and the answers to run, status, cancel and open folder. Before, they came in the program's language, and the refusal during a run was always English.
[0.12.0] - 2026-11-11
Added
- Self-update (ADR 0094):
freemapper updateasks, then installs the newest release over the running program at the same path, so the registration with the AI assistant stays valid.--checkonly checks and exits with 10 when a newer version exists, otherwise with 0.--yesinstalls without asking,--version <x.y.z>picks a release, also an older one, and--rollbackgoes back to the replaced version, which stays asfreemapper.previous. freemapper installs only what is signed with the project's minisign key and matches its checksums, and it starts the new program once as a test before the swap. Afterinit,select,fetchandrunit checks at most once a day and reports a newer version in one line on stderr after the command's output; a very fast command can take up to 3 s longer for it. The update mode (notify,installoroff) lives insettings.tomlin the system's configuration folder, is set withfreemapper update --modeand can be overridden withFREEMAPPER_UPDATE.--offlineor a setCImeans no check. The request goes only to github.com, with the fixedUser-Agentand no personal data. The MCP server has the toolscheck_updateandinstall_update(only withconfirm: true) and adds a note for the person to its next tool result when it knows a newer version; it never installs on its own. The area page then shows a line with the command. A build from source namesgit pullandcargo build --release --lockedinstead. 0.12.0 is the first release that can update itself; 0.11.0 and older are replaced by hand once. The manual (chapter 3, "Updating"), the READMEs andAGENTS.mddescribe it. - Each release also carries the bare executables as
freemapper-<tag>-<platform>.gzand the update manifestfreemapper-update.jsonwith its minisign signaturefreemapper-update.json.minisig, whichfreemapper updateloads. The archives stay as they were.
Changed
AGENTS.md: agents that can run commands use the command line first. Onefreemapper runwaits until the map is written, while through MCP every status poll costs a turn. MCP stays the way for assistants without a shell. New: a command-line workflow, the pointer to--help, the note on too short timeouts, and thatinit --placetakes the best match without naming the others.- Map kind and reserved words come from the shared crate
freemapper-contract(ADR 0095, stage 4 of the contract test). The namesschoolyardandsprint, the scales of a kind, the tagfreemapper:sourcewith its reserved values, the part names and the file namefreemapper.tomlnow exist once, in freemapper-core v0.18.0, and freemapper-print and freemapper-courseplan can use the same definitions. Maps and project files stay the same byte for byte. All core crates are pinned to v0.18.0. Library:MapKindgainsALL,name,from_nameandcontract.
Fixed
- Area page: when the program language differs from the browser's language (for example
--lang enin a German browser), three texts stayed in the browser's language: the hint under "Draw it yourself", the names in the map's layer control and the title of the browser tab. All three now follow the program language.
[0.11.0] - 2026-11-11
Added
- Program language, third stage (ADR 0092): progress lines and warnings come in the program's language, on the command line, in the MCP server and in the log of the area page. A German warning starts with
Warnung:. An error inside a warning, such as a failed download, is translated as well. That includes the warnings about the height models of the single states (tile lists, dates). - Program language, help (ADR 0092, stage 4):
--help,freemapper help <command>and the messages about wrong calls (unknown option, missing argument, invalid value) come in the program's language, with German headings ("Aufruf:", "Optionen:"). The English help is unchanged. - Program language, MCP server (ADR 0092, stage 4): the server instructions, the descriptions of the tools and their parameters, the results in words and the summary at the end of a run come in the program's language; the area page shows the same summary. Names of tools, parameters and JSON fields stay English. The note after
initabout 1:5000 on sprint maps is translated too.freemapper mcp --lang enkeeps the server English. - Program language, remains (ADR 0092): the messages of the place search (such as "… is an area of 3 separate parts"), the messages about layers and previews and the warnings of the OCAD export now have German texts. The message table in the German manual gives the German wording with the English one in brackets.
AGENTS.md: instructions for AI agents on installing freemapper (choosing the archive, the checksum, the macOS quarantine flag) and using it through MCP or the command line, with the tools, the workflow, the result files and what the agent should tell the person. It is now part of every release archive too. The manual (chapters 3 and 4) and the READMEs tell how to let an assistant that can run commands set freemapper up with it.
Changed
- Library: the progress callback receives a
Note(a message id and its values) instead of a finished line (&str);to_string()gives the English line as before,Note::textthe line in a language, andNote::is_warningtells whether it is a warning.HeightModel::warningsandOcadOutcome::warningshold such values instead of strings, and so doAreaError::PlaceandProjectError::Layer;MapKind::scale_notereturns one. The texts live incrates/freemapper/i18n/.
[0.10.0] - 2026-11-11
Added
- Area selection: the page now creates the whole map (ADR 0090, stage 5; ADR 0009, amendment). Below the settings sits the block "Create the map" with the options OCAD starter project, printable PDF, training PDF, scale bar, source lines (automatic, full, freemapper only, with a hint about the ODbL and dl-de/by-2-0 licences), "Cache only" and, only when a map exists, "Replace the existing map" (never ticked in advance, with a confirmation dialog). The page saves first when needed, shows "Step i of n", the log excerpt and the warnings, can be cancelled, lists the files with their size at the end and opens the project folder in the file manager. Reloading during a run picks the display up again. While a run goes on, the area, the settings and "Save" are locked. The defaults come from
freemapper select --ocad --pdf --pdf-candidates --pdf-scale-bar --pdf-sources --offline. All texts exist in German and English by the browser language; alangfield from the server would win, but it is still empty. The scales of a map kind now come from the server (allowed_scales) and no longer from a copy in the page. New manual section: "Create the map in the browser". - Area selection: the local server has routes for the run (ADR 0090, stage 4). Scripts can use them now; the page follows in stage 5.
POST api/runstarts the run with the seven options (force,offline,ocad,pdf,pdf_candidates,pdf_scale_bar,pdf_sources) and answers 202, or 409 when a run or another process already holds the folder;GET api/status?since=Nreports the step, new lines, warnings and files,POST api/cancelstops the run,POST api/open-folderopens the project folder in the file manager. Kind, scale and title stay as saved.freemapper selectand the MCP toolopen_area_selectortake--offline --ocad --pdf --pdf-candidates --pdf-scale-bar --pdf-sourcesas the page's defaults. - One project folder, one run (ADR 0090, stage 3; closes the gap named in ADR 0009).
run,fetch,derive,export, the MCP pipeline and saving the area on the page create the file.freemapper-run.lockin the folder. A second process in the same folder stops with a clear message, for example "another freemapper run is using this folder (since 14:02, started by the terminal)". The holder reports in every ten seconds. After 60 seconds without a report the lock counts as abandoned, after a crash say, and is replaced; Ctrl+C clears it at once. The file holds only the process id, the start time and who started it. The engine can also stop between steps, tiles and requests now (ProjectError::Cancelled,run_project_cancellable). A cancelled run leaves only whole files, and the next run continues from there. The cancel button on the page follows in stage 4. - Railway tracks from OSM (ADR 0093). On sprint maps,
railway=rail,light_railandnarrow_gaugeare now map objects 509.1 (railway, at least 4 mm long), bridges and sidings included. Before, freemapper read no track at all: the map of the Biesdorfer Park had no S-Bahn. Tunnels, passages under buildings, disused, razed and planned tracks and crossovers are left out. Subway tracks that are not in a tunnel are 509.1 candidates, on an elevated viaduct map objects. Tram tracks are 509.2 candidates, because the norm draws them only when they help navigation. A forest is cut at a track. The railway land of ALKIS stays a 520 candidate. Schoolyard maps have no tracks. Three examples change: Viktoriapark (3 tracks), Herrenhausen (2) and Cochem (4); Herrenhausen and Cochem also get the firm gravel paths of the previous fix. The other eight have no track in their area; Quedlinburg could not be rebuilt (the Saxony-Anhalt orthophoto service answered with an error). Existing maps get the tracks withrun --force. - Program language, first stage (ADR 0092):
--lang deor--lang enchooses the language of the program texts; without itFREEMAPPER_LANGcounts, then the system language (LC_ALL,LC_MESSAGES,LANG), then English. German so far covers the lines the program prints itself at the end of a step ("… geschrieben", "… behalten", the hints afterrun,exportandselect). Progress lines, warnings, error messages and--helpstay English for now. - Program language, second stage (ADR 0092): error messages come in the program's language, in the terminal, from the MCP server and on the area page. With
--lang dean error reads, for example, "Fehler: Es sind noch keine Kacheln geladen; rufen Sie zuerstfreemapper fetchauf". What a server, the operating system or a parser says about an error stays as it is, and so do a few details freemapper still keeps as free text (for example of the place search). Progress lines, warnings and--helpfollow in the next stages. - Area selection: the page takes the program's language (ADR 0092) when
--lang,FREEMAPPER_LANGor the system (LC_ALL,LC_MESSAGES,LANG) names one.freemapper select --lang enshows the page in English in a German browser too. When nothing names a language, the page follows the browser as before.
Changed
- An error in the terminal is now one line,
error: …orFehler: …, with the cause after a colon. Before, it readError: …with the cause below under "Caused by:". The exit code stays 1. exportandrunbuild the map and the candidates template once per command instead of once per output (ADR 0091). With--ocad --pdf --pdf-candidatesthat used to be four passes over all stored layers; now it is one forexportand two forrun. The written files are the same byte for byte.- Area selection: the local server now runs on the shared library
freemapper-webfrom freemapper-core v0.11.0 (ADR 0090, stage 1; ADR 0009 and 0067, updates). The page looks the same. The checks are stricter: a POST needs the page'sOriginandContent-Type: application/json, or the server answers 403. A script that calls the routes must send both. Requests withSec-Fetch-Site: cross-siteare refused, every response carriesX-Content-Type-Options: nosniff, and a request body may be at most 1 MiB (an outline with 5000 points takes about 150 KB). All core crates are now pinned to the same tag v0.11.0. - The example preview images are now WebP instead of JPEG (
preview.webp,preview-map.webp). They are rendered straight from the PDFs and are smaller than the JPEGs. The README title image (Viktoriapark) is sharper at 1600 pixels wide. - Tests: every test run now checks that the map and
freemapper.tomlkeep the suite contract (ADR 0089,freemapper-contractfrom freemapper-core v0.8.0). A schoolyard map at 1:1000 and a sprint map at 1:4000 are tested against twelve rules and against the vocabulary freemapper-print and freemapper-courseplan rely on: part names, the tags of the peripheral information and of the walkable area, the contract keys of the project file. The program itself does not change.
Fixed
- Firm gravel paths (501.6 to 501.9) stay whole where only an ALKIS
Wegparcel lies (ADR 0079, addendum). That parcel is only a 501.5 candidate, not a map object, yet it cut the OSM line away. Now only 501.5 map objects (roads, squares, the survey) cut. The 0.25 mm tolerance and the 1 mm minimum piece stay. Existing maps get this withrun --force.
[0.9.2] - 2026-11-10
Fixed
- Area selection: in some browsers the base map showed "access blocked" (403) from OpenStreetMap (issue 11). The page sends no
Referer, and OpenStreetMap's tile policy asks for a validRefereror an identifiableUser-Agent. Now the local server fetches the tiles itself (/tiles/osm/{z}/{x}/{y}.png) withUser-Agent: freemapper/<version> (+https://github.com/HenryJobst/freemapper)and nothing else. It checks zoom (0 to 19), column and row, follows no redirect, makes at most two requests at once and keeps the tiles in memory for as long as OpenStreetMap allows (at most 1024 tiles, 32 MB). The page no longer loads anything directly fromtile.openstreetmap.org. The state aerial images stay as they are (ADR 0088). - Wide stairs such as stadium stands (ADR 0048, amendment): the parallel 532.9 lines now stand one symbol width plus 0.15 mm apart, the norm's minimum gap between two lines of one colour. Before, the ticks of neighbouring lines met and the stand looked like a ladder. The width stays covered to its edge. The Viktoriapark goes from 94 to 86 lines 532.9. Existing maps get this with
run --force. - Berlin: fountains, street pumps and drinking fountains no longer appear twice (ADR 0087). Measured in the Viktoriapark: a surveyed pump and the OSM well at the same spot lie 0.05 to 0.5 m apart, the next point of another source 9.8 m. The limit is 0.75 mm on paper (3 m at 1:4000), never under 3 m on the ground. The order is register, ALKIS, street survey, OSM. The street survey now beats OSM wells (
man_made=water_well,amenity=fountain) and OSM drinking water (amenity=drinking_water), and the Zierbrunnen register beats an OSM well as well. The winner names the dropped point infreemapper:also. A register, ALKIS or street survey fountain inside an OSM fountain basin (amenity=fountainas an area) or within 1 m of it is dropped, and the basin names it. Two fountains under the limit without a higher source both stay. In the Viktoriapark 9 candidates 311 remain (3 register, 4 survey, 2 OSM) and 0 candidates 313; only the note changes fromfreemapper:generalizedtofreemapper:also. Existing maps get this withrun --force.
[0.9.1] - 2026-11-10
Changed
- Coordinate systems and tiles now come from
freemapper-georef(freemapper-core v0.5.1).crsandtilesin freemapper re-export the types under the old paths, and nothing changes in behaviour. The projection uses the shared transverse Mercator code.freemapper-fsis now on v0.5.1 too.
Added
- Power lines, pipelines, towers and masts from OSM, sprint maps, candidates only. Overhead
power=line|minor_lineandpower=cablewithlocation=overheadare 510, lines of 110 kV and more 511. Pipelines withlocation=overground|surface|overheadare 528 (low) or 529 (high, uncrossable: overhead orheightof 1.5 m or more).power=tower,man_made=communications_tower|chimney|water_tower|lighthouse, towers and masts are 524 or 525 points by height. Underground lines and pipelines, poles, masts under 10 m and storage tanks are left out. The lines keep the norm's minimum length (3.75, 2.2 and 3 mm on paper). Each tower point carriesfreemapper:control=and is thinned like the street furniture. ALKIS: the layers we fetch hold no towers or lines, so there is no ALKIS rule (follow-up in the ADR). No example area has a line or a pipeline. Wismar, Monschau and Quedlinburg get one tower each (candidates 1756 to 1757, 850 to 851, 1110 to 1111) (ADR 0083).
Fixed
- The scale bar carries
freemapper:source=sheetagain, like every sheet object (since 0.9.0 it saidscale-bar). freemapper-print and freemapper-courseplan recognise the sheet only by that value; otherwise they printed the bar as map content and shifted the page centre and the extent. Every bar object also carriesfreemapper:sheet=scale-bar, which the PDF uses to leave the bar out without--pdf-scale-bar. The OOM and OCAD maps keep the bar. Maps already written with the old value stay readable (ADR 0080, amendment). - Duplicate areas by rank (ADR 0078): an area that was itself dropped for a higher one no longer drops another. In a chain A > B > C, C used to go because of the already removed B, and the
freemapper:alsonote landed on B. Now the area that stays on the map carries it, and C stays when A alone does not reach the share. Existing maps get this withrun --force. - The map area is checked on every path, not only on the selection page (ADR 0084).
init --geojson, MCPcreate_projectwithgeojson,init_projectand the area infreemapper.tomlnow refuse a polygon without corners, with crossing edges or with more than 5000 corners, with "not a usable map area". An empty polygon ("coordinates": []) used to crash the server. init, MCPcreate_projectand the area selection page take only scales that freemapper-print prints (ADR 0085): schoolyard 1:1000, sprint 1:4000 or 1:5000. Before,--kind schoolyard --scale 2000ran through and freemapper-print then stopped withMapScaleNotAllowed. The error lists the allowed scales; for sprint 1:3000 it advises drawing at 1:4000, because freemapper-print enlarges to 1:3000 when printing. 1:5000 is not in the norm;initsays so, and the symbols stay at 100 %. A project with another scale infreemapper.tomlstill loads and prints a warning. The selection page offers the allowed scales as a list.initalways writes atitleintofreemapper.toml, also without--title: the folder name with capitalised words, as the PDF already built it (Clara-Zetkin-Schule). freemapper-print and freemapper-courseplan now read the same title (ADR 0086). Older projects without atitlestay as they are.
[0.9.0] - 2026-11-10
Changed
- All eleven examples are rebuilt with the current code. The PDF of each example is the training map (
<name>-candidates.pdf), andpreview.jpgis rendered from it, because the map alone is very plain. Map objects, candidates and symbols in the examples overview are counted again, and the gravel paths 501.6 to 501.9 are map objects in every example. Only Cochem and Blankenese also have the map without candidates (<name>.pdf,preview-map.jpg). The Viktoriapark attribution names the public lighting register again. - The default of
--pdfchanges. It now writes<name>.pdfwith exactly the objects of the OOM map, without candidates and without a scale bar. The training map with every candidate is<name>-candidates.pdf, written with--pdf-candidates; both switches together write both files. The scale bar on the PDFs only comes with--pdf-scale-bar(German orienteering maps usually have none); the scale number stays in the title block. The old behaviour is--pdf-candidates --pdf-scale-bar. This also holds forrunand the MCP parameterspdf,pdf_candidates,pdf_scale_bar. The OOM and OCAD maps keep the bar. Amends ADR 0002 (ADR 0080). - The Viktoriapark training map (
berlin-viktoriapark-candidates.pdf,preview.jpg) is regenerated with the shortened source block (four lines instead of nine). The other examples have at most five lines and stay unchanged; the map content is identical.
Added
- The source block on the PDF map is shortened when needed.
--pdf-sources auto(the default, also MCPpdf_sources) prints up to five lines unchanged; a longer block gets thedl-de/zero-2-0sources merged for each provider, long names shortened, lines joined with " · " and, last, a pointer toATTRIBUTION.txt. OpenStreetMap, every other licence and the freemapper line stay word for word.fullnever shortens;credit-onlyprints only the freemapper line and says in the output that ODbL anddl-de/by-2-0require naming the sources when you pass the map on. The freemapper line cannot be switched off in any mode.ATTRIBUTION.txtand the OOM and OCAD maps always list every source. The Viktoriapark block shrinks from nine lines to four (ADR 0081). - A comparison of map and training map:
examples/compare.en.mdshows Cochem and Blankenese side by side, with the most frequent candidate symbols and the measurement on all eleven examples that decided the choice. The examples overview and the README link to it. - Berlin control sites on sprint maps. The street survey (bollards, masts, flag poles, benches) and the lighting cadastre (lamps in operation) now give 531 candidates with
freemapper:control(bollard,mast,flagpole,bench,street_lamp, plusadvertising_columnfor the survey's advertising columns), like the OSM ones. Thinning is shared: a site of one kind within 25 m of another is left out, whichever source it comes from, after duplicates and sites in buildings are gone. A surveyed bollard replaces an OSM one within 2 m. Hydrants and play equipment stay schoolyard-only. A Berlin sprint project fetches seven more WFS requests (33 instead of 26); the disk estimate for the Berlin layers goes from 10.5 to 12 MB per km². Existing maps get this withrun --force(ADR 0077). - Drinking fountains are 313 on sprint maps, from the Berlin register and survey and from OSM
amenity=drinking_water.
Fixed
- Firm gravel paths are map objects again.
surface=compacted|fine_gravelandtracktype=grade2(paved by ISSprOM 501, "hard gravel") are drawn as a line 501.6 to 501.9 bywidthon the map, no longer only as a candidate; the park maps have their paths back. Where ALKIS or the street survey already draw paving (501.5), the part of the line within it goes (widened by 0.25 mm on paper), and remnants under 1 mm on paper go. Ways withoutsurface, unknown surfaces andtracktype=grade3tograde5stay candidates, and tree groups are still cut at the lines. Viktoriapark: 26 map objects 501.6 instead of 49 candidates, Sanssouci: 192 instead of 218. Amends ADR 0073 (ADR 0079). - Duplicate areas from several sources are kept once. An OSM passage (
tunnel=building_passage,covered) over a Berlin building part, an ALKIS passage or a canopy, an OSM private strip inside an ALKIS area that shall not be entered, and an OSM bridge over a Berlin bridge deck are dropped when half (520: 80 %) of their area lies under the higher-ranked area, widened by 0.25 mm on paper. The kept object names the other infreemapper:also. An OSM memorial within 5 m of a cadastre monument and OSM kerbs and embankments along cadastre ones go too. Viktoriapark: 520 from 117 to 94, 522 from 211 to 192. Lübeck: 520 from 1 125 to 1 112, 522 from 280 to 221 (ADR 0078). - Control sites in buildings no longer thin their neighbours. The 25 m rule now runs after the sites in buildings are dropped.
[0.8.0] - 2026-11-09
Added
- Only reachable passages are drawn. A 522 passage (from OSM, ALKIS or the Berlin building parts) that touches only buildings, 520 areas or water, or joins two walled-in courtyards with no way out, gets
freemapper:hidden=unreachable: it stays among the candidates and is left out of the training map. A passage counts as reachable when it (or a chain of passages, such as the Lübecker Höfe und Gänge) meets walkable ground that connects to the street network, with 0.5 mm (2 m) of tolerance. Lübeck: 16 of 280 passages hidden, Viktoriapark: 52 of 211 (ADR 0076). - Memorials from OSM. Memorials, wayside crosses and boundary stones (
historic=memorial|monument|wayside_cross|boundary_stone) are 526 candidates on sprint maps. Stolpersteine, plaques and memorials that are a bench, a tree or a mural stay out, because 526 is for what is obvious (ADR 0075). - Control sites for course setters. Bollards, street lamps, waste baskets, bicycle racks and benches from OSM are 531 candidates on sprint maps with the tag
freemapper:control(the kind of object), never map objects. An object with one of its own kind within 25 m (a row of bollards, a pair of benches, a series of lamps) is left out, and a control site gives way to every other point symbol so that it displaces no trees or fountains. The tag is where a planning tool finds the sites (ADR 0074). - Access restrictions from OSM. Private and closed ways (
access=private|no,foot=private|no) become 520 candidates on sprint maps, a strip of 2 m (roads 3 m) around the way, and the path line is gone.foot=yes|permissive|designatedleaves the way as it was. Areas withaccess=private|no(land use, garden, pitch, car park, school grounds) are 520 in their own shape (ADR 0073). - Building passages from OSM. Ways with
tunnel=building_passageand covered ways (covered=yes, arcades) are now 522 candidates on sprint maps, drawn as a strip of 3 m (or thewidthtag) along the way, with the building left whole. Before, a paved passage was no candidate at all and an unpaved one only a 505.1 line. The rules get a new field,corridor_m, for this (ADR 0072). Existing maps get them withrun --force. - OSM multipolygon relations are read. Parks, water, woods and buildings that exist only as relations, with the tags on the relation and untagged ways as rings, now reach the rules. freemapper chains the ways into closed rings in either direction and keeps holes, so a courtyard stays out of its building and a pond out of its park. An outer way that repeats the relation's tags is drawn once. In the Viktoriapark example the stored OSM features grow from 752 to 755 and the candidates from 2,093 to 2,094: a pond (301) is new, and two lawns with holes lie under the ALKIS park. Park Sanssouci gains one lawn with 13 holes (1,047 to 1,048 features) once its example is rebuilt. Existing maps get relations with
run --force(ADR 0070). - Parks are yellow. Green spaces, parks, settlement green and grassland from ALKIS become open land (401) on the map, woods and copses forest (405), heath 403. Cemeteries, other farmland, moor and swamp are candidates, and so are parks and lawns from OSM where no ALKIS park lies (ADR 0069).
- The walkable area. On the sprint map one area in the lower brown of 501.5 lies under everything over the whole sheet, symbol 990 in its own map part
base, tagfreemapper:source=base. It fills every gap that nothing else shows; a sprint map without it is incomplete. Its colour comes after all others, in OOM, OCAD (colour 32, symbol 990.000) and the PDF. Print sprint maps in colour, because in greyscale the brown comes close to paper white (ADR 0069).
Fixed
- Points inside buildings are dropped. A candidate point on sprint maps (memorial, lamp, waste basket, fountain, spring) whose centre lies in a building footprint can be neither seen nor used and is removed; the dark dots on the church in the Lübeck example were memorials. Trees stay. Lübeck: 526 from 10 to 4, 531 from 195 to 180; Viktoriapark: 531 from 121 to 119 (ADR 0076).
- The street edge no longer makes a hook around each street tree. The survey kerb lines (501.1 candidates) ran around every tree slot cut across the parking strip, so the training map showed a hook at each tree. freemapper now replaces a kerb detour with its chord when it encloses less than 1.5 mm² on paper (24 m² at 1:4000), and drops a closed kerb ring of that size. The rule judges a detour by how far it reaches out of its chord (at least 0.3 of it, at most 10 m wide), so the wider trapezoid slots go as well, and closed kerb rings around lone pits are dropped. A detour must also lie on a straight run, so a spike at a tree and a diagonal across a step of the kerb no longer appear. Curves, larger bays and the map itself stay as they are. In the Viktoriapark the survey kerbs lose 735 of 6,522 vertices and 5 of 81 lines. Existing projects get the cleaner lines with
run --force(ADR 0071).
Changed
- The Viktoriapark and Lübeck examples are rebuilt with the new OSM rules. Viktoriapark: map objects 789 to 740 (505.1: 58 to 9, because compacted gravel becomes a candidate), candidates 2,089 to 2,327 (531: 5 to 121, of which 116 control sites; 520: 73 to 117; 522: 179 to 211; 501.6: 45 new, 501.9: 4 new; 526: 1 to 3). Lübeck: map objects 2,294 to 2,281, candidates 1,528 to 1,859 (522: 185 to 280; 531: 0 to 195; 520: 1,090 to 1,125; 526: 0 to 10; 501.6: 13 new; 505.1: 35 to 16). The stored OSM features grow from 755 to 1,371 (Viktoriapark) and from 234 to 927 (Lübeck).
- Compacted and fine gravel (
surface=compacted|fine_gravel) is firm under ISSprOM 501, so it is no longer an unpaved path on the map but a 501.6 to 501.9 candidate bywidth. Unpaved ways from 3 m wide are 505.2. A track withoutsurfacefollowstracktype(ADR 0073). - Tree group areas (402, 405) no longer cover paths. freemapper also cuts them at paved candidates and at paths (505, 506, 507). The dotted distinct vegetation boundary (416) is left only on the schoolyard map; on the sprint map the white forest shows on yellow or brown. In the Viktoriapark more trees therefore stay points (1,128 instead of 835), and the 49 boundary lines are gone (ADR 0069).
- All eleven example projects are rebuilt, with yellow parks and the walkable area.
- Dense tree groups now become an area the map shows, also in parks. Three or more trees standing closer than 2.5 mm on paper (10 m at 1:4000), or whose crowns almost touch, become forest (405) when their crowns cover at least half of the area, else open land with scattered trees (402). On the white base the forest gets a dotted distinct vegetation boundary (416) so that it shows. On paving it stays 501.3, from 9 trees. Rows of trees along streets and avenues stay points. In Park Sanssouci the tree points drop from 1,654 to 782 (48 areas 402), in Viktoriapark from 1,660 to 942 (43 forests, 9 areas 402; ADR 0066, amendment).
- The training map (PDF) draws the point patterns of areas, such as the white dots of 402. Until now 402 looked like 401 there.
- Overlapping walls, fences and hedges. Where two such lines run parallel and closer than their symbols may come on paper, the weaker one loses that stretch: the worse source, and for one source the weaker symbol (wall before fence before hedge before retaining wall). Wall stretches within 0.5 m of a building outline are dropped, and so are trees within 1 m of one of these lines. In Park Sanssouci the parallel line pairs closer than 1 m drop from 162 to 4 (ADR 0068).
- All eleven example projects are rebuilt with these rules; their map objects stay the same.
- freemapper now writes, copies and removes files in the project folder with the shared crate
freemapper-fsfrom freemapper-core 0.2.0 and no longer keeps its own copy. Nothing changes for users, and the messages keep their wording (ADR 0067).
[0.7.0] - 2026-11-09
Added
- Canopies and passages in more states. In every state except Saxony and Saxony-Anhalt, ALKIS canopies and carports become map objects (522) on both map kinds, cut at the buildings as in Berlin. Building passages and arcades become 522 candidates, and the building stays whole. freemapper reads them from the buildings it already fetches, so there is no extra download. The data currency is the date of the ALKIS object. An existing map gets the canopies only with
run --force(ADR 0061). - Brandenburg: the full ALKIS from the LGB's NAS service. Walls and wall edges, fences, hedges, monuments, fountains, ditches and brooks become candidates, on sprint maps also embankment tops and bridges. The code in the cadastre picks the symbol, and
freemapper:alkisgives its name, e.g.Mauerkante, rechts. The data currency is the date the object version entered the cadastre. Where the two edges of a wall face each other and lie closer than 0.55 mm on paper (2.2 m at 1:4000), freemapper draws one 515 line in the middle withfreemapper:alkis=Mauer (Mauerkanten gepaart), andfreemapper:alsonames the other edge. Park Sanssouci has 264 wall lines instead of 271. The layers are stored indata/alkis-nas/, about 1 MB per km² (ADRs 0062, 0063). - Potsdam: the trees of the city map (Bäume der Stadtkarte) become 418 candidates, each with its own survey date. The data has no crown size, and stumps are left out. OSM trees within 2 m of a Potsdam tree are dropped. freemapper stops an answer larger than 256 MB while it reads it. The new attribution line
Landeshauptstadt Potsdam / Bäume der Stadtkarte, dl-de/zero-2-0appears when Potsdam trees are among the candidates (ADR 0065). - Point symbol generalization. Point symbols keep the gap of 0.15 mm that ISSprOM sets for lines. Three or more trees that crowd each other become an area when at least half of their crowns lie on paving or on open land (401 to 404): paved area with scattered trees (501.3) on paving, and on open land forest (405) when the crowns cover at least half of the group, otherwise open land with scattered trees (402). Elsewhere the trees stay points and are thinned, because a white forest on the white base would hide them. Rows of trees stay single tree symbols. The area carries
freemapper:source=generalizationand lists its trees infreemapper:source_id(ADR 0066).
Changed
- Points too close together are thinned. Where two point symbols would come closer on paper than the norm allows, freemapper keeps the larger one, then the one from the better source, then the one with the larger crown. The kept point names the others in
freemapper:generalized. This changes the candidates and the training map in every state, Berlin included. The map objects stay the same (ADR 0066). - Trees and other points in out-of-bounds candidates (520) stay in the candidates with
freemapper:hidden=520, but the training map leaves them out. On schoolyard maps the PDF therefore shows no point off the school grounds (ADR 0066). - Duplicates: register before ALKIS before the street survey before OSM now applies in every state, and also to brooks and ditches (305, 306). An OSM line with at least 80 % of its length within 1.5 m of a full ALKIS line with the same symbol is dropped and named in
freemapper:also(ADR 0063). - The download estimate and the disk check count the full ALKIS and the city tree cadastres as an optional part (2 and 1 MB per km²). Without room, freemapper leaves them out and keeps the stored ones.
runnow reports a kept map without the ALKIS canopies in every state with canopies. The message now readsThe map lacks the ALKIS canopies and carports (522) ….- freemapper joins the pieces of a line with a side (earth bank 104, cliff 201, retaining wall 513.2, the right and left edges of the full ALKIS) only in their own direction and never across two sides, so the side of the ticks stays right. In the Viktoriapark two more earth bank lines stay apart (ADR 0063).
Security
- Cleaning up old
.partfiles in thetemplatesfolder no longer follows a link out of the project and deletes nothing outside it. A.partentry that is itself a link is skipped (ADR 0060).
[0.6.2] - 2026-11-09
Security
- A project folder from someone else could make freemapper write outside it through links. If
ATTRIBUTION.txtwas a link, everyrunwith an existing map overwrote the file it pointed to. With--force, the backups.omap.bakand.ocd.bakcopied the project's map into the link's target, for example~/.zshrc. The image copies intoocad/followed links too, and so did every file written into adata,templatesorocadfolder that was a link. freemapper now writes each file under a new name and renames it into place, which replaces a link instead of writing through it. Adata,templatesorocadfolder that leads out of the project stops the command (…: a link leads out of the project folder, so freemapper writes nothing there). Partial files get a fresh name each time and never take over an existing file or link (ADR 0060). - Copies inside a project could read through links. A template image that was a link to a file elsewhere, such as
~/.ssh/id_rsa, ended up copied intoocad/. freemapper now copies only files of the project itself. The OCAD export leaves such a template out and warns (warning: …: a link or outside the project folder, so freemapper does not copy it; …). freemapper checks every single write, not just once per run (ADR 0060). - A remaining race: someone who can write to a project folder while freemapper runs on it, and who swaps a folder for a link at the right moment, can still redirect a write with a fixed name. Do not run freemapper on project folders that others can write to at the same time (ADR 0060).
Changed
- Library API (
freemappercrate): the writers of templates and stored data take the project folder as an extrarootargument, placed before the output path. This coverswrite_gray_png,write_ndsm_png,build_orthophoto,build_orthophoto_from_image,wms::fetch_orthophoto,wms::fetch_orthophoto_from,wms::fetch_k5,geosn::fetch_orthophotoand thefetch_modelfunctions of the height model sources.OcadOutcomehas the new fieldwarnings. The command line and MCP are unchanged.
Fixed
- Windows: the free disk space check before
fetchnow tells volumes apart by their serial number instead of the drive letter. Until now freemapper skipped the check with a warning (warning: cannot read the free disk space of …) when Windows could not resolve the path, as on some RAM or virtual drives. A volume mounted into a folder of another drive counted as that other drive, so its own space went unchecked.
[0.6.1] - 2026-11-09
Security
- A crafted
freemapper.tomlcould make freemapper delete files outside the project. Aberlin_layersentry named like../../../xmadefetchdelete the filex.geojsonnext to the project folder. freemapper now builds the paths of the Berlin layers only from its own layer list. When it loads a project, it drops entries with an unknown name or with/,\,.., a drive letter or control characters, and warns (warning: freemapper.toml: ignored the Berlin layer entry …). If the folderdata/berlinleads out of the project through a link, freemapper writes and deletes nothing there (ADR 0059).
[0.6.0] - 2026-11-09
Added
- Berlin: the street survey (Straßenbefahrung) of Geoportal Berlin, recorded from 2014 to 2016. On sprint maps, curbs (501.1), advertising columns (531), green strips (401) and surveyed sidewalks, squares and park paths outside the ALKIS street areas (501.5) become candidates. On both map kinds, stairs, walls, railings, traffic barriers and crash barriers (518), bus shelters and fountains are added. Each surveyed candidate carries its survey date; when that is unreadable, it says 2014-01-01 with
freemapper:currency_guessed=yes. - Berlin: street furniture on schoolyard maps. Benches, hydrants, bollards, masts, flag poles and play equipment come from the street survey, lamps (only those in operation) from the lighting cadastre, ornamental and drinking fountains from their registers. Sprint maps get none of it.
- Berlin: a register point replaces OSM and surveyed points of the same kind. A lamp replaces OSM lamps up to 5 m and surveyed masts up to 2 m away, a fountain other fountains up to 3 m away. On schoolyard maps a surveyed hydrant, bench, mast or play item replaces the OSM one up to 2 m away. A fountain of a register or of the street survey inside drawn water is dropped.
- Berlin: buildings carry their footprint date (Grundrissaktualität) from the building heights of 2022 in the Umweltatlas as data currency. A building without a match keeps no date.
- New attribution lines for the street survey, the registers and the building heights, each only when they gave objects. The register line names only the registers whose points are in the map or the candidates.
Changed
- Berlin: the paved areas (501.5) no longer include the surveyed green strips; freemapper cuts them out. Tree pits stay inside. A green strip is a 401 candidate only where freemapper cut it out or where it lies off the paved areas. A cut area names the strips in
freemapper:cut,freemapper:cut_idsandfreemapper:cut_currency. An existing map changes only withrun --force. - Berlin: short line pieces from ALKIS and the street survey that meet end to end are joined into one line. It names the other pieces in
freemapper:alsoand carries the oldest survey date. Lines under 1 mm on paper are dropped after that, now for ALKIS too. - Berlin: when an object comes from several sources, the register wins over ALKIS, ALKIS over the street survey, and the survey over OSM. A surveyed bus shelter at least half under an ALKIS canopy is dropped. The object that stays names the others in
freemapper:also, surveyed ones asgeoportal-berlin/<layer>/<gis_id>. Each Berlin candidate carries the tagberlin:layer. - The download estimate counts 10.5 instead of 4 MB per km² for the Berlin layers (measured at Viktoriapark: 9.8).
[0.5.0] - 2026-11-09
Added
- Disk space: before each download freemapper checks the free space of the cache and the project folder, each drive on its own, and keeps 1 GB free on every drive. If not everything fits, it leaves out the surface model, the update of an older OSM extract and, in Berlin, the structures, trees and K5 and warns with the space needed and the space free. Without room for the map data, the terrain model or the orthophoto it stops before it downloads anything. When the disk fills up during a write, freemapper says so plainly, deletes the half-written file and does not retry. The download estimate (MCP tool
estimate_download, area selection page) shows the free space and marks what does not fit. - Berlin: more open data from Geoportal Berlin. ALKIS canopies and carports become map objects (522) on both map kinds. freemapper cuts them at buildings and leaves them out when they lie almost wholly inside a building. Candidates now include stairs (532.6 to 532.9) with the walking direction from the terrain model. A stair that does not rise there leads up to an adjoining building or monument, or runs across its short side. Stairs wider than three times 532.9 become parallel lines. The
Freitreppelines are step edges, and each flight of parallel edges becomes one stair across them. Further candidates are walls, retaining walls, fences, hedges, building passages and monuments, and on sprint maps also bridges and embankment tops. Street and park trees from the tree cadastre become 417 or 418 by crown size, and OSM trees within 2 m of them are dropped. So are OSM fences, walls and hedges with 80 % of their length within 1.5 m of the same ALKIS line. The Berlin map 1:5000 (K5) comes as the templatetemplates/k5.png. An existing map gets the canopies only withrun --force, andrunsays so. init --osmtakes one part of an OSM area of several separate parts with--part <n>(1 is the largest;partover MCP). Without--partthe message lists the parts with their sizes. When Nominatim does not find a way, such as an untagged outer way, the message suggests the relation or--geojson.
Changed
- Allotment gardens (ALKIS land use "Sport-, Freizeit- und Erholungsfläche" with
bez"Kleingarten") are out-of-bounds candidates (520) in every state. Parks, sports grounds and playgrounds stay open.
Fixed
- Contour candidates name the terrain model of their state in
freemapper:source, e.g.laiv-mv-dgm1orhvbg-dgm1. Before, every state saidlgb-dgm1.
[0.4.0] - 2026-11-08
Added
- Lower Saxony (LGLN): orthophoto from the WMS, terrain and surface models (DGM1/DOM1) from the WCS in 2 km pieces, flight date and data currency from the STAC searches, buildings and land use from ALKIS. The nDSM is DOM1 − DGM1; if the DOM1 is more than two years older than the orthophoto, freemapper warns with both dates. A message says whether the trees were in leaf on the flight. Maps use UTM zone 32. Bremen is not included yet.
- Rhineland-Palatinate (LVermGeo RP): orthophoto from the WMS, with the block's date of creation as the flight date. Terrain and surface models (DGM1/DOM1) come from 1 km laser tiles whose names and dates the
Laserbefliegungflight index gives; for tiles without a flight year freemapper reads the state's Metalink file. If the server lacks a tile, freemapper reports it as missing and asks again after 30 days. Buildings and land use come from ALKIS. Maps use UTM zone 32. At the Hesse border (Mainz, Wiesbaden) freemapper reads the ALKIS and OSM of both states. - Water on all maps: rivers, canals, lakes, ponds, harbour basins and sea from ALKIS become uncrossable water (301.1) with a bank line (301.6), with no lines between cadastre areas or along the map edge. Water with a mean width under 2 m comes as candidates. OSM adds ponds, swimming pools, fountain basins, streams, ditches, fountains, wells, springs, drinking fountains on schoolyard maps and bridges on sprint maps as candidates. Contours stop at the shore, and fountain points in water (mostly jets in a basin) are left out. In OCAD the fill and the bank line have the numbers 301.001 and 301.002. An existing map gets the water only with
run --force.
Changed
- The north lines are in the map part "default part" with the other map objects, tagged
freemapper:source=north-lines. In OOM they can be broken at small objects, and on the training map walls and fences lie on top of them. Title, scale and attribution stay in the part "peripheral information". An existing map changes only withrun --force. - Colours follow the IOF Printing and Colour Definitions Rev. 4 (September 2024, valid from 1 December 2024) instead of the older values in OOM's symbol set: brown is 25/75/100/0 instead of 0/56/100/18, green 80/0/100/0 instead of 76/0/91/0, brown 50% 10/35/50/0. Buildings are filled with 50 % black instead of 60 %, as in ISSprOM 2019-2. This applies to the OOM map, the OCAD file and the training PDF. Colour names and order stay the same.
- Longer messages use plainer wording.
- If a map area reaches beyond every supported state (abroad, out to sea or into a state freemapper does not support yet, such as Bremen or Thuringia), freemapper warns at fetch that the orthophoto and ALKIS can be missing there. This applies to all states.
Fixed
- Where the water areas of two states did not quite meet at the border in mid-river (Mainz, Rhine), a bank line ran through the river. freemapper now closes gaps under 0.5 m between water areas before it draws the bank lines. This also applies to parcels of one state. Bridges and roads (0.8 m and wider) stay land, and islands keep their bank lines.
[0.3.0] - 2026-11-08
Added
- Hamburg (LGV): orthophoto from the WMS (2026 vintage), terrain and surface models from the state's archives, buildings and land use from ALKIS. Maps use UTM zone 32.
- Saxony-Anhalt (LVermGeo): orthophoto, terrain and surface models (DGM1/DOM1), the nDSM, buildings and land use. Maps use UTM zone 32.
- Hesse (HVBG): orthophoto, terrain and surface models from the municipal downloads, buildings and land use from ALKIS.
- Schleswig-Holstein (LVermGeo SH): orthophoto, terrain model from the INSPIRE ATOM feed (with an XYZ fallback), surface model, buildings and land use from ALKIS.
- Mecklenburg-Vorpommern (LAiV M-V): orthophoto from the WCS, terrain and surface models, buildings and land use from ALKIS.
- North Rhine-Westphalia (Geobasis NRW): orthophoto from the WMS, terrain and surface models (DGM1/DOM1) from laser tiles, buildings and land use from ALKIS, OSM from the extracts of the five Regierungsbezirke instead of the statewide one. Maps use UTM zone 32.
- Maps can now use UTM zone 32 or 33. A project takes the zone of its state, and freemapper reports and cleans up when an existing project changes zone.
- The repository contains one example project per supported state, each with the OpenOrienteering Mapper file, the OCAD file, the training PDF and a preview image.
- The release archives include the user manual with its images, at the path the READMEs link to.
- The README explains the user manual, the example projects and the area selection in the browser.
- This changelog, and architecture decision records (ADRs) in
docs/adr/.
Changed
- Every state has one row in the README regions table. Details moved to the user manual.
- Before a download, the size estimate counts whole tiles for states with tiled data and marks the ones already cached.
- Older projects drop their stored records when the raster provider changes, and save that change.
- freemapper pins its Rust toolchain in
rust-toolchain.toml, so local builds and CI use the same version.
Fixed
- Hamburg ALKIS falls back to the classic WFS when the OGC API fails.
- State boundaries are valid geometries now, so the check whether an area lies inside a state no longer trips over slivers or self-intersections.
- A server error report is recognised as such and no longer retried, including XML errors from WMS and WCS services.
- Downloads have a size limit, follow no redirects from the Schleswig-Holstein download portal, and leave no half-finished files after a cancelled run.
- Damaged or unusual LZW-compressed TIFF files decode the way libtiff decodes them.
- A failed surface model download keeps a stored model that covers the area. An unreadable flight date no longer aborts a run.
- Missing tiles and places that cannot be resolved show up as warnings with the product and the affected tile instead of ending the run.
- An orthophoto without a flight date is reused for 30 days only, then fetched again. If the flight-date query fails, freemapper keeps a matching stored orthophoto and its date.
[0.2.0] - 2026-11-07
Added
- Berlin (Geoportal Berlin): ALKIS buildings and land use in projects, with the matching attribution. Where no ready nDSM exists, freemapper computes it from the bDOM minus the DGM1.
- Saxony (GeoSN): orthophoto, DGM1/DOM1 tiles, the nDSM, buildings and land use from ALKIS, and a Saxony OSM extract. Each region names its own data provider in the map credits.
- Projects pick the data region from the area's centre. Brandenburg (with Berlin cut out), Berlin and Saxony are supported.
- The area selection page and the download estimate know the regions, so they show the right layers and sizes per region.
- A bilingual user manual (German and English) with pictures. It covers installation, the AI assistant, area selection, templates, field checks, the PDF, OCAD and the regions, and it explains the messages. Both READMEs link to it.
- The README says up front that freemapper writes an OCAD starter project and a training PDF.
Changed
- The README lists regions in one equal table instead of separate Berlin and Saxony sections.
- OSM progress messages name the extract they download (Brandenburg or Saxony).
Fixed
- Empty answers from the Saxony WFS, tiles at the border outside the raster region and refused requests are handled. A refused request is not retried.
- The Berlin credit line names Geoportal Berlin, and the ALKIS line appears only for Berlin objects.
[0.1.0] - 2026-11-07
Added
- First release. freemapper builds an OpenOrienteering Mapper starter project for orienteering from official geodata of Brandenburg and OpenStreetMap, as a command line tool (
init,fetch,derive,export,run) and as an MCP server for AI assistants. - Georeferenced map with the IOF symbol set for 1:1000 sprint maps, peripheral information (north lines, scale bar, info block) and a credit line that names freemapper and its repository.
- Orthophoto, hillshade and slope as templates behind the map, and contour lines and the nDSM derived from the terrain data.
- Buildings from ALKIS as map objects.
- OSM data as candidates: reliable OSM ways become map objects, the rest stays as candidates for you to review. Geofabrik extracts are cached, and freemapper falls back to the cached extract when Geofabrik is unreachable.
- Sprint map objects: paved areas from ALKIS traffic areas and unpaved paths from OSM.
- Out-of-bounds areas for private land, derived from ALKIS land use.
- OCAD export (
--ocad, OCAD 12) with placeholder symbols. - Training map as a one-page PDF (
export --pdf,run --pdf, MCP optionpdf). - Area selection in the browser (
freemapper select, MCP toolopen_area_selector) with place search, rectangle, polygon, tile outlines and a download estimate. - Place search through Nominatim (
init --place) and initialisation from OSM (init --osm). The MCP server also lists layers and delivers PNG previews. - Release archives for Linux (x86_64 and ARM64), macOS (Apple Silicon and Intel) and Windows, each with a SHA-256 checksum.
Fixed
- Downloads have connect, response and body timeouts, keep a cached copy when the new download is invalid, and clean up old partial files.
- An existing map is kept when you run again. freemapper refreshes its templates and says so.
- freemapper protects edited maps from being overwritten on export.
- Error messages name the product and what to do next. Scale 0 and out-of-range coordinates are rejected.
- Download errors for uncovered tiles come in one report, and offline runs fall back to cached data.