SWG Project Capture
A field worker opens one tokenized link on a phone, names the job, takes photos, and taps Send. Photos land in the WordPress Media Library grouped by job with the camera GPS intact and stripped from the public copies.
Overview
- One tokenized link per person or crew – no login, no app, no account
- The camera's GPS survives the trip, including through the client-side shrink
- Location stripped from the public derivative by default, kept in the database
- Named capture links, revocable one at a time, with per-link rate limiting and photo attribution
- Offline queue in IndexedDB – photos persist before the first send attempt and resume on reconnect
- Installs to the phone home screen from the Done screen, no app store
- Tile-free job map drawn as SVG, so no coordinate ever reaches a map provider
- Per-job gallery placed on any page, serving only stripped derivatives
- Photo-spot scanner: deterministic keyword pass plus an optional SmartCore AI pass
- Real byte-level upload progress, not a timer
// illustrative interface preview. real screenshots land here before launch.
See it running
Tech specs
Straight from the codebase scan and the engineering docs. No marketing numbers.
How it works
swg-project-capture.php boots includes/class-plugin.php, which wires twelve classes and no custom tables. A job is a taxonomy term (class-taxonomy.php, swgpc_job) registered against attachments, so WordPress supplies rename, merge, reassign and filtering for free – the original design called for six custom tables and was cut to this before any code was written. class-capture.php routes the public capture page and its web-app manifest off a query var, both token-gated; class-token.php holds the named capture links (hashed at rest, AES-256-CBC recoverable copies keyed from wp_salt); class-upload.php is the only write path, authenticating by token rather than nonce because a field user has no WP session; class-metadata.php extracts EXIF before any image processing and strips location from public copies; class-geo.php draws the job map as SVG from the database; class-gallery.php places a job on a page; class-scan.php finds pages that want photos, deterministically first and via SmartCore second; class-admin.php renders the three-screen SaaS admin.
Where the data lives
| Database / table | Type | Purpose |
|---|---|---|
| swgpc_job (taxonomy) | taxonomy on attachments | the job a photo belongs to; term meta carries the public flag and page placement. No custom tables exist – this replaced a proposed six-table schema. |
| attachment meta | post meta | _swgpc_lat / _lng / _alt / _gps_source / _swgpc_taken_at / _swgpc_camera / _swgpc_status / _swgpc_error / _swgpc_upload_id – provenance survives even when a host's image library destroys EXIF |
| swgpc_links | option | one row per named capture link: id, name, password hash, encrypted recoverable copy, issued and last-used timestamps |
Talks to
SWG SmartCore the optional AI pass of the photo-spot scanner, via swgsc_ai_request(); the plugin holds no AI key of its own and fails soft to the keyword pass
Public surface
Two public surfaces. The capture page (?swgpc=capture) is the phone app: job search, camera, per-photo naming, offline queue, home-screen install – reachable only with a valid token. The [swgpc_gallery] shortcode, and an automatic append for a job placed on a page, render a job's photos publicly; the renderer enforces the public flag itself and emits only stripped derivatives, and field notes never render.
History
Changelog
32 releases since August 2026. The whole history, verbatim from the changelog:
Frequently asked questions
What is SWG Project Capture?
It gets field photos from a phone into the WordPress Media Library. A worker opens one tokenized link, names the job, takes photos and taps Send, with no app and no account.
Do field workers need an app or a login?
Neither. Each person or crew gets one tokenized link that opens in the phone browser, which is what makes it usable by subcontractors and casual crews.
Does the camera GPS survive the upload?
Yes. The location data survives the trip, including through the client-side image shrink, and is stored in the database against the photo.
Is the location visible to the public?
No, not by default. Location is stripped from the public derivative image while being kept in the database, so you keep the data without publishing it.
What happens if a worker loses signal on site?
Photos are queued offline in the browser using IndexedDB. They persist before the first send attempt and resume automatically when the connection comes back.
Can I turn off a link if someone leaves?
Yes. Capture links are named and revocable one at a time, so you can kill a single crew member's access without disturbing anyone else.
How are photos organized once uploaded?
They land in the WordPress Media Library grouped by job, with attribution recorded per link so you know who sent what.
What stops someone abusing a capture link?
Each link carries its own rate limiting, and links are individually revocable, so a leaked link is contained rather than open-ended.
Is this useful outside construction?
Any job where someone on site needs to send photos back without being issued an account fits the same shape, including inspections and property work.
Can I buy SWG Project Capture now?
Not yet. Checkout opens when the SWG License Manager clears hardening, and listed prices are placeholders until then.
Want it the day checkout opens?
Checkout opens the day our license platform clears its final security gate. One email when it does. That is the whole funnel.
No spam. One email at launch, then the newsletter only if you opt in.