Self-initiated (internal tool)

Camera to Gallery, Live

  • Product Design
  • UX/UI Design
  • Brand Identity
  • Photography
  • Systems Integration

Product design, interface and identity; Piwigo gallery and hosting stood up and run; event photography. Python application written in pair with an AI assistant, against a live camera.

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.

Contact SheetLast: 10:29:21
  1. Families queuing at a table of blue and red branded backpacks in a school cafeteria5G2A0109.JPG10:28:11
  2. A volunteer in a red shirt handing a red backpack to a woman at the giveaway table5G2A0120.JPG10:28:17
  3. A group gathered around the backpack table under blue and yellow balloons5G2A0131.JPG10:28:24
  4. Volunteers and families exchanging backpacks across the branded table5G2A0137.JPG10:28:30
  5. Attendees crossing the cafeteria floor with backpacks, a firm banner behind them5G2A0141.JPG10:28:36
  6. A child holding a 'First Day of Kindergarten' sign against a coloured pencil backdrop5G2A0149.JPG10:28:43
  7. Two children holding first-day-of-school signs in front of the photo backdrop5G2A0152.JPG10:28:49
  8. Backpacks stacked on the table beside a firm-branded display board and balloons5G2A0189.JPG10:28:56
  9. A young girl holding a first-day sign, photographed against the coloured pencil backdrop5G2A0195.JPG10:29:03
  10. Volunteers in red shirts distributing backpacks under blue and yellow balloons5G2A0222.JPG10:29:09
  11. Families walking through the cafeteria past the event signage5G2A0245.JPG10:29:15
  12. A child being photographed on the small stage in front of the coloured pencil backdrop5G2A0264.JPG10:29:21
12 uploaded0 failed10:28:11 → 10:29:21
Real frames, real filenames, real timestamps, lifted from the session screenshot. The reveal is time-compressed: about six seconds passed between each of these in the room.