How to use ISMS to edit an IVAO Aurora sectorfile: open one, find your way around it, change it, check it against the format and the IVAO standards, and package the release.
This is the manual for the person editing a sector. For what the project is, how it is built and how a version of the app is released, see the README; for the format itself, the format specification and the IVAO standards.
- What ISMS is not
- Before you start
- A first pass, end to end
- The window
- The render
- Editing
- Tracing a shape
- The files of the sector
- When files change underneath you
- Validation
- Preparing a release
- Keeping the app up to date
- Shortcuts
- When something goes wrong
ISMS is an independent, unofficial tool. IVAO did not make it, does not endorse it and does not support it. Aurora, the sectorfile format and the standards checked here are IVAO's; ISMS is one person's reading of the documents they publish, offered as is and with no warranty. Nothing that follows from using it — a damaged file, a lost afternoon, a release sent back — is the author's responsibility.
Three consequences are worth carrying with you through the rest of this guide:
- The validator is not an authority. Its rules are written from the format specification and the IVAO standards, and both are prose. A finding can be raised on a row that is perfectly correct, and a row that is wrong can pass unmentioned. Read what a finding says and decide; do not treat a sector with no findings as approved, or one with findings as broken.
- A fix writes to your files. The Fix buttons in the validator change rows you are not looking at — one of them, or every one across the sector. Each says what it is about to write, every one is a single step of undo, and nothing touches the disk until you save. Check the result anyway.
- What you see is what ISMS understood. A record drawn in the wrong place, or a file that comes up empty, means ISMS misread it — not that Aurora will. Aurora is the only authority on what Aurora accepts.
The first time you run the app it says this in a window of its own, with a box to tick so it stops asking. Until that box is ticked it comes back on every launch, and Help ▸ About ISMS opens it again afterwards.
None of this touches the one promise ISMS does make, which is in the next section: your bytes are safe. Work on a Git checkout of the sector, and read the diff before you commit it.
Install ISMS from the Releases page — ISMS_<version>_x64-setup.exe
installs per user and needs no administrator rights. Windows will warn that it
does not recognise the publisher; the installer is not code-signed, and
the README explains why. Click
More info ▸ Run anyway.
You need a sectorfile on disk: an .isc file with its Include directory
beside it, exactly as Aurora installs it. ISMS reads and writes that directory
in place, so work on a Git checkout of the sector, not on your live Aurora
install — every change you make is a change you will have to review.
The single promise ISMS makes is worth knowing before you trust it with a repository: opening a file and saving it without editing produces the same bytes it had before. ISMS never regenerates a file from a model. It keeps the original bytes and replaces only the span you edited, so a commit's diff is the lines you changed and nothing else.
The shortest useful path through the app: open a sector, change one thing, see that it is still valid, and save it.
- File ▸ Open .isc… and pick the
.iscat the root of the sector. If the directory holds several, ISMS lists them rather than making you type a path. The sectors you have opened before are on the front page and under Open in the File menu, which after the first time is the whole of this step. Opening resolves the whole include graph — everyF;directive along the[INFO]search paths, and every file auto-loaded because it is named after an ICAO declared in[AIRPORT]— so what you get is what Aurora gets. - Find what you want to change. Type into the Project panel's search box.
It matches file names and file contents, so
BARDI3Sfinds the file that defines the procedure even if nothing in its name says so. Click the group — a SID, a polygon, an airspace — and the inspector opens its source; the ⤢ button beside it zooms the render onto it. - Change a line in the inspector. The render and the diagnostics follow as you type. Nothing has touched the disk yet.
- Read the diagnostics. The bottom panel lists what the validator found in the whole sector. Click a finding to jump to the line that caused it. If your edit broke something, it appears here immediately.
Ctrl+Ssaves every file with unsaved changes. Until you do, the title bar and the tree carry the unsaved marks and the disk is untouched.- When the work of a cycle is done, Tools ▸ Prepare a release… writes the
Changelog.txtentry and builds the distribution.zip.
Everything below is the detail of those steps.
| Panel | What it holds |
|---|---|
| Project (left) | The include tree, grouped by directory. The checkbox beside a file switches its layer on the render; the twisty opens what is inside it — SID and STAR procedures, [FILLCOLOR] polygons, airspace identifiers — each with its own checkbox and its own ⤢, which zooms the render onto it. Clicking a file's name opens the whole file in the inspector, which is the only way into a file that draws nothing: a .def, a colour scheme, the header comments of a .geo. A file with findings against it carries their count. |
| Render (centre) | The sector drawn with the colours of the loaded [COLORSCHEME]. |
| Inspector (right) | The source of whatever is selected — the group by default, the whole file on request — editable in place. |
| Diagnostics (bottom) | The validator's findings, with the per-severity totals doubling as a filter. |
Drag the rules between panels to resize them, or use the arrow keys once a rule has focus. View ▸ Reset the panel sizes puts them back.
The editor and the render can each be torn off into a window of their own from the Window menu, which is what you want on two monitors. A detached panel is a second view of the same state, not a second document: it shares the project, the buffers and the undo history, because those live in the backend. Closing the main window closes them.
Panel sizes, hidden layers, hidden groups, unfolded directories and where the render was looking are remembered per sector, so reopening one puts you back on the apron you were working on rather than at the whole-sector extent. The window's own size and position are remembered too, including a detached pane's — the point of pulling the render onto the second monitor is that it stays there. All of it lives in ISMS's own configuration directory, never inside the sector: the tool does not drop its own files into a repository other people have to review.
- Pan by dragging, zoom with the wheel. Rotation is off; a sector chart that is not north-up is a chart nobody can read.
- Click geometry to select it. The selection is the line that drew it: the inspector opens there, with the caret on that line.
- The other direction works too. The line the caret is on is marked in magenta — the segment that line draws and the points at its ends — so walking a procedure with the arrow keys shows you the drawing leg by leg. A detached render window follows the editor's caret as well.
- View ▸ Waypoint labels draws the identifiers next to the points. Useful when you are checking a procedure against a chart, noisy the rest of the time.
- The coordinate under the pointer is read out in the top right, in
canonical DMS and in decimal degrees.
Ctrl+Cover the render copies it as the pair of tokens a record is written with —N040.27.47.100;W003.33.14.040;— ready to paste. The reading is only ever as precise as the pixel the cursor is on, so zoom in before trusting one. A selection in the editor or in a dialog still ownsCtrl+C. - View ▸ Show every layer / Hide every layer are the fast way back from a tree where you have switched off half the sector.
Hold Shift and the render frames itself in white, the pointer becomes a
ruler, and clicks measure instead of selecting — the pen's red frame and pencil
say the same thing about drawing, and both are there because a click is about
to do something other than what it did a moment ago. Click once to anchor the
ruler; the reading then follows the pointer — the distance in
nautical miles and in metres, and the bearing both true and magnetic. The
magnetic one uses the sector's own declared variation from [INFO], not a
model, so it is the figure Aurora draws its radials with.
The far end snaps to drawn points exactly as the pen does, so a runway is measured from its threshold and an apron from its corner rather than from a pixel near one. A second Shift+click fixes it, and so does letting go of Shift — the reading stays on the map, with the distance on the leg and the whole of it in the corner, until Escape clears it or the next Shift+click starts another.
Distances are great-circle, worked out from the coordinates rather than from the drawing: at 40°N a degree of longitude is 76% of a degree of latitude, and a ruler that measured the plane would be wrong by a quarter along every east-west leg.
Edits change the in-memory buffer, the render and the diagnostics. Nothing is
written to disk until you save. Undo and redo are unlimited within a session
and are labelled in the Edit menu with the operation they will reverse, so you
can see what Ctrl+Z is about to take back before you press it.
Inside a text field, Ctrl+Z and Ctrl+Y are that field's own undo, not the
file's. Ctrl+S saves from anywhere, including from inside the editor.
By default the inspector shows the group you selected. View ▸ Edit the whole file widens it to the entire file, for the times when the change is not confined to one procedure.
Edit ▸ Add a record at the caret… builds a record from a form that knows the schema of the section it is going into, so you fill in fields rather than counting semicolons. The record is inserted at the caret.
Its coordinate fields take whatever the publication printed, not just the
format's own notation: 432826.9N, 41°00'25.6"N, N40 28.426, decimal with
either separator, and the typographic marks a PDF hands over instead of the
real ones. Paste the pair into either box and both are filled — which is
how a plate gives it to you. Anything already written the way the format wants
is left exactly as typed; only what the strict reader could not take is
rewritten, and it is rewritten to padded DMS so you can see what was understood
before the row is composed. The same fields, and the same rule, in the holding
generator below.
Edit ▸ Paste a table from a publication… takes a table copied straight out of an AIP.
Column roles are detected from the shape of the cells, not from their
headings — an AIP is a national document and every state lays its tables out
differently — and you can correct the detection before anything is inserted.
Coordinates come out as the canonical padded DMS the manual specifies, whatever
form the publication used. Names are matched against the sector, so a pasted
coordinate that is already a known fix is written as BARDI;BARDI; rather than
as a duplicate point.
Ctrl+F opens a search over the source of the whole sector. The Project
panel's filter matches file names and procedure ids; this one matches the
bytes, which is the only way to reach a colour token, a coordinate, a callsign
or a comment — none of those is the name of anything. It searches the buffers,
so a line you typed a moment ago and have not saved is found.
Results are grouped by file. Enter goes to the one marked and then to the next; Shift+Enter walks back; the arrow keys do the same, and each hit opens in the inspector as you reach it, so the panel is a way of reading the results rather than of choosing one of them. Aa matches case, and this file narrows the search to the file the inspector is showing. Escape closes it.
A query that starts with a colon is a line number instead: Ctrl+G opens
the same panel with the colon already there, so :412 and Enter puts the caret
on line 412 of the file you are in.
Edit ▸ Who uses this waypoint… lists everything that names the identifier on
the current line, and where it is defined. It works off the parsed record, so it
behaves the same on the [FIXES] row that defines a point and on a procedure
leg that flies through it. Use it before renaming or removing anything.
For drawing an apron edge, a taxiway line or any outline that exists on a chart but not yet in the sector.
Hold Ctrl. The render frames itself in red and the pointer becomes a
pencil, its point on the pixel a click would take. Every click places a point:
- Points snap to a point already drawn or to the nearest vertex of whatever is under the cursor, so a traced apron edge meets the taxiway it runs into exactly. A white ring shows the point a click would take, before it is taken.
Ctrl+drag still pans.Ctrl+Ztakes back the last point.Enter, or Close outline, closes the shape back onto its own first corner exactly — which snapping cannot do once that corner is off screen.Escapeends the run; the next click starts another one.- Releasing
Ctrlchanges nothing. The draft is a drawing, not a mode: letting go of the key can never cost you work.
Export… writes the draft out as [GEO] segments, as a [FILLCOLOR]
polygon with its header and colour, or as bare coordinate rows. It shows the row
count and a preview of the shape before anything is copied.
Written as coordinates, the first point of each run carries <br>. A blank line
breaks a [GEO] path, but in a procedure section it breaks nothing — there a
new path starts at the point carrying the marker, and rows pasted without it
join the procedure above and the one below. Turn the check box off only when the
points belong to a path that is already being drawn.
The draft is never an edit. Nothing reaches a file until you paste the rows in yourself.
Some shapes are not traced, they are computed. Tools → Holding / racetrack… draws one from the numbers on the plate.
The fix is where the inbound leg ends — where the aircraft crosses and
starts turning, which is where the symbol is anchored on the chart. It opens
filled in from the last point on the draft, so clicking the fix on the render
first saves typing it, and it takes a coordinate in the plate's own notation —
paste 432826.9N 0053932.5W into either box and both are filled.
- The course is the inbound one, which is what plates publish. Say
Outboundif you are reading the other track off the plate instead, andMagneticorTruefor which one it is. A magnetic course is converted through the sector's own[INFO]variation — the figure Aurora draws its own radials with, not a model. - The leg is minutes or nautical miles. Minutes are the ICAO way — one below FL140, one and a half above — and are flown at the true airspeed below.
- The turn radius is stated, or computed from the maximum holding speed and the level. Computed, it uses the gentler of 25° of bank and rate one, which is how the pattern is designed. The figures it arrived at are listed beside the drawing: check the true airspeed and the radius against the plate.
- Arc detail is degrees per segment, and it is the row count in disguise: 5° is thirty-six points a turn, 15° is twelve.
The drawing and the rows are both shown before anything leaves the dialog. The
arrow is a run of its own, so both it and the track start with <br> and
neither runs into the procedure it is pasted next to.
Copy takes the plain coordinates; Add to the draft puts the pattern on
the render, where it can be undone, drawn over, and exported as [GEO] or a
[FILLCOLOR] with everything else on the draft.
The Project panel's right-click menu manages the files:
| Entry | What it does |
|---|---|
| New file here… | Creates a file and declares it in the .isc. These are one operation — a file nothing includes is a file Aurora never reads — and if the declaration fails, the file is undone. |
| Add an existing file… | Declares a file that is already on disk. |
| Duplicate… | Copies a file and declares the copy. |
| Rename… | Renames the file and rewrites the declaration that names it. |
| Remove from the sector | Undeclares it, leaving the file on disk. |
| Delete from disk… | Undeclares it and deletes it. |
| Open the whole file | The same as clicking the file's name. |
| Paste a table from a publication… | As above, into that file. |
Anything that adds or removes a file reopens the project, because file ids are positions in the include graph and those renumber. That is why these operations clear the undo history — save before you reach for them.
ISMS assumes it is never the only writer. Sectorfiles get edited in whatever text editor is already open, and Aurora reloads them from disk. A watcher reparses external changes in place and the render follows them, with no need to reopen the project.
If a file changes on disk while ISMS is holding unsaved edits to it, that is a conflict: nothing is reloaded and nothing is overwritten, and ISMS says so. You resolve it, either by saving over the file or by File ▸ Reload from disk… and discarding your work. The tool will not choose for you which of two people's edits survives.
The validator walks what the parser already produced, so a rule can never disagree with what is drawn on the render. Every finding carries a permanent code, which means you can filter on it and cite it in an issue:
| Range | Domain |
|---|---|
V1xx |
Project structure and the include graph |
V2xx |
Coordinates |
V3xx |
Colours |
V4xx |
Identifiers and references |
V5xx |
Record schema |
V6xx |
IVAO quality standards |
V9xx |
Metrics |
Click a finding to go to the line. Click a severity total to see only that severity; View ▸ Clear the diagnostics filter removes it. In the inspector, the line numbers of rows that carry a finding are marked in the severity's own colour, so the source and the panel are looking at the same thing. Those marks are not capped the way the list is.
Most rules are decisions. An include that resolves to nothing, an ICAO declared twice, a missing changelog — each of those needs somebody to know what was meant, and a tool that guessed would be editing the sector rather than checking it.
Four are not decisions, and those carry a Fix:
| Code | What it writes |
|---|---|
V203 |
N039.32.14 → N039.32.14.000, the fraction Aurora truncates to |
V204 |
W003.10.0.0 → W003.10.00.000, padded as the manual specifies |
V205 |
N044.47.60.000 → N044.48.00.000, sixty seconds carried into the minute |
V302 |
STOPLINE → STOPBAR, APPRON → APRON |
Fix on a finding writes that row. Fix all on a rule's heading writes every one of them across the sector — a thousand of them on a sector nobody has run a validator over, which is the difference between a report worth reading and a report worth ignoring.
Either way it is one step of history: Ctrl+Z takes the whole thing back, and nothing is on disk until you Save. The button says what it will write before you press it.
A repair never moves a point. It is arithmetic on the digits the token already
has, not a conversion out to decimal degrees and back, so the coordinate that
comes out denotes exactly the coordinate that went in. Where that is not
possible it is not offered: N040.27.47.6271 cannot be written in fourteen
characters without losing its last digit, so it stays a finding and you decide.
The .isc's own rules — a trailing semicolon on an include, an include whose
case does not match the disk — have no Fix yet. The .isc is not edited
through a buffer like the rest of the sector; changing it reopens the project.
Severity is not encoded in the code. A rule may be promoted or demoted as we learn more about the real data, but its code never moves — so a code you cited last year still means the same thing.
Expect findings on a sector nobody has run a validator over before, and expect many of them to be pre-existing. The parser accepts everything Aurora accepts, including the thousands of unpadded DMS tokens the real corpus contains, precisely so the validator can make that tolerance visible instead of letting a sectorfile quietly rot until someone's approach chart stops drawing.
Tools ▸ Prepare a release…
Changelog.txt is what an ATC Advisor reviews, its template is fixed, and a
contribution without a complete one is not approved. It is also the one part
nobody can reconstruct after the fact — so ISMS keeps a journal as the work
happens: every save, every file added, renamed or removed.
The dialog therefore opens with the added, removed and edited lists already filled in. You supply the FIR name, the date and the AIRAC cycle, and a description of what the update does; ISMS appends the entry newest first, in the template's exact shape.
Then it builds the distribution .zip from the files you tick.
delete.upd is offered from the same journal and stays opt-in.
Unzipping an update deletes nothing, so a file that moved leaves its old copy
behind on every install — still loaded, and still auto-loaded if its name is an
ICAO. But no delete.upd exists anywhere in the reference corpus, and shipping
one nobody asked for is not a decision a tool gets to make. It is yours.
The journal is cleared when you explicitly start a new cycle, not when the changelog is written: a release is not finished until it is packaged.
ISMS tells you when there is a new version. A few seconds after the window is up it asks GitHub once, and if a release is waiting a button appears in the status bar beside the version you are running: Update to 0.1.4. A check that finds nothing, or that cannot reach GitHub at all, says nothing.
Tools ▸ Check for updates… does the same thing on demand, at any time.
Either way, nothing is downloaded until you confirm in the dialog that names the version and its release notes. Both are disabled while there are unsaved edits, since installing restarts the app.
When ISMS comes back up on the new version it opens What's new in ISMS
0.1.4 once: that version's entry from CHANGELOG.md, which is the same text
the release notes on GitHub carry. Closing it is the end of it — it does not
come back, and it never appears on a first install or on a build from source.
You can also just install a newer version over an older one; there is no need to uninstall first, and your per-sector state survives because it lives in the configuration directory, not in the install.
F1 — or Help ▸ Keyboard shortcuts… — shows this list inside the app,
built from the same table the menus print their accelerators from.
Ctrl+O |
Open an .isc |
Ctrl+S |
Save every file with unsaved changes |
Ctrl+Z |
Undo — or, while tracing, take back the last point |
Ctrl+Y / Ctrl+Shift+Z |
Redo |
Ctrl+F |
Find text in the sector |
Ctrl+G |
Go to a line |
F1 |
The keyboard reference |
Ctrl+Enter (in the inspector) |
Apply the region being edited |
Ctrl (held, over the render) |
Trace |
Ctrl+C (over the render) |
Copy the coordinate under the pointer |
Shift (held, over the render) |
Measure |
Enter (while tracing) |
Close the outline |
Escape (while tracing) |
End the run |
Escape (over the render) |
Clear the measurement |
Escape (in a dialog) |
Cancel |
On a Spanish keyboard, AltGr reports itself to the window as Ctrl+Alt. ISMS
ignores anything with Alt held, so typing @, #, [, ], {, } or \
does not trip a shortcut.
- A window shows an error screen with a stack trace. Something in the UI threw. Nothing on disk is at risk, and the button reloads the window — but unsaved edits in that window are not recoverable. The message and the stack are the useful part of a bug report.
- A file will not reload. It has unsaved edits and has also changed on disk. See When files change underneath you.
- The render is empty after opening. Check the layer checkboxes in the Project panel — hidden layers are remembered per sector, so a layer you switched off weeks ago is still off.
- Windows warns about the installer. Expected, and explained in the README.









