{"id":49330902,"url":"https://github.com/chipcolate/tesserone","last_synced_at":"2026-04-26T22:03:14.348Z","repository":{"id":353337924,"uuid":"969216132","full_name":"chipcolate/tesserone","owner":"chipcolate","description":"A simple, open-source app for storing and using your fidelity cards.","archived":false,"fork":false,"pushed_at":"2026-04-23T12:19:35.000Z","size":3090,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-23T14:27:22.853Z","etag":null,"topics":["apache-2","expo","local-first","loyalty-cards","open-source","privacy-first","react-native"],"latest_commit_sha":null,"homepage":"https://tesserone.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/chipcolate.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":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-04-19T16:47:26.000Z","updated_at":"2026-04-23T12:19:37.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chipcolate/tesserone","commit_stats":null,"previous_names":["chipcolate/tesserone"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/chipcolate/tesserone","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chipcolate%2Ftesserone","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chipcolate%2Ftesserone/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chipcolate%2Ftesserone/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chipcolate%2Ftesserone/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chipcolate","download_url":"https://codeload.github.com/chipcolate/tesserone/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chipcolate%2Ftesserone/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32314118,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T21:09:39.134Z","status":"ssl_error","status_checked_at":"2026-04-26T21:09:21.240Z","response_time":129,"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":["apache-2","expo","local-first","loyalty-cards","open-source","privacy-first","react-native"],"created_at":"2026-04-26T22:03:08.628Z","updated_at":"2026-04-26T22:03:14.337Z","avatar_url":"https://github.com/chipcolate.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" alt=\"Tesserone logo\" width=\"120\" /\u003e\n\u003c/p\u003e\n\n# Tesserone\n\nA loyalty card manager that feels alive. Cards aren't rows in a database — they're objects you hold, flip, and fan through. Built with wallet-style interactions, spring physics, and haptic feedback.\n\nLocal-first. Zero cloud. Zero bloat. Open source.\n\n\u003e Tesserone is an independent project. It is not affiliated with, endorsed by, or sponsored by any of the brands, merchants, or platform owners referenced in the app or its source. See [Trademarks \u0026 Attribution](#trademarks--attribution) for details.\n\n\u003e Tesserone is a side project, maintained on a best-effort basis by the [Chipcolate](https://chipcolate.com) team. Issues and pull requests are welcome and will be reviewed as time allows.\n\n## Features\n\n- **Wallet-style card stack** — scroll, tap to bring a card forward with its barcode, tap again or swipe up to send it back\n- **Brightness boost** — screen brightness maxes out when viewing a barcode, restores when you're done\n- **Barcode scanning** — scan loyalty cards with the camera, or enter details manually\n- **Brand recognition** — type a store name and Tesserone matches it to a curated brand database with logos and colors\n- **Custom logos** — upload your own logo from the gallery or take a photo\n- **Drag to reorder** — wobble mode with long-press drag, like rearranging your home screen\n- **Import/Export** — back up your cards as JSON, import from a backup file with conflict resolution\n- **Dark/Light/System themes** — neutral chrome, the cards bring the color\n- **Haptic feedback** — tactile responses on every interaction\n- **Fully offline** — all data stays on your device\n\n## Supported Barcode Formats\n\nEAN-13, EAN-8, Code 128, Code 39, QR, UPC-A, UPC-E, PDF417, Aztec, Data Matrix, ITF-14\n\n## Tech Stack\n\n| Layer | Choice |\n|---|---|\n| Framework | Expo SDK 55, React Native 0.83 |\n| Animation | react-native-reanimated 4.x |\n| Gestures | react-native-gesture-handler 2.x |\n| Navigation | expo-router (file-based) |\n| State | zustand + AsyncStorage |\n| Barcode scan | expo-camera |\n| Barcode render | @kichiyaki/react-native-barcode-generator, react-native-qrcode-svg |\n| Haptics | expo-haptics |\n| Brightness | expo-brightness |\n\n## Getting Started\n\n### Prerequisites\n\n**Common**\n\n- [Bun](https://bun.sh) for package management (npm or yarn work too, but `bun.lock` is the checked-in lockfile)\n- Node.js 20+ (needed for `npx` — some Expo CLI commands shell out to it)\n- `eas-cli` installed globally\n\n**For iOS builds**\n\n- macOS (required — iOS builds don't run on Linux or Windows)\n- Xcode with iOS simulators and command line tools\n- A physical iOS device (Expo Go is not supported)\n\n**For Android builds**\n\n- Android Studio with the Android SDK and platform tools\n- JDK 17\n- A physical Android device with USB debugging enabled, or a running emulator\n- `adb` on your PATH (comes with Android SDK platform-tools)\n\n### Clone \u0026 Install\n\n```bash\ngit clone https://github.com/chipcolate/tesserone.git\ncd tesserone\nbun install\n```\n\n### Run on a device\n\n**iOS**\n\n```bash\nnpx expo run:ios --device\n```\n\n**Android**\n\n```bash\nnpx expo run:android --device\n```\n\n### Building for Distribution\n\n**iOS**\n\n```bash\n# Ad-hoc build for your provisioned devices\neas build --platform ios --local --profile preview\n\n# Install the resulting .ipa on a connected device\nxcrun devicectl device install app --device \u003cDEVICE_UUID\u003e \u003cpath-to-ipa\u003e\n\n# Production build for App Store submission\neas build --platform ios --local --profile production\n```\n\n**Android**\n\n```bash\n# Preview APK for direct install / sharing with testers\neas build --platform android --local --profile preview\n\n# Install the APK via adb\nadb install \u003cpath-to-apk\u003e\n\n# Production Android App Bundle for Play Store submission\neas build --platform android --local --profile production\n```\n\n## Adding Brand Logos\n\nTesserone ships with a curated set of store logos. To add a new brand:\n\n1. Add a PNG logo to `assets/logos/` (white/light logo on transparent background works best)\n2. Register the asset in `src/services/logos.ts` in the `BUNDLED_LOGOS` map\n3. Add the brand entry to `data/brand-index.json` with name, aliases, colors, and logo filename\n\nUsers can also upload custom logos from their photo gallery when adding a card.\n\n## Data Format\n\nCards are stored locally via AsyncStorage and can be exported as JSON:\n\n```json\n{\n  \"cards\": [\n    {\n      \"id\": \"card-1234567890-abc123\",\n      \"name\": \"Example Store\",\n      \"code\": \"1234567890128\",\n      \"format\": \"EAN13\",\n      \"color\": \"#1456A2\",\n      \"logoSlug\": null,\n      \"notes\": \"Family card\",\n      \"sortIndex\": 0,\n      \"createdAt\": \"2026-04-13T10:00:00.000Z\",\n      \"updatedAt\": \"2026-04-13T10:00:00.000Z\"\n    }\n  ],\n  \"settings\": { \"themeMode\": \"system\", \"sortMode\": \"manual\" },\n  \"exportedAt\": \"2026-04-13T12:00:00.000Z\",\n  \"version\": \"2.0.0\"\n}\n```\n\nImport is tolerant of older export shapes — lowercase barcode enums are normalized and missing fields get sensible defaults.\n\n## License\n\nLicensed under the [Apache License, Version 2.0](./LICENSE). See [`NOTICE`](./NOTICE) for attribution and trademark information that must be preserved in redistributions.\n\n## Trademarks \u0026 Attribution\n\nTesserone is an independent, open-source project. It is not affiliated with, endorsed by, or sponsored by any of the brands, merchants, or platform owners referenced in the app or its source.\n\n- All third-party brand names, logos, and trademarks — including merchant logos bundled under `assets/logos/` and indexed in `data/brand-index.json`, as well as any platform, framework, or tool names mentioned for descriptive purposes — are the property of their respective owners. Any references are descriptive (nominative fair use) and do not imply endorsement, affiliation, or partnership.\n- Bundled merchant logos are included solely to help users visually identify the merchant that issued a loyalty card.\n- If you are a rights holder and would like a logo or brand entry removed from the bundled set, please open an issue on the repository.\n- Custom logos uploaded by end users are the responsibility of the user; you must have the right to use any image you add to the app.\n\n## Author\n\n[Chipcolate](https://chipcolate.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchipcolate%2Ftesserone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchipcolate%2Ftesserone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchipcolate%2Ftesserone/lists"}