{"id":50805491,"url":"https://github.com/tillkuhn/triptale","last_synced_at":"2026-06-13T00:33:11.285Z","repository":{"id":363096977,"uuid":"1261943116","full_name":"tillkuhn/triptale","owner":"tillkuhn","description":"An offline-first diary for long cycling and hiking trips — your notes live as plain Markdown in a git repo you own.","archived":false,"fork":false,"pushed_at":"2026-06-07T13:09:35.000Z","size":31,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-07T13:14:57.118Z","etag":null,"topics":["biking","diary","git","hiking","java","javafx","jgit","maven","spring-boot","trips"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tillkuhn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-07T11:14:31.000Z","updated_at":"2026-06-07T13:09:39.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tillkuhn/triptale","commit_stats":null,"previous_names":["tillkuhn/triptale"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/tillkuhn/triptale","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tillkuhn%2Ftriptale","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tillkuhn%2Ftriptale/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tillkuhn%2Ftriptale/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tillkuhn%2Ftriptale/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tillkuhn","download_url":"https://codeload.github.com/tillkuhn/triptale/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tillkuhn%2Ftriptale/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34268187,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["biking","diary","git","hiking","java","javafx","jgit","maven","spring-boot","trips"],"created_at":"2026-06-13T00:33:07.673Z","updated_at":"2026-06-13T00:33:11.257Z","avatar_url":"https://github.com/tillkuhn.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TripTale 🏔️🚴\n\n\u003e An offline-first diary for long cycling and hiking trips — your notes live as plain Markdown in a git repo you own.\n\nTripTale is a small JavaFX app for keeping a day-by-day journal of a trip: kilometres ridden, altitude climbed, and whatever notes you want to scribble. The twist: there is no cloud, no account, no database. Every entry is a plain Markdown file on disk, and the whole thing is a git repository — so you can sync between machines, hack it from the command line, or never touch the app again and just edit `.md` files in your favourite editor.\n\n\u003e ⚠️ **Status:** personal hobby project / early PoC. Works for me on macOS. No roadmap, no promises — but contributions and ideas are welcome.\n\n## Why? 🤔\n\nI wanted a trip diary that:\n\n- Works **without internet**, on a campsite, on a ferry, halfway up an Alpine pass.\n- Stores my notes in a format I'll still be able to read in 20 years (plain text \u003e proprietary blobs).\n- Syncs between my laptop and desktop without me logging into yet another service.\n- Lets me edit entries from *anywhere* — the app on my laptop, `vim` on the road, Obsidian when I get home.\n\nGit + Markdown turned out to be the answer. TripTale is just a friendly UI on top of that.\n\n## Screenshot 📸\n\n\u003c!-- TODO: drop a real screenshot here --\u003e\n![](./preview.png)\n\n```\n+----------------------------------------------+\n|  TripTale — Alps 2026                        |\n|  ┌────────────────────────────────────────┐  |\n|  │  2026-06-04  ▼     km: 87   alt: 1840m │  |\n|  ├────────────────────────────────────────┤  |\n|  │  Crossed the Gotthard pass today.      │  |\n|  │  Strong headwind from the south, but   │  |\n|  │  the descent into Airolo was worth it. │  |\n|  └────────────────────────────────────────┘  |\n|  [ Save ]  [ Pull ]  [ Push ]                |\n+----------------------------------------------+\n```\n\n## How it stores your data 💾\n\nEverything lives under one directory (default `~/.triptale`), which is itself a git repo:\n\n```\n~/.triptale/                          # single git repo\n└── trips/\n    └── alps-2026/\n        ├── trip.yml                  # name, start date, description\n        └── entries/\n            └── 2026-06-04_Thursday.md\n```\n\nA diary entry is just Markdown with a YAML frontmatter block — structured fields on top, free notes below:\n\n```markdown\n---\ndistance: 87.0\naltitude: 1840.0\n---\n\nCrossed the Gotthard pass today. Strong headwind from the south,\nbut the descent into Airolo was worth it.\n```\n\nThat's it. No database, no schema migrations. If TripTale disappears tomorrow, your trips remain a perfectly readable folder of Markdown.\n\n## The app-free workflow ✍️\n\nBecause everything is just files, **you don't actually need the app to use TripTale.** A perfectly valid workflow is:\n\n```bash\ncd ~/.triptale/trips/alps-2026/entries\nvim 2026-06-04_Thursday.md          # write your day\ncd ~/.triptale\ngit add . \u0026\u0026 git commit -m \"Day 4\"\ngit push                            # if you've set a remote\n```\n\nThe next time you open the JavaFX app, your entries are right there. Use the app when you want a nicer editing surface; use any editor when you don't. Both round-trip cleanly through git.\n\nThis also means you can keep writing offline for weeks — every save is a local git commit — and push the whole batch the moment you find Wi-Fi.\n\n## Run it 🛠️\n\nRequires **Java 25** and Maven.\n\n```bash\nmake run        # or: mvn javafx:run\nmake build      # package without tests\nmake test       # run unit tests\n```\n\nPoint at a different data directory (e.g. a USB stick for travel):\n\n```bash\nmvn javafx:run -Dtriptale.data-dir=/Volumes/USB/triptale\n```\n\n## Configuration ⚙️\n\nOverride defaults via `application.yml`, env vars, or `-D` flags:\n\n| Property                     | Default       | Notes                                       |\n|------------------------------|---------------|---------------------------------------------|\n| `triptale.data-dir`          | `~/.triptale` | Root directory; also the git repo root      |\n| `triptale.git.author-name`   | *(blank)*     | Falls back to system git config             |\n| `triptale.git.author-email`  | *(blank)*     | Falls back to system git config             |\n\nTo enable push/pull, add a remote in the data dir: `git -C \u003cdata-dir\u003e remote add origin \u003curl\u003e`.\n\n## Tech stack 🧰\n\n- **Java 25** with records for the domain types\n- **Spring Boot** (headless — `web-application-type: none`) for DI, config binding, and lifecycle\n- **JavaFX** for the UI, with FXML controllers resolved as Spring beans\n- **JGit** for in-process git operations (init, commit, push, pull)\n- **Maven** as the build system; a thin `Makefile` wraps the common targets\n\nThe interesting bit architecturally is that JavaFX's `Application.init()` boots Spring *before* `start()`, and the FXML loader uses `spring::getBean` as its controller factory — so controllers are real Spring beans with constructor-injected services. See `CLAUDE.md` for more on the layering.\n\n## Contributing 🤝\n\nThis is a hobby project, but PRs, issues, and ideas are welcome. A few ground rules:\n\n- Keep JavaFX imports out of the `storage`, `git`, `config`, and `domain` packages.\n- Domain types are records — keep them plain.\n- Constructor injection only, no field `@Autowired`.\n\nIf you're thinking of something larger than a small fix, open an issue first so we can talk about it.\n\n## License 📜\n\nApache License 2.0 — see [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftillkuhn%2Ftriptale","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftillkuhn%2Ftriptale","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftillkuhn%2Ftriptale/lists"}