{"id":50408110,"url":"https://github.com/guillim/fyrestore","last_synced_at":"2026-05-31T02:30:39.464Z","repository":{"id":360449041,"uuid":"1250104154","full_name":"guillim/fyrestore","owner":"guillim","description":"Read-only macOS client for Google Firestore — browse any collections and documents in a Notion-inspired UI","archived":false,"fork":false,"pushed_at":"2026-05-26T12:00:50.000Z","size":690,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-26T14:04:31.679Z","etag":null,"topics":["firestore","firestore-database","nosql"],"latest_commit_sha":null,"homepage":"","language":"Swift","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/guillim.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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":null,"dco":null,"cla":null}},"created_at":"2026-05-26T10:02:03.000Z","updated_at":"2026-05-26T12:00:53.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/guillim/fyrestore","commit_stats":null,"previous_names":["guillim/fyrestore"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/guillim/fyrestore","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guillim%2Ffyrestore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guillim%2Ffyrestore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guillim%2Ffyrestore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guillim%2Ffyrestore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/guillim","download_url":"https://codeload.github.com/guillim/fyrestore/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/guillim%2Ffyrestore/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33717415,"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":["firestore","firestore-database","nosql"],"created_at":"2026-05-31T02:30:37.995Z","updated_at":"2026-05-31T02:30:39.459Z","avatar_url":"https://github.com/guillim.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fyrestore\n\nA light, read-only macOS browser for Google Firestore. Sign in with your Google account and browse any Firestore project your account has access to.\n\n![Fyrestore showing a Firestore collection with filter, document list and field inspector](img/fyrestore-overview.png)\n\n- **Read-only** — no write or delete endpoints anywhere\n- **Single-binary** — pure Swift Package, no Firebase SDK\n- **Google sign-in** — one button, your browser, done. Works for any Google account.\n- **Three panes** — projects/collections sidebar → document list with filter \u0026 pagination → document inspector with sub-collection drill-down\n\n## For users\n\n1. Download the latest `.app` (or clone and `swift run Fyrestore`).\n2. Launch → **Sign in with Google** → consent in your browser → you're back in the app.\n3. Pick a project, click a collection, browse.\n\nTokens cache in your macOS Keychain. If you see a *\"Google hasn't verified this app\"* warning, that's normal — **Advanced → Continue**.\n\n### What you can do\n\n- **Filter** — `field op value` (e.g. `age \u003e= 18`, `name == \"alice\"`, `email contains \"alice\"`). Operators: `==`, `!=`, `\u003c`, `\u003c=`, `\u003e`, `\u003e=`, `contains` (case-insensitive substring).\n- **Pagination** — first 100 docs load; **Load more** at the bottom fetches the next page.\n- **Sub-collections** — chips at the bottom of the doc inspector. Click to drill in; breadcrumb at the top to navigate back up.\n- **Copy** — copy any doc as JSON, copy a doc's reference path, right-click for more.\n- **Open in Firebase Console** — one-click jump to the hosted UI when you want to make a change.\n\n### Required Google permissions\n\n- `roles/datastore.viewer` on each project you want to browse.\n- `roles/browser` (or `roles/resourcemanager.projectViewer`) so the app can list which projects exist for you.\n\nIf a project doesn't appear, it's an IAM gap on that project — not a bug.\n\n---\n\n## For maintainers / forking the repo\n\nYou need to register your own Google OAuth client once.\n\n### 1. Create the OAuth client (~5 min)\n\n1. \u003chttps://console.cloud.google.com/apis/credentials\u003e — pick or create a host project.\n2. **OAuth consent screen** → **External**, fill in app info, add scopes: `openid`, `email`, `https://www.googleapis.com/auth/cloud-platform.read-only`, `https://www.googleapis.com/auth/datastore`. Add yourself as a test user.\n3. **Create credentials → OAuth client ID → Desktop app** → copy the **Client ID** and **Client secret**.\n4. **APIs \u0026 Services → Library** → enable **Cloud Resource Manager API** and **Cloud Firestore API**.\n\n### 2. Set up credentials locally\n\n```sh\nexport FYRESTORE_CLIENT_ID=\"…apps.googleusercontent.com\"\nexport FYRESTORE_CLIENT_SECRET=\"GOCSPX-…\"\n./scripts/setup-secrets.sh\n```\n\nThis writes `Sources/Fyrestore/Secrets.swift` (gitignored). Without it `swift build` errors with *\"cannot find 'Secrets' in scope\"*. Per RFC 8252 the Desktop \"client secret\" isn't actually confidential, but we keep it out of git to satisfy push-protection scanners and to remind forkers to register their own client.\n\n### 3. Build \u0026 run\n\n```sh\nswift run Fyrestore                    # command line\nopen Package.swift                      # or open in Xcode and ⌘R\n```\n\n### 4. Build a distributable `.app`\n\n```sh\n./scripts/make-release.sh\n```\n\nOutputs `dist/Fyrestore-\u003cversion\u003e.zip` ad-hoc signed and ready for a GitHub Release. Prints the exact `gh release create` line at the end. Drop an `.icns` at `Resources/AppIcon.icns` to bake in a custom icon.\n\nThe build is unsigned/un-notarized. First-time users right-click → Open to bypass Gatekeeper. To remove that warning, join the [Apple Developer Program](https://developer.apple.com/programs/) ($99/yr) and add real Developer ID signing + Apple notarization.\n\n### 5. Going from 100 test users to public\n\nWhile the consent screen is in \"Testing\": max 100 named test users. To open it to anyone, click **Publish App**, then submit for **OAuth verification** (privacy policy URL + demo video + scope justification — typical turnaround 4–8 weeks). No code changes needed.\n\n## Requirements\n\n- macOS 13+\n- Xcode 15+ or Swift 5.9+ (only needed to build from source)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguillim%2Ffyrestore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fguillim%2Ffyrestore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fguillim%2Ffyrestore/lists"}