Open-source WordPress image workflow for rights-aware free-stock discovery and CMS placement.
Project description
Pictovap
Pictovap is an open-source WordPress image workflow for publishers. It finds rights-aware free-stock image candidates for Gutenberg or Markdown articles, plans their placement, and keeps the provenance needed to publish with confidence.
The Problem
Every publisher runs the same manual routine before an article can go live: find images that actually fit the section they're going into, check whether the license permits the intended use, resize and convert them to the site's format, write alt text and a caption for each one, and place them at the right point in the CMS. None of this is hard, individually. It is, however, repetitive, easy to get wrong under deadline pressure, and it scales linearly with how much a publisher writes. Skipped alt text quietly erodes accessibility and SEO. Untracked image provenance is a license or attribution problem waiting to surface later, when it's expensive to fix. None of this shows up in a style guide — it shows up as an hour of an editor's afternoon, per article, forever.
Point solutions exist for pieces of this: stock photo plugins, DAM systems, generic AI image generators. What's largely missing is the connective layer — something that reads what the article actually needs, evaluates candidates against that need with a visible, auditable reason for every accept and reject, and hands a CMS a placement plan it can execute without a human re-deriving the same context from scratch.
The Solution
Pictovap is that connective layer, built as an open, adapter-based pipeline rather than a closed SaaS product:
Article Input → Visual Brief → Candidate Images → Fit Score
→ Provenance Pack → CMS Placement → Editor Report
- Visual Brief — a structured read of what imagery the article actually needs, derived from its heading structure and content, not from a generic "insert 3 images" rule.
- Fit Score — every candidate is scored against the brief with a
transparent, deterministic reason attached (
selected,rejected, orneeds_review, plus why). No black-box relevance number. - Provenance Pack — a persistent audit trail for every selected image: source, license status, attribution, a content hash, and the exact processing actions applied. This is what makes "where did this image come from and are we allowed to use it" answerable six months later.
- CMS Placement — a CMS-agnostic plan describing where and how each image should be placed, independent of whether the destination is WordPress, Ghost, Strapi, or something a contributor writes an adapter for tomorrow.
- Editor Report — a human-readable Markdown review surface, so an editor signs off on a report, not raw JSON, before anything reaches production.
What makes this radical isn't any single stage — it's that the whole pipeline is a public, inspectable contract instead of a hosted black box, and that it is honest about its own workings by default: the credential-free demo below runs the entire pipeline end-to-end, with zero API keys and zero network calls, so you can read exactly what it does before you ever hand it a real site.
Pictovap is not a stock photo search tool, a DAM, a generic AI image generator, or a WordPress-only plugin. It has no graphical interface yet — it is a CLI-first, adapter-based core, with the editor report as the intended human review surface and CMS adapters as the machine-facing execution layer.
Quickstart
Install from PyPI and run the credential-free demo:
pip install pictovap
pictovap demo
Brief: 4 slots from 3 sections
Evaluated: 5 candidates
Selected: 3 images
Rejected: 4 candidates
Placements: 3 instructions
No .env file, no API keys, no network calls — every candidate and score
above comes from deterministic mock data, on purpose. This is the demo's
guarantee, not just its default state.
Try Your Own Article
pictovap plan \
--article path/to/your/article.md \
--profile examples/profiles/sample-publisher.yaml \
--output my-plan.json \
--report my-report.md
my-plan.json is the canonical, machine-readable artifact for adapters and
automation. my-report.md is the same plan, rendered for a human editor to
review before anything gets published.
Adapters
Pictovap connects to the outside world only through adapters — the core pipeline has no hardcoded dependency on any specific image provider or CMS.
Image sources: local folder, Unsplash, DepositPhotos, Openverse (no key required, free CC-licensed images), and Pexels are implemented. Pixabay and Wikimedia Commons are open contribution opportunities — see Good First Issues. See Image Source Adapters.
CMS placement: WordPress (production-tested), Ghost and Strapi (reference implementations, real but with documented limitations). See CMS Adapters.
Image-source adapters degrade gracefully when unconfigured — a missing API key
produces an empty result, not a crash, so a partially configured profile still
runs. CMS adapters fail clearly when publishing credentials are missing.
Writing a new adapter means implementing one method (search_candidates or
place) against a documented Protocol; see the
Adapter Overview.
Third-party adapters can ship as independent Python packages. Generate a
working package with pictovap scaffold provider <name> or
pictovap scaffold cms <name>, validate it with pictovap.testing, and expose
it through a standard Python entry point. See
Building Adapter Plugins.
An installed plugin is a first-class runtime component, not only a discovered class. The same external package can be checked, planned, previewed, and run:
pictovap doctor --provider acme-images
pictovap plan --article article.md --provider acme-images --output plan.json
pictovap publish --plan plan.json --cms acme-cms --dry-run
Constructor settings are repeatable KEY=VALUE options. For credentials, use
KEY=@ENV_VAR; Pictovap resolves the environment value without echoing it in
diagnostics or output.
Multi-Language by Design
Pictovap's own code, comments, and documentation are English. What it generates — alt text, captions, titles — is not tied to any one language. Article language is detected automatically (or set explicitly via the publisher profile), and generated metadata follows it: a Turkish article gets Turkish alt text, a French one gets French, and so on. This isn't a localization afterthought bolted onto an English-only tool; it's a parameter of the pipeline from the start.
Current Status and Limitations
Pictovap is early open-source infrastructure. It has a genuinely credential-free local demo, documented core primitives, a real test suite, and a working adapter model — it does not yet claim broad ecosystem adoption or a large external contributor base.
Specifically:
- Only the WordPress CMS adapter is production-hardened; Ghost and Strapi are real, tested reference implementations with documented gaps (see CMS Adapters).
- The credential-free demo always uses deterministic mock candidates by
design, regardless of what's configured in
.env—pictovap planis where real, credentialed sources are used. - Deterministic structural extraction (the rule-based, non-AI language and section detection) is reliable for English and Turkish; other languages are untested.
Compatibility Note
Product name: Pictovap. Since 0.3.0 the Python package, import name, and
console-script entry point are all pictovap; pictova remains a deprecated
alias — see Brand & Naming.
Contributing
The July 2026 Adapter Sprint has three claimable provider and CMS integrations with exact acceptance tests.
See the Documentation Portal for architecture, concepts, and adapter-writing guides, and DEVELOPER.md for the contribution workflow. Pull requests that add a new image source or CMS adapter, improve test coverage, or fix documentation are all welcome.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pictovap-0.7.2.tar.gz.
File metadata
- Download URL: pictovap-0.7.2.tar.gz
- Upload date:
- Size: 72.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c434a5ec1aa68034a4efa2032ae9ea9e6f17fa1b44c7581941c8daf509bad709
|
|
| MD5 |
dc663c8638731be4e8fc2ba18121e9d9
|
|
| BLAKE2b-256 |
cf06d49df534253050d3354d7c87d079a034694cc11fa09c1d35c5c739e119e8
|
Provenance
The following attestation bundles were made for pictovap-0.7.2.tar.gz:
Publisher:
publish.yml on yoldaolmak/Pictovap
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pictovap-0.7.2.tar.gz -
Subject digest:
c434a5ec1aa68034a4efa2032ae9ea9e6f17fa1b44c7581941c8daf509bad709 - Sigstore transparency entry: 2195855553
- Sigstore integration time:
-
Permalink:
yoldaolmak/Pictovap@c82fab54b78468a107c8ccb5ad61c584e33718b8 -
Branch / Tag:
refs/tags/v0.7.2 - Owner: https://github.com/yoldaolmak
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c82fab54b78468a107c8ccb5ad61c584e33718b8 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pictovap-0.7.2-py3-none-any.whl.
File metadata
- Download URL: pictovap-0.7.2-py3-none-any.whl
- Upload date:
- Size: 82.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0f0153e4378dcf52a07b58966f9838696443e1ff7bbc709deacc29195c80e9cf
|
|
| MD5 |
ba520d172cb4fcd35f23b5904763366e
|
|
| BLAKE2b-256 |
d7835f87c67e86495b2da090ca67f65fa9b133c9ec61363ccc5b3a354c4c64f1
|
Provenance
The following attestation bundles were made for pictovap-0.7.2-py3-none-any.whl:
Publisher:
publish.yml on yoldaolmak/Pictovap
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pictovap-0.7.2-py3-none-any.whl -
Subject digest:
0f0153e4378dcf52a07b58966f9838696443e1ff7bbc709deacc29195c80e9cf - Sigstore transparency entry: 2195855686
- Sigstore integration time:
-
Permalink:
yoldaolmak/Pictovap@c82fab54b78468a107c8ccb5ad61c584e33718b8 -
Branch / Tag:
refs/tags/v0.7.2 - Owner: https://github.com/yoldaolmak
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@c82fab54b78468a107c8ccb5ad61c584e33718b8 -
Trigger Event:
push
-
Statement type: