From df8d1adf15589a23ae75cb98d0abf6b56f30f235 Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 6 Mar 2026 11:05:26 +0000 Subject: [PATCH] Rename AdventureLog to Voyage and add fork attribution MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace all AdventureLog references with Voyage across ~102 files (7 case variants: AdventureLog, adventurelog, Adventurelog, ADVENTURELOG, AdventUrelog, AdventureLOG, adventure-log, adventure_log) - Rename brand, static, and documentation assets to use voyage naming - Rename install_adventurelog.sh → install_voyage.sh - Update README.md and voyage_overview.md to credit AdventureLog as the upstream project and Sean Morley as its original creator --- .github/.docker-compose-database.yml | 2 +- .github/ISSUE_TEMPLATE/bug_report.md | 6 +- .github/ISSUE_TEMPLATE/deployment-issue.md | 2 +- .github/ISSUE_TEMPLATE/feature_request.md | 6 +- .github/copilot-instructions.md | 10 ++-- .github/workflows/backend-beta.yml | 2 +- .github/workflows/backend-latest.yml | 2 +- .github/workflows/backend-release.yml | 2 +- .github/workflows/cdn-beta.yml | 2 +- .github/workflows/cdn-latest.yml | 2 +- .github/workflows/cdn-release.yml | 2 +- .github/workflows/frontend-beta.yml | 2 +- .github/workflows/frontend-latest.yml | 2 +- .github/workflows/frontend-release.yml | 2 +- .github/workflows/trivy_security_scans.yml | 8 +-- .megamemory/knowledge.db | Bin 0 -> 135168 bytes .megamemory/knowledge.db-shm | Bin 0 -> 32768 bytes .megamemory/knowledge.db-wal | 0 CONTRIBUTING.md | 16 +++--- README.md | 41 ++++++------- backend/entrypoint.sh | 2 +- backend/server/adventures/admin.py | 6 +- backend/server/adventures/geocoding.py | 4 +- .../adventures/views/collection_view.py | 2 +- .../views/generate_description_view.py | 2 +- .../adventures/views/import_export_view.py | 4 +- .../adventures/views/location_image_view.py | 2 +- .../adventures/views/recommendations_view.py | 2 +- backend/server/main/settings.py | 10 ++-- backend/server/run_periodic_sync.py | 2 +- backend/server/templates/base.html | 16 +++--- backend/server/templates/home.html | 2 +- .../email/email_invite_message.html | 16 +++--- .../server/{adventurelog.txt => voyage.txt} | 0 backup.sh | 6 +- brand/{adventurelog.png => voyage.png} | Bin brand/{adventurelog.svg => voyage.svg} | 0 cdn/README.md | 2 +- cdn/docker-compose.yml | 2 +- cdn/entrypoint.sh | 4 +- cdn/index.html | 14 ++--- cdn/main.py | 4 +- deploy.sh | 6 +- docker-compose-traefik.yaml | 26 ++++----- docker-compose.dev.yml | 14 ++--- docker-compose.yml | 14 ++--- .../docs/changelogs/development_timeline.md | 32 +++++------ documentation/docs/changelogs/v0-10-0.md | 22 +++---- documentation/docs/changelogs/v0-11-0.md | 14 ++--- documentation/docs/changelogs/v0-12-0.md | 10 ++-- documentation/docs/changelogs/v0-7-0.md | 8 +-- documentation/docs/changelogs/v0-7-1.md | 8 +-- documentation/docs/changelogs/v0-8-0.md | 12 ++-- documentation/docs/changelogs/v0-9-0.md | 16 +++--- .../configuration/advanced_configuration.md | 2 +- documentation/docs/configuration/analytics.md | 2 +- .../configuration/disable_registration.md | 2 +- .../configuration/google_maps_integration.md | 12 ++-- .../docs/configuration/immich_integration.md | 12 ++-- .../docs/configuration/social_auth.md | 6 +- .../configuration/social_auth/authentik.md | 32 +++++------ .../docs/configuration/social_auth/github.md | 24 ++++---- .../docs/configuration/social_auth/oidc.md | 2 +- .../configuration/social_auth/pocket_id.md | 38 ++++++------ .../docs/configuration/strava_integration.md | 28 ++++----- documentation/docs/configuration/updating.md | 4 +- .../configuration/wanderer_integration.md | 12 ++-- documentation/docs/guides/admin_panel.md | 4 +- documentation/docs/guides/invite_user.md | 6 +- documentation/docs/guides/v0-7-1_migration.md | 10 ++-- documentation/docs/install/caddy.md | 8 +-- .../docs/install/dev_container_wsl.md | 12 ++-- documentation/docs/install/docker.md | 20 +++---- documentation/docs/install/getting_started.md | 10 ++-- documentation/docs/install/kustomize.md | 16 +++--- .../docs/install/nginx_proxy_manager.md | 30 +++++----- documentation/docs/install/proxmox_lxc.md | 4 +- documentation/docs/install/quick_start.md | 10 ++-- documentation/docs/install/synology_nas.md | 4 +- documentation/docs/install/traefik.md | 4 +- documentation/docs/install/unraid.md | 8 +-- .../docs/intro/adventurelog_overview.md | 35 ------------ documentation/docs/intro/voyage_overview.md | 33 +++++++++++ .../troubleshooting/login_unresponsive.md | 4 +- .../docs/troubleshooting/nginx_failed.md | 18 +++--- .../docs/troubleshooting/no_images.md | 6 +- documentation/docs/usage/usage.md | 8 +-- documentation/index.md | 54 +++++++++--------- .../public/{adventurelog.png => voyage.png} | Bin .../public/{adventurelog.svg => voyage.svg} | 0 frontend/package-lock.json | 4 +- frontend/package.json | 2 +- frontend/src/lib/components/AboutModal.svelte | 10 ++-- frontend/src/lib/components/Navbar.svelte | 6 +- frontend/src/lib/components/TOTPModal.svelte | 2 +- .../components/locations/LocationModal.svelte | 2 +- .../components/lodging/LodgingModal.svelte | 2 +- .../transportation/TransportationModal.svelte | 2 +- frontend/src/lib/config.ts | 4 +- frontend/src/lib/index.ts | 8 +-- frontend/src/lib/json/backgrounds.json | 16 +++--- frontend/src/locales/ar.json | 8 +-- frontend/src/locales/de.json | 14 ++--- frontend/src/locales/en.json | 14 ++--- frontend/src/locales/es.json | 14 ++--- frontend/src/locales/fr.json | 12 ++-- frontend/src/locales/hu.json | 14 ++--- frontend/src/locales/it.json | 14 ++--- frontend/src/locales/ja.json | 12 ++-- frontend/src/locales/ko.json | 14 ++--- frontend/src/locales/nl.json | 14 ++--- frontend/src/locales/no.json | 14 ++--- frontend/src/locales/pl.json | 14 ++--- frontend/src/locales/pt-br.json | 14 ++--- frontend/src/locales/ro.json | 14 ++--- frontend/src/locales/ru.json | 14 ++--- frontend/src/locales/sk.json | 14 ++--- frontend/src/locales/sv.json | 14 ++--- frontend/src/locales/tr.json | 14 ++--- frontend/src/locales/uk.json | 14 ++--- frontend/src/locales/zh.json | 8 +-- frontend/src/routes/+error.svelte | 4 +- frontend/src/routes/+layout.svelte | 4 +- frontend/src/routes/+page.svelte | 4 +- frontend/src/routes/calendar/+page.svelte | 2 +- frontend/src/routes/dashboard/+page.svelte | 4 +- frontend/src/routes/login/+page.svelte | 6 +- .../src/routes/profile/[uuid]/+page.svelte | 2 +- frontend/src/routes/search/+page.svelte | 2 +- frontend/src/routes/settings/+page.svelte | 18 +++--- frontend/src/routes/signup/+page.svelte | 6 +- frontend/src/routes/user/[uuid]/+page.svelte | 2 +- .../routes/user/reset-password/+page.svelte | 2 +- .../user/reset-password/[key]/+page.svelte | 2 +- .../user/verify-email/[key]/+page.svelte | 2 +- frontend/src/routes/users/+page.svelte | 2 +- frontend/src/routes/worldtravel/+page.svelte | 2 +- ...g_christmas.webp => voyage_christmas.webp} | Bin ...log_new_year.webp => voyage_new_year.webp} | Bin ...showcase_1.webp => voyage_showcase_1.webp} | Bin ...showcase_2.webp => voyage_showcase_2.webp} | Bin ...showcase_3.webp => voyage_showcase_3.webp} | Bin ...showcase_4.webp => voyage_showcase_4.webp} | Bin ...showcase_5.webp => voyage_showcase_5.webp} | Bin ...showcase_6.webp => voyage_showcase_6.webp} | Bin ...showcase_7.webp => voyage_showcase_7.webp} | Bin ...showcase_8.webp => voyage_showcase_8.webp} | Bin frontend/static/manifest.json | 6 +- .../static/{adventurelog.svg => voyage.svg} | 0 install_adventurelog.sh => install_voyage.sh | 36 ++++++------ kustomization.yml | 10 ++-- 151 files changed, 653 insertions(+), 658 deletions(-) create mode 100644 .megamemory/knowledge.db create mode 100644 .megamemory/knowledge.db-shm create mode 100644 .megamemory/knowledge.db-wal rename backend/server/{adventurelog.txt => voyage.txt} (100%) rename brand/{adventurelog.png => voyage.png} (100%) rename brand/{adventurelog.svg => voyage.svg} (100%) delete mode 100644 documentation/docs/intro/adventurelog_overview.md create mode 100644 documentation/docs/intro/voyage_overview.md rename documentation/public/{adventurelog.png => voyage.png} (100%) rename documentation/public/{adventurelog.svg => voyage.svg} (100%) rename frontend/static/backgrounds/{adventurelog_christmas.webp => voyage_christmas.webp} (100%) rename frontend/static/backgrounds/{adventurelog_new_year.webp => voyage_new_year.webp} (100%) rename frontend/static/backgrounds/{adventurelog_showcase_1.webp => voyage_showcase_1.webp} (100%) rename frontend/static/backgrounds/{adventurelog_showcase_2.webp => voyage_showcase_2.webp} (100%) rename frontend/static/backgrounds/{adventurelog_showcase_3.webp => voyage_showcase_3.webp} (100%) rename frontend/static/backgrounds/{adventurelog_showcase_4.webp => voyage_showcase_4.webp} (100%) rename frontend/static/backgrounds/{adventurelog_showcase_5.webp => voyage_showcase_5.webp} (100%) rename frontend/static/backgrounds/{adventurelog_showcase_6.webp => voyage_showcase_6.webp} (100%) rename frontend/static/backgrounds/{adventurelog_showcase_7.webp => voyage_showcase_7.webp} (100%) rename frontend/static/backgrounds/{adventurelog_showcase_8.webp => voyage_showcase_8.webp} (100%) rename frontend/static/{adventurelog.svg => voyage.svg} (100%) rename install_adventurelog.sh => install_voyage.sh (96%) diff --git a/.github/.docker-compose-database.yml b/.github/.docker-compose-database.yml index aa187bd6..19d54f43 100644 --- a/.github/.docker-compose-database.yml +++ b/.github/.docker-compose-database.yml @@ -1,7 +1,7 @@ services: db: image: postgis/postgis:15-3.3 - container_name: adventurelog-db + container_name: voyage-db restart: unless-stopped ports: - "127.0.0.1:5432:5432" diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index bb6f94bd..1d88cd7a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,7 +23,7 @@ Steps to reproduce the behavior: ## ✅ Expected Behavior -What did you expect AdventureLog to do? +What did you expect Voyage to do? ## 📸 Screenshots / Logs @@ -34,7 +34,7 @@ What did you expect AdventureLog to do? - **Platform:** (Docker, Synology, Proxmox, TrueNAS, Unraid, etc.) - **Install Method:** (Docker Compose, Quick Install Script, Manual, etc.) -- **AdventureLog Version:** (e.g., v0.12.0) +- **Voyage Version:** (e.g., v0.12.0) - **Reverse Proxy:** (e.g., Nginx, Traefik, Caddy, etc. or None) If using Docker and the issue is related to the container, it may be helpful to include your `docker-compose.yml` or relevant variables below. @@ -46,4 +46,4 @@ Anything else that might be useful (custom configuration, network setup, databas --- -Thank you for taking the time to report this issue! We appreciate your help in making AdventureLog better. We’ll look into it as soon as we can. 🙌 +Thank you for taking the time to report this issue! We appreciate your help in making Voyage better. We’ll look into it as soon as we can. 🙌 diff --git a/.github/ISSUE_TEMPLATE/deployment-issue.md b/.github/ISSUE_TEMPLATE/deployment-issue.md index a926ed68..f474aeeb 100644 --- a/.github/ISSUE_TEMPLATE/deployment-issue.md +++ b/.github/ISSUE_TEMPLATE/deployment-issue.md @@ -1,6 +1,6 @@ --- name: Deployment Issue -about: Request help deploying AdventureLog. For faster support, please use our Discord community! +about: Request help deploying Voyage. For faster support, please use our Discord community! title: "[DEPLOYMENT] " labels: deployment assignees: "" diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 20ef0d38..5e4a3037 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,6 +1,6 @@ --- name: Feature request -about: Suggest a new idea, feature, or improvement for AdventureLog +about: Suggest a new idea, feature, or improvement for Voyage title: "[REQUEST] " labels: enhancement assignees: "" @@ -20,7 +20,7 @@ Is your request related to a specific problem? ## 🛠️ Proposed Solution Describe the solution you’d like. -What should AdventureLog do differently? +What should Voyage do differently? ## 🔄 Alternatives Considered @@ -36,4 +36,4 @@ Any other details that might help us understand the request (use cases, user sto --- -✨ Thanks for suggesting improvements to AdventureLog! Your ideas help shape the future of the project. +✨ Thanks for suggesting improvements to Voyage! Your ideas help shape the future of the project. diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 71251d80..a1d90897 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,6 +1,6 @@ -# AdventureLog Development Instructions +# Voyage Development Instructions -AdventureLog is a self-hosted travel companion web application built with SvelteKit frontend and Django backend, deployed via Docker. +Voyage is a self-hosted travel companion web application built with SvelteKit frontend and Django backend, deployed via Docker. **ALWAYS follow these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.** @@ -76,7 +76,7 @@ Run these commands in order: ### Repository Structure ``` -AdventureLog/ +Voyage/ ├── frontend/ # SvelteKit web application │ ├── src/ # Source code │ ├── package.json # Node.js dependencies and scripts @@ -87,7 +87,7 @@ AdventureLog/ │ └── requirements.txt # Python dependencies ├── docker-compose.yml # Main deployment configuration ├── .env.example # Environment template -└── install_adventurelog.sh # Production installer +└── install_voyage.sh # Production installer ``` ### Key Scripts and Files @@ -98,7 +98,7 @@ AdventureLog/ ### Development vs Production - **Development**: Use `docker compose up -d` with .env file -- **Production**: Use `./install_adventurelog.sh` installer script +- **Production**: Use `./install_voyage.sh` installer script - **CI/CD**: GitHub Actions in `.github/workflows/` handle testing and deployment ### Common Error Patterns diff --git a/.github/workflows/backend-beta.yml b/.github/workflows/backend-beta.yml index a9a80979..d6ba591a 100644 --- a/.github/workflows/backend-beta.yml +++ b/.github/workflows/backend-beta.yml @@ -12,7 +12,7 @@ on: - "backend/**" env: - IMAGE_NAME: "adventurelog-backend" + IMAGE_NAME: "voyage-backend" jobs: upload: diff --git a/.github/workflows/backend-latest.yml b/.github/workflows/backend-latest.yml index dd3b9ce1..381b235a 100644 --- a/.github/workflows/backend-latest.yml +++ b/.github/workflows/backend-latest.yml @@ -12,7 +12,7 @@ on: - "backend/**" env: - IMAGE_NAME: "adventurelog-backend" + IMAGE_NAME: "voyage-backend" jobs: upload: diff --git a/.github/workflows/backend-release.yml b/.github/workflows/backend-release.yml index ff1919db..48b890a1 100644 --- a/.github/workflows/backend-release.yml +++ b/.github/workflows/backend-release.yml @@ -9,7 +9,7 @@ on: types: [released] env: - IMAGE_NAME: "adventurelog-backend" + IMAGE_NAME: "voyage-backend" jobs: upload: diff --git a/.github/workflows/cdn-beta.yml b/.github/workflows/cdn-beta.yml index d229b606..625fcf66 100644 --- a/.github/workflows/cdn-beta.yml +++ b/.github/workflows/cdn-beta.yml @@ -12,7 +12,7 @@ on: - "cdn/**" env: - IMAGE_NAME: "adventurelog-cdn" + IMAGE_NAME: "voyage-cdn" jobs: upload: diff --git a/.github/workflows/cdn-latest.yml b/.github/workflows/cdn-latest.yml index 65a88dae..f37abc54 100644 --- a/.github/workflows/cdn-latest.yml +++ b/.github/workflows/cdn-latest.yml @@ -12,7 +12,7 @@ on: - "cdn/**" env: - IMAGE_NAME: "adventurelog-cdn" + IMAGE_NAME: "voyage-cdn" jobs: upload: diff --git a/.github/workflows/cdn-release.yml b/.github/workflows/cdn-release.yml index 11cb258a..88506038 100644 --- a/.github/workflows/cdn-release.yml +++ b/.github/workflows/cdn-release.yml @@ -9,7 +9,7 @@ on: types: [released] env: - IMAGE_NAME: "adventurelog-cdn" + IMAGE_NAME: "voyage-cdn" jobs: upload: diff --git a/.github/workflows/frontend-beta.yml b/.github/workflows/frontend-beta.yml index 4b237367..51f4963b 100644 --- a/.github/workflows/frontend-beta.yml +++ b/.github/workflows/frontend-beta.yml @@ -12,7 +12,7 @@ on: - "frontend/**" env: - IMAGE_NAME: "adventurelog-frontend" + IMAGE_NAME: "voyage-frontend" jobs: upload: diff --git a/.github/workflows/frontend-latest.yml b/.github/workflows/frontend-latest.yml index dcb5e8c9..2822b760 100644 --- a/.github/workflows/frontend-latest.yml +++ b/.github/workflows/frontend-latest.yml @@ -12,7 +12,7 @@ on: - "frontend/**" env: - IMAGE_NAME: "adventurelog-frontend" + IMAGE_NAME: "voyage-frontend" jobs: upload: diff --git a/.github/workflows/frontend-release.yml b/.github/workflows/frontend-release.yml index 3bb33ce8..542edc7d 100644 --- a/.github/workflows/frontend-release.yml +++ b/.github/workflows/frontend-release.yml @@ -9,7 +9,7 @@ on: types: [released] env: - IMAGE_NAME: "adventurelog-frontend" + IMAGE_NAME: "voyage-frontend" jobs: upload: diff --git a/.github/workflows/trivy_security_scans.yml b/.github/workflows/trivy_security_scans.yml index 3e3d01f5..0d7be0d7 100644 --- a/.github/workflows/trivy_security_scans.yml +++ b/.github/workflows/trivy_security_scans.yml @@ -57,15 +57,15 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: Build backend Docker image - run: docker build -t adventurelog-backend ./backend + run: docker build -t voyage-backend ./backend - name: Build frontend Docker image - run: docker build -t adventurelog-frontend ./frontend + run: docker build -t voyage-frontend ./frontend - name: Scan backend Docker image with Trivy uses: aquasecurity/trivy-action@master with: - image-ref: adventurelog-backend + image-ref: voyage-backend format: table exit-code: 1 ignore-unfixed: true @@ -75,7 +75,7 @@ jobs: - name: Scan frontend Docker image with Trivy uses: aquasecurity/trivy-action@master with: - image-ref: adventurelog-frontend + image-ref: voyage-frontend format: table exit-code: 1 ignore-unfixed: true diff --git a/.megamemory/knowledge.db b/.megamemory/knowledge.db new file mode 100644 index 0000000000000000000000000000000000000000..0749e7562f6c39848de135a63d8ea1d7fe9f48c7 GIT binary patch literal 135168 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 literal 0 HcmV?d00001 diff --git a/.megamemory/knowledge.db-shm b/.megamemory/knowledge.db-shm new file mode 100644 index 0000000000000000000000000000000000000000..fe9ac2845eca6fe6da8a63cd096d9cf9e24ece10 GIT binary patch literal 32768 zcmeIuAr62r3 - logo -

AdventureLog

+ logo +

Voyage

The ultimate travel companion for the modern-day explorer.

- -

- View Demo - · - Documentation - · - Discord - · - Support 💖 -

+ +

+ A fork of AdventureLog by Sean Morley. +


@@ -39,9 +33,11 @@ ## ⭐ About the Project -Starting from a simple idea of tracking travel locations, AdventureLog has grown into a full-fledged travel companion. With AdventureLog, you can log your adventures, keep track of where you've been on the world map, plan your next trip collaboratively, and share your experiences with friends and family. +> **Voyage is a fork of [AdventureLog](https://github.com/seanmorley15/AdventureLog)**, the open-source travel companion created by [Sean Morley](https://seanmorley.com). This fork builds on top of AdventureLog's foundation to make additional changes and improvements. -AdventureLog was created to solve a problem: the lack of a modern, open-source, user-friendly travel companion. Many existing travel apps are either too complex, too expensive, or too closed-off to be useful for the average traveler. AdventureLog aims to be the opposite: simple, beautiful, and open to everyone. +Starting from a simple idea of tracking travel locations, Voyage is a full-fledged travel companion. With Voyage, you can log your adventures, keep track of where you've been on the world map, plan your next trip collaboratively, and share your experiences with friends and family. + +Voyage aims to be simple, beautiful, and open to everyone — inheriting AdventureLog's commitment to being a modern, open-source, user-friendly alternative to overly complex or expensive travel apps. @@ -105,21 +101,21 @@ AdventureLog was created to solve a problem: the lack of a modern, open-source, - Itineraries include many planning features like flight information, notes, checklists, and links to external resources. - Itineraries can be shared with friends and family for collaborative planning. - **Share Your Experiences** 📸: Share your adventures with friends and family and collaborate on trips together. - - Locations and itineraries can be shared via a public link or directly with other AdventureLog users. + - Locations and itineraries can be shared via a public link or directly with other Voyage users. - Collaborators can view and edit shared itineraries (collections), making planning a breeze. ## 🧭 Roadmap -The AdventureLog Roadmap can be found [here](https://github.com/users/seanmorley15/projects/5) +The Voyage Roadmap can be found [here](https://github.com/users/seanmorley15/projects/5) ## 👋 Contributing - - + + Contributions are always welcome! @@ -128,10 +124,10 @@ See `contributing.md` for ways to get started. ### Translation -AdventureLog is available on [Weblate](https://hosted.weblate.org/projects/adventurelog/). If you would like to help translate AdventureLog into your language, please visit the link and contribute! +Voyage is available on [Weblate](https://hosted.weblate.org/projects/voyage/). If you would like to help translate Voyage into your language, please visit the link and contribute! - -Translation status + +Translation status @@ -146,12 +142,13 @@ Distributed under the GNU General Public License v3.0. See `LICENSE` for more in Sean Morley - [website](https://seanmorley.com) -Hi! I'm Sean, the creator of AdventureLog. I'm a college student and software developer with a passion for travel and adventure. I created AdventureLog to help people like me document their adventures and plan new ones effortlessly. As a student, I am always looking for more opportunities to learn and grow, so feel free to reach out via the contact on my website if you would like to collaborate or chat! +Hi! I'm Sean, the creator of Voyage. I'm a college student and software developer with a passion for travel and adventure. I created Voyage to help people like me document their adventures and plan new ones effortlessly. As a student, I am always looking for more opportunities to learn and grow, so feel free to reach out via the contact on my website if you would like to collaborate or chat! ## 💎 Acknowledgements +- **[AdventureLog](https://github.com/seanmorley15/AdventureLog)** — the original project this fork is based on, created by [Sean Morley](https://seanmorley.com) - Logo Design by [nordtektiger](https://github.com/nordtektiger) - WorldTravel Dataset [dr5hn/countries-states-cities-database](https://github.com/dr5hn/countries-states-cities-database) diff --git a/backend/entrypoint.sh b/backend/entrypoint.sh index cb573de9..eef4e40e 100644 --- a/backend/entrypoint.sh +++ b/backend/entrypoint.sh @@ -82,6 +82,6 @@ if [ $? -eq 137 ]; then exit 1 fi -cat /code/adventurelog.txt +cat /code/voyage.txt exec "$@" \ No newline at end of file diff --git a/backend/server/adventures/admin.py b/backend/server/adventures/admin.py index 6440ccee..211c508c 100644 --- a/backend/server/adventures/admin.py +++ b/backend/server/adventures/admin.py @@ -196,6 +196,6 @@ admin.site.register(Activity, ActivityAdmin) admin.site.register(CollectionItineraryItem, CollectionItineraryItemAdmin) admin.site.register(CollectionItineraryDay) -admin.site.site_header = 'AdventureLog Admin' -admin.site.site_title = 'AdventureLog Admin Site' -admin.site.index_title = 'Welcome to AdventureLog Admin Page' +admin.site.site_header = 'Voyage Admin' +admin.site.site_title = 'Voyage Admin Site' +admin.site.index_title = 'Welcome to Voyage Admin Page' diff --git a/backend/server/adventures/geocoding.py b/backend/server/adventures/geocoding.py index fb80c32f..ad2c94c2 100644 --- a/backend/server/adventures/geocoding.py +++ b/backend/server/adventures/geocoding.py @@ -129,7 +129,7 @@ def _infer_addresstype(type_): def search_osm(query): try: url = f"https://nominatim.openstreetmap.org/search?q={query}&format=jsonv2" - headers = {'User-Agent': 'AdventureLog Server'} + headers = {'User-Agent': 'Voyage Server'} response = requests.get(url, headers=headers, timeout=(2, 5)) response.raise_for_status() data = response.json() @@ -370,7 +370,7 @@ def reverse_geocode(lat, lon, user): def reverse_geocode_osm(lat, lon, user): url = f"https://nominatim.openstreetmap.org/reverse?format=jsonv2&lat={lat}&lon={lon}" - headers = {'User-Agent': 'AdventureLog Server'} + headers = {'User-Agent': 'Voyage Server'} connect_timeout = 1 read_timeout = 5 diff --git a/backend/server/adventures/views/collection_view.py b/backend/server/adventures/views/collection_view.py index 580926d8..7d43236a 100644 --- a/backend/server/adventures/views/collection_view.py +++ b/backend/server/adventures/views/collection_view.py @@ -481,7 +481,7 @@ class CollectionViewSet(viewsets.ModelViewSet): collection = self.get_object() export_data = { - 'version': getattr(settings, 'ADVENTURELOG_RELEASE_VERSION', 'unknown'), + 'version': getattr(settings, 'VOYAGE_RELEASE_VERSION', 'unknown'), # Omit export_date to keep template-friendly exports (no dates) 'collection': { 'id': str(collection.id), diff --git a/backend/server/adventures/views/generate_description_view.py b/backend/server/adventures/views/generate_description_view.py index 28719608..61897506 100644 --- a/backend/server/adventures/views/generate_description_view.py +++ b/backend/server/adventures/views/generate_description_view.py @@ -17,7 +17,7 @@ class GenerateDescription(viewsets.ViewSet): # User-Agent header required by Wikipedia API, Accept-Language patched in per request BASE_HEADERS = { - 'User-Agent': f'AdventureLog/{getattr(settings, "ADVENTURELOG_RELEASE_VERSION", "unknown")}' + 'User-Agent': f'Voyage/{getattr(settings, "VOYAGE_RELEASE_VERSION", "unknown")}' } DEFAULT_LANGUAGE = "en" LANGUAGE_PATTERN = re.compile(r"^[a-z0-9-]{2,12}$", re.IGNORECASE) diff --git a/backend/server/adventures/views/import_export_view.py b/backend/server/adventures/views/import_export_view.py index 191d118b..99af8a3e 100644 --- a/backend/server/adventures/views/import_export_view.py +++ b/backend/server/adventures/views/import_export_view.py @@ -41,7 +41,7 @@ class BackupViewSet(viewsets.ViewSet): # Build export data structure export_data = { - 'version': settings.ADVENTURELOG_RELEASE_VERSION, + 'version': settings.VOYAGE_RELEASE_VERSION, 'export_date': datetime.now().isoformat(), 'user_email': user.email, 'user_username': user.username, @@ -390,7 +390,7 @@ class BackupViewSet(viewsets.ViewSet): # Return ZIP file as response with open(tmp_file.name, 'rb') as zip_file: response = HttpResponse(zip_file.read(), content_type='application/zip') - filename = f"adventurelog_backup_{user.username}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.zip" + filename = f"voyage_backup_{user.username}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.zip" response['Content-Disposition'] = f'attachment; filename="{filename}"' # Clean up diff --git a/backend/server/adventures/views/location_image_view.py b/backend/server/adventures/views/location_image_view.py index d1a9c4b0..87571205 100644 --- a/backend/server/adventures/views/location_image_view.py +++ b/backend/server/adventures/views/location_image_view.py @@ -198,7 +198,7 @@ class ContentImageViewSet(viewsets.ModelViewSet): return Response({"error": result}, status=status.HTTP_400_BAD_REQUEST) try: - headers = {'User-Agent': 'AdventureLog/1.0 (Image Proxy)'} + headers = {'User-Agent': 'Voyage/1.0 (Image Proxy)'} max_redirects = 3 current_url = image_url diff --git a/backend/server/adventures/views/recommendations_view.py b/backend/server/adventures/views/recommendations_view.py index 4f4018cf..574e6265 100644 --- a/backend/server/adventures/views/recommendations_view.py +++ b/backend/server/adventures/views/recommendations_view.py @@ -14,7 +14,7 @@ class RecommendationsViewSet(viewsets.ViewSet): permission_classes = [IsAuthenticated] OVERPASS_URL = "https://overpass-api.de/api/interpreter" NOMINATIM_URL = "https://nominatim.openstreetmap.org/search" - HEADERS = {'User-Agent': 'AdventureLog Server'} + HEADERS = {'User-Agent': 'Voyage Server'} # Quality thresholds MIN_GOOGLE_RATING = 3.0 # Minimum rating to include diff --git a/backend/server/main/settings.py b/backend/server/main/settings.py index bbf7c23a..d5816fc9 100644 --- a/backend/server/main/settings.py +++ b/backend/server/main/settings.py @@ -1,5 +1,5 @@ """ -AdventureLog Server settings +Voyage Server settings Reference: - Django settings: https://docs.djangoproject.com/en/stable/ref/settings/ @@ -235,7 +235,7 @@ AUTH_USER_MODEL = 'users.CustomUser' ACCOUNT_ADAPTER = 'users.adapters.CustomAccountAdapter' INVITATIONS_ADAPTER = ACCOUNT_ADAPTER INVITATIONS_ACCEPT_INVITE_AFTER_SIGNUP = True -INVITATIONS_EMAIL_SUBJECT_PREFIX = 'AdventureLog: ' +INVITATIONS_EMAIL_SUBJECT_PREFIX = 'Voyage: ' SOCIALACCOUNT_ADAPTER = 'users.adapters.CustomSocialAccountAdapter' ACCOUNT_SIGNUP_FORM_CLASS = 'users.form_overrides.CustomSignupForm' @@ -365,10 +365,10 @@ LOGGING = { # --------------------------------------------------------------------------- PUBLIC_URL = getenv('PUBLIC_URL', 'http://localhost:8000') -# ADVENTURELOG_CDN_URL = getenv('ADVENTURELOG_CDN_URL', 'https://cdn.adventurelog.app') +# VOYAGE_CDN_URL = getenv('VOYAGE_CDN_URL', 'https://cdn.voyage.app') -# Major release version of AdventureLog, not including the patch version date. -ADVENTURELOG_RELEASE_VERSION = 'v0.12.0' +# Major release version of Voyage, not including the patch version date. +VOYAGE_RELEASE_VERSION = 'v0.12.0' # https://github.com/dr5hn/countries-states-cities-database/tags COUNTRY_REGION_JSON_VERSION = 'v3.0' diff --git a/backend/server/run_periodic_sync.py b/backend/server/run_periodic_sync.py index abe40dd8..4df95b8c 100644 --- a/backend/server/run_periodic_sync.py +++ b/backend/server/run_periodic_sync.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """ -Periodic sync runner for AdventureLog. +Periodic sync runner for Voyage. Runs sync_visited_regions management command every 60 seconds. Managed by supervisord to ensure it inherits container environment variables. """ diff --git a/backend/server/templates/base.html b/backend/server/templates/base.html index 205445ee..f8c96893 100644 --- a/backend/server/templates/base.html +++ b/backend/server/templates/base.html @@ -3,10 +3,10 @@ - + - AdventureLog API Server + Voyage API Server