Translation that stays beside what you are reading.
A native macOS translation layer that appears on intent, stays close to the source, and gets out of the way.
Light up a translation beside the source, read it, and continue without leaving your work.
简体中文 · English · 日本語 · Français · Español · Deutsch · 한국어
Marla introduction homepage · Download (GitHub Releases) · GitHub
Why Marla · Workflows · Privacy · Development · Documentation
Watch the real Marla workflow (MP4)
Real native macOS app capture. GitHub opens the MP4 in its media viewer.
Marla's introduction homepage is in website/. When you are ready to download, go to GitHub Releases; the source code and development records are in the GitHub repository. The repository is still being prepared for release, so the Releases page may not yet contain downloadable assets.
Most translation tools become another destination. Marla keeps the user's current application as the primary surface: invoke it with a shortcut, read a nearby result, dismiss it, and continue from the same place.
- Stays in place. Selection and screenshot results appear in a nearby native card instead of a main translation window.
- Shows intent immediately. The stable result surface appears before the network response and grows with streamed content.
- Preserves structure. Quick Input and supported rich selections keep semantic Markdown through translation and native rendering.
- Keeps providers replaceable. Named profiles support OpenAI-compatible Chat Completions, OpenAI Responses, Anthropic Messages, and Google Gemini Generate Content, with an explicit endpoint and model choice.
| Entry | Default shortcut | What happens |
|---|---|---|
| Selected text | ⌃⇧D |
Marla safely acquires the current selection and streams a result beside the source. |
| Screen region | ⌃⇧S |
Frozen frames across displays support region, element, and window selection. Vision OCR is the default; cloud GLM-OCR or local Ollama glm-ocr can be selected explicitly. |
| Quick Input | ⌃⇧Space |
A compact editor translates typed or pasted content, including supported Markdown structure. |
Optional experiment: Independent in-place screenshot translation is disabled by default and can be enabled in the experimental settings. Its configurable default shortcut is ⌃⇧I. It uses cloud GLM-OCR to reconstruct reliable text blocks over only the selected frozen crop, stays in memory, and can be dismissed immediately. Ordinary screenshot translation keeps using the nearby card.
The shortcuts are configurable. Completed results support comparison, copy, retry, system speech, pinning, language changes, and provider switching without turning Marla into a document workspace.
Explicit trigger
→ SwiftUI / AppKit acquisition and presentation
→ versioned in-process C ABI
→ embedded Rust core for providers, streaming, normalization, and cancellation
→ nearby native result surface
Marla is a Swift 6 macOS app with SwiftUI for durable surfaces and AppKit for menu-bar, panel, focus, and screen-level behavior. The Rust 2024 core is embedded as a static library: there is no localhost backend or separate always-running service.
| Path | Current boundary |
|---|---|
| Selection translation | Only an explicitly triggered, protected Copy transaction may provide content. Accessibility is used for permission and positioning, not as a hidden text source. |
| Vision screenshot OCR | The selected screenshot crop remains local for OCR. Text translation may still use the configured cloud provider. |
| Cloud GLM-OCR | Only the selected crop is uploaded after explicit selection under the Settings disclosure, or when the user invokes the enabled in-place experiment. |
| Local Ollama GLM-OCR | The selected crop goes only to the user-managed local Ollama glm-ocr service. Marla does not bundle, install, or start Ollama or its model; text translation may still use a cloud provider. |
| Storage | Screenshots and recent translations stay in memory only; credentials are stored in Keychain. Persistent translation history and contextual window-text collection are not implemented. |
Marla does not claim to be fully offline. The exact provider, OCR, and data boundaries are intentionally visible rather than collapsed into a single privacy slogan.
Marla's current product language set contains seven options:
| Language | Code |
|---|---|
| Simplified Chinese | zh-Hans |
| English | en |
| Japanese | ja |
| French | fr |
| Spanish | es |
| German | de |
| Korean | ko |
Traditional Chinese is normalized to the Simplified Chinese product option and is not a separate preference. Provider documentation may list more languages; Marla does not claim those languages as product-supported until detection, routing, UI, and provider mapping are verified together.
Marla remains in Incubation / Unreleased while its public entry points are being prepared. The native application and its core workflows are implemented, but no public Release, assigned product version, notarized package, or updater has been declared yet.
- Verified development status
- Product definition
- Architecture
- Paper Lantern brand
- Marla introduction homepage
- Website implementation notes
Thanks to the open-source project Snow Shot. Its element snapping, wheel navigation through parent and child levels, background query scheduling, and interruptible selection transitions informed Marla’s screenshot element selection. Its fluid interaction was an important reference for this feature.
We studied a fixed Snow Shot source revision and implemented the feature independently in Swift/AppKit, without importing its source code or dependencies. Marla’s immediate retargeting on pointer movement, one-level-per-trackpad-gesture behavior, and animation timing were adjusted through hands-on feedback. See TASK-054 for implementation and verification records.
Marla’s original code, build scripts, documentation and original project assets are licensed under GNU GPL v3 only (GPL-3.0-only), to the extent of the owner’s rights. See LICENSE, COPYRIGHT, the bilingual licensing and source-distribution guide, and third-party notices. Modification, redistribution and commercial use are permitted under the GPL; there is no noncommercial restriction. Third-party material retains its original terms. The website’s GSAP dependencies have an unresolved GPL compatibility conflict; this grant does not relicense them or claim the combined website build is GPL compatible.
- macOS 14 or later on Apple Silicon
- Xcode 26.5 or a compatible full Xcode installation
- Swift 6.2 or later
- Rust 1.85 or later
Run the complete repository check:
./scripts/check.shThe script checks Rust formatting, builds and tests the Rust core and Swift layer, builds the native Debug app against the Cargo debug library, validates the project structure, and checks the diff. It selects the full Xcode installation only for its own commands and does not change the machine-wide xcode-select setting.
Build the fixed-path, stable-signed Release development app:
./scripts/build-test-app.shThe verified artifact is written to artifacts/Marla_dev.app with the development-only Marketing Version 0.0.0. This numeric value is bundle metadata, not a public release version.
First local signed build
The packaging script requires a stable local code-signing identity and never silently falls back to ad-hoc signing. Pass an identity name or certificate hash reported by security find-identity -v -p codesigning:
MARLA_CODE_SIGN_IDENTITY="Your Local Code Signing Identity" \
./scripts/build-test-app.shLater no-argument builds recover the certificate hash from the existing fixed app and verify that its designated requirement remains stable before replacement. This supports local testing only; it does not provide Developer ID distribution, notarization, or automatic TCC approval.
| Path | Role |
|---|---|
Sources/MarlaApp/ |
SwiftUI/AppKit application, acquisition, settings, sessions, and presentation |
Sources/MarlaCore/ |
Swift-facing bridge models and provider contracts |
Sources/MarlaRustFFI/ |
Versioned C bridge between Swift and Rust |
rust/marla-core/ |
Embedded provider, streaming, OCR normalization, and cancellation core |
website/ |
Independent React/Vite product-homepage prototype |
docs/ |
Product truth, architecture, Tasks, status, and verification evidence |
scripts/ |
Repository checks, packaging, and artifact verification |
Start with the documentation map, then read the current status and the Task explicitly assigned to your conversation/worktree before making changes. The repository keeps product ideas, confirmed backlog, active implementation, and verified evidence deliberately separate.
Paper Lantern: a little light beside the reader.