Möbius OS

← All apps

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.

Works offline
v0.13.6 by mobius-os MIT Source ↗ ★ 0 updated 2026-07-17

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.