Fernscout

For self-hosters, tinkerers and people with a terminal open

Your travel journal is a folder.
Point an agent at it.

Fernscout is an open-source travel journal: JSON documents and photographs in a folder you own, a website on top, and a documented API underneath. Bring Claude Code, or any agent that can read a Markdown guide and make an HTTP call, and let it do the plumbing — exports, sorting, resizing, uploading. The words stay yours. A new day lands as a draft, and nothing is published until you say so.

  • Apache-2.0
  • JSON + photos
  • OpenAPI
  • SQLite · Postgres

Try it with your agent

any agent · paste this

Guide me through creating my own travel journal, following the overview at https://fernscout.ch/documentation.txt and the day-writing guide at https://fernscout.ch/skill/add-a-day.md. You will need an email address I control.

Pick your altitude

  • Only a folder

    Clone Fernscout Helper, open it with your agent, end up with trip.json and one JSON file per day on your own disk. No server, no account.

    git clone https://github.com/severinlindenmann/fernscout-helper
    cd fernscout-helper && claude
  • Hosted on Fernscout

    Hand your agent the prompt above. With an invitation, it walks you through signing up and gets a key that writes to your journal for seven days.

    GET /api/v2/status
    GET /api/v2/{user}/status
  • Your own server

    A VPS, Node and Caddy, one deploy script. SQLite on your laptop, Postgres in production. A public journal needs no database at all.

    git clone https://github.com/severinlindenmann/fernscout
    cd fernscout && npm ci
    npm run build && npm start

Ten years of trips, out of your photo library

Most people do not have a travel blog. They have a photo library full of trips and no clear idea when any of them were. Fernscout Helper is a set of agent skills that reads that library — metadata only at first — finds the weeks you were away, and turns the ones you pick into draft days you can review in a browser page.

~/fernscout-helper · claude

find the trips in my photos from the last ten years

Reading the Photos library… (metadata only, nothing is downloaded)

2017-04-12 → 2017-04-19 8d 412p 1840 km Lisbon · Sintra

2019-08-02 → 2019-08-16 15d 1233p 960 km Split · Hvar · Kotor

2023-02-18 → 2023-02-25 8d 287p 9310 km Tokyo · Kyoto

These are candidates, not facts — check them against what you remember.

export the Croatia one, up to fifteen a day, favourites first

1233 photographs · 6.1 GB · opening the review page…

Example session. Your places come from your own photographs.

  1. find-trips

    Finds the weeks you were away, from photo metadata. Asks where home is instead of guessing.

  2. icloud-export

    Exports one trip and opens a review page: Keep, a note per photo, a box for what happened each day. Location and camera data are stripped from the photos that go into the journal.

  3. statement-costs · trip-budget

    Reads a bank CSV, filters it to the trip, shows you the merchants first. Asks about the flights instead of estimating them.

  4. gps-history

    Google Timeline, Takeout or a GPX from your watch → the route you actually travelled, simplified, on the trip map. The raw history never becomes public.

  5. validate-content → publish · sync

    Checks for gaps, prints a dry run, then uploads. Sync goes both ways and, by default, stops when both sides changed the same day.

Built and tested with Claude Code on a Mac — that is where the Photos library is. The cost, GPS and publishing skills run anywhere. On Linux or Windows, a self-hosted instance's npm run ingest turns a folder of camera files into dated draft days, geotagged where the photos carry a location, offline.

A new trip, while you are still on it

  • Your agent, over the API

    A trip and a day are PUT at ids you choose. Every field is in the OpenAPI file; a section left empty is declined with a reason, never guessed.

    PUT  /api/v2/{user}/trips/{trip}
    PUT  /api/v2/{user}/trips/{trip}/days/{slug}
    POST /api/v2/{user}/trips/{trip}/days/{slug}/media
  • Or just say it

    In the studio, a day can be spoken: five short questions, one per screen, answered out loud. You see the transcript and correct it; the day is only your own answers.

What comes out

content/<you>/trips/<trip>/

trip.json dates, people, budget, costs

track.json the clipped route for the map

entries/

2019-08-03-hvar.json one day, status: draft

media/ resized, EXIF and GPS stripped

originals/ the print masters

  • A website: map, gallery and an RSS feed, public or only for the people you choose.
  • One command hands the whole thing back as a zip. No lock-in: the folder is the journal.
  • A printed photobook and real postcards. An agent can arrange a draft; ordering and paying stay on your own page.

The one rule agents follow here

  • No invented memories. No weather, meals, feelings or people that you or a real source did not supply. An empty field beats plausible fiction.
  • Drafts first. A new day starts as a draft. Publishing is a separate call, made only when you say so in words.
  • Tokens stay in the API. An agent's key never opens your owner pages, and your raw GPS history is never exposed.

Read the source of truth