# Evianis/travel-photo-abstraction: a Codex skill that turns one photograph into a sparse editorial abstraction

> A source-available Codex skill that inventories the visual facts of a travel photo, maps them to minimal marks, and pixel-verifies the result against the untouched original. It is a narrow tool with a strict licence and a hard dependency on Codex image generation.

**Evianis/travel-photo-abstraction** — A source-available Codex skill for distilling photographs into sparse editorial abstractions.

- Repository: https://github.com/Evianis/travel-photo-abstraction
- Stars: 780 · Forks: 51
- Language: Python
- License: NOASSERTION
- Published: 2026-09-17 · Updated: 2026-09-17 · Language: en
- Canonical page: https://hysenlabs.com/projects/evianis-travel-photo-abstraction

## The problem: a photo is a system, not a filter target

Most photo-to-art tools apply a style. The README describes something narrower: the skill treats a photograph as a visual system and inventories observable evidence before any generation happens. It then maps each retained source fact to a minimal abstract mark, and the stated goal is to preserve spatial relationships, asymmetry, occlusion, count groups and negative space.

That framing tells you who it is for. It suits someone who wants a single editorial study from one photograph, with the original kept intact beside the abstraction, and who cares that four boats stay four boats in roughly the same relative positions rather than becoming a decorative pattern. It is a poor fit for batch processing or for anyone who wants the tool to invent a composition. The README is explicit that the skill avoids generic filters, decorative filler and invented visual content.

The output format is also fixed rather than open. The finalizer takes a number, a date and a phrase, and the example uses "NO. 001", "03 AUG 2026" and "QUIET STRUCTURE". That is a zine-style caption strip, not a general layout engine.

## How the skill works: inventory, mapping, then a fail-closed finalizer

The pipeline has two distinct halves, and the split is the most interesting design decision in the repository.

The first half is generative. The skill analyzes the photograph, selects two to four structurally relevant examples from the 19 bundled references using references/structural-reference-index.md, and generates a CLEAN abstract panel as a temporary asset. The README says the relationship logic of those references is binding while obsolete texture, grading, text and proportions are not. That is a careful distinction: the examples teach structural relationships, not a look to copy.

The second half is deterministic. A fail-closed finalizer composes the untouched original photograph with the abstract panel and pixel-verifies the result. Pillow is used only for deterministic composition, exact microtype and validation, and the README states plainly that it is never used to draw the abstract motif. So the creative step and the assembly step are separated, and the assembly step can reject an output.

The run-log template in references/run-log-template.md suggests the analysis is meant to be recorded rather than left implicit, which matters if you want to compare two runs on the same photograph.

## Installing the skill and producing a first abstract panel

Installation is a copy, not a package install. Clone the repository, then copy the travel-photo-abstraction folder into your Codex skills directory.

```bash
git clone https://github.com/Evianis/travel-photo-abstraction.git
```

On Windows PowerShell the README gives this copy command:

```powershell
Copy-Item -Recurse ".\travel-photo-abstraction" "$env:USERPROFILE\.codex\skills\travel-photo-abstraction"
```

On macOS or Linux it gives this one:

```bash
cp -R ./travel-photo-abstraction ~/.codex/skills/travel-photo-abstraction
```

Start a new Codex task afterwards, because the README notes the skill is discovered at task start. Then verify the bundled reference library actually arrived, since the 19-image library is what the selection step reads:

```bash
python travel-photo-abstraction/scripts/check_installation.py travel-photo-abstraction
```

For a first real run, invoke the skill from a prompt. The README's example is short by design:

```text
Use $travel-photo-abstraction to analyze my uploaded photograph. Map its most distinctive observable facts to minimal abstract marks, then generate a faithful photo-plus-abstraction editorial study.
```

When the abstract panel exists, the finalizer is a separate command with explicit caption arguments:

```bash
python travel-photo-abstraction/scripts/finalize_artwork.py original.jpg abstract-panel.png final.png --number "NO. 001" --date "03 AUG 2026" --phrase "QUIET STRUCTURE"
```

Expect the finalizer to validate rather than to improvise. If the composition does not match what it expects, it fails closed, which is a feature when you want the original photograph untouched and an annoyance when you just want something out the door.

## Where it breaks: image generation dependency and a licence that stops at use

The README states that the skill deliberately stops when the built-in image generation tool is unavailable. There is no fallback path described. If your Codex setup lacks that tool, the skill is not a degraded version of itself; it is inert. That single requirement disqualifies a lot of environments before any other consideration applies.

The licence is the second hard boundary. The project describes itself as source-available, not open source under the OSI definition. You may install and use an unmodified copy. Modification, derivative works, redistribution, republication, sublicensing and resale are prohibited. For an individual producing editorial images this is workable. For a team that wants to fork the mapping logic, adjust the reference index, or ship the skill inside a product, it is not.

Two smaller constraints are worth noting. The bundled output examples carry an embedded repository watermark that the README says must not be removed, so they are not reusable assets for your own output. And Pillow is listed as recommended rather than required for objective output checks, but the README also says the visual review remains mandatory, so skipping Pillow does not remove the human step.

## Compared with a plain image-to-image style pass

The obvious alternative is a generic image-to-image or style-transfer pass: feed the photograph to a model, apply a style prompt, accept the result. The difference is not quality, it is what gets preserved and what gets checked.

A style pass optimizes for resemblance to a look. This skill optimizes for fidelity to countable and positional facts: counts, positions, proportions, directions, depth and spatial rhythm, in the README's wording. A style pass has no concept of an occlusion or a count group, and it will happily merge three boats into two because that reads better.

The second difference is verification. A style pass ends when the image looks acceptable. Here, the finalizer composes the untouched original with the panel and pixel-verifies the composite, and the analysis is meant to be logged. That gives you a failure signal instead of a judgement call.

The cost is flexibility. A style pass works on any photograph with any prompt. This skill has a fixed output grammar, a fixed caption strip, and a reference library whose relationship logic is binding. If your goal is a poster that looks a particular way, the style pass is the better tool.

## Maintenance, upgrades and what the licence means in practice

The repository is not archived, and the last push was on 2026-08-03. Version v1.0.0 was released on 2026-08-02, so the release and the last push are one day apart, which is consistent with a project that shipped a first tagged version and then made a small follow-up change. There is no changelog or migration guide in the repository, so there is nothing to tell you how a future version would treat existing run logs or reference indices.

Upgrade cost is mostly a copying problem. Because installation is a manual copy into the Codex skills directory, an upgrade means replacing that folder, and the check_installation.py script exists to confirm the reference library is complete afterwards. The 19-image library is the part most likely to be missed in a partial copy.

On licence, the practical reading is that the constraint is on modification and redistribution, not on the images you produce. The README states the licence does not claim ownership of photographs supplied by users or of generated outputs, and that rights in those materials remain subject to their respective owners and applicable platform terms. It also says the watermark on the bundled examples must not be removed. Beyond that, read LICENSE yourself; this is a description of what the repository says, not legal advice.

## Conclusion

Adopt it if you already run Codex with skill support and the built-in image generation tool, and you want a repeatable way to reduce one photograph to counts, positions, proportions and sampled accent colors. Do not adopt it if you need to modify or redistribute the code, if you want a general-purpose filter set, or if your environment cannot reach the image generation tool, because the skill stops rather than falling back. Before installing, confirm three things: that the skill directory lands in the Codex skills path your version reads, that Pillow is importable in the same Python you will call the scripts with, and that you have read LICENSE yourself, since the repository ships a v1.0.0 release and the licence is the part that most constrains what you can do next.

## FAQ

### What does abstraction mean in photography for travel-photo-abstraction?

The README frames it as turning a photograph's most distinctive shapes, counts, positions, proportions, colors, directions, depth and spatial rhythm into a sparse editorial abstraction. Each retained source fact is mapped to a minimal abstract mark rather than replaced by a filter effect.

### What is an abstract photo example in this project's output?

The bundled examples include a hot-air balloon reduced to nested circular color fields, a harbour vessel reduced to a dark silhouette with reflected strokes, and a dense school of fish sampled into directional repeated marks. Those images carry a repository watermark that must not be removed.

### How do you abstract a picture with travel-photo-abstraction?

You install the skill into your Codex skills directory, start a new Codex task, and prompt it to analyze an uploaded photograph and map its observable facts to minimal abstract marks. The skill generates a CLEAN abstract panel, then finalize_artwork.py composes and pixel-verifies it against the untouched original.

### Why don't people like abstract art, and does that affect this skill?

The README does not address audience reactions to abstract art, so this question cannot be answered from it. What the README does say is that the skill avoids generic filters, decorative filler and invented visual content.

## Sources

- [Evianis/travel-photo-abstraction on GitHub](https://github.com/Evianis/travel-photo-abstraction)
- [Issues](https://github.com/Evianis/travel-photo-abstraction/issues)
- [README](https://github.com/Evianis/travel-photo-abstraction/blob/main/README.md)
- [Releases](https://github.com/Evianis/travel-photo-abstraction/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/evianis-travel-photo-abstraction
