{"id":49239711,"url":"https://github.com/trinkner/yearbirder","last_synced_at":"2026-04-24T19:01:05.290Z","repository":{"id":343827273,"uuid":"130119368","full_name":"trinkner/yearbirder","owner":"trinkner","description":"Yearlist is a desktop app to help birders analyze, visualize and map their personal eBird sightings and, optionally, their bird photography. Yearlist is a free and open-source Python application.","archived":false,"fork":false,"pushed_at":"2026-04-16T17:38:17.000Z","size":27999,"stargazers_count":14,"open_issues_count":1,"forks_count":2,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-04-16T19:30:03.400Z","etag":null,"topics":["birding","ebird","openlayers","python"],"latest_commit_sha":null,"homepage":"","language":"Python","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/trinkner.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":"2018-04-18T20:39:51.000Z","updated_at":"2026-04-16T17:38:21.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/trinkner/yearbirder","commit_stats":null,"previous_names":["trinkner/yearbird","trinkner/yearbirder"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/trinkner/yearbirder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinkner%2Fyearbirder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinkner%2Fyearbirder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinkner%2Fyearbirder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinkner%2Fyearbirder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/trinkner","download_url":"https://codeload.github.com/trinkner/yearbirder/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/trinkner%2Fyearbirder/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32236744,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-24T13:21:15.438Z","status":"ssl_error","status_checked_at":"2026-04-24T13:21:15.005Z","response_time":64,"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":["birding","ebird","openlayers","python"],"created_at":"2026-04-24T19:01:04.480Z","updated_at":"2026-04-24T19:01:05.266Z","avatar_url":"https://github.com/trinkner.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ctable\u003e\u003ctr\u003e\n\u003ctd\u003e\u003cimg src=\"icons/Yearbirder_Icon_1024.png\" alt=\"Yearbirder\" height=\"120\"\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"src/readme_photos/demo_Lists.png\" alt=\"Lists\" height=\"120\"\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"src/readme_photos/demo_Reports1.png\" alt=\"Reports\" height=\"120\"\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"src/readme_photos/demo_Graphs1.png\" alt=\"Graphs\" height=\"120\"\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"src/readme_photos/demo_Maps1.png\" alt=\"Maps\" height=\"120\"\u003e\u003c/td\u003e\n\u003ctd\u003e\u003cimg src=\"src/readme_photos/demo_Photos1.png\" alt=\"Photos\" height=\"120\"\u003e\u003c/td\u003e\n\u003c/tr\u003e\u003c/table\u003e\n\n# Yearbirder\n\n**Current release: v1.4** (April 2026)\n\nA desktop application for exploring and analysing your personal [eBird](https://ebird.org) data and your personal photos of birds.\n\nYearbirder lets you filter, browse, and visualise your personal eBird sightings in ways the eBird website does not — across every location, species, date, and season in your personal history. If you are a bird photographer, Yearbirder also lets you sort, filter and view your photos in the same way.\n\n---\n\n## What's New in v1.4\n\n- **eBird species code in Rename Photos** — the Species Name Format picker now includes *eBird Species Code* (e.g. `gretit1`) alongside Common Name and Scientific Name\n- **Smarter photo-to-species matching** — when adding photos to the catalog, filename matching now checks eBird codes, BBL banding codes, common names, and scientific names as substrings, handling arbitrary filename patterns from any camera or workflow; previously only whole-word token matching was used\n- **Duration-aware checklist matching** — photo EXIF timestamps are now matched to the checklist whose *window* (start time + duration) is closest, so a photo taken mid-checklist correctly matches that checklist rather than the next one to start\n- **Sighting Filter** — the filter panel is now labelled *Sighting Filter* to distinguish it from the Photo Filter\n- **Chart names updated** — photo-related charts are now named *Families \u0026 Orders by Photos*, *Total Photos*, *New Species Photographed Each Year*, and *Photographed Species Growth Over Time*\n\n---\n\n## Features\n\n- **Species, Locations, and Checklists lists** — sortable, filterable tables of your sightings\n- **Individual Species window** — full sighting history, location and year breakdowns, monthly patterns, and photo thumbnails for any species\n- **Location window** — complete sighting history for a single location, with species list, yearly and monthly breakdowns, and a map showing the site\n- **Date Totals** — species counts by year, month, and individual date\n- **Location Totals** — species counts by region, country, state, county, and named location\n- **Powerful filter panel** — filter everything simultaneously by region, country, state, county, location, taxonomic order, family, species, date range, and seasonal range; the Date Options picker includes a **Select Year** mode that reveals a second dropdown listing every year in your data, so you can filter to any specific calendar year in one step\n- **Big Report** — comprehensive multi-tab report combining species, dates, locations, and checklists\n- **Compare Lists** — compare any two species lists side by side\n- **Graphs** — fourteen chart types:\n  - *Total Species Bar Graph* — species count per year\n  - *Cumulative Species Curve* — cumulative species seen over time\n  - *Species Heatmap* — species count by month and year\n  - *Species Accumulation* — new species added each year vs. repeats\n  - *Top Locations* — top 20 locations by species count\n  - *Checklist Scatter* — duration vs. species count per checklist, coloured by season\n  - *Locations by Species \u0026 Checklists* — locations plotted by species count vs. checklist count\n  - *Species by Locations \u0026 Count* — species plotted by distinct location count vs. individual count\n  - *Phenology Chart* — sighting dates by day-of-year across years\n  - *First of Year Chart* — first sighting of each species per year, plotted by month\n  - *Last of Year Chart* — last sighting of each species per year, plotted by month\n  - *Pie Chart by Species* — species count by taxonomic family or order\n  - *Pie Chart by Individual Tallies* — individual bird count by taxonomic family or order\n  - *Locations by Checklists* — checklist count by location as a pie chart\n  - *YTD Reports* — horizontal bar charts comparing year-to-date species, locations, checklists, and photographs across all years in your data\n- **Maps** — eight interactive map types:\n  - *Locations Map* — all your sighting locations plotted on a zoomable map\n  - *Animated Lifer Map* — watch your life list build up chronologically, dot by dot\n  - *Effort Map by Time* — bubble map sized by cumulative birding time per location\n  - *Effort Map by Checklists* — bubble map sized by checklist count per location\n  - *Species Total Map* — bubble map sized by species total per location\n  - *Individuals Total Map* — bubble map sized by individual bird count per location\n  - *Choropleth by Species* — US states, US counties, Canada, India, Great Britain, and world countries shaded by species count\n  - *Choropleth by Checklists* — same regions shaded by checklist count\n- **Photos** — associate your JPEG bird photos with your sightings; browse, filter, and rate them by camera, lens, aperture, shutter speed, focal length, and ISO; **File → Open Photo Catalog** defaults to the photo catalog directory stored in Preferences\n  - *Browse Photos* — thumbnail gallery of every photo matching the current filter, sortable by taxonomy, date, rating, or name\n  - *Species Gallery* — one best-rated photo per species, arranged in taxonomic order; click any tile to see all photos of that species\n  - *Geolocated Photos* — geotagged photos plotted on a clustered interactive map; hover for a thumbnail preview, click to open the full enlargement\n  - *Batch Edit Photos* — edit species, date, time, location, or rating for multiple photos at once\n  - **Adding photos** — when adding photos to the catalog, Yearbirder automatically suggests the species by matching the filename against the closest checklist using the EXIF timestamp; matching checks eBird species codes (e.g. `gretit1`), BBL banding codes, common names, and scientific names as substrings, handling arbitrary filename patterns from any camera or workflow\n  - **Rename Photos** — batch-rename photo files using configurable components including date, time, species name, and location; the species name component supports **Common Name**, **Scientific Name**, or **eBird Species Code** format\n- **Print and PDF export** — export any window to the printer or a PDF file\n\n---\n\n## Download\n\nA pre-built, signed, and notarized macOS app is available on the [Releases page](https://github.com/trinkner/yearbird/releases/latest).\n\nDownload `Yearbirder.dmg`, open it, and drag Yearbirder to your Applications folder.\n\n---\n\n## Requirements\n\n- Python 3.10 or later (download from [python.org](https://www.python.org/downloads/))\n- [PySide6](https://pypi.org/project/PySide6/) — Qt 6 bindings (LGPL)\n- [folium](https://pypi.org/project/folium/)\n- [matplotlib](https://pypi.org/project/matplotlib/)\n- [numpy](https://pypi.org/project/numpy/)\n- [natsort](https://pypi.org/project/natsort/)\n- [piexif](https://pypi.org/project/piexif/)\n\nAfter installing Python, install all other dependencies with:\n\n```\npip install pyside6 folium matplotlib numpy natsort piexif\n```\n\n---\n\n## Running Yearbirder\n\n```\npython3 yearbirder.py\n```\n\n---\n\n## Getting Your eBird Data\n\n1. Go to [https://ebird.org/downloadMyData](https://ebird.org/downloadMyData)\n2. Click **Request My Observations**\n3. eBird will email you a link to download a `.csv` file containing your complete sightings history\n4. In Yearbirder, click **File → Open** and select that file — if you have set a default eBird data folder in Preferences, the dialog will open there automatically\n\n---\n\n## Building a Standalone App (macOS)\n\nYearbirder uses [PyInstaller](https://pyinstaller.org) to create a distributable `.app` bundle. From the project root directory:\n\n```\npyinstaller Yearbirder.spec\n```\n\nThe finished app will be in `dist/Yearbirder.app`.\n\n---\n\n## License\n\nYearbirder is free, open-source software licensed under the [GNU General Public License v3](https://www.gnu.org/licenses/gpl-3.0.html).\n\nCreated by Richard Trinkner.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrinkner%2Fyearbirder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftrinkner%2Fyearbirder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftrinkner%2Fyearbirder/lists"}