Nestra is an upcoming cross‑platform desktop application that lets you run web apps (PWA / regular web pages) as if they were native desktop applications. Think of having first‑class, isolated, launchable “apps” for services that don’t ship official Linux (or desktop) clients—such as WhatsApp or Microsoft Teams—while keeping a single lightweight core.
Status: Early design / pre‑alpha. Core implementation is in progress. Community feedback, ideas, and early contributions are welcome.
Provide a unified launcher and runtime that:
- Registers multiple web apps ("Nestra apps") with distinct names, icons, notification preferences, and window behaviors.
- Offers both a multi‑app hub (launch Nestra with no arguments) and single‑app direct launch (
nestra --app <id>), behaving like a real native app window. - Delivers native desktop affordances: tray icon, system notifications, auto‑launch, per‑app cache control, offline mode (future), basic theming, and controlled reload.
- Makes adding a new app as simple as providing a URL and optional metadata.
| Area | Planned Capabilities |
|---|---|
| App Registry | Create, edit, remove web app entries with ID, name, URL, icon, category, tags. |
| Launch Modes | Hub UI listing all apps OR direct single‑app window via CLI flag. |
| Web Engine | Embedded WebView (Flutter webview / platform view abstraction). |
| Isolation | Per‑app cookies/cache (configurable); quick “Clear cache” action. |
| Reload | Manual reload + optional auto‑reload on network regain. |
| Tray Integration | Global tray with quick app switch, reload, mute notifications, quit. |
| Notifications | Native system notifications; future hook to intercept / enhance push (subject to platform limitations). |
| Auto‑Start | Optional enable at OS login (Linux systemd / autostart, Windows Registry/Startup, macOS LaunchAgent). |
| Theming | Light/dark mode + follow system. |
| Shortcuts | Generate desktop/menu launcher entries per app. |
| Security | Content sandboxing defaults, configurable permission prompts (camera / mic / notifications). |
| Updates | Auto‑update channel (future) + change log surfacing. |
| Extensibility | Plugin API (exploration phase). |
The project includes a vector app icon that reflects Nestra’s mission: a stylized “N” with an orbital ring, symbolizing running web apps as first‑class desktop citizens.
- Source:
assets/branding/nestra_icon.svg - Packaged via
pubspec.yamlassets
Generating platform icons (optional):
- Linux: supply
.pngsizes underlinux/runner/resources(48, 64, 128, 256). Many DEs use the app’s.desktopentry icon. - macOS: add an
.icnsto the Xcode asset catalog undermacos/Runner/Assets.xcassets/AppIcon.appiconset. - Windows: update the
.icoinwindows/runner/Runner.rc.
You can export the SVG to sizes: 16, 32, 48, 64, 128, 256, 512, 1024.
Export icons automatically:
- Run the Dart script to export PNGs from the SVG:
- dart run tool/export_icons.dart
- Outputs to
build/icons/nestra/<size>.png
Create Linux desktop entries:
- Hub (Nestra): uses
nestra.desktopunder~/.local/share/applications. - Per app: generates entries like
nestra-<id>.desktopwithExec=nestra --app <id>.
Prerequisites (Linux example):
sudo apt-get update
sudo apt-get install -y libayatana-appindicator3-dev libnotify-devClone and run (Flutter stable recommended):
git clone https://github.com/dip-develop/nestra.git
cd nestra
flutter pub get
flutter run -d linux # or windows / macos when enabledUntil feature implementation lands, the app will run as a minimal Flutter shell.
nestra # Open hub (list of registered apps)
nestra --app <id> # Launch a specific app in standalone window
nestra --register <url> \
--name "My Chat" \
--icon /path/icon.png
nestra --list # Output registered app metadata (JSON)
nestra --clear-cache <id> # Wipe cache/storage for one app
nestra --reset # Factory reset (after confirmation)
- Config file:
~/.config/nestra/config.json(platform‑appropriate path abstraction) containing global settings. - App definitions:
~/.config/nestra/apps/*.jsonone file per app. - Icons cached under:
~/.cache/nestra/icons/. - Environment overrides (example):
NESTRA_DATA_DIR=/custom/pathNESTRA_LOG_LEVEL=debug
Clean Architecture + SOLID:
- Presentation: Flutter widgets + BLoC (state management) + localization (ARB, Flutter gen-l10n).
- Application / Use Cases: Stateless interactors encapsulating business actions (register app, list apps, etc.).
- Domain: Entities (AppDefinition), value objects, repository abstractions.
- Infrastructure: Repository implementations (currently in-memory), future JSON/SQLite persistence & platform services.
- Core: Dependency injection (get_it + injectable), configuration, logging.
- Platform Integration: WebView wrapper, tray, auto-start, notifications via thin, swappable adapters.
Dependency Injection: GetIt container initialized early (codegen with injectable planned; manual bootstrap pre‑alpha).
State Management: flutter_bloc for unidirectional data flow & testability.
Localization: ARB files in lib/l10n/ (English default). Add new language by creating app_<locale>.arb.
See ROADMAP.md for a living roadmap with milestones.
We welcome contributions of all kinds: code, design feedback, docs, issue triage, localization, and testing. Please read CONTRIBUTING.md for detailed guidelines (branch strategy, commit conventions, PR review process) and CODE_OF_CONDUCT.md for community standards.
Quick checklist:
- Open (or find) an issue describing the change.
- Fork → create a feature branch (
feat/short-name). - Keep commits atomic; follow conventional commits style (
feat: add tray mute toggle). - Add/update docs as needed.
- Ensure formatting & static analysis pass (
flutter format,dart analyze). - Open a PR; link the issue; fill out the PR template.
If you discover a vulnerability or privacy concern, DO NOT open a public issue. Instead, follow the instructions in SECURITY.md to report it responsibly.
Project stewardship is led by DIP Dev. See GOVERNANCE.md for roles (Maintainers, Contributors) and decision process.
This project is released under the MIT License (see LICENSE). You are free to use it in commercial and open source projects, with attribution & license inclusion.
“WhatsApp”, “Microsoft Teams”, and all other third‑party product names, logos, and brands are property of their respective owners. Nestra is an independent project and is not affiliated with, endorsed by, or sponsored by those parties.
Existing solutions often either (a) focus on a single app, (b) are electron‑heavy, or (c) don’t cleanly separate multiple web apps with lightweight isolation. Nestra aims for a clean architecture, low overhead, and a straightforward UX for managing many apps at once.
Q: Will it support mobile? No—desktop focus only. Q: Will it intercept proprietary push notifications? Only within platform & legal constraints; many web push flows rely on service workers which we’ll integrate via the underlying WebView where available. Q: Can I export/import my app list? Planned via JSON bundle. Q: Offline mode? Future: optional caching / manifest packaging per app.
Formatting & Lints:
dart format .
dart analyzeRun tests:
flutter testGenerate localization (usually automatic on build):
flutter gen-l10nDI code generation (future when annotations introduced):
dart run build_runner build --delete-conflicting-outputs- Issues: Feature requests, bugs, questions.
- Discussions (future): Architecture debates, plugin ideas, UX sketches.
- Roadmap proposals: Open an issue tagged
proposal.
Copyright (c) 2025 DIP Dev.
If you reference Nestra in academic or technical material, see CITATION.cff.
Made with care by DIP Dev and the community. Contributions welcome!