{"id":50409649,"url":"https://github.com/involvex/shelly-app","last_synced_at":"2026-05-31T03:02:10.433Z","repository":{"id":346189485,"uuid":"1188733666","full_name":"involvex/shelly-app","owner":"involvex","description":"Shelly is a robust, seamless SSH client specifically designed for Android and optimized for Windows PowerShell environments. ","archived":false,"fork":false,"pushed_at":"2026-04-04T09:55:59.000Z","size":3520,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-02T19:41:43.418Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/involvex.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":["involvex"],"custom":["https://buymeacoffee.com/involvex","https://paypal.me/involvex","https://rewards.bing.com/welcome?rh=14525F68\u0026ref=rafsrchae\u0026form=ML2XE3\u0026OCID=ML2XE3\u0026PUBL=RewardsDO\u0026CREA=ML2XE3"]}},"created_at":"2026-03-22T14:09:11.000Z","updated_at":"2026-04-04T09:54:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/involvex/shelly-app","commit_stats":null,"previous_names":["involvex/shelly-app"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/involvex/shelly-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/involvex%2Fshelly-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/involvex%2Fshelly-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/involvex%2Fshelly-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/involvex%2Fshelly-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/involvex","download_url":"https://codeload.github.com/involvex/shelly-app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/involvex%2Fshelly-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33717419,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-31T03:02:09.637Z","updated_at":"2026-05-31T03:02:10.428Z","avatar_url":"https://github.com/involvex.png","language":"TypeScript","funding_links":["https://github.com/sponsors/involvex","https://buymeacoffee.com/involvex","https://paypal.me/involvex","https://rewards.bing.com/welcome?rh=14525F68\u0026ref=rafsrchae\u0026form=ML2XE3\u0026OCID=ML2XE3\u0026PUBL=RewardsDO\u0026CREA=ML2XE3"],"categories":[],"sub_categories":[],"readme":"# Shelly SSH Terminal 🚀\n\n![Expo](https://img.shields.io/badge/Expo-55.0-black?style=flat-square\u0026logo=expo)\n![React Native](https://img.shields.io/badge/React_Native-0.83.2-blue?style=flat-square\u0026logo=react)\n![Bun](https://img.shields.io/badge/Bun-1.2-fbf0df?style=flat-square\u0026logo=bun)\n![License](https://img.shields.io/badge/license-MIT-green?style=flat-square)\n\n[![Build Android Debug APK](https://github.com/involvex/shelly-app/actions/workflows/android-debug-build.yml/badge.svg)](https://github.com/involvex/shelly-app/actions/workflows/android-debug-build.yml)\n\nShelly is a robust, seamless SSH client specifically designed for Android and optimized for Windows PowerShell environments. It combines the power of `xterm.js` with the flexibility of React Native to provide a professional terminal experience on the go.\n\n## 🌟 Key Features\n\n- **XTerm.js Powered Terminal**: Full terminal emulation with support for colors, resizing, and complex escape sequences.\n- **PowerShell Optimization**: Tailored experience for connecting to Windows PowerShell over SSH.\n- **Productivity Toolbar**: Quick access to essential keys like `Tab`, `Ctrl`, `Esc`, and `Arrow Keys` right above the keyboard.\n- **Snippet System**: Save, manage, and execute frequently used commands with a single tap.\n- **Local SSH Discovery**: Scan the current LAN for reachable SSH hosts on port 22 from the app.\n- **Password and Key Auth**: Connect with either passwords or pasted private keys, including optional key passphrases.\n- **Secure by Design**: Biometric authentication support (Windows Hello style) and secure credential storage.\n- **Themable UI**: Modern, dark-first design powered by **NativeWind** (Tailwind CSS).\n- **Hybrid Dev Strategy**: Supports **Expo Go** for rapid UI iteration using a mock SSH provider.\n\n## 🛠️ Tech Stack\n\n- **Framework**: [Expo](https://expo.dev/) (React Native)\n- **Runtime**: [Bun](https://bun.sh/)\n- **Styling**: [NativeWind](https://www.nativewind.dev/) (Tailwind CSS)\n- **Terminal Engine**: [xterm.js](https://xtermjs.org/) via `react-native-webview`\n- **State Management**: [Zustand](https://github.com/pmndrs/zustand)\n- **SSH/SFTP**: `@dylankenneally/react-native-ssh-sftp`\n- **Navigation**: Expo Router (File-based routing)\n\n## 📁 Project Structure\n\nThe project uses a monorepo structure managed by Bun workspaces:\n\n```text\nssh-powershell-shell/\n├── apps/\n│   └── mobile/           # Main Expo application\n│       ├── src/\n│       │   ├── app/      # Expo Router routes\n│       │   ├── components/# Reusable UI components\n│       │   ├── services/ # SSH and Business logic\n│       │   └── store/    # Zustand state stores\n├── packages/\n│   └── shared/           # Shared types and utilities\n└── Plans/                # Project roadmap and architecture docs\n```\n\n## 🚀 Getting Started\n\n### Prerequisites\n\n- [Bun](https://bun.sh/) installed on your machine.\n- [Expo Go](https://expo.dev/client) app installed on your Android/iOS device (for UI testing).\n- Android Studio / Xcode (for native development).\n\n### Installation\n\n1. Clone the repository:\n\n   ```bash\n   git clone https://github.com/involvex/shelly-app.git\n   cd ssh-powershell-shell\n   ```\n\n2. Install dependencies:\n\n   ```bash\n   bun install\n   ```\n\n### Running the App\n\n#### UI/UX Development (Expo Go)\n\nFor rapid UI iteration, Shelly uses a **Mock SSH Service** that allows you to test the terminal interface without a real connection:\n\n```bash\nbun run start:app\n```\n\n_Note: Real SSH connections and local SSH discovery are not supported in standard Expo Go._\n\n#### Native Development (Dev Client)\n\nTo use real SSH sockets and biometric authentication, you must use a development build:\n\n```bash\n# Generate native folders and build\nbun run build:app\n\n# Run on Android\nbun run android\n\n# Run on iOS\nbun run ios\n\n# Start Metro over LAN for a device on the same Wi-Fi\nbun run -F @shelly/mobile start:lan\n\n# Fallback when LAN routing or host headers are unreliable\nbun run -F @shelly/mobile start:tunnel\n```\n\nIf the dev client shows a Metro error like `No host header was found`, restart Metro with `start:lan` first. If Windows firewall, router isolation, or local DNS still interferes, switch to `start:tunnel`.\n\n### Local Discovery\n\nLocal discovery scans the current subnet for reachable SSH services on port 22.\n\n- Use a development build, not Expo Go.\n- Keep the phone and target machines on the same Wi-Fi.\n- The current implementation falls back to a `/24` subnet scan when Expo does not expose the subnet mask.\n- If discovery finds no devices, verify that SSH is enabled on the target host, Windows Firewall allows inbound port 22, and the router is not using AP/client isolation.\n\n### Authentication\n\nShelly supports two authentication modes in both quick connect and saved profiles:\n\n- `Password`: stores the password in secure storage.\n- `SSH Key`: stores pasted private key material and an optional passphrase in secure storage.\n\nKey generation and external providers such as `sshid.io` are not integrated yet. The current implementation supports importing existing key material by pasting it into the profile or quick-connect form.\n\nPlanned next steps for SSH key support:\n\n- In-app keypair generation with secure local storage.\n- Cleaner import flows from files, clipboard, or share targets.\n- A future `sshid.io` integration path once the local key-management pipeline is stable.\n\n## 📜 Available Scripts\n\n- `bun run start:app`: Starts the Expo development server in LAN mode.\n- `bun run -F @shelly/mobile start:lan`: Starts Metro in LAN mode and clears cache.\n- `bun run -F @shelly/mobile start:tunnel`: Starts Metro in tunnel mode and clears cache.\n- `bun run build:app`: Performs expo prebuild for native functionality.\n- `bun run typecheck`: Runs TypeScript compiler checks.\n- `bun run lint`: Checks code for style and errors with ESLint.\n- `bun run format`: Formats the codebase using Prettier.\n\n`bun run check:app` keeps `expo install --check` in the validation path, but treats Expo Doctor as advisory. This repo keeps `apps/mobile/android/` in the workspace, so Doctor can warn about non-CNG config sync, and Bun installs can occasionally trigger duplicate-native-module warnings in `node_modules` even when app code is unchanged.\n\n## 🛠️ Configuration\n\nShelly can be configured via `app.json` and environment variables. Key native configurations (like SSH bindings) are handled during the `prebuild` phase.\n\n## 🤝 Contributing\n\nWe welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) (coming soon) for more details.\n\n1. Fork the Project\n2. Create your Feature Branch (`git checkout -b feature/AmazingFeature`)\n3. Commit your Changes (`git commit -m 'Add some AmazingFeature'`)\n4. Push to the Branch (`git push origin feature/AmazingFeature`)\n5. Open a Pull Request\n\n## 📄 License\n\nDistributed under the MIT License. See `LICENSE` for more information.\n\n## 👤 Author\n\n- **involvex**\n\n- GitHub: [@involvex](https://github.com/involvex)\n- Sponsor: [Support my work](https://github.com/sponsors/involvex)\n\n## 🙏 Acknowledgments\n\n- [XTerm.js](https://xtermjs.org/) for the incredible terminal engine.\n- [NativeWind](https://nativewind.dev/) for making styling React Native a breeze.\n- [Expo](https://expo.dev/) for the amazing development workflow.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finvolvex%2Fshelly-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finvolvex%2Fshelly-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finvolvex%2Fshelly-app/lists"}