Install & Permissions
CaptureKey is distributed through PortalKey under Software. Install the APK the same way you install other Shatterproof Android apps. On first launch, Android will prompt you for a few permissions:
- USB access - Needed every time you plug the camera into the phone. Check Always allow on the permission dialog so it doesn't pop up mid-event.
- Notifications - Allow these so messages from Operations and other photographers can reach you even while the screen is off.
- Storage - CaptureKey manages its own scoped folder for imported photos. You don't need to grant broad file access.
Sign In
If you aren't signed in, the app opens directly to the login screen. The normal tabs and top bar are hidden until you authenticate.
- Enter your normal PortalKey username and password. You don't need a separate CaptureKey account.
- Tap Sign In. On success, the app loads your photographer profile and jumps to the Capture tab.
- Your session is remembered until it expires. You can keep closing and reopening the app without signing in again.
Auto-loaded event
After sign in, CaptureKey checks whether you already picked an event on this device. If not, it auto-loads the event the server says you're scheduled for. You can always switch events later from Setup.
Pick an Event
Each event is its own sandbox. Assignments, photos, messages, and notes from one event never leak into another. You can only be attached to one event at a time per device.
- Go to Setup and tap Switch next to the current event to pick a different one.
- Switching events clears the local active assignment but does not delete photos that are still waiting to upload.
Connect the Camera
CaptureKey speaks USB directly to Canon EOS cameras. No extra drivers, apps, or cables beyond a standard USB OTG connection.
- Plug the USB cable into the camera first, then into the phone.
- When Android asks which app should handle the USB device, pick CaptureKey and check Use by default.
- The camera status icon in the top bar should pick up a green dot within a few seconds.
- Trigger a test shot. It should appear on the Capture tab almost immediately.
Leave the card in the camera
The intended production flow keeps the capture destination on the camera card. CaptureKey downloads copies to the phone. Only enable Delete from card after import if you're confident you want that; see Canon Camera Notes.
Typical Flow
Most events follow a loop like this:
Activate an assignment from the Path tab, or type the number into Quick Select.
Shoot your photos. Every capture that arrives while this assignment is active is automatically tagged with it.
Move on. Either tap Complete on the Capture chip, or switch assignments. CaptureKey will queue the tagged photos for upload.
If the assignment didn't want photos, tap No Photos. That completes the assignment and flags it; if you later retag a photo onto it, the flag clears automatically.
If someone requests a return, you'll see it as a notification and a RETURN row in Path. Re-activate, shoot, and the photo flows through normally.
Why there's no Claim button
Assignments don't need to be "claimed." When you pick one, you're telling your device to tag new photos with that number. Completing the assignment is the only action that's event-global; everything else is local and instantaneous.
Capture Tab
Capture is your home base during the event. It shows the latest photo that came in from the camera, its assignment tag, and its upload state.
Elements:
- Top Banner - Appears briefly when the app auto-activates the next assignment. Tap it to jump to that assignment in Path.
- Photo Preview - The current selected or newest photo. Swipe left/right to move through recent captures. Pinch to zoom.
- Upload Chip - Shows the live state of the visible photo. See Upload States.
- Assignment Chip - Tap it to retag this single photo onto a different assignment. Retagging does not change your active assignment.
- Complete - Completes the active assignment and may auto-activate the next item in Your Assignments.
- No Photos - Completes the active assignment and marks it as having no photos.
- Photo Note - Free text attached to a single photo. Tap the pencil to edit. Notes sync to the server with the photo.
- Recent strip - Thumbnails of recent photos. Tap to jump, long-press to multi-select (drops you into Gallery selection mode).
- Quick Select FAB - Opens the number picker. See Quick Select.
Gallery Tab
Gallery shows every imported photo on the device, grouped by assignment. Use it when you need to retag, delete, or review in bulk.
Elements:
- Thumbnail grid - Each thumbnail shows its assignment and an upload-state dot in the corner. Tap to open, long-press to start multi-select.
- Selection bar - Appears after you long-press. Shows the count and exposes Retag, Delete, and an overflow menu.
- Batch Retag - Reassigns every selected photo to the same target in one step. Useful if you shot someone into the wrong suite.
- Batch Delete - Always confirms before it removes. Deleting a photo that was already uploaded only removes the local copy on the phone.
Be deliberate with Delete
Deletion on the phone is not reversible from within the app. If a photo hasn't uploaded yet, deleting it means the photo is gone. Upload first when in doubt.
Path Tab
Path is the event-wide view of every assignment. It's the same list everyone else on the team is looking at in real time.
Assignments are grouped into sections so you don't have to scroll a flat list:
- ACTIVE The one assignment your device is currently tagging photos with.
- Your Assignments - Items assigned to you that aren't yet complete.
- Return Requested - Items the operator or a guest asked for another pass on.
- Unassigned - Fair game for anyone to pick up.
- Skip List - Red rows. Do not disturb. You can still activate one if Operations tells you to, but the app will warn first.
- Other Assignments - Assigned to someone else. Visible for context; activate them only if you know what you're doing.
- Completed - Collapsed by default. Reopen one from here if it turns out there was more work.
Row actions:
Tap the three-dot overflow on any row to reveal actions. Not all actions apply to every row.
- Assign to Me - Pulls the assignment into your working list. Replaces the previous owner.
- Activate - Sets this as the device-local active assignment. Doesn't change ownership.
- Complete / No Photos - Same as on Capture, but you don't have to activate first.
- Request Return - Flags the assignment for another pass. Notifies the current owner.
- Reopen - Moves a completed row back into active state.
- Edit Note - Attach a free-text note to the assignment itself (visible to the whole team).
Quick Select
Quick Select is the fastest way to change assignments without scrolling Path. It's the floating action button on Capture and Path.
- Start typing the number. Matches filter in real time.
- Tap ↵ on a row to activate that assignment.
- Long-press a row instead to Assign to Me before activating.
- Typed numbers that don't exist in the event are rejected with a shake; nothing is created.
Setup Tab
Setup holds everything that isn't part of the per-photo, per-assignment loop: event selection, camera status, per-device settings, and session controls.
- Event - The event this device is attached to. Switch opens the event picker.
- Camera - Model and connection state. Tap the card to re-probe USB if something looks wrong.
- Delete from card after import - When on, successfully imported photos are deleted from the camera's SD card. Off by default.
- Notification sound / Vibrate - Per-device. These do not sync to other devices.
- End Session - Full event wrap-up. See End Session.
- Sign Out - Clears the auth session only. Local event data stays so you can sign back in without losing anything.
Notifications
Every event-wide event - messages, reassignments, return requests, completions by other photographers - shows up behind the bell in the top bar. Unread items bump the red badge and animate the bell.
- Tap a row to open the relevant assignment or message thread.
- Mark all read clears the badge without opening anything.
- Sound and vibration are controlled in Setup. Android still decides whether to show a system notification when the app is in the background.
- Read state is stored locally on your device only. Reading a notification on one phone does not mark it read on another.
Path rows are color-coded. A quick reference:
| Badge | Meaning |
| ACTIVE | The assignment your device is tagging photos with right now. Only one at a time. |
| YOURS | Assigned to you, not yet complete. |
| RETURN | Someone requested another pass. Treat as higher priority than normal. |
| OPEN | Unassigned. Anyone can Assign to Me or simply activate. |
| SKIP | Operations says do not disturb. The app warns before activating a skipped row. |
| DONE | Completed. Can be reopened if work reappears. |
End Session
End Session is the event wrap-up. It sends a recap to Operations, closes the event on the server, clears all event-scoped state on the device, and signs you out.
Readiness checklist
The modal will not let you finish until all three of these are green:
- No active assignment - Complete or deactivate your current one first.
- All photos uploaded - Zero photos in Held, Queued, Uploading, or Failed. Retry failed uploads before ending.
- Workflow sync clear - Pending local actions (retags, notes, completes) have reached the server.
Recap notes
Use the notes field for anything Operations should know: which suites had issues, what equipment misbehaved, guest feedback worth logging. The text submits to the server as part of the final summary.
What happens on confirm
- The app calls
finishEventSession on the server.
- On success, every imported photo file is deleted from the device.
- All event-scoped workflow state on the device is cleared.
- The auth session is signed out.
Point of no return
End Session is destructive on the device. Don't end the session until all uploads are complete. If the server acknowledges but you still see local data, force quit the app and reopen - the cleanup runs again on next launch.
Workflow Conflict Rules
Multiple photographers touch the same event at the same time. CaptureKey's conflict model keeps things predictable:
- Active is device-local. Two devices can have "the same" assignment active. Each only tags photos it sees.
- Complete is event-global. The first completion wins. Later attempts to complete the same assignment are no-ops.
- Assign to Me wins the row. Reassignment always replaces the previous owner, even if the row was already in someone's Your Assignments.
- No Photos clears on new photo. If any device retags or imports a photo onto a No Photos assignment, that flag drops automatically and the assignment reopens.
- Skip is operator-managed. Only Operations can add or remove Skip state through PortalKey. Photographers see the red warning but can override if instructed.
- Local writes are optimistic. Actions apply instantly on your device and sync to the server in the background through the outbox. If the server rejects one later, you'll see it reappear in the affected section.
Canon Camera Notes
CaptureKey talks to Canon EOS bodies directly over USB using MTP plus the EOS event stream. Tested bodies include the R100 and the T5i. Other recent EOS bodies should work but may need a firmware check.
Compatibility notes
- Canon R100 - Works. An older build depended on
EOS_GetObjectInfoEx during prep; the current app skips that call.
- Canon T5i - Works with broadened handling for older Canon EOS event variants. If you see "listening" but no captures arrive, power-cycle the camera and reconnect.
- Other EOS bodies - Generally fine. If a specific body misbehaves, open the Camera card on Setup, note the model string, and send it to Operations.
Capture destination
Leave the camera set to write to its SD card. CaptureKey pulls copies. Writing to the card keeps a physical backup and is faster on tethered bursts than writing over USB.
Delete from card
If you turn this on, the app deletes each successfully imported photo from the card. This only runs after CaptureKey has the file and has registered it for upload. It does not run on failure.
Offline Behavior
Short-lived events often happen in venues with bad networking. CaptureKey is local-first:
- All workflow state is persisted as JSON on the device, scoped to your photographer id.
- Every event-global change you make is queued in an outbox. The repository overlays pending outbox changes on top of the latest server snapshot so your own actions always appear applied.
- Uploads are handled by Android's WorkManager. When it's online, it drains the queue; when it's not, it waits.
- When the network comes back, outbox actions and uploads both resume automatically. You don't need to press anything.