尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Quickly ID all your bird pics
翻译准备中
正在加载完整 README。
查看完整 README ↗A photo-first bird identification and life list tracker. Upload your bird photos, identify the species on your device, and build your personal WingDex over time.
WingDex is for reverse birding: people who take photos first and identify species later. Instead of checklists and field guides, you upload photos you already took, and the app identifies the birds. You just confirm with a tap.
Photos never leave your device. Identification runs entirely in the browser, or natively on iOS. There is no inference server, so there is nothing to upload a photo to.
Drop a whole day's photos at once and the batch wizard clusters them into outings by time and location, identifies each bird, and lets you confirm the lot in one pass. Species link back to the outings you saw them on, and outings link forward to the species, so you can cross-reference either direction.
ios/Accounts without a provider-supplied display name receive a stored bird-themed name. Blank display-name edits are rejected; web and iOS share this server policy.
The first identification downloads about 53 MB of model files, once. After that everything is local and works offline.
The web app tries browser-supported images first, then offers embedded JPEG preview support for classic TIFF-based files, independent of camera brand or extension. It reads JPEG references and self-contained RGB/YCbCr JPEG preview strips, not RAW sensor data. Previews stay local and supply display, cropping, and identification; metadata and duplicate detection use the received file. This is not universal RAW support: unsupported containers (such as CR3 or RAF), vendor-specific preview layouts, and files without a decodable preview require a JPEG export. Failed photos are reported individually without blocking other photos or another selection. The iOS app uses the operating system's RAW decoder.
WingCLIP-0.3 is a 39M-parameter image encoder distilled from BioCLIP-2 via WingCLIP-0.1. Small enough to download once and run on a phone.
Vision alone struggles to separate lookalike species, so candidates are reranked against an empirical prior over what has actually been reported in that map cell in that month. Some pairs are hard to tell apart from pixels and trivial to tell apart from geography. With that rerank the pipeline reaches 95.0 percent top-1 on a 3,322-photo held-out split.
The same model, priors, and preprocessing ship on both platforms, and a golden-vector suite pins the two implementations to each other.
| Layer | Technology |
|---|---|
| Platform | Cloudflare Workers, D1 (SQLite) |
| Frontend | React 19, TypeScript, Vite 8 |
| Styling | Tailwind CSS 4, Radix UI primitives, Phosphor Icons |
| Auth | better-auth (anonymous, passkeys, GitHub/Google/Apple OAuth) |
| Identification | WingCLIP-0.3 via ONNX Runtime Web (browser) and Core ML (iOS) |
| Geocoding | Reverse (coordinate to place name) from a local OpenStreetMap PMTiles archive in R2; forward place search proxied to Geoapify |
| Bird imagery | Wikipedia REST API |
| Testing | Vitest (unit), Playwright (e2e), XCTest (iOS) |
| iOS | Swift, XcodeGen |
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗