
Self-initiated (internal tool)
Camera to Gallery, Live
Problem
Event photography has a delivery gap, and the gap is where the value leaks out. The photographer shoots all afternoon, drives home, culls, edits, and posts a gallery two days later — by which time the crowd has dispersed and the moment has passed. For a law firm handing out backpacks in a school cafeteria, the photographs are the outreach. They are worth most while the families are still in the room.
Canon’s own answers to this are poor. Camera Connect was retired in favour of Content Transfer Professional, which is subscription-gated and sits at 2.2 stars. image.canon only speaks to Google Drive and Google Photos. FTP straight off the camera body works, but wants a server standing by. Tethered USB is the most reliable option and ties the photographer to a cable, which is the one thing you cannot be while working a room.
What made a better answer possible is that Canon ships a full HTTP REST API on the camera itself — the Camera Control API — reachable over the local network with no authentication, free to unlock, and almost nobody was using it for this.
Solution & Impact
FlashWire is a small Python service that watches the camera over WiFi and puts every new frame in front of the public within seconds of the shutter. It polls one endpoint the camera already exposes, downloads each new JPEG, and fans it out concurrently to a self-hosted Piwigo gallery, to Dropbox, and to a local folder — so the same shot becomes a public link, a cloud backup, and a file on disk in one pass, with no cable and no Canon software anywhere in the chain.
I designed the application and its identity, specified the Piwigo integration, stood up the gallery and the hosting the photographs land in, and shot the events it was built for. The code was written in pair with an AI assistant and debugged against a live camera.
The interface is a three-column console — camera and controls at the left, the contact sheet in the middle, the raw activity log at the right — in a deep plum and acid green chosen to stay legible in a dim gymnasium without throwing light back at the photographer. The identity follows the same logic: a camera drawn in one continuous outline with a lightning bolt struck through the lens, which is the whole product in one mark.
The design decision I would defend hardest is the activity log, because it is the part a tidier interface would have deleted. An unattended uploader that shows you nothing is an uploader you cannot trust — and trust is the entire proposition when the photographer has walked away from the laptop. So every step is written out in full: file found, bytes downloaded, each backend acknowledged with the URL it actually wrote to. When the venue WiFi wobbles, the failure is visible in the room, in the second it happens, instead of being discovered as an empty gallery that evening. The contact sheet is the reward; the log is the reason anyone leaves the laptop alone.
Confirmed end to end on a Canon EOS R7 into Piwigo 16.3, running on venue WiFi and on a phone hotspot. It has worked two seasons of firm events, and the gallery it feeds now holds 649 photographs across them.
Twelve frames, seventy seconds
Twelve frames off a Canon R7, seventy seconds apart end to end, at a school backpack giveaway. Nobody touched the laptop while these arrived — the photographer was across the room, still shooting. This is what the middle column of the dashboard looked like as it happened.
5G2A0109.JPG10:28:11
5G2A0120.JPG10:28:17
5G2A0131.JPG10:28:24
5G2A0137.JPG10:28:30
5G2A0141.JPG10:28:36
5G2A0149.JPG10:28:43
5G2A0152.JPG10:28:49
5G2A0189.JPG10:28:56
5G2A0195.JPG10:29:03
5G2A0222.JPG10:29:09
5G2A0245.JPG10:29:15
5G2A0264.JPG10:29:21




