Skip to content
An experimental JavaScript toolchain
TypeScript JavaScript Other
Branch: master
Clone or download

Latest commit

sebmck Merge pull request #244 from ooflorent/fix_call_expression_fmt
Fix OptionalCallExpression formatting
Latest commit 775d446 Apr 3, 2020


Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Fix CI Mar 21, 2020
.vscode Update snapshots 3 Mar 9, 2020
assets Initial commit Feb 27, 2020
node_modules Add deps Mar 27, 2020
packages Fix OptionalCallExpression formatting Apr 3, 2020
scripts Add source map support Apr 2, 2020
website Fix Docusaurus theme image config Apr 1, 2020
.editorconfig Initial commit Feb 27, 2020
LICENSE Initial commit Feb 27, 2020 Merge branch 'master' into sparse-array Mar 3, 2020
package.json Move vscode from editor namespace to integration Mar 29, 2020
tsconfig.json Enable TypeScript noImplicitReturn option Mar 31, 2020

Rome, logo of an ancient Greek spartan helmet

Rome is an experimental JavaScript toolchain. It includes a compiler, linter, formatter, bundler, testing framework and more. It aims to be a comprehensive tool for anything related to the processing of JavaScript source code.

Rome is not a collection of existing tools. All components are custom and use no third-party dependencies.

Rome is experimental and in active development. It's open for contributors and those interested in experimental tools. It is not ready for production usage. The only way to use it is to build from source.

Rome aims to be a replacement for many existing JavaScript tools. We will, however, offer integrations for components in other tools. For example, using the Rome compiler as a plugin for another bundler.

Rome is MIT licensed, and the project managed under the Contributor Covenant Code of Conduct.


Rome was started by Sebastian McKenzie, the author of Babel and Yarn.

Rome is a project from the React Native team at Facebook.

Rome gets its name from proverbs such as "All Roads Lead to Rome", "Rome wasn't built in a day" and "When in Rome, do as the Romans do". This refers to the expansive scope and the desire for conformity across the project. It started as a joke at the office.

Rome has a logo of an ancient Greek spartan helmet. It's not very relevant since it's not Roman, but it looks cooler than a Galea.


Rome is written completely in TypeScript with sparing usage of loose types.

Rome is a monorepo with internal packages to delineate code boundaries.

Rome is self-hosted and compiles itself with an old version.

Rome supports processing JSX as well as Flow and TypeScript annotated code.

See CONTRIBUTING for more information.


The current area of focus is linting. See the umbrella task #20 for tracking.

Getting Started

To setup Rome in a project, all you need is a rome.json file.

$ mkdir hello-world
$ cd hello-world
$ echo '{}' >rome.json

This file is used to configure Rome and indicates the boundaries of your project.

See Getting Started for more usage instructions.


This list includes general ethos the project should abide by. This list is not comprehensive. Some of these are obvious but are stated for completeness.

Project Management

  • Set clear expectations. Make project intent and decisions known well in advance. Nothing should be a surprise.
  • Transparency. No back-channel project management. Project conversation and decisions will take place only on public forums such as GitHub, the Rome Discord, and Twitter. The only exception to this is moderation decisions which will be strictly done in private.


  • No external dependencies. This allows us to develop faster and provide a more cohesive experience by integrating internal libraries more tightly and sharing concepts and abstractions. There always exist opportunities to have a better experience by having something purpose-built.
  • Errors should suggest fixes and hints where possible. These should be inferred and filtered from usage to reduce surfacing irrelevant and unhelpful messages.
  • Unique and specific error messages. No generic error messages. This not only helps users understand what went wrong, but should provide maintainers with a unique call site and the necessary information to debug.
  • Minimize API. Question the existence of all options and flags. Are they necessary? Can they be combined? How can we reduce code branching?
  • Reduce jargon. Don't assume that users will understand specific terminology. Strive to provide clear meaning for experts and beginners. For example, use "character" where you would traditionally use "token" when producing parser errors.
  • Utilize verbosity when naming commands and flags. No unnecessary and confusing abbreviations.
  • Use inclusive terminology. Use gender-neutral pronouns. No ableist slurs. No usage of terms that could be considered insensitive.
  • Build for generic clients. Don't assume that output will only be consumed by a terminal and using ANSI codes. Use abstractions that could be generalized for viewing in an IDE, browser, or other environments.
  • Use strong types. Don't use loose types such as any. Where possible, refine and validate input. Aim for sound types.
  • Terminal output should be unambiguous. When designing terminal output, don't purely rely on formatting cues such as color. Always use a combination of formatting, symbols, and spacing. If all ANSI codes are stripped, all the output should still be understood.


Contribution and development instructions can be found in CONTRIBUTING.

Additional project coordination and realtime discussion happens on our Discord server. Remember that all activity on the Discord is still moderated and will be strictly enforced under the project's Code of Conduct.

You can’t perform that action at this time.