A port of Coq to Javascript -- Run Coq in your Browser
Clone or download
Failed to load latest commit information.
coq-addons [build] Update addons for final 8.8 branches. Apr 17, 2018
coq-js [build] Tweak on JSOO 3.1.0 fixup. Mar 22, 2018
coq-libjs [libjs] Add non-functional wrapper for unix_getcwd Jun 28, 2017
coq-tools [addons] Add ltac2 and Equations Dec 27, 2017
etc [build] Switch to 4.06.0 + js_of_ocaml 3.0.2. Dec 2, 2017
examples [addons] Add ltac2 and Equations Dec 27, 2017
ui-css [build] Group UI directories. Jun 22, 2016
ui-external [codemirror] Update. Mar 26, 2017
ui-images [build] Group UI directories. Jun 22, 2016
ui-js [addons] Add ltac2 and Equations Dec 27, 2017
.eslintrc.js [misc] Mics repo maintenance. Nov 27, 2017
.gitignore [misc] Mics repo maintenance. Nov 27, 2017
.gitmodules [build] Group UI directories. Jun 22, 2016
.travis.yml [build] Switch to 4.06.0 + js_of_ocaml 3.0.2. Dec 2, 2017
HISTORY [build] Move to Ocaml 4.04 Jan 30, 2017
LICENSE [build] Group UI directories. Jun 22, 2016
Makefile [build] Update addons for final 8.8 branches. Apr 17, 2018
Makefile.addons [addons] Fix math-comp coq-pkg install path. Jan 14, 2018
README.md [doc] Add new course (closes #31) Aug 20, 2018
THANKS [doc] Doc/README update, added DESIGN.md Feb 26, 2016
build-common.sh [jscoq] Port to 8.8 Mar 11, 2018
build.sh [travis] Initial setup. Feb 5, 2017
config.mk [jscoq] Port to 8.8 Mar 11, 2018
newhott.html [addons] Reenable HoTT for 8.6. Nov 29, 2016
newide.html [addons] Add ltac2 and Equations Dec 27, 2017
toolchain-setup.sh [build] Fix some missing dependencies for Elpi Dec 5, 2017


Run the Coq Proof Assistant in your browser!

Build Status Gitter

jsCoq is an Online Integrated Development Environment for the Coq proof assistant and runs in your browser! We aim to enable new UI/interaction possibilities and to improve the accessibility of the Coq platform itself. Current stable version is jsCoq 0.8b supporting Coq 8.8, try it:


JsCoq is written in ES2015, thus any standard-compliant browser should work. Chrome (>= 48) and Firefox (>= 45) are reported to work OK, jsCoq also runs in my 5-year old Galaxy Nexus. Browser performance is greatly variable these days, see the Browser Optimization section if you have browser problems.

Coq is compiled to javascript using the js_of_ocaml compiler. No servers or external programs are needed. We want to strongly thank the js_of_ocaml developers. Without their great and quick support jsCoq wouldn't have been possible.

Note: By default, the Coq standard libraries are qualified in jsCoq, thus you need to prefix your imports:

Require Import Lists.
(* should become *)
From Coq Require Import Lists.

You should be able to tweak this behavior using an option, however, due to the large number of packages bundled we recommend you write qualified Coq imports.

Browser Tips and Tricks

Browser performance is very variable these days, it is the case that some jsCoq workloads work better in Firefox and some others work better in Chrome. Browser performance seems to get better at every iteration so we are hopeful about the future.

Are you getting a StackOverflow exception? We recommend using the --js-flags="--harmony-tailcalls" command line flag in Google Chrome; this setup greatly alleviates the problem. Firefox may work better in this regard. Fiferox also seems to do better when loading a lot of libraries is involved.

Older Google Chrome versions that don't use the Ignition engine usually require the chrome://flags/#enable-javascript-harmony flag enabled for heavy workloads.

Warning for Chrome users: be aware of privacy/DRM issues in Chrome bug page. We recommend Chrome just for jsCoq, not for other uses.

Development Version

Development for jsCoq 0.9 takes place in the js-worker branch. This branch provides significant advantages due to Coq being ran in a Worker thread. While the branch is not yet ready for general use, it is the mandatory for developers. A preview build of jsCoq 0.9 is usually available at:


Be warned that the version uploaded to the link is quite unstable. Big structural changes are happening in 0.9, please stop by gitter or by the mailing list if you would to contribute. See below for build instructions.

jsCoq is easy to develop using the Chrome developer tools; the jsCoq object has a debug flag, and it is possible to compile Coq with debug information by setting the makefile variable JSCOQ_DEBUG=yes.

Previous Coq versions can be accessed at:

In the future, we may provide builds corresponding to particular git hashes. See below for more jsCoq versions, including one adapted to HoTT.


A paper describing the ideas behind jsCoq 0.9 has been published in the proceeding of the UITP 2016 workshop. The paper is available from the open access EPTCS proceedings. The recommended citation is:

  author    = {Gallego Arias, Emilio Jes\'us and Pin, Beno\^it and Jouvelot, Pierre},
  year      = {2017},
  title     = {{jsCoq}: Towards Hybrid Theorem Proving Interfaces},
  editor    = {Autexier, Serge and Quaresma, Pedro},
  booktitle = {{\rmfamily Proceedings of the 12th Workshop on}
               User Interfaces for Theorem Provers,
               {\rmfamily Coimbra, Portugal, 2nd July 2016}},
  series    = {Electronic Proceedings in Theoretical Computer Science},
  volume    = {239},
  publisher = {Open Publishing Association},
  pages     = {15-27},
  doi       = {10.4204/EPTCS.239.2},
  issn      = {2075-2180}

Some further ideas behind jsCoq are also discussed in SerAPI: Machine-Friendly, Data-Centric Serialization for COQ. Technical Report


A small pastebin-like server based on haste is available at https://x80.org/collacoq

Note that this is totally experimental, and data loss is guaranteed.

See also the branch at https://github.com/ejgallego/haste-server/tree/collacoq

Help with Collacoq is very welcome!


  • Clearing the browser cache usually solves lots of issues.
  • Consider using --js-flags="--stack-size=65536" in Chrome if you get StackOverflows.
  • Use the --js-flags="--harmony-tailcalls" command line flag.
  • Enable the chrome://flags/#enable-javascript-harmony flag if you get StackOverflows.

API / How to embed in your own webpage

JsCoq provides a coqManager javascript object for embedding Coq in your particular application, blog, or webpage. The basic pattern to add jsCoq to webpage with Coq code is:

  <script src="$path/js/jscoq-loader.js" type="text/javascript"></script>
  <script type="text/javascript">
    loadJsCoq($path).then( () => new CoqManager ($list_of_ids, [$options]) );

where $path is the path the jsCoq distribution, $list_of_ids is the list of textareas that will form the Coq document. See below for available $options.

The jsCoq (landing webpage)[newide.html] is a good actually running example.


JsCoq accepts the following options as an optional second parameter to the constructor:

  • base_path: Path where jsCoq is installed.
  • wrapper_id: id of the div where to attach the panel.
  • all_pkgs, init_pkgs: List of Coq's packages to show/preload.
  • prelude: bool: Whether to load Coq's prelude or not.

Homotopy Type Theory

jsCoq supports the HoTT library which requires a special build of Coq, an online version is at: https://x80.org/rhino-hott/


The main page includes a proof of the infinitude of primes by G. Gonthier. We provide some more examples as a showcase of the tool:


A coqdoc replacement that is better suited to produce jsCoq output while (mostly) remaining compatible is being developed at https://github.com/ejgallego/udoc

It works kind of OK for converting coqdoc files, but it produces some artifacts and omits some declarations.

There also is a superseded experimental version of coqdoc outputting jsCoq at https://github.com/ejgallego/coq/tree/coqdoc

Just build coqdoc normally and use the option --backend=jscoq.

Mailing List

You can subscribe to the jsCoq mailing list at:


The list archives should be also available through Gmane at group:


you can post to the list using nntp.


This is certainly an alpha-status project, but any contribution or comment is really welcome! Please submit your pull request for review to the mailing list using git request-pull. You can also submit a github PR, but it is not guaranteed that we'll look into it.

Reporting Bugs

Feel free to use the issue tracker. Please include your browser/OS/user-agent and command line options.


CodeMirror has played a crucial role in the project, we are very happy with it, thanks a lot!

Please consider supporting the development of CodeMirror with a donation.

What is broken

  • Loading ML modules is slow.
  • Loading .vo files is slow.
  • There surely are threading and performance problems.
  • vm_compute and native_compute are devired to regular compute.

Contact & Sponsorship


jsCoq has been make possible thanks to funding by the FEEVER project.

Contact: Emilio J. Gallego Arias e+jscoq at x80.org.

jsCoq Users:

Incomplete list of places where jsCoq has been used:

jsCoq in the press

How to Install/Build

You can download ready-to-use builds from https://github.com/ejgallego/jscoq-builds/ ; find below the instructions to build JsCoq yourself, it is reasonably easy.

Short instructions:

$ ./toolchain-setup.sh
$ make coq
$ ./build.sh
$ git submodule update --remote
$ cd ui-external/CodeMirror && npm install

Here are the explanations of the steps:

  • First, let's setup a 32-bit Ocaml toolchain. Install a recent opam and a multiarch gcc (gcc-multilib package in Debian/Ubuntu), then:

    $ ./toolchain-setup.sh

    will do the job.

  • Second, build a 32-bit Coq v8.8 and all the libraries to be installed. make coq should do it automatically. jsCoq is compatible with vanilla Coq v8.8.

  • You also need jsCoq's version of CodeMirror:

    $ git submodules update --remote
    $ cd ui-external/CodeMirror && npm install

    hopefully, the Coq mode will be merged in CodeMirror some day.

  • Finally:

    $ ./build.sh

    will build jsCoq. The script manages the 32/64 bit toolchain switching; you can also use make directly if you want finer control over the build process.

  • To run jsCoq locally you need to start your browser with some options:

    $ google-chrome --allow-file-access-from-files --js-flags="--harmony-tailcalls" --js-flags="--stack-size=65536" index.html
  • ?

  • Profit!

Addon Packages:

One of jsCoq's strengths is its support for bundling addon packages. In order to add your Coq package to jsCoq, you need to add a definition file in the coq-addons repository. We recommend you use one of the existing files as a model.

Also, you need to define a jsCoq package by editing the coq-tools/dftlibs.ml file. Once that is done, calling build.sh and make coq should build your package.


JsCoq used to support serialization to Json or Sexps for Coq's internal data structures, but this effort has been split to an independent development. See https://github.com/ejgallego/coq-serapi for more information.

Commit tag conventions [work in progress]:

  • [jscoq]: ML/Coq interface.
  • [ui]: Html/Css commit
  • [cm]: CodeMirror provider.
  • [libs]: Coq Library support and format.
  • [addons]: Addons support.
  • [build]: Build system.


See the etc/notes/ directory for some random notes about the project.