{"id":49534383,"url":"https://github.com/kiefer-networks/falco","last_synced_at":"2026-05-02T09:05:25.344Z","repository":{"id":355028109,"uuid":"1226146464","full_name":"Kiefer-Networks/Falco","owner":"Kiefer-Networks","description":"Privacy-respecting Hetzner Manager for Android (Cloud, Robot, DNS, Storage Box, S3 Object Storage)","archived":false,"fork":false,"pushed_at":"2026-05-01T13:02:41.000Z","size":719,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-01T15:06:31.401Z","etag":null,"topics":["android","foss","hetzner","hetzner-cloud","hetzner-dns","hetzner-robot","jetpack-compose","kotlin","privacy","s3"],"latest_commit_sha":null,"homepage":"https://github.com/Kiefer-Networks/Falco","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Kiefer-Networks.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-01T02:59:20.000Z","updated_at":"2026-05-01T13:02:43.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Kiefer-Networks/Falco","commit_stats":null,"previous_names":["kiefer-networks/falco"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/Kiefer-Networks/Falco","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kiefer-Networks%2FFalco","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kiefer-Networks%2FFalco/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kiefer-Networks%2FFalco/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kiefer-Networks%2FFalco/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Kiefer-Networks","download_url":"https://codeload.github.com/Kiefer-Networks/Falco/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Kiefer-Networks%2FFalco/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32528665,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-02T01:12:54.858Z","status":"online","status_checked_at":"2026-05-02T02:00:05.923Z","response_time":132,"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":["android","foss","hetzner","hetzner-cloud","hetzner-dns","hetzner-robot","jetpack-compose","kotlin","privacy","s3"],"created_at":"2026-05-02T09:05:08.034Z","updated_at":"2026-05-02T09:05:25.335Z","avatar_url":"https://github.com/Kiefer-Networks.png","language":"Kotlin","funding_links":["https://de.liberapay.com/beli3ver","https://de.liberapay.com/beli3ver)*"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# Falco — Hetzner Manager for Android\n\n[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](LICENSE)\n[![CI](https://github.com/Kiefer-Networks/Falco/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/Kiefer-Networks/Falco/actions/workflows/ci.yml?query=branch%3Amain)\n[![Donate](https://img.shields.io/badge/donate-Liberapay-F6C915?style=flat\u0026logo=liberapay)](https://de.liberapay.com/beli3ver)\n\nPrivacy-respecting Android client for [Hetzner Online](https://www.hetzner.com).\nManage **Hetzner Cloud**, **Robot** (dedicated servers + Storage Boxes),\n**DNS Console** and **Object Storage** from one secure app.\n\n\u003c/div\u003e\n\n\u003e Falco is community software and is **not affiliated** with Hetzner Online GmbH.\n\u003e Hetzner is a trademark of Hetzner Online GmbH.\n\n## Highlights\n\n- **100 % free software** (GPL-3.0-or-later) — no Google Play Services, no\n  Firebase, no proprietary dependencies. Designed to be reproducibly buildable\n  on F-Droid.\n- **Multi-account, multi-project** — switch between Hetzner customers and\n  Cloud projects on the fly. Per-account credentials.\n- **Hardened storage** — credentials in `EncryptedSharedPreferences` with the\n  master key bound to the Android Keystore (StrongBox-backed when available).\n- **Biometric gate** — `BiometricPrompt` (Class 3 / Device Credential) on app\n  start; auto-relock on background timeout.\n- **TLS 1.3 only** with **certificate pinning** for every Hetzner endpoint\n  (Cloud, Robot, DNS, Object Storage). Pins are root anchors so they survive\n  Let's Encrypt's leaf rotation cycle.\n- `FLAG_SECURE` on every screen, `allowBackup=\"false\"`, auto-backup excluded.\n- Localised in **7 languages** (en, de, es, fr, it, ru, zh-CN).\n\n## Features\n\n### Hetzner Cloud\n- Servers: list, detail, metrics, create wizard, power actions, reset password,\n  rebuild, change type, ISO attach/detach, rescue mode, backup toggle, console\n  request, reverse DNS, rename, protection, delete.\n- Volumes: list, create wizard with live price estimate, attach/detach,\n  rename, resize, format, automount, protection, delete.\n- Networks: list, create wizard, subnets add/delete, routes, change IP range,\n  expose to vSwitch, protection, delete.\n- Floating IPs: list, create wizard, assign/unassign, change reverse DNS,\n  protection, delete.\n- Firewalls: list, create, edit rules, apply to / remove from resources.\n- SSH keys: list, create, rename, delete.\n- Primary IPs: list, create, assign/unassign, protection, delete.\n- Load Balancers: list overview *(create + actions wired in repo, UI growing)*.\n- Certificates: upload PEM or request managed (Let's Encrypt) certs, list,\n  delete, retry managed issuance.\n- Placement Groups: list, create, delete.\n- Storage Boxes: full detail screen — list, snapshots, subaccounts, password\n  reset, access toggles (SSH/Samba/WebDAV/ZFS).\n\n### Hetzner Robot\n- Servers: rich list (status dot, chips, IPv4/IPv6 with copy, datacenter,\n  paid-until), detail screen, reset (sw/hw/manual), Wake-on-LAN, rescue mode\n  enable/disable, reverse DNS setter, server cancellation + withdraw.\n- Failover IPs: list, route to active server, unroute.\n- vSwitches: list, create, update, delete, attach/detach servers.\n- SSH keys: list, create, delete.\n\n### DNS Console\n- Zones: list, create, update, delete, single-zone fetch.\n- Records: list, create, update, delete, single-record fetch, **bulk\n  create/update**, BIND import/export, validate.\n- Primary servers (secondary zone sources): full CRUD.\n\n### Object Storage (S3-compatible)\n- Buckets: list, exists, create, delete.\n- Objects: list (prefix browser), upload via foreground service, download via\n  signed URL, head/stat, copy, delete (single + batch), presigned upload URL.\n- Bucket settings: versioning toggle.\n\n## Building\n\nRequires:\n\n- **JDK 17** (set via Gradle toolchain — auto-provisions if absent).\n- **Android SDK 35** (compileSdk).\n- **Kotlin 2.1**, **AGP 8.x**, **Compose BoM 2025.01**.\n\n```sh\ngit clone https://github.com/Kiefer-Networks/Falco.git\ncd Falco\n./gradlew :app:assembleDebug\n```\n\nThe debug APK lands in `app/build/outputs/apk/debug/`.\n\n### Release builds\n\nRelease builds are signed with a real keystore. Provide one via\n`keystore.properties` at the repo root (this file is git-ignored):\n\n```properties\nstoreFile=keystore.jks\nstorePassword=YOUR_STORE_PASSWORD\nkeyAlias=upload\nkeyPassword=YOUR_KEY_PASSWORD\n```\n\nThen:\n\n```sh\n./gradlew :app:assembleRelease   # APK\n./gradlew :app:bundleRelease     # AAB\n```\n\n### Quality gates\n\n```sh\n./gradlew :app:lintDebug          # Android Lint\n./gradlew testDebugUnitTest       # unit tests\n```\n\nCI runs both on every push.\n\n## Architecture\n\n- **UI**: Jetpack Compose + Material 3, single-Activity (Hilt entry point).\n- **DI**: Hilt.\n- **Networking**: Retrofit 2 + OkHttp 4, Kotlin Serialization JSON\n  converter. TLS pinning via `CertificatePinner` (SPKI SHA-256 of trust\n  anchors).\n- **Storage**: Jetpack DataStore for non-sensitive prefs;\n  `EncryptedSharedPreferences` (AES-256-GCM, Keystore master key) for\n  Hetzner tokens / S3 secrets / Robot credentials.\n- **S3**: MinIO Java SDK 8.5 routed through the same hardened OkHttp client\n  so it inherits TLS + pinning policy.\n- **Concurrency**: Kotlin Coroutines + `StateFlow` / `SharedFlow`.\n\n## Permissions\n\n| Permission | Why |\n|---|---|\n| `INTERNET` | API calls (Hetzner + S3). |\n| `ACCESS_NETWORK_STATE` | Network availability checks. |\n| `USE_BIOMETRIC` | Unlock gate. |\n| `POST_NOTIFICATIONS` | Upload-progress notifications (Android 13+). |\n| `FOREGROUND_SERVICE` + `FOREGROUND_SERVICE_DATA_SYNC` | S3 upload service. |\n\nNo location, contacts, broad storage, accounts, or analytics permissions.\n\n## Localisation\n\nThe default language is English. Falco ships with full translations of the\n~530 user-facing strings for: German, Spanish, French, Italian, Russian and\nSimplified Chinese. Help us add more in `app/src/main/res/values-*`.\n\n## Donate\n\nIf Falco saves you time, please consider supporting development via\n**[Liberapay — de.liberapay.com/beli3ver](https://de.liberapay.com/beli3ver)**.\nLiberapay is non-profit, anonymous-friendly and takes no platform cut.\n\n## Contributing\n\nPRs welcome. Please:\n\n1. Match the project's code style (Compose-first, no Views, no XML layouts).\n2. Add strings to **all** seven `values-*/strings.xml` files when introducing\n   user-visible text.\n3. Run `./gradlew :app:lintDebug` and `./gradlew testDebugUnitTest` before\n   opening a PR.\n\n## License\n\n[GPL-3.0-or-later](LICENSE). See [`LICENSE`](LICENSE) for the full text.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkiefer-networks%2Ffalco","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkiefer-networks%2Ffalco","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkiefer-networks%2Ffalco/lists"}