Repository navigation
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 --helpsay it plainly. Dialect reports what it couldn't convert, but
you are responsible for what you deploy. - Nothing to install first. The
dialectcommand is now also a standalonedialect.exewith 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 namedcomein "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 asdenywhere 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-groupwith its LACP mode
(active, passive or on), the Port-channel's minimum links, and on NX-OS thefeature lacpLACP needs. Converting a
Junosae0with its members givesPort-channel1(port-channel1on 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-OSno switchportfor 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 Junos802.3adandaggregated-ether-optionsand IOS-XRbundle idand
bundle minimum-active links, both ways. Converting to Junos also writes thechassis aggregated-devicesline Junos
needs for itsaeinterfaces. - 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 byip ospf … areaornetworkstatements (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 bynetworkstatements 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 Tanduse neighbor-group Gin 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 Junosvrf-importandvrf-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'sset community 65000:1now 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:
ipv4andipv6 access-listentries (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-importandvrf-exportpolicies, 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 flatif … then … else … endifblocks, 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: nestedif,elseif, parameters,
applyand the like are listed as not converted. Converting a Junos policy to IOS-XR adds a finalpass, 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 inetandinet6filters (and the olderfirewall 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
irbwith 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 asVlan100,Vlan200. Before, only one unit could be converted. The other way, Cisco'sVlan100is
suggested as Junos'sirb.100, and VLAN interfaces become units of oneirb. - 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). BGPimportandexportnow 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
featurelines 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 withnetworkstatements 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 bynetwork
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
ae0is suggested as IOSPort-channel1,
NX-OSport-channel1or IOS-XRBundle-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
--mapfile (from,to
lines or JSON). Dialect suggests names (ge-0/0/0→GigabitEthernet0/0/0) but uses none unasked: with interfaces
left unnamed,convertgives their lines and exits 3, unless--allow-incompleteis given.--write-mapwrites
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
setlines Junos prints, with
deactivateandprotectlines 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 containingset, 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.