Tandem
Split-pane bilingual reader for language learning. Wide screens show the languages left/right; phones and narrow windows stack them top/bottom. The panes sync-scroll and the divider resizes them. Choose languages and level, then describe the story you want in one free-form prompt — ask for a fresh story or to continue an earlier one. Pick the generation agent (Claude or OpenAI Codex) in settings; tap a word for its exact glossary match or honest aligned-sentence context.
Install
Open the App Store mini-app in your Möbius shell and paste:
https://raw.githubusercontent.com/mobius-os/app-tandem/main/mobius.json
Möbius shows the requested permissions and the cron schedule, then installs.
Manifest
Show mobius.json
{
"id": "tandem",
"name": "Tandem",
"version": "0.13.6",
"description": "Split-pane bilingual reader for language learning. Wide screens show the languages left/right; phones and narrow windows stack them top/bottom. The panes sync-scroll and the divider resizes them. Choose languages and level, then describe the story you want in one free-form prompt — ask for a fresh story or to continue an earlier one. Pick the generation agent (Claude or OpenAI Codex) in settings; tap a word for its exact glossary match or honest aligned-sentence context.",
"offline_capable": true,
"offline": {
"reads": true,
"writes": "queued",
"execution": "none",
"reads_detail": "Previously opened stories, the story index, preferences, and pending-generation state use window.mobius.storage, so cached content remains readable and edits queue while offline. Creating a new story still requires a connection because generation runs on the server."
},
"author": "mobius-os",
"license": "MIT",
"homepage": "https://github.com/mobius-os/app-tandem",
"icon": "icon-v6.png",
"entry": "index.jsx",
"source_files": [
"story-schema.mjs",
"text-align.mjs",
"gen-model.mjs",
"scroll-sync.mjs",
"constants.js",
"signals.js",
"theme.js",
"storage.js",
"ui/useModalFocus.js",
"ui/useShellBackTarget.js",
"ui/Icons.jsx",
"ui/ParaText.jsx",
"ui/StoryReader.jsx",
"ui/GenerateSheet.jsx",
"ui/DeleteConfirmModal.jsx",
"ui/SettingsSheet.jsx",
"ui/LibraryTab.jsx",
"ui/SetupView.jsx"
],
"theme_color": "#0c0f14",
"background_color": "#0c0f14",
"permissions": {
"cross_app_access": "none",
"share_with_apps": "none"
},
"storage_seeds": {
"system-prompt.md": "system-prompt.md"
},
"schedule": {
"job": "generate.sh"
},
"runtime": {
"imports": [
"react",
"react-dom"
],
"esm_deps": []
}
}
Feedback
Something feel off, or want to suggest an iteration? Open an issue at app-tandem/issues — the app's maintainer reads them.