{"id":47302217,"url":"https://github.com/sane-apps/SaneSales","last_synced_at":"2026-03-31T09:00:50.231Z","repository":{"id":337709339,"uuid":"1150252878","full_name":"sane-apps/SaneSales","owner":"sane-apps","description":"Universal indie sales tracker for LemonSqueezy, Gumroad, and Stripe. iOS + macOS. 100% on-device privacy.","archived":false,"fork":false,"pushed_at":"2026-03-27T15:16:31.000Z","size":33329,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-28T00:46:59.104Z","etag":null,"topics":["claude-ai","gumroad","indie-hacker","ios","lemonsqueezy","macos","macos-app","open-source","pair-programming","privacy","revenue-analytics","sales-tracker","stripe","swift","swiftui","vibecoding"],"latest_commit_sha":null,"homepage":"https://sanesales.com","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sane-apps.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":"docs/support.html","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-02-05T04:02:51.000Z","updated_at":"2026-03-27T15:16:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/sane-apps/SaneSales","commit_stats":null,"previous_names":["sane-apps/sanesales"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sane-apps/SaneSales","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sane-apps%2FSaneSales","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sane-apps%2FSaneSales/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sane-apps%2FSaneSales/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sane-apps%2FSaneSales/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sane-apps","download_url":"https://codeload.github.com/sane-apps/SaneSales/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sane-apps%2FSaneSales/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31228492,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-31T08:35:14.124Z","status":"ssl_error","status_checked_at":"2026-03-31T08:34:00.887Z","response_time":111,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["claude-ai","gumroad","indie-hacker","ios","lemonsqueezy","macos","macos-app","open-source","pair-programming","privacy","revenue-analytics","sales-tracker","stripe","swift","swiftui","vibecoding"],"created_at":"2026-03-17T05:00:23.918Z","updated_at":"2026-03-31T09:00:50.224Z","avatar_url":"https://github.com/sane-apps.png","language":"Swift","funding_links":[],"categories":["Productivity"],"sub_categories":["Text"],"readme":"\u003cdiv align=\"center\"\u003e\n\n# SaneSales\n\n### Bring Sanity to Your Sales Tracking\n\n**LemonSqueezy + Gumroad + Stripe — finally unified**\n\n[![GitHub stars](https://img.shields.io/github/stars/sane-apps/SaneSales?style=flat-square)](https://github.com/sane-apps/SaneSales/stargazers)\n[![License: PolyForm Shield](https://img.shields.io/badge/License-PolyForm%20Shield-blue.svg?style=flat-square)](LICENSE)\n[![macOS](https://img.shields.io/badge/macOS-14.0+-blue?style=flat-square)](https://sanesales.com)\n[![iOS](https://img.shields.io/badge/iOS-17.0+-blue?style=flat-square)](https://sanesales.com)\n[![Price](https://img.shields.io/badge/Price-$6.99_one--time-green?style=flat-square)](https://sanesales.com)\n[![Privacy: 100% On-Device](https://img.shields.io/badge/Privacy-100%25%20On--Device-success?style=flat-square)](PRIVACY.md)\n[![Listed on awesome-macos](https://img.shields.io/badge/Listed%20on-open--source--mac--os--apps%20(40k%E2%98%85)-black?style=flat-square)](https://github.com/serhii-londar/open-source-mac-os-apps)\n\n\u003e **Star this repo if you find it useful!** \u0026middot; **[Buy — $6.99](https://sanesales.com)** \u0026middot; Keeps development alive\n\n\u003c/div\u003e\n\n---\n\n## The Problem\n\nYou sell on multiple platforms. Every morning you check three dashboards, copy numbers into a spreadsheet, and try to answer: *\"How are we actually doing?\"*\n\n- LemonSqueezy has your licenses\n- Gumroad has your digital products\n- Stripe has your subscriptions\n- Your spreadsheet is already out of date\n\n## The Solution\n\nSaneSales pulls your sales data from all three platforms into one beautiful, native app. Revenue, orders, products, charts — all on your device, all in real time.\n\n| | |\n|---|---|\n| **Revenue Dashboard** | Today, this month, and all-time revenue at a glance with trend indicators |\n| **Interactive Charts** | Daily revenue bar charts with Swift Charts. Tap to drill into any day |\n| **Product Breakdown** | Donut chart showing revenue by product. Tap segments to explore |\n| **Refund-Aware Revenue** | Net totals that deduct refunds automatically — no more overstated numbers |\n| **Order Tracking** | Search by customer, product, or amount. Filter by provider, status, or date |\n| **CSV Export** | Export your full order history for accounting or email marketing |\n| **Widgets + Watch Glance** | Glance at today's revenue from Home Screen, Lock Screen, or Apple Watch Smart Stack |\n| **macOS Menu Bar** | See today's revenue in the menu bar. Right-click for quick actions |\n| **100% On-Device** | API keys in Keychain. Data cached locally. No SaneApps server in the middle |\n\n---\n\n## Supported Providers\n\n| Provider | Revenue | Orders | Products | Refunds | Pagination |\n|----------|:-------:|:------:|:--------:|:-------:|:----------:|\n| **LemonSqueezy** | ✅ | ✅ | ✅ | ✅ | ✅ |\n| **Gumroad** | ✅ | ✅ | ✅ | ✅ | ✅ |\n| **Stripe** | ✅ | ✅ | ✅ | ✅ | ✅ |\n\n---\n\n## Why Not Just Use Baremetrics or ChartMogul?\n\nThey're cloud dashboards. That means:\n\n- **Your revenue data lives on their servers** — every sale, every customer, every refund, stored and processed by a third party\n- **They only support Stripe** — sell on LemonSqueezy or Gumroad? Tough luck\n- **$29–$99/month forever** — that's $350–$1,200/year to look at your own sales numbers\n- **No native app** — just a browser tab competing with your other 47 tabs\n- **No offline access** — no internet, no data\n\nSaneSales is the opposite:\n\n| Feature | SaneSales | Baremetrics | ChartMogul | Spreadsheets |\n|---------|:---------:|:-----------:|:----------:|:------------:|\n| **Multi-provider** | ✅ | ❌ Stripe only | ❌ Stripe only | Manual |\n| **LemonSqueezy support** | ✅ | ❌ | ❌ | Manual |\n| **Gumroad support** | ✅ | ❌ | ❌ | Manual |\n| **Refund-aware revenue** | ✅ Net after refunds | ✅ | ✅ | Manual |\n| **Native iOS + macOS** | ✅ | Web only | Web only | ❌ |\n| **Home screen widgets** | ✅ | ❌ | ❌ | ❌ |\n| **Menu bar revenue** | ✅ | ❌ | ❌ | ❌ |\n| **Your data stays on YOUR device** | ✅ | ❌ Their cloud | ❌ Their cloud | Local |\n| **No subscription** | **$6.99 once** | $29+/mo | $99+/mo | Free |\n| **100% Transparent Code** | PolyForm Shield | ❌ | ❌ | N/A |\n\n\u003e **$6.99 once vs $350+/year.** Your sales data on your device, not theirs. **[Get SaneSales →](https://sanesales.com)**\n\n---\n\n## Download\n\n**One-time purchase. No subscription. Works on iPhone, iPad, and Mac.**\n\n**[Download from sanesales.com](https://sanesales.com)** — $6.99\n\nAlso coming to the iOS \u0026 Mac App Store (submitted, awaiting review).\n\n\u003e *I wanted to make it $5, but processing fees and taxes were... insane. — Mr. Sane*\n\nOr [build from source](#development) — it's PolyForm Shield licensed, always will be.\n\n**Requirements:** iOS 17+ / macOS 14+ \u0026middot; Apple Silicon (arm64) only\n\n---\n\n## How It Works\n\n1. **Connect** — Paste your API key from LemonSqueezy, Gumroad, or Stripe\n2. **Sync** — SaneSales fetches your orders, products, and revenue directly from the provider APIs\n3. **Track** — See everything in one dashboard with charts, search, and export\n\nAPI keys are stored in the device Keychain with hardware encryption. Sales data is cached locally for offline access. Nothing is ever transmitted to SaneApps servers.\n\n---\n\n## Privacy\n\n**SaneSales does not upload your sales data or API keys to SaneApps servers.**\n\n- No accounts, no sign-up, no email required\n- A few simple anonymous app counts may be sent, such as Basic vs Pro launches or locked-feature views\n- API keys stored in device Keychain (hardware-encrypted)\n- Direct communication with provider APIs — no intermediary server\n- Sales data cached on-device only\n- 100% transparent code — [verify yourself](https://github.com/sane-apps/SaneSales)\n\nFull policy: [sanesales.com/privacy](https://sanesales.com/privacy.html)\n\n---\n\n## Development\n\n```bash\n# Clone the repo\ngit clone https://github.com/sane-apps/SaneSales.git\ncd SaneSales\n\n# Generate the Xcode project\nxcodegen generate\n\n# Build macOS\nxcodebuild -scheme SaneSales -destination 'platform=macOS,arch=arm64' build\n\n# Build iOS\nxcodebuild -scheme SaneSalesIOS -destination 'platform=iOS Simulator,name=iPhone 17 Pro' build\n\n# Run tests (20 tests across 4 suites)\nxcodebuild -scheme SaneSales test -destination 'platform=macOS,arch=arm64'\n```\n\n### Requirements\n\n- macOS 14.0+ (Sonoma) / iOS 17.0+\n- Xcode 16+\n- Apple Silicon (arm64) only\n- [XcodeGen](https://github.com/yonaskolb/XcodeGen) (`brew install xcodegen`)\n\n### Architecture\n\n```\nCore/\n  Models/          Order, Product, Store, SalesMetrics (Codable, Sendable)\n  Services/        SalesProvider protocol, LemonSqueezy/Gumroad/Stripe actors\n  SalesManager     @MainActor @Observable — central state coordinator\n\niOS/\n  Views/           Shared SwiftUI views (iOS + macOS)\n  Components/      SalesCard, GlassSection, badges, chart components\n\nmacOS/\n  SaneSalesMacApp  macOS entry point, menu bar, activation policy\n  MenuBarManager   Status item with revenue display + right-click menu\n\nWidgets/           WidgetKit extensions (small, medium, accessory watch/lock-screen)\nTests/             Swift Testing (API parsing, metrics, cache, providers)\n```\n\n### Key Patterns\n\n- `SalesProvider` protocol for all platform adapters\n- Actors for network services, `@Observable` for state\n- UserDefaults cache for offline mode\n- Keychain for API keys (service: `com.sanesales.app`)\n- Swift 6 strict concurrency\n\nSee [DEVELOPMENT.md](DEVELOPMENT.md) for detailed setup, demo mode, and conventions.\n\n---\n\n## Documentation\n\n| Document | Purpose |\n|----------|---------|\n| [README.md](README.md) | Product overview and doc map |\n| [ARCHITECTURE.md](ARCHITECTURE.md) | App structure and provider model |\n| [DEVELOPMENT.md](DEVELOPMENT.md) | Build, test, and workflow SOP |\n| [PRIVACY.md](PRIVACY.md) | Canonical privacy policy for the app |\n| [SECURITY.md](SECURITY.md) | Security policy and reporting |\n| [`docs/`](docs/) | Public website, privacy page, and guide pages |\n\n---\n\n## Support\n\n- **Email:** [hi@saneapps.com](mailto:hi@saneapps.com)\n- **Bugs:** [Report a Bug](https://github.com/sane-apps/SaneSales/issues/new?template=bug_report.md)\n- **Discussions:** [GitHub Discussions](https://github.com/sane-apps/SaneSales/discussions)\n\n---\n\n## License\n\n[PolyForm Shield 1.0.0](https://polyformproject.org/licenses/shield/1.0.0) — free for any use except building a competing product. See [LICENSE](LICENSE) for details.\n\n---\n\n\u003cdiv align=\"center\"\u003e\n\n**Made with love in the USA by [Mr. Sane](https://github.com/MrSaneApps)**\n\n**Not fear, but power, love, sound mind** — 2 Timothy 1:7\n\n**[SaneBar](https://sanebar.com)** \u0026middot; **[SaneClip](https://saneclip.com)** \u0026middot; **[SaneHosts](https://sanehosts.com)** \u0026middot; **[SaneSales](https://sanesales.com)** \u0026middot; **[All Apps](https://saneapps.com)**\n\n\u003c/div\u003e\n\n## Third-Party Notices\n\nThird-party open-source attributions are documented in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).\n\n\u003c!-- SANEAPPS_AI_CONTRIB_START --\u003e\n### Become a Contributor (Even if You Don't Code)\n\nAre you tired of waiting on the dev to get around to fixing your problem?  \nDo you have a great idea that could help everyone in the community, but think you can't do anything about it because you're not a coder?\n\nGood news: you actually can.\n\nCopy and paste this into Claude or Codex, then describe your bug or idea:\n\n```text\nI want to contribute to this repo, but I'm not a coder.\n\nRepository:\nhttps://github.com/sane-apps/SaneSales\n\nBug or idea:\n[Describe your bug or idea here in plain English]\n\nPlease do this for me:\n1) Understand and reproduce the issue (or understand the feature request).\n2) Make the smallest safe fix.\n3) Open a pull request to https://github.com/sane-apps/SaneSales\n4) Give me the pull request link.\n5) Open a GitHub issue in https://github.com/sane-apps/SaneSales/issues/new?template=bug_report.md that includes:\n   - the pull request link\n   - a short summary of what changed and why\n6) Also give me the exact issue link.\n\nImportant:\n- Keep it focused on this one issue/idea.\n- Do not make unrelated changes.\n```\n\nIf needed, you can also just email the pull request link to hi@saneapps.com.\n\nI review and test every pull request before merge.\n\nIf your PR is merged, I will publicly give you credit, and you'll have the satisfaction of knowing you helped ship a fix for everyone.\n\u003c!-- SANEAPPS_AI_CONTRIB_END --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsane-apps%2FSaneSales","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsane-apps%2FSaneSales","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsane-apps%2FSaneSales/lists"}