The graphical desktop
If you're on a real desktop (not a headless server), window (or gui) from rymsh launches rymwin — a small retro desktop shell with its own independent login (install once with cargo install --path crates/rymwin --force). Its Start menu opens five apps:
| App | What it's for |
|---|---|
| File Manager | Folder tree, create/read/update/delete on your virtual computer. |
| Rymcode | A small editor for writing and running RymScript programs. |
| Browser | An early-Internet-Explorer-style browser for .rym sites — no JavaScript, no forms, just HTML/CSS content and links. |
| Terminal | Most of rymsh's command set in a black-background window, already logged in — no separate login needed. |
| An Outlook-alike client: folders, message list, reading pane, and a full compose window. |
What RymScript is
RymScript is Rymnet's app language: real Python syntax, running on an embedded RustPython interpreter, restricted to a small curated API. There is no real filesystem, network, or process access from a RymScript program — only a sandboxed file API and (as of the latest update) a hand-picked slice of the Python standard library.
Two program types, by file extension:
*.run— terminal programs. Run fromrymshwithrun <name>(looks for/Programs/<name>.run).print()and real, interactiveinput()both work, since a terminal is right there.*.win— desktop programs, run only insiderymwin(Rymcode's Run button, or opened from File Manager). A.winscript definesdef draw(events):returning a list of widget dicts (heading, label, button, text input, checkbox); the runtime calls it once per frame and reacts to what the user did last frame.
File API (both program types)
read_file(path) -> str write_file(path, text) append_file(path, text) list_dir(path='.') -> list[str] exists(path) -> bool remove_file(path) mkdir(path)
Standard library
Importable today: math, cmath, unicodedata, zlib, binascii, csv, struct, random, and per-algorithm hashing (sha256, md5, sha1, sha3, sha512, blake2), plus json_loads(text)/json_dumps(obj) as plain functions rather than a real json module.
Two things behave a little differently than real Python, on purpose: random has no module-level random.random() — make an instance first, random.Random().random(). And hashing is one small module per algorithm rather than a single hashlib dispatcher — sha256.sha256(data).hexdigest(), not hashlib.sha256(data).
Everything that could reach the real filesystem, network, or process table (os, socket, subprocess, ctypes, and the rest) is left out on purpose — not just unregistered, not even compiled into the binary.
Starter examples
Every fresh account's /Programs folder comes seeded with four examples, ready to open and run:
| File | Type | Shows |
|---|---|---|
hello.run | terminal | Basic print()/input() and the file API. |
counter.win | desktop | The draw(events) widget contract with a click counter. |
checksum_tool.run | terminal | sha256, random, and csv working together — hashes a file, generates a confirmation code, logs the result. |
notes.win | desktop | A JSON-backed checklist app using json_loads/json_dumps for persistent storage. |