Stock photography hosting for a library measured in terabytes.
A photography store is an unusual WordPress site: the product is the file, the catalogue is enormous, and the thing you sell must never be reachable by guessing a URL.
Everything a photo library asks of a host.
Most sites store images. Here the images are the inventory, the storefront and the delivery, all at once.
Derivatives generated outside the request
One upload becomes a thumbnail, a preview, a watermarked comp and more. Generated on upload in-request, a bulk import of two thousand photos times out on the first hundred.
Originals that are not in the webroot
A full-resolution file sitting under /wp-content/uploads is one guessed URL away from being free. Purchased assets live outside the served directory entirely.
Download links that expire
A permanent download URL is a permanent licence. Links are signed and time-limited, so a shared link stops working rather than becoming a distribution channel.
A media table that stays queryable
Every derivative is a row in postmeta. A hundred thousand images with six sizes each is over half a million rows before a single search runs against them.
Browse pages that do not load originals
The single fastest way to ruin a gallery is serving a 40 MB master where a 60 KB thumbnail belongs. Size selection is enforced at delivery, not left to the theme.
Import thousands without taking the site down.
The dangerous day is not a busy one, it is the day somebody bulk-uploads a shoot and every derivative is generated at once on the machine serving customers.
- Bulk imports processed as background jobs
- Originals excluded from the served directory
- Expiring, signed download links
- Restore any daily backup from the dashboard
A gallery page of forty photographs.
Forty images is forty requests, and whether the page is fast is decided entirely by which size each of them resolves to.
What we change for a photography library
These differ from a standard WordPress site on the same plan, and each follows from the media being the product rather than decoration.
| Setting | What we do | Why |
|---|---|---|
| Derivative generation | Queued as background work instead of running during upload | One photograph becomes several rendered sizes, so a bulk import multiplies into thousands of resize operations and exhausts the request that triggered them. |
| Original file storage | Held outside the served directory, reachable only through signed access | A full-resolution master under the uploads directory can be fetched by anyone who guesses its path, which gives away the thing the site exists to sell. |
| Download URLs | Signed and time-limited rather than static paths | A permanent link is an unlimited licence the moment it is forwarded, and nothing on the site can tell that it has been. |
| Attachment metadata | Indexed, with unused image sizes pruned | Each rendered size adds a postmeta row per image, so a six-size preset turns a hundred thousand photographs into most of a million rows before any search touches them. |
| Image size selection | Enforced at delivery rather than trusted to the theme | A template that outputs the full-size file into a grid transfers tens of megabytes to render thumbnails, which no amount of caching in front of it can undo. |
Simple, transparent pricing.
Every plan includes free migration, daily backups, SSL and 24/7 support.
- 1 WordPress site
- 10 GB NVMe disk
- Free SSL
- Daily backups
- One-click deployment
- Support tickets
- 5 WordPress sites
- 50 GB NVMe disk
- Free SSL
- Daily backups
- One-click deployment
- Priority support tickets
- 20 WordPress sites
- 200 GB NVMe disk
- Free SSL
- Daily backups
- One-click deployment
- Dedicated support
Questions, answered.
Can WordPress handle a library of a hundred thousand photos?
How do you stop people downloading the full-resolution file for free?
Bulk uploads take the site down. What fixes that?
Why is my gallery page so slow?
Can customers re-download what they bought?
Host a photography library where the files are the business.
Free migration, derivatives off the request path, and originals nobody can guess their way into.