No project description provided
Project description
Oscilla
Oscilla is a platform for building and hosting text-based adventure games. Games are defined entirely as YAML content manifests — regions, locations, adventures, items, enemies, quests, and more — with no code required to create a new game.
The engine ships two interfaces over the same core:
- Web application — a SvelteKit frontend backed by a FastAPI REST + SSE API, with user accounts, persistent characters, and a browser-based play experience.
- TUI — a Textual full-screen terminal application that runs entirely locally against a local SQLite database, with no server required.
For a full architectural overview, see docs/system-overview.md.
Playing via the Web
The easiest way to run the web stack is with Docker Compose:
git clone https://github.com/tedivm/oscilla.git
cd oscilla
docker compose up -d
The application is then available at http://localhost. A default developer account is seeded automatically:
- Email:
dev@example.com - Password:
devpassword
For production deployment — environment variables, PostgreSQL, Redis, TLS, and migration procedure — see the Deployment Guide.
Playing Locally via the TUI
The TUI runs entirely from the command line with no server or account required. It uses a local SQLite database for character persistence.
Install from PyPI:
pip install oscilla
# or, with uv:
uv tool install oscilla
Install from source:
git clone https://github.com/tedivm/oscilla.git
cd oscilla
make install
Oscilla requires a game library — a directory of game packages, each containing YAML manifests. By default it looks for a content/ directory in the working directory. Point it elsewhere with GAMES_PATH.
# Validate content before playing
oscilla validate
# Launch the TUI (choose from available games)
oscilla game
# Jump directly into a specific game
oscilla game --game my-game
# Use a custom game library directory
GAMES_PATH=/path/to/games oscilla game
The game command resolves your identity from USER@hostname and stores save data in a platform-appropriate data directory. Run oscilla data-path to see where that is on your system.
For the full CLI reference, see docs/dev/cli.md.
Game Library Layout
A game library is a directory of game packages. Each package is a subdirectory containing a game.yaml.
content/ # GAMES_PATH root
my-game/ # one game package
game.yaml
character_config.yaml
regions/
starting-region.yaml
adventures/
intro.yaml
Multiple game packages can coexist in the same library. Oscilla loads all of them at startup.
Writing Game Content
Games are defined entirely in YAML. No code is required to create a new adventure, enemy, item, quest, or region. The content system supports:
- A hierarchical world of regions and locations with unlock conditions
- Multi-step adventures with narrative text, choices, combat, stat checks, and skill menus
- Items, equipment slots, crafting recipes, and loot tables
- A skill and buff system for both players and enemies
- Multi-stage quests with milestone-driven progression
- Archetypes for persistent character states (class, faction, condition)
- An opt-in in-game calendar with cycles, eras, and time-based conditions
- Jinja2 templates for dynamic narrative text and numeric formulas
Getting started with content authoring: docs/authors/getting-started.md
Full authoring reference: docs/authors/README.md
Author CLI tools (validate, test, scaffold, graph, trace): docs/authors/cli.md
# Validate all content
oscilla validate
# List all loaded manifests of a given kind
oscilla content list Adventure --game my-game
# Run the engine against a specific adventure and print results
oscilla content test my-adventure --game my-game
# Scaffold a new manifest
oscilla content create Adventure --game my-game
Contributing
git clone https://github.com/tedivm/oscilla.git
cd oscilla
make install # install dependencies and set up .venv
cp .env.example .env # configure local settings
docker compose up -d # start database, Redis, and other services
make tests # run the full test and lint suite
make chores # auto-fix formatting
Architecture and codebase reference: docs/system-overview.md
Developer documentation index: docs/dev/README.md
All documentation: docs/README.md
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file oscilla-0.1.4.tar.gz.
File metadata
- Download URL: oscilla-0.1.4.tar.gz
- Upload date:
- Size: 1.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2905466c882cc923ee8b886e8726f4d258b1299d56ece7bff6bec25c0503839
|
|
| MD5 |
044624d5f278503fd5547537f9cdac0e
|
|
| BLAKE2b-256 |
ffeb21c31bc2054e66b4e51d560e0fac2b2c0ed874e2fec4abbba21ba85be228
|
Provenance
The following attestation bundles were made for oscilla-0.1.4.tar.gz:
Publisher:
pypi.yaml on tedivm/oscilla
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oscilla-0.1.4.tar.gz -
Subject digest:
e2905466c882cc923ee8b886e8726f4d258b1299d56ece7bff6bec25c0503839 - Sigstore transparency entry: 1334095767
- Sigstore integration time:
-
Permalink:
tedivm/oscilla@9193cd40db3cbce78669e85cc8699676e94b537b -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/tedivm
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yaml@9193cd40db3cbce78669e85cc8699676e94b537b -
Trigger Event:
push
-
Statement type:
File details
Details for the file oscilla-0.1.4-py3-none-any.whl.
File metadata
- Download URL: oscilla-0.1.4-py3-none-any.whl
- Upload date:
- Size: 1.7 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3d237b7873dc53a7e577e150ba4b52f518059fc24a33947525b668f5b8fb94c5
|
|
| MD5 |
9bf7a050761bb14a5a8e54cb50c28876
|
|
| BLAKE2b-256 |
8415e275d2659228cf13516921d81bbb76d466cb339845a82810ff79243e1aa3
|
Provenance
The following attestation bundles were made for oscilla-0.1.4-py3-none-any.whl:
Publisher:
pypi.yaml on tedivm/oscilla
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oscilla-0.1.4-py3-none-any.whl -
Subject digest:
3d237b7873dc53a7e577e150ba4b52f518059fc24a33947525b668f5b8fb94c5 - Sigstore transparency entry: 1334095948
- Sigstore integration time:
-
Permalink:
tedivm/oscilla@9193cd40db3cbce78669e85cc8699676e94b537b -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/tedivm
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yaml@9193cd40db3cbce78669e85cc8699676e94b537b -
Trigger Event:
push
-
Statement type: