Skip to content

Dialect 0.1.0

Latest

Choose a tag to compare

@Suremise Suremise released this 15 Oct 02:30

Dialect 0.1.0 for Windows (x64): it translates network device configs between vendor dialects, offline.

Always review converted configuration before applying it to a device. Dialect reports what it couldn't convert,
but you are responsible for what you deploy.

Downloads

None needs anything else installed: no Node.js, no runtime.

File What it is
Dialect_0.1.0_x64-setup.exe The one most people want. The desktop app and the dialect command, for you alone (no admin rights). It needs internet only on the rare PC without Microsoft WebView2.
Dialect_0.1.0_x64-offline-setup.exe The same, for a PC with no internet: Microsoft's WebView2 installer is inside, so it's much bigger.
dialect-cli.exe The dialect command on its own: one file, nothing to install. Rename it dialect.exe to type dialect.
dialect.html The app as one web page. It runs offline in Edge, Chrome or another modern browser: open it from any folder or a USB stick, with no network.
LICENSE, THIRD_PARTY_NOTICES.md Dialect's MIT License, and the licenses of the open-source software it includes.

The installers and dialect-cli.exe are unsigned: Dialect has no code-signing certificate yet, so Windows
SmartScreen warns about them. Choose More info → Run anyway. Dialect doesn't update itself or check for new
versions: look here, or use Help → Releases on GitHub.

What's new

The first release of Dialect: Junos display set, and conversion between Junos, Cisco IOS / IOS-XE, NX-OS and IOS-XR,
in a desktop app for Windows, an offline web page and a command-line tool. Always review converted configuration
before applying it to a device.

Getting Dialect

  • Releases are on GitHub: github.com/Suremise/dialect/releases, and
    Help → Releases on GitHub opens the page. Dialect doesn't update itself or check for new versions yet.
  • Review before applying: About and dialect --help say it plainly. Dialect reports what it couldn't convert, but
    you are responsible for what you deploy.
  • Nothing to install first. The dialect command is now also a standalone dialect.exe with its own runtime: no
    Node.js needed. The desktop installer installs it beside the app and asks to add it to your PATH (yes by default);
    uninstalling removes both. It's also a download of its own, dialect-cli.exe.
  • Two installers: the normal one, which installs Microsoft WebView2 if your PC lacks it (rare; that needs
    internet), and an offline one with WebView2's installer inside, for a PC with no internet.

The window

  • The Dialect icon everywhere in the desktop app: on the installer and in Add/Remove Programs, on the window and
    the taskbar, and in the notification area while Dialect runs. Click the tray icon to bring the window back, or
    right-click it for Show Dialect, New tab and Quit. Quit asks first while output is unsaved, as closing the window
    does, and closing the window still quits Dialect. Where Windows has no notification area, Dialect runs without the
    tray icon.
  • Tabs and a menu bar, the same in the desktop app and the web build. Open several conversions at once, each in
    its own tab (File → New Tab, Ctrl+T, or +, then Display set or Convert), with its own source, output, interface
    names and undo history. A dot marks a tab whose output isn't saved, and closing it asks first. The Docs pages open in
    tabs of their own, beside your conversions.
  • The menus: File, Edit, View (the theme), Window (every open tab, the current one ticked) and Help, all usable
    from the keyboard (Alt or F10, the arrow keys, Enter, Esc). Exit is in the desktop app's File menu. In a browser,
    which keeps Ctrl+T, Ctrl+W and Ctrl+Tab for itself, the web build uses Alt+T, Alt+W and Alt+PgDn.
  • Tabs come back after a restart with their file names, but never your configs: Dialect doesn't keep configs
    anywhere. Reopen the file from the tab.
  • Nothing unsaved is lost on the way out: File → Exit, the desktop window's ✕ and Alt+F4 ask first while a tab's
    output is unsaved, and the web build has the browser ask before its tab closes or reloads.
  • Controls stand out: buttons, tabs and menus have a visible edge, the current tab is marked in violet, and the
    keyboard focus shows.

Convert

  • No message repeats a secret, even by chance: a message or a reason that would hold a secret of the config (an
    SNMP community or a key that happens to be one of its words, such as a community named come in "which comes with
    filters") is withheld instead, keeping its line: "This message is withheld, as it would repeat a value of this
    configuration." This covers every platform, in Convert, Display set, the app and the command line.
  • A warning about the converted config is at the right line: a warning the target raises about a line it wrote
    (a term written as deny where the source rejected, a final permit added to a route map) was shown at that line
    number in the source. It is now at the source statement it came from, and gives its line of the output too: after
    the message on the command line, and in the app beside the problem, marked in the output's gutter.
  • IOS-XR access list remarks convert: the remarks before an entry are kept as its description, and converting to
    IOS-XR writes one back as a remark just before its entry, instead of listing it as not written.
  • An access list remark converting to Junos says why it isn't written: Junos filters keep no description per term,
    so the remark is listed as not written, and the entry it describes still converts.
  • A filter whose last entry can't be converted is no longer turned into one that drops everything: an entry left
    out goes alone only when that changes nothing (it only counts, or it is the last and denies, as the filter's end
    does). Otherwise the whole filter is listed as not converted, and so is every interface that applies it.
  • Cisco IOS / IOS-XE and NX-OS bundles (port-channels) convert: each member's channel-group with its LACP mode
    (active, passive or on), the Port-channel's minimum links, and on NX-OS the feature lacp LACP needs. Converting a
    Junos ae0 with its members gives Port-channel1 (port-channel1 on NX-OS) with the same members and mode, once
    you take the suggested name. Each member is written to match its bundle (its switch port settings and MTU, and on
    NX-OS no switchport for a routed bundle), as the device needs to bundle it. Members of one bundle with different
    modes stop the conversion with an error, and PAgP isn't converted.
  • Link aggregation converts for Junos and IOS-XR: which aggregate each member link is in, the LACP mode (active,
    passive or none) and minimum links, from Junos 802.3ad and aggregated-ether-options and IOS-XR bundle id and
    bundle minimum-active links, both ways. Converting to Junos also writes the chassis aggregated-devices line Junos
    needs for its ae interfaces.
  • Every line not converted says why, from every platform: a line Dialect doesn't read at all is no longer shown as
    a bare "not converted", but with what it is and that it comes later ("logical systems come later", "IS-IS comes
    later", "SNMP traps come later", "QoS (class, policy and table maps) comes later").
  • Cisco IOS / IOS-XE VLANs, switch ports, VLAN interfaces, OSPF and BGP convert: VLANs and their names, access and
    trunk ports (allowed VLANs with add, remove and except, a native VLAN), VLAN interfaces, OSPF enabled by ip ospf … area or network statements (areas, stub and NSSA, authentication, cost, network type, passive, timers) and BGP
    (neighbors, peer groups, update source, eBGP multihop, IPv4 and IPv6 address families with their route maps), in
    the global table and in VRFs. Converting OSPF enabled by network statements writes an exact one for each
    interface, with a warning, and an eBGP neighbor with no route map warns where the source (IOS-XR) exchanged nothing.
  • Keys and passwords are asked for, never carried over: an OSPF key or a BGP password is never carried over, nor
    written as a placeholder: the converted config leaves it out until you give it.
  • Give keys, passwords and other answers: the app's new Needs input panel, beside the interfaces, lists what a
    conversion needs besides names (an OSPF key, a BGP password, an IOS-XR eBGP neighbor's route policy, a Junos VRF's
    route distinguisher or route targets) by line, with a field for each; keys and passwords are masked unless you show
    them, and kept only while the tab is open, never stored. On the command line, dialect convert --answers <file>
    (or - for stdin) reads them from an answers file, never from the command line, and --write-answers <file>
    writes everything asked to fill in. Each unanswered item's message now says what's needed, and the summary counts
    interfaces and other items apart.
  • Warnings about a converted field give their line: a target's warning such as IOS-XR's about an eBGP neighbor
    with no policy is shown at the statement it's about, where it had no line before.
  • IOS-XE messages no longer quote the config: a statement that isn't converted says which word, by its position, or
    which line, never the word itself, so a password or community reused there doesn't show up in a warning or log.
  • A VRF's BGP neighbor can inherit a global template on NX-OS and IOS-XR: inherit peer T and use neighbor-group G in a VRF now convert with the template's settings, where they were listed as not converted.
    Converting to NX-OS or IOS-XR writes a VRF's group once as the global template when it is the same as the global one
    (or every other VRF's), and lists one that differs.
  • Cisco IOS / IOS-XE and NX-OS VRF import and export maps convert with the VRF's route targets, as the policies
    they name. A Cisco map filters what the route targets import or export, where Junos vrf-import and vrf-export
    replace them: converting a Junos VRF policy to IOS-XE or NX-OS warns.
  • More routing policy converts to and from Junos: AS-path groups (as-path-group), and a Cisco AS-path list of
    several lines is written as one. A route map's set community 65000:1 now converts to Junos, as a community of the
    term's own (Junos acts on named communities only).
  • Cisco IOS / IOS-XE and NX-OS access lists convert, IPv4 and IPv6, with the interfaces that apply them: protocols,
    addresses, ports (eq, neq, gt, lt, range), ICMP types, established and TCP flags, fragments, DSCP and log, and each
    entry's remarks as its description. A non-contiguous wildcard is never approximated: its entry is listed as not
    converted. Converting a Junos filter warns that the Cisco list denies what no entry decides, where Junos drops it
    silently.
  • Cisco IOS-XR access lists convert: ipv4 and ipv6 access-list entries (addresses, contiguous wildcards,
    protocols, ports, ICMP types, established, fragments, dscp, log, counter) and the interfaces' access-group
    attachments. An entry that can't be converted leaves its whole access list out unless it is the last, and a
    non-contiguous wildcard is never approximated. Converting to IOS-XR warns where its implicit deny differs from the
    source's end (Junos discards silently) or a list relies on it.
  • Junos VRF policies convert: a routing instance's vrf-import and vrf-export policies, in order, are converted
    and written back, and a VRF with a policy for a side needs no route target there. Converting a Cisco VRF's import
    or export map to Junos leaves it out with a warning: a Cisco map filters routes after the route targets, while
    Junos's replaces them, so the meaning can't be kept.
  • Cisco IOS-XR routing policy converts, in RPL's simple forms: prefix sets, community sets, AS-path sets and route
    policies made of flat if … then … else … endif blocks, and BGP neighbors' and VRFs' route policies now carry the
    policy itself, not only its name. A set or policy converts whole or not at all: nested if, elseif, parameters,
    apply and the like are listed as not converted. Converting a Junos policy to IOS-XR adds a final pass, with a
    warning, and a VRF's import or export policy warns where Junos and IOS-XR treat route targets differently.
  • Junos firewall filters convert: firewall family inet and inet6 filters (and the older firewall filter),
    with their terms' conditions (addresses and prefix lists by source, destination or either, protocol and
    next-header, ports and ranges by number or name, ICMP types and codes, DSCP and traffic class, TCP established,
    initial and flags, fragments) and actions (accept, discard, reject, next term, count, log), and the filter each
    unit applies in and out. A term converts whole or not at all, and when leaving one out could change what a later
    term decides, the whole filter is listed as not converted, with the units applying it. Converting to Junos warns
    where the filter's end differs (a Cisco ACL's deny) or the filter relies on it. Policers, routing-instance
    forwarding, input and output lists and filters of other families aren't converted yet.
  • Cisco NX-OS routing policy converts: prefix lists (IPv4 and IPv6, with eq), standard and expanded community lists
    and AS-path access lists with their sequence numbers, and route maps; BGP neighbors' route maps now carry the policy,
    not only its name. As on IOS-XE, regexes are kept as written, a route map converts sequence by sequence, and a Junos
    policy that passes undecided routes on gets a final permit sequence, with a warning.
  • Cisco IOS / IOS-XE routing policy converts: prefix lists (IPv4 and IPv6), community lists (standard, expanded and
    numbered), AS-path access lists and route maps, and BGP neighbors' route maps now carry the policy itself, not only
    its name. Regexes are kept as written and never translated between platforms. A route map converts sequence by
    sequence: one that can't (continue, an ACL match) is listed, with the whole route map when leaving it out would
    change what later sequences see. A Junos policy that passes undecided routes to the next policy gets a final permit
    sequence, with a warning, as an IOS route map denies them.
  • Every IRB unit converts: a Junos irb with several units is named unit by unit (irb.100, irb.200), in the
    Interfaces table and in map files (irb.100,Vlan100), and each becomes its own VLAN interface on IOS-XE and NX-OS,
    suggested as Vlan100, Vlan200. Before, only one unit could be converted. The other way, Cisco's Vlan100 is
    suggested as Junos's irb.100, and VLAN interfaces become units of one irb.
  • Junos routing policy converts: prefix lists, communities (literal, extended and large members, and regular
    expressions, marked as Junos's), AS paths and policy-statements, with their terms' conditions (prefix lists and
    prefix-list-filter, route filters, communities, AS paths, protocol, neighbor, tag, family) and actions (accept,
    reject, next term, next policy, local preference, metric, community add, set and delete, AS-path prepend, next hop,
    tag). BGP import and export now name the converted policies, and the "policies by name only" warning is gone where
    they convert. A term converts whole or not at all; when leaving one out could change what a later term sees, the
    whole policy is listed as not converted. Junos's own readings are respected: route filters match by longest prefix,
    so nested ones that would match differently aren't converted, nor a term with both route filters and prefix lists.
    Converting to Junos warns when the source rejects routes no term decides (a Cisco route map), as Junos passes them
    to the next policy.
  • Cisco NX-OS and IOS-XR join convert, in the app and on the command line: convert from any of Junos, IOS / IOS-XE,
    NX-OS and IOS-XR to any other (dialect convert --from nxos --to iosxr …). In the app, a new tab's Convert row has
    the platform to convert from and the one to convert to, and a convert tab can change either.
  • Cisco NX-OS VLANs, switch ports, VLAN interfaces, OSPF and BGP convert: VLANs and their names, access and trunk
    ports (allowed VLANs with add, remove and except, a native VLAN), VLAN interfaces (SVIs), OSPF as NX-OS enables it on
    each interface (areas, stub and NSSA, cost, network type, passive, timers, passive-interface default) and BGP
    (neighbors, peer templates, eBGP multihop, address families, route maps), in the global table and in VRFs. The
    feature lines they need are written. OSPF keys and BGP passwords are never carried over. Warnings say where NX-OS behaves differently: an eBGP neighbor with no route map exchanges every route
    (IOS-XR exchanges none, RFC 8212), and OSPF enabled with network statements is enabled per interface.
  • Junos OSPF and BGP convert: OSPF areas (stub, NSSA) and their interfaces (passive, metric, point-to-point,
    timers), and BGP groups and neighbors (type, peer AS, description, local address, multihop, IPv4 and IPv6 unicast,
    import and export policies), with the router ID and AS number, in the global table and in VRFs. Keys are never
    carried over. Converting into Junos warns where its defaults differ from the source's: OSPF enabled by network
    statements becomes per interface, and an eBGP peer without a policy accepts its routes on Junos where IOS-XR rejects
    them.
  • Aggregated interfaces get a suggested name on every target: Junos ae0 is suggested as IOS Port-channel1,
    NX-OS port-channel1 or IOS-XR Bundle-Ether1 (Cisco counts from 1, Junos from 0), and back again; between Cisco
    platforms the number is kept (Port-channel5 → Bundle-Ether5). As with every suggestion, it's used only once you
    take it.
  • Cisco IOS-XR OSPF and BGP convert: OSPF processes with their areas (stub, NSSA, authentication) and interfaces
    (cost, network type, passive, timers), taking IOS-XR's inheritance from the area and the process into each interface,
    and BGP (neighbors, neighbor groups, eBGP multihop, address families, route policies), in the global table and in
    VRFs, with each VRF's route distinguisher. Layer 2 (bridge domains) isn't converted yet. Converting to
    IOS-XR, an eBGP neighbor with no route policy one way needs one, since IOS-XR exchanges no routes without it
    (RFC 8212), and a warning says so when the source accepted them; no policy is made up. OSPF keys and BGP passwords
    are never carried over.
  • Junos VLANs, switch ports and IRB convert (ELS, as on today's EX and QFX): VLANs with their names and
    descriptions, access and trunk ports with their VLANs and native VLAN, and IRB units with the VLAN each routes for.
    What Junos itself refuses (two VLANs with one ID, or naming one IRB unit) is an error, and what can't be read one way
    (a vlan-id-list, the older non-ELS port-mode, an IRB unit that routes for no VLAN) is listed as not converted rather
    than guessed.
  • Junos routing instances convert: VRFs and virtual routers, with their units, route distinguisher and vrf-target
    (one target or an import and export), to and from the model, so their interfaces stay in the right VRF. A unit in two
    instances is an error, as on the device, and instance types Dialect doesn't convert yet (mac-vrf, EVPN) are listed as
    not converted. Writing a VRF to Junos that the source gives without a route distinguisher or route targets asks for
    them rather than making them up.
  • Junos to Cisco IOS / IOS-XE on the command line: dialect convert --from junos --to iosxe [--map file] [--allow-incomplete] <file|->. What didn't carry over is listed on stderr by line, with the reason, and never quotes
    the config.
  • Convert in the app, the web build and the desktop app: a Convert mode beside Display set, with the target
    platform to choose. What didn't carry over is listed in the problems panel and marked in the source's gutter, with
    the reason on hover, and the source and output lines are linked as in display set. An Interfaces table names
    each interface on the target: type a name, take the suggestion, or load and save a map file.
  • Interface names are never guessed. Every interface needs a name on the target, from a --map file (from,to
    lines or JSON). Dialect suggests names (ge-0/0/0 → GigabitEthernet0/0/0) but uses none unasked: with interfaces
    left unnamed, convert gives their lines and exits 3, unless --allow-incomplete is given. --write-map writes
    every interface, with suggestions, to a map file to fill in. Two interfaces are never given one name: such names are
    refused, so neither is lost.

Display set

  • Junos display set, in the Junos plugin: hierarchical config to the set lines Junos prints, with
    deactivate and protect lines after the statements they cover, as Juniper documents. Annotations and unknown tags
    are reported as warnings, and syntax errors with their line and column. Fixes the bugs found in jcc (the earlier
    open-source converter) during research: words containing set, annotations in the output, words starting with _
    or @, a last line without a newline, and an unterminated quote.
  • dialect display-set <file|-> on the command line (Node 24): the set commands to stdout, and warnings and errors
    to stderr with their file, line and column. Messages never quote the config itself, so secrets stay out of logs.
    Exit codes: 0 done, 1 a syntax error, 2 a usage error or unreadable input.
  • The web build, dialect.html: display set in a browser, from one file opened from disk, with nothing installed
    and no network. Open a file, drop one or paste, and see the display set as you type, with warnings and syntax errors
    in a problems panel, linked lines between source and output, copy and save, and light and dark themes in Dialect's
    violet. The output is counted in commands (set, deactivate and protect), so a multi-line banner counts once, with
    its lines said too.
  • The desktop app for Windows: the same display set in its own window, from a per-user installer (no admin rights
    needed). Open and save with the Windows dialogs or drop a file on the window; the app can touch only the files you
    pick and reaches no network. Unsigned for now, so SmartScreen may warn.
  • Help, About and Docs in the desktop app and the web build: the user guide (F1), the release notes, the license
    and the third-party notices in the app, and About Dialect with the version, the build, the WebView2 or browser
    version and the OS, links to the license and the notices, the release notes, and the copyright and independence
    notice.

Repository

  • The monorepo is in place. npm workspaces for the core, the conformance kit, the Junos plugin, the CLI, the UI and
    the web and desktop shells (all stubs for now), with Hive's TypeScript settings, oxlint, Vitest and Windows CI, on
    npm 12.
  • Third-party notices are generated from what ships, with full license texts and working https:// links, and a
    license check in two categories: what ships must be MIT or equally permissive, and build-only tools, listed in
    docs/BUILD_ONLY_PACKAGES.md, must be open source.
  • The notices cover the desktop app's Rust crates, the installer's components and the WebView2 loader: only crates
    compiled into the app ship; proc-macros and build scripts are listed as build-only.
  • The notices say which license Dialect uses for each package and crate offered under a choice of licenses: MIT
    where it is offered, otherwise the first allowed one (e.g. "MIT OR Apache-2.0, used under MIT").

SHA-256 checksums

File SHA-256
Dialect_0.1.0_x64-setup.exe 4b15bfbc4c9dc0fc295a6315d0332cb248e3a63efed58f925476d748f0b829e3
Dialect_0.1.0_x64-offline-setup.exe 6d13ab9021cd331babeae956c40706206b479c34dcae25a8fd6c837acf9a4dcb
dialect-cli.exe d0ed2b296d3511a518083140e9279c2d262ad11486d55449e4d103278a382d19
dialect.html c07adf123fc012425ce964bb3450917d066b02d2e9ca254198d7a9f077d00058
LICENSE a8a09b573427572e96a285d143cf620b3ae7f8eb76d0f09287aafe798455a384
THIRD_PARTY_NOTICES.md 2c15e3257c2c439d9972d18ad56f6209261d2a65ced43f3cf158d27d9fde2814

Check one in PowerShell with Get-FileHash <file>.


© 2026 Darren Marshall. Dialect is independently developed and isn't affiliated with, endorsed or sponsored by Juniper Networks or Cisco Systems. Juniper and Junos are trademarks of Juniper Networks, Inc.; Cisco, IOS, IOS-XE, NX-OS and IOS-XR are trademarks of Cisco Systems, Inc.