unnamed User Guide
1. What is this site?
- Write, compile, run and judge code in your browser.
- The local sandbox supports C++ and Python 3.
- Compiling and running both happen on your device. Your code never leaves this machine.
- No sign-up, no login.
- You can install it as a standalone window app and use it offline.
Default layout: sidebar on the left, editor on the right.
The sidebar holds two panels: Explorer and Test cases.
2. How do I run code in the browser?
- Download the local runtime. Click the gear icon in the sidebar header, open the Settings tab, then go to Local runtime.
- Click Download next to C++ or Python 3. Roughly 50MB and 24MB, downloaded once each.
- Wait for the button to read Ready. The current stage is announced while it downloads.
- Make sure the engine under Judge is Local WASM sandbox. That is the default for new visitors, and it needs no service URL.
- Press ⌘/Ctrl + Enter, or click the ▶ in the footer of the Test cases panel.
The sidebar expands automatically before a run and switches to Test cases.
Need the space back? The Ready row has Uninstall on the right.
- The runtime is downloaded once, and later page loads hit the cache.
- One download is enough to run offline: the editor, the test cases and the sandbox all live on your machine.
- Clear your browser data and you will have to download it again.
- Python is not compiled — it runs straight in the interpreter.
- C++ compiles only the file you have open, and local headers are not included.
- Python can import modules from the same folder.
- File reads and writes inside the sandbox stay in memory. They are never written back to your workspace.
3. Which judge engine should I pick?
Switch it under Settings › Judge.
| Engine | Where it runs | Needs a service URL? | Needs the network? |
|---|---|---|---|
| Local WASM sandbox (default) | Your own browser; supports C++ and Python 3 | No — it is a built-in engine | Downloads the runtime once, then works offline |
| Piston | A judge service you host yourself | Yes | Yes |
| Judge0 | A judge service you host yourself | Yes | Yes |
| Self-test (does not run code) | A local demo | No | No |
A remote engine means hosting the service yourself and entering its URL under Judge.
- Once you switch to Piston or Judge0, your code is sent to the URL you entered.
- Self-test does not run code. It echoes the standard input back, for exercising the UI.
4. How fast is it in the browser?
There is no single scaling factor.
These are measurements: Apple M5, headless Chrome.
Both sides run with -O2.
The sandbox uses clang 8.0.1; the native column uses the system clang.
The sandbox column is the run phase — the same thing the card timing measures.
| Case | Sandbox run phase | Native | Ratio |
|---|---|---|---|
| Pure compute, 5×10⁷ rounds of xorshift | 132 ms | 74.4 ms | 1.77× |
| Sequential access, 8×10⁶ ints | 26 ms | 7.4 ms | 3.51× |
| Sorting 500k numbers | 60 ms | 11.8 ms | 5.08× |
| Sorting 2M numbers | 247 ms | 36.7 ms | 6.73× |
- The ratio climbs with memory density, from about 1.8× to about 6.7×.
- The more a workload leans on memory bandwidth, the more it slows down.
- The ratio cannot be extrapolated. Do not use 5× to guess at other code.
- Five samples spread over ≤3 ms, and the output matched native byte for byte. This is not noise.
- Both columns include startup cost: process launch on the native side, WASI instantiation in the sandbox.
- The shorter the run, the more those two constants flatten the ratio.
- On a different machine, both the absolute times and the ratios change.
Why doesn't the empty-program comparison count?
The empty-program comparison is an illusion.
That 4.4 ms on the native side is all process startup.
The 3.0 ms in the sandbox is WASI instantiation.
Neither number contains any computation, so comparing them means nothing.
For a real comparison, look only at the rows that actually compute.
5. How do I import a problem?
Use the CC for Web extension distributed from this site.
- Open Settings › Browser extension: that group detects your browser and offers one matching path — Firefox gets a one-click Firefox version, other Chromium browsers get a Download button plus the manual steps.
- (Chromium) Unzip the downloaded archive.
-
(Chromium) Open
chrome://extensionsin the address bar (edge://extensionson Edge) and turn on Developer mode in the top right. - (Chromium) Click Load unpacked and select the folder you just unzipped.
- Back on this site, click Check again in that group. The status will show the version.
- Open any problem page on an online judge and click the extension icon in the browser toolbar.
- The problem lands in
<year-month>/<OJ>/未分类/, under the workspace root. - The samples replace the contents of the Test cases panel wholesale. No manual copying.
- The code file holds a single line,
// your code here. The solution is yours to write. - Difficulty is yours to fill in: right-click the file › Problem info.
- Re-importing the same problem only refreshes the samples and metadata. Not a character of your solution is touched.
- Problems are identified by Problem URL, not by file name.
- This site has to be open for the extension to deliver anything.
- Firefox is on the Mozilla Add-ons store and installs in one click; neither Chrome nor Edge is listed yet, so those still need the manual load above.
- On phones and tablets only Firefox for Android can install this extension today (Edge for Android does support extensions, but this extension is not on Edge Add-ons yet); Chrome for mobile has no extension support at all — so mobile users should switch to Firefox.
6. How are verdicts and the time limit calculated?
One card per test case, holding the input and the expected output.
The actual-output field below is read-only, with a copy button in its top right.
The blank strip in the middle of a card is the “run this case only” button.
| Verdict | Meaning |
|---|---|
AC |
The program finished normally and its output matches the expected output |
WA |
The program finished normally and its output differs from the expected output |
CE |
Compilation failed |
TLE |
The run exceeded the current time limit |
RE |
Runtime error — the program exited abnormally |
ERR |
An environment problem such as an unreachable judge service. Not a problem with your code |
After you change your code or the input, the previous verdict is marked Result stale.
What exactly do the time limit and the elapsed time measure?
- The run phase only — not compilation, not queueing.
- The run phase includes a fixed sandbox startup cost of a few milliseconds.
- The card timing measures the same thing. No timing is shown if the program never got to run.
- The panel header shows the slowest case of the current run.
- Default: 1 second. To change it: Settings › Judge › Time limit — 1 / 2 / 5 / 10 seconds.
- A time limit stored on the problem takes priority: right-click the file › Problem info › Time limit (s).
- Python gets an extra 0.5 s of startup allowance, so a TLE can arrive up to half a second late.
7. How do I use the file tree?
- The header has two buttons: New file and New folder.
- It goes into whichever row is selected: click a folder to select it (the new entry lands inside it), or click the empty area below the tree to select nothing (it lands in the root).
- To place it somewhere specific: right-click that folder › New file / New folder.
- Type a name and press Enter. Only the stem is selected, so you do not have to retype the extension.
Right-clicking a file also offers Rename and Delete.
What does a new file start with?
A new file is mapped by its extension to a language and filled with that language’s template: .cpp gets the C++ template, .py the Python one and .md the notes template. Code files created by the problem importer use the same templates.
An unrecognized extension (say .c or .txt) yields an empty file. Edit the three templates under Settings › Templates; the text is written as-is with no variable substitution, and Restore default on each one brings the built-in back. The Enable templates switch at the top of that section turns the whole feature off: new files and imported problem code then start empty, while the template text is kept as-is and reused once you switch it back on. Both the switch and the templates travel with cloud sync.
What goes into Problem info?
- Five fields: Problem URL, Judge, Difficulty, Date and Time limit (s).
- Difficulty follows the judge — the two scales are not interchangeable.
- Codeforces and AtCoder use the 800–3500 rating band.
- Luogu uses its eight official levels.
- NowCoder, LeetCode and Other take free text.
- Changing the judge clears the difficulty, so a mismatched value cannot linger.
Imported problems are layered as <year-month>/<OJ>/<difficulty> directly under the workspace root, with the problem title as the file name.
Problem info and captured samples live on the code file itself, so nothing extra shows up in the tree.
The importing extension creates the 未分类 folder under its Chinese name in either interface language.
How do I write notes (Markdown / LaTeX)?
Notes are just a .md file: click New file in the header, rename it to
“notes.md” and press Enter. Open it and a toolbar appears above the editor, with the word count and the
view buttons at its right end.
- 14 toolbar buttons: bold, italic, strikethrough, inline code, heading, quote, bullet list, numbered list, code block, link, image, formula, table and horizontal rule. Hover one to see its shortcut — bold is Mod + B.
- The three view buttons at the right end (editor only / split / preview only) switch the layout at any time, and Mod + \ cycles through them; the button next to them gives the editor the whole window, and Esc leaves it.
- Write formulas as
$inline$and$$on their own line$$; the preview renders them as LaTeX.
The preview needs a one-time renderer download (marked + KaTeX, about 578KB) — like the local runtime, it is downloaded once and can be uninstalled at any time.
Notes are not judged: opening a .md greys out the run button, and Mod + Enter
will not start a compilation.
Add test case is greyed out along with it — test cases hang off the current file, and a file like a note has nowhere to run them. The reason is printed in the panel footer.
8. What shortcuts are there?
On macOS Mod is ⌘; on every other platform it is Ctrl.
| Action | Default combination |
|---|---|
| Run all test cases | Mod + Enter |
| Show / hide the sidebar | Mod + B |
| Switch sidebar panel | Mod + Shift + E |
| Swap the sidebar side | Mod + Shift + B |
| Add a test case | Mod + Alt + Enter |
| Open / close settings | Mod + , |
- These also fire while the editor has focus, and they win over the editor's own bindings.
- To rebind: Settings › Shortcuts, click the field on the right, then press the new combination.
- Press Delete to clear a binding, Esc to cancel recording.
- A combination that clashes with a browser shortcut is rejected, with the reason given.
- Restore defaults puts the whole table above back.
- Once you change them, the run hint in the editor's status bar follows.
9. How do I tweak the interface?
- Switch panels: click the pill switch on the left of the sidebar header.
- Toggle the settings tab: click the gear in that header.
- Collapse the sidebar: single-click the divider between the two columns; click again to expand.
- You can also drag the divider to the edge; drag it back out to expand again.
- Move it to the other side: Settings › Appearance › Sidebar position.
- Scale the interface: Settings › Appearance › Interface scale — 100% by default.
- Change the colours: Settings › Appearance › Theme — dark / light.
Collapsing only hides the sidebar. Neither the test cases nor the expanded folders are lost.
Keyboard: focus the divider with Tab, then nudge the width with ← / →.
On touch screens the divider's hit area widens on its own, which makes it easier to grab.
It only collapses at the very edge and only expands 60px away from it — the two thresholds are deliberately staggered.
10. How do I install it and use it offline?
- Open Settings › App.
- The Install button only lights up once the browser considers the site installable.
- Click Install and confirm the prompt.
- After that, opening it from the desktop or home-screen icon gives you a standalone window with no address bar.
- Once it is installed the button reads Installed and the prompt stops appearing.
- Safari on iPhone / iPad has no such button — use Share → Add to Home Screen instead.
- Toolchains are cached on demand: a language only runs offline once you have used it at least once.
- Offline, the editor, the test cases and the local sandbox keep working. Only Piston and Judge0 stop.
Besides the web version, native builds for macOS, Windows and Android are in development: compiling and running happen natively on your machine instead of in the browser sandbox, so they are faster and can use the full local toolchain. The web version is unaffected and keeps being maintained; download details will be added here once the native builds are ready to ship.
The desktop builds also add a second kind of workspace. Under Settings ›
Workspace you can open a folder on your machine directly: the file tree is that directory
itself, so creating, renaming and deleting all act on real files on disk, and changes made in another editor
are picked up automatically. Problem info and captured samples live in .unnamed/ inside the
folder (never in the files themselves), so they travel with it. To switch back, click
Back to virtual workspace in the same place — the interface reloads.
11. Common questions
Does my code get uploaded to a server?
With the local sandbox, no. Your code never leaves this device.
Switch to Piston or Judge0 and your code is sent to the URL you entered.
Do I need to be online?
Only the first time, to download the runtime — about 50MB.
After that it stays in the cache and works with no network.
Clear your browser data and you will have to download it again.
Which languages are supported?
The local sandbox supports C++ and Python 3.
For anything else, switch to Piston or Judge0.
What you get depends on the service you connect to.
Does the editor autocomplete?
Yes — but only for the three languages it knows: C, C++ and Python (.c, .cpp, .py). Start typing a prefix and the suggestion box appears on its own: arrow keys move through the list, Tab accepts the highlighted entry and Esc dismisses it.
There are three kinds of candidate: keywords, common standard-library names (vector, sort, printf, print) and snippets (main, fori, ifmain). Snippets carry placeholders — press Tab after accepting one to jump between them.
It is a lookup table, not a language service: it does not know your variable names or types, cannot jump to definitions and reports no errors. Words already used in the same file are suggested too. .md and other files are not covered.
Why is the first run so much slower?
The runtime is downloaded on the first run.
After that, the first case of every new piece of code pays the compilation cost once.
Running several cases against the same code compiles it only once.
A precompiled STL header is built in the background during idle time and never blocks you.
It covers only the 5 most common standard library headers. A failure to build it does not affect normal compilation.
Why doesn't the timing match other judges?
The timing here covers the run phase only, excluding compilation and queueing.
So the numbers come out smaller than on platforms that report total time.
Different engines and different machines are not directly comparable either.
Where is my data stored?
Preferences, drafts, test cases and the column split live in localStorage.
The file tree and the file contents live in IndexedDB.
The precompiled header lives in IndexedDB too.
All of it is confined to this browser on this device. Clearing your browser data clears it as well.
Are cloud-synced settings public?
Yes. Reading needs no sign-in, and there are two ways in: open Settings › Cloud sync, enter the Codeforces handle and click Import; or append the handle to the site URL, e.g. https://www.998244353.best/he-jie. Installed as a standalone app (PWA) there is no address bar, so use the former.
Import and Sign in are two different things: importing only pulls a public copy, needs no verification code, and does not bind this device to that handle.
After a successful import, upload or sign-in the address bar switches to site/handle (e.g. https://www.998244353.best/he-jie) — that address records “this is the setup I am using”, so you can bookmark it or send it to someone as is.
So clicking Upload local settings means you agree to make this configuration public.
Only preference keys are uploaded: theme, shortcuts, UI scale, sidebar side, column split, run time limit and the like.
The judge URL you entered, hand-written test cases, the file tree and file contents are never uploaded.
What if the extension cannot grab the problem?
First make sure this site is open in a tab.
Then check whether Browser extension shows a version number.
If it does not, click Check again; if that still fails, reload this page.
A reloaded extension loses touch with a page that has not been refreshed since.
12. Credits and open-source licences
Thanks to the authors and maintainers of the projects below.
The only things written for this site are the interface, the interactions and the judging logic.
Full licence documentation (with the version, licence and placement of every component): Third-party open-source components and licences.
| Component | Licence | What it does here |
|---|---|---|
| Vue | MIT | The interface framework |
| Monaco Editor (Microsoft; the editor core of VS Code) | MIT | The code editor; bundled alongside it are marked (MIT) and DOMPurify (dual-licensed MPL-2.0 or Apache-2.0) |
runno (@runno/wasi) |
MIT | The WASI runtime behind the local sandbox: starts the instance, feeds it input, and interrupts it on a timeout (TLE) |
| LLVM / clang and lld | Apache-2.0 WITH LLVM-exception | The compiler and linker that build C++ locally (wasm build, 8.0.1) |
| wasi-libc | Apache-2.0 WITH LLVM-exception | The C standard library and startup code for that clang |
| libc++ / libc++abi | MIT | The C++ standard library (<vector>, <string> and friends) |
| compiler-rt | Apache-2.0 WITH LLVM-exception | The built-in functions in the compiler's runtime |
| CPython | PSF License | Runs Python 3.11 locally (wasm build) |
| seti-ui | MIT | The C++ icon in the file tree |
| Competitive Companion | MIT | The upstream project of the CC for Web extension (this site uses a fork) |
- The interface uses only the system fonts on your device — no self-hosted or third-party web fonts. The code area additionally bundles three open-source monospace fonts (JetBrains Mono / Fira Code / Cascadia Code), downloaded only when you pick one under Settings › Editor › Font, again with no third-party service involved.
- The app icon and the share image are made for this site.
- The C++ toolchain and the Python interpreter in the table above are upstream prebuilt artefacts (from binji's wasm-clang and the official CPython builds respectively, distributed through runno's project). This site only serves them from its own server and has not modified them.
- Piston (MIT) and Judge0 (GPL-3.0) are external judge services this site talks to. Their code is not part of this site, and you have to deploy the server yourself. The service URL you enter decides where your code is sent.
-
The complete list is on the Third-party open-source components and licences page (generated
from
NOTICE.en.mdin the repository root), with the version, licence and placement of every component. - To reuse the toolchains, icons or code from here somewhere else, follow the licence terms of the corresponding upstream projects above.