Profile
Back to NewsBack
GitHub Trending 10 min
Reader Mode
veteranbv/inky-bird-frame: Turn bird observations and detections into reviewed, reusable field-journal plates for color e-paper displays

veteranbv/inky-bird-frame: Turn bird observations and detections into reviewed, reusable field-journal plates for color e-paper displays

11 hours ago

Inky Bird Frame

Turn the birds around you, the birds your station hears, and the birds you have seen into reviewed field-journal plates on a color e-paper frame.

CI</a> Latest release</a> License: MIT</a>

Inky Bird Frame displaying an Eastern Bluebird field-journal plate in a bronze portrait frame
A finished portrait installation using the recommended 12 x 16 inch frame with a panel-fitted mat opening.

I built Inky to keep birding present between outings. A feeder visit, a sound outside, or a bird logged on a trip can become something beautiful on the wall and something my family can learn from.

Browse the plates · Build the frame · Run with Docker

Eastern Bluebird scientific field-journal plate
Eastern Bluebird · Sialia sialis
Northern Cardinal scientific field-journal plate
Northern Cardinal · Cardinalis cardinalis

Inky brings several kinds of bird evidence into one private collection:

  • nearby observations from iNaturalist and eBird;
  • your own eBird history, including birds recorded on past trips;
  • acoustic detections from BirdWeather, self-hosted BirdNET-Go, or BirdNET
Analyzer; and
  • authorized Bird Buddy feeder postcards and optional manual sightings.
The controller reuses an approved plate whenever one exists. For a missing species, it gathers licensed references, researches the bird, creates the plate with Codex, and runs a separate factual and visual review before the image can appear. Your discovery location and observation history stay private.

Start here

  • Build the complete wall frame: choose parts in the
hardware guide, then follow the native installation.
  • Run the controller on Docker or a NAS: use the
Docker controller guide.
  • Use an existing Mac, Linux host, or Raspberry Pi: use the
native installation guide.
  • Connect eBird, BirdNET, Bird Buddy, or another source: choose providers in
the discovery guide.
  • Connect a trusted browser application: read the
browser application boundary. Inky provides a read-only catalog, image interface, and narrow plate embed, not a standalone browser application.
  • Add Inky to a Homepage dashboard: use the
stock Homepage recipe for compact catalog stats and an optional upright plate.
  • Request or contribute a bird: start with
Contributing.

How it works

Configured bird observations and detections enter the private controller, which reuses or creates and independently reviews field-journal plates before serving the approved catalog to an Inky display node or an optional trusted browser application
Open the full-size overview on a small screen. The installation guide includes the complete runtime and network diagram.

The project has two installed roles:

  • The controller checks configured sources, creates and reviews missing
plates, and serves an approved catalog on a trusted private network.
  • The display node downloads approved assets, verifies their checksums, and
rotates them on the Inky panel. It never runs discovery or Codex.

A trusted browser application may also read the catalog through a same-origin proxy or an explicitly allowed origin. Inky supplies the data interface and a narrow, script-free plate embed, not a standalone application. The controller has no built-in authentication or TLS and must not be exposed directly to the internet.

The controller and display may run on one capable Raspberry Pi, but the recommended wall build keeps a lightweight Pi behind the frame and runs the controller on an existing Mac, Linux computer, Raspberry Pi 4 or 5, or Docker host. A controller or network outage does not blank the e-paper panel; it keeps showing its last successful image.

A same-origin application proxy is the recommended browser path. It can authenticate users, keeps the controller on the trusted network, and needs no CORS setting. Direct cross-origin access is disabled by default. Browser local network and mixed-content policies vary, so a direct connection may prompt for permission or fail even when its origin is allowed. Browser reads never count as display-node health. Allowing an origin does not add authentication or make the controller safe to expose to the internet. See Browser applications for the API, embed, privacy, and network limits.

Observation sources

  • Nearby public sightings: iNaturalist or eBird. These use the configured
point, radius, and supported time window.
  • Your sightings and trips: eBird Archive. Inky imports the official
Download My Data ZIP or CSV without storing account credentials, locations, comments, counts, or media references.
  • A live acoustic station: BirdWeather or BirdNET-Go. Inky reads species
summaries and never receives recordings or manages microphones.
  • Offline acoustic results: BirdNET Analyzer. Only CSV history you
explicitly import enters private controller state.
  • A smart feeder: Bird Buddy. This opt-in private-API provider requires
permission from Bird Buddy and an explicit authorization confirmation.

Providers run independently, so one failure does not stop healthy providers. Every result must resolve to the same active iNaturalist bird species before it can enter generation. BirdWeather, BirdNET-Go, and Bird Buddy can also give the newest eligible detection one display turn before normal rotation resumes.

See Discovery sources for credentials, provider limits, privacy, setup, verification, failure handling, recovery, and disabling a provider.

Related project

If you want an end-to-end backyard listening station, AvianVisitors by Teddy Warner is a project I’m happy to point people toward. Built around BirdNET-Pi, it turns local microphone detections into a live illustrated collage and connects with Home Assistant, MQTT, remote access, and eBird regional filtering. Teddy also offers hardware kits for the microphone and frame, and the optional e-ink frame can run from either the local station or BirdWeather data. His detailed AvianVisitors project write-up is a great guide to the full listening-station workflow.

Inky Bird Frame meets that ecosystem at a different point. It can bring in acoustic detections from BirdNET-Go, BirdWeather, and BirdNET Analyzer alongside eBird, iNaturalist, Bird Buddy, and personal eBird history, then turn them into reviewed, reusable field-journal plates. Inky does not record or analyze raw audio, configure microphones, or install and manage a BirdNET detector.

Plates you can trust and reuse

Creating an image does not approve it. A separate Codex run checks every candidate:

  1. independently verifies the species profile against at least two authoritative
sources;
  1. compares anatomy, plumage, proportions, and field marks with every reference
photograph;
  1. checks names, measurements, labels, and location neutrality; and
  2. returns structured scores and concrete corrections.
A failed review edits the candidate with those corrections. Attempts are bounded, and exhausted work stops for inspection rather than publishing. Regular application code, not Codex, owns provider parsing, license rules, checksums, dimensions, catalog state, downloads, and display rotation.

Approved plates and manifests contain no postal code, coordinates, observation dates, local place names, network details, or machine paths. That separation lets every installation reuse the same reviewed plate. Downloaded references, private observations, run logs, rejected work, and display state stay outside the reusable catalog.

Browse the public gallery or read the architecture and privacy model.

Hardware

The reference display uses the 13.3-inch PIM774, a Pi Zero 2 W with a pre-soldered header, and a 12 x 16 inch portrait frame. The supported 7.3-inch PIM773 provides a smaller build; the display node fits the complete canonical plate without cropping or stretching.

An existing 64-bit Mac or Linux computer can host the controller at no added hardware cost. A dedicated Raspberry Pi 4 is optional. The reference prices checked on July 9, 2026 put the framed PIM774 display at $358.94 and the optional dedicated controller at $173.64, before tax and shipping.

The hardware guide contains the complete bill of materials, panel and mat dimensions, assembly photographs, reuse guidance, and physical safety notes. Verify every measurement against the panel before cutting a mat or backing board.

Install

Choose the path that matches the controller:

release bundle and pulls the published AMD64 or ARM64 image from GitHub Container Registry.
  • macOS, Ubuntu, or Raspberry Pi OS: the
native installation guide previews every managed setup change before applying it.

Both paths continue through the same five checkpoints: prepare and diagnose the controller, flash and attach the display Pi, prove the panel with an included plate, prove private-network access, then enable live rotation and automatic generation.

The controller needs Python 3.11 or newer and either a ChatGPT plan that includes Codex or separately billed OpenAI API access. It also needs network access to the observation, geocoder, research, and Codex services you configure. The display needs Pimoroni’s Inky package and private-network access to the controller.

Living with the frame

Normal installations schedule observation refresh, generation, catalog serving, notifications, and display rotation. These commands are the useful first checks on a native installation. They use the default managed runtime; if you chose a different application directory, point IBF at its .venv/bin/inky-bird-frame instead.

IBF="$HOME/Services/inky-bird-frame/.venv/bin/inky-bird-frame"
"$IBF" --version
"$IBF" doctor controller --config /path/to/config.toml
"$IBF" status --config /path/to/config.toml
"$IBF" refresh --config /path/to/config.toml
"$IBF" generate --config /path/to/config.toml

shuffle_bag is the default rotation: it shows every active bird once before a new round and admits newly discovered birds into the current round. The active catalog includes approved species that are currently observed or explicitly kept in the private collection.

See Operations for Docker equivalents, historical seeding, collection management, rotation modes, publication, backups, and failure recovery. Start with Troubleshooting when a doctor check fails.

Notifications

Notifications tell you when something worth seeing happens: a new bird appears, a plate passes review, a failed service recovers, or generation needs help. Routine successes stay quiet. Delivery uses a retry queue, so a notification provider outage does not block discovery or generation.

!Pushover notifications for a recovered generation queue and an approved American Goldfinch plate

Pushover is one option. The same configuration can target Discord, ntfy, Gotify, Slack, email, Home Assistant, and other Apprise-supported services. See Notifications for setup, event controls, retries, and secret handling.

Homepage dashboard

For my fellow homelabbers, I wanted Inky to feel at home beside the rest of your services. The compact card gives you a quick read on catalog readiness, active birds, approved plates, and the controller version. If you have a little more room, the featured-plate card adds an upright bird plate that refreshes every 15 minutes.

Compact Homepage service card for Inky Bird Frame showing catalog readiness, active birds, approved plates, and controller version
Compact status

Homepage service card for Inky Bird Frame showing catalog stats above an upright featured Eastern Bluebird plate
Status and featured plate

Both versions use Homepage's stock service widgets. There is no custom plugin or JavaScript to install. The screenshots use a deterministic v0.7.0 demo: the 162 public plates published in that release and a fixed Eastern Bluebird. They include no provider, location, observation time, or personal observation data.

Follow the Homepage dashboard recipe for the copy-and-paste configuration and private-network requirements.

Contributing

Code, documentation, hardware compatibility, and new catalog plates are welcome.

Public CI checks privacy, provenance, checksums, image structure, and immutable catalog rules. External pull requests never receive Codex, deployment, notification, or publisher credentials.

The project does not offer individual setup support. Start with the doctor commands and troubleshooting guide; open a bug only when you can describe reproducible incorrect behavior.

Thank you to @dwalters0, whose contribution identified and helped close the trusted browser-client gap, and to everyone who shares an issue, plate, fix, or idea.

Documentation

| If you need to… | Read… | | --- | --- | | Choose parts or assemble a frame | Hardware | | Install on macOS, Linux, or Raspberry Pi OS | Native installation | | Run the controller with Docker or on a NAS | Docker controller | | Configure observation and detection sources | Discovery sources | | Operate, seed, recover, update, or roll back | Operations | | Back up or restore private controller state | Backup and restore | | Configure alerts | Notifications | | Add Inky to a Homepage dashboard | Homepage dashboard | | Diagnose a failure | Troubleshooting | | Understand trust, privacy, and data flow | Architecture | | Submit a change or plate | Contributing | | Report a vulnerability privately | Security |

Development

uv sync --extra dev --locked
uv run ruff format --check .
uv run ruff check .
uv run mypy
uv run pytest
uv run inky-bird-frame catalog validate --catalog catalog

License

Inky Bird Frame is available under the MIT License. The controller container also includes Codex CLI and GitHub CLI. Their licenses and the exact in-image notice paths are listed in THIRD_PARTY_NOTICES.md.

Chat with me