{"id":49989111,"url":"https://github.com/60milesperhour/horizon","last_synced_at":"2026-06-12T05:01:02.746Z","repository":{"id":357982895,"uuid":"1239413710","full_name":"60MilesPerHour/Horizon","owner":"60MilesPerHour","description":"Multi-provider AI chat client (Ollama, Claude, OpenAI, Gemini). Per-conversation configs, secure on-device key storage, primary+backup Ollama URL with failover. Flutter, GPL-3.0 fork of Reins.","archived":false,"fork":false,"pushed_at":"2026-06-06T17:54:23.000Z","size":16888,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-06T19:17:49.823Z","etag":null,"topics":["ai-chat","android","anthropic","chat-application","chatbot","claude","dart","flutter","gemini","gpt-4","llm","llm-client","local-llm","macos","ollama","openai","self-hosted","windows"],"latest_commit_sha":null,"homepage":null,"language":"Dart","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/60MilesPerHour.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":null,"dco":null,"cla":null}},"created_at":"2026-05-15T04:21:47.000Z","updated_at":"2026-06-06T17:46:38.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/60MilesPerHour/Horizon","commit_stats":null,"previous_names":["60milesperhour/horizon"],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/60MilesPerHour/Horizon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/60MilesPerHour%2FHorizon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/60MilesPerHour%2FHorizon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/60MilesPerHour%2FHorizon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/60MilesPerHour%2FHorizon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/60MilesPerHour","download_url":"https://codeload.github.com/60MilesPerHour/Horizon/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/60MilesPerHour%2FHorizon/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34229624,"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-06-12T02:00:06.859Z","response_time":109,"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":["ai-chat","android","anthropic","chat-application","chatbot","claude","dart","flutter","gemini","gpt-4","llm","llm-client","local-llm","macos","ollama","openai","self-hosted","windows"],"created_at":"2026-05-19T02:23:13.892Z","updated_at":"2026-06-12T05:01:02.741Z","avatar_url":"https://github.com/60MilesPerHour.png","language":"Dart","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"assets/images/horizon.png\" width=\"120\" alt=\"Horizon logo\"\u003e\n\n# Horizon\n\n**A multi-provider AI chat client built on Flutter.**\nTalk to **Ollama**, **Claude**, **OpenAI**, and **Gemini** from a single app — with per-conversation configs, secure on-device key storage, and an OLED-optimized dark theme.\n\n[**Download latest release ▸**](https://github.com/60MilesPerHour/Horizon/releases)\n\n\u003c/div\u003e\n\n---\n\n## Highlights\n\n- **Four providers, one app.** Ollama (local + Ollama Cloud), Claude (Anthropic), OpenAI (incl. o-series reasoning), Gemini (Google). Mix providers freely across chats — or even mid-chat.\n- **Per-conversation everything.** Model, provider, system prompt, temperature, context size, max tokens — all stored per chat. No global toggles to babysit.\n- **Live model + provider switching.** Switch from a local Llama to Claude Sonnet mid-thread without losing history.\n- **Self-hosted-friendly Ollama setup.** Configure a *primary* and a *backup* server URL. Requests fail over automatically when the primary is unreachable — keep your home-LAN address private and let traffic transparently route through your VPN/Tailscale endpoint when you're off-network.\n- **Ollama Cloud + bearer auth.** Optional Authorization token for Ollama Cloud (ollama.com) or any reverse-proxy that gates a self-hosted Ollama behind auth.\n- **Per-chat thinking toggle.** Three-state `think` control (Default / On / Off) for Ollama models with a thinking phase (Qwen 3, gpt-oss, etc.). Models without one ignore it.\n- **Secure key storage.** Cloud-provider API keys live in the OS keystore via `flutter_secure_storage` — never in plaintext settings or app data.\n- **Smooth streaming.** Typewriter buffer plus plain-text rendering during the stream means responses don't turn into a slideshow as they grow. Markdown renders cleanly once the response completes (code blocks, GFM tables, the works).\n- **OLED true-black dark theme.** Free AMOLED battery, pleasant at night.\n- **Image input** on every vision-capable model — Ollama vision, Claude, GPT-4o, Gemini.\n- **Edit \u0026 regenerate.** Edit any of your past messages and regenerate the assistant's response from there.\n- **Custom Ollama models.** Save your favourite prompt + config combo as a fresh Ollama model — Horizon calls `/api/create` for you.\n- **Responsive layout.** Same Flutter codebase tuned for phone, tablet, and desktop.\n\n## Install\n\n| Platform | Download | Notes |\n|---|---|---|\n| **Android** | `horizon-vX.Y.Z.apk` from [Releases](https://github.com/60MilesPerHour/Horizon/releases) | Signed. Sideload via Files/adb. |\n| **macOS** | `horizon-macos.zip` from [Releases](https://github.com/60MilesPerHour/Horizon/releases) | Unsigned. After unzip: `xattr -dr com.apple.quarantine /Applications/horizon.app` |\n| **Windows** | `horizon-windows.zip` from [Releases](https://github.com/60MilesPerHour/Horizon/releases) | Extract and run `horizon.exe`. VC++ runtime DLLs are bundled. |\n| **Debian / Ubuntu / Mint / Pop** | `horizon_X.Y.Z_amd64.deb` from [Releases](https://github.com/60MilesPerHour/Horizon/releases) | `sudo apt install ./horizon_X.Y.Z_amd64.deb` |\n| **Other Linux** | `horizon-X.Y.Z-linux-x64.tar.gz` from [Releases](https://github.com/60MilesPerHour/Horizon/releases) | Extract and run `./horizon` |\n| **iOS** | Not currently distributed | Buildable from source if you have an Apple Developer account. |\n\n## Configure\n\n1. **Ollama** — Settings → Server → enter `http://\u003chost\u003e:11434`. Optionally enter a backup URL (Tailscale, VPN, etc.) — used automatically when the primary can't be reached. For **Ollama Cloud**, set the primary to `https://ollama.com` and paste your `olc-...` token in the API Token field below.\n2. **Cloud providers** — Settings → Cloud Providers → paste API keys for Anthropic, OpenAI, and/or Google. Models from every configured provider show up in the model picker, grouped by provider.\n3. **Per-chat thinking** (Ollama) — Configure Chat → Thinking → Default / On / Off. Leave at Default unless you need to force a thinking-capable model on or off.\n\nThat's it.\n\n## Compared to upstream Reins\n\nHorizon is a fork of [Reins](https://github.com/ibrahimcetin/reins) — a clean Flutter Ollama client by [Ibrahim Çetin](https://github.com/ibrahimcetin). Upstream's last public release was 1.2.0 and the repo has been quiet since; this fork started as a personal stability patch and grew into a multi-provider client. Major changes:\n\n| Area | Reins (1.2.0) | Horizon (3.3.0) |\n|---|---|---|\n| Backends | Ollama only | Ollama (local + Cloud) + Claude + OpenAI + Gemini |\n| Server reachability | Single URL | Primary + backup URL with automatic failover |\n| Authenticated Ollama | n/a | Optional bearer token for Ollama Cloud / proxied servers |\n| Per-chat `think` toggle | n/a | Three-state Default/On/Off |\n| Network reliability | A few hang/leak edges | 30 s timeouts everywhere, stream-subscription cleanup, JSON parse guards, tagged provider errors |\n| Streaming feel | Per-token rebuilds (jittery on bursty SSE) | Typewriter buffer + plain-text live render → Markdown on completion |\n| `num_ctx` behaviour | Always sent, always 2048 default → forced Ollama to reload models | Defaults to \"let the server decide\"; opt-in override per chat |\n| Multi-provider routing | n/a | `ChatService` abstraction, per-chat `provider` column, self-healing on read |\n| Key storage | n/a | OS keystore via `flutter_secure_storage` |\n| Theme | Material default | OLED true-black dark + dynamic colour |\n| Platform builds | Manual | GitHub Actions: Android (signed APK), macOS, Windows, Linux (.deb + tar.gz) on every push |\n| Distribution | APK only (1.2.0) | Android APK + macOS app + Windows exe + Linux .deb / tar.gz per release |\n\nAnything that was good in Reins — the responsive layout, the chat-configure sheet, the model-selection bottom sheet, the inline Markdown rendering — is still good in Horizon. The diff is purely additive.\n\n## Build from source\n\nLocal Flutter dev works for Android/macOS/Linux. iOS and Windows generally route through CI.\n\n```bash\ngit clone https://github.com/60MilesPerHour/Horizon.git\ncd Horizon\nflutter pub get\nflutter run                  # uses current device\nflutter build apk --release  # Android\nflutter build macos --release\nflutter build windows --release\n```\n\nDart SDK ≥ 3.5.4 required. Flutter 3.27.x recommended (this is what CI pins).\n\n## Contributing\n\nIssues and PRs welcome. Quick rules of the road:\n- Keep changes per-platform-buildable. CI builds Android + macOS + Windows on every push to `main` and on PRs.\n- Don't break per-chat isolation — anything that touches the request path should respect `chat.provider`.\n- New providers go in `lib/Services/\u003cname\u003e_service.dart` and register through `ChatServiceRegistry`.\n\n## Credit\n\nBuilt on top of [Reins](https://github.com/ibrahimcetin/reins) by [Ibrahim Çetin](https://github.com/ibrahimcetin). Thank you for shipping a clean, hackable Flutter Ollama base — every multi-provider, networking, and polish change in Horizon stands on top of your work.\n\n## License\n\n[GPL-3.0](LICENSE), inherited from Reins. Modifications and additions © Miles Oldenburger 2026.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F60milesperhour%2Fhorizon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F60milesperhour%2Fhorizon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F60milesperhour%2Fhorizon/lists"}