Federation (#327)

* initial commit federation

* more federation

* more federation

* more federation

* completes follow, accept, undo

* add trail create activity

* process trail create activity

* more trail create activity

* adds missing endpoints

* adds update and delete activity

* adds comment activities

* adds activities back

* adds summit logs activities

* deletes follow counts table

* fixes migrations

* fixes migrations

* fixes migrations

* fixes migrations

* adds remote profiles

* ctd

* ctd

* we are getting closer...

* adds public summit logs

* fixes federated trails in lists

* adds remote lists

* adds list activites

* fixes lists

* adds notifications

* adds iri redirect

* fixes comments and summitlogs

* fixes follows and profiles

* adds asynchronous send

* fixes list search

* adds encryption key

* bug fixes

* fixes activity signing

* removes custon activity object types

* adds html editor

* fixes html editor

* fixes display issues on mastodon

* adds federated sharing

* finishes announcements

* fixes small summit log issues

* adds trail likes

* finalizes likes

* fixes images for komoot

* add disable federation option

* adds private profiles

* updates docs

* adds federated comments

* adds trail and comments actvitiypub routes

* adds mentions to editor

* adds mentions to trails, comments, summit logs

* updates theme

* updates theme

* update docs

* update docs

* updates docs

* fixes various frontend problems

* fixes activitypub follows api

* updates docs

* updates docs

---------

Co-authored-by: Christian Beutel <>
This commit is contained in:
Flomp
2025-06-21 10:09:22 +02:00
committed by GitHub
parent 742a6d9d30
commit 9276690d60
356 changed files with 57150 additions and 35470 deletions

View File

@@ -1,95 +1,132 @@
import { defineConfig } from 'astro/config';
import starlight from '@astrojs/starlight';
import tailwind from '@astrojs/tailwind';
import node from "@astrojs/node";
import starlightOpenAPI, { openAPISidebarGroups } from 'starlight-openapi'
import tailwindcss from "@tailwindcss/vite";
// https://astro.build/config
export default defineConfig({
integrations: [starlight({
title: 'wanderer Documentation',
logo: {
light: '/src/assets/logo_text_dark.svg',
dark: '/src/assets/logo_text_light.svg',
replacesTitle: true
},
social: {
github: 'https://github.com/flomp/wanderer'
},
components: {
Footer: './src/components/footer.astro'
},
plugins: [
starlightOpenAPI([
integrations: [
starlight({
title: 'wanderer Documentation',
logo: {
light: '/src/assets/logo_text_dark.svg',
dark: '/src/assets/logo_text_light.svg',
replacesTitle: true
},
social: [
{ icon: 'github', label: 'GitHub', href: 'https://github.com/flomp/wanderer' },
],
components: {
Footer: './src/components/footer.astro'
},
plugins: [
starlightOpenAPI([
{
base: 'api-reference',
label: 'API Reference',
schema: 'wanderer.openapi.yaml',
},
]),
],
sidebar: [
{
base: 'api-reference',
label: 'API Reference',
schema: 'wanderer.openapi.yaml',
label: 'Welcome to wanderer',
link: '/welcome'
},
]),
],
sidebar: [{
label: 'Getting Started',
items: [{
label: 'Installation',
link: '/getting-started/installation/'
}, {
label: 'Configuration',
link: '/getting-started/configuration/'
}, {
label: 'Local development',
link: '/getting-started/local-development/'
}, {
label: 'Changelog',
link: '/getting-started/changelog/'
}]
}, {
label: 'Guides',
items: [{
label: 'Authentication',
link: '/guides/authentication/'
}, {
label: 'Create a trail',
link: '/guides/create-a-trail/'
}, {
label: 'Share trails',
link: '/guides/share-trails/'
}, {
label: 'Lists',
link: '/guides/lists/'
},
{
label: 'Statistics',
link: '/guides/statistics/'
},
{
label: 'Custom categories',
link: '/guides/custom-categories/'
},
{
label: 'Customize the map',
link: '/guides/customize-map/'
},
{
label: 'Import/Export',
link: '/guides/import-export/'
},
{
label: 'Integrations',
link: '/guides/integrations/'
},
{
label: 'API',
link: '/guides/api/'
}]
},
...openAPISidebarGroups,],
customCss: ['./src/custom.css', './src/tailwind.css', '@fontsource/ibm-plex-sans/400.css', '@fontsource/ibm-plex-sans/600.css', '@fontsource/ibm-plex-mono/400.css', '@fontsource/ibm-plex-mono/600.css']
}), tailwind({
applyBaseStyles: false
})],
{
label: 'Using wanderer',
items: [{
label: 'Authentication',
link: '/use/authentication/'
}, {
label: 'Create a trail',
link: '/use/create-a-trail/'
},
{
label: 'Summit logs',
link: '/use/summit-logs/'
},
{
label: 'Interact with the community',
link: '/use/community-interaction/'
},
{
label: 'Share trails',
link: '/use/share-trails/'
}, {
label: 'Lists',
link: '/use/lists/'
},
{
label: 'Statistics',
link: '/use/statistics/'
},
{
label: 'Customize the map',
link: '/use/customize-map/'
},
{
label: 'Import/Export',
link: '/use/import-export/'
},
{
label: 'Integrations',
link: '/use/integrations/'
},
]
},
{
label: 'Running wanderer',
items: [
{
label: 'Installation',
link: '/run/installation/'
},
{
label: 'Environment configuration',
link: '/run/environment-configuration/'
},
{
label: 'Backend configuration',
link: '/run/backend-configuration/'
},
{
label: 'Custom categories',
link: '/run/custom-categories/'
},
{
label: 'Backing up your server',
link: '/run/backup-server/'
},
{
label: 'Changelog',
link: '/run/changelog/'
}]
}, {
label: 'Develop wanderer',
items: [
{
label: 'Local development',
link: '/develop/local-development/'
},
{
label: 'API',
link: '/develop/api/'
},
{
label: 'Federation',
link: '/develop/federation/'
},
]
},
...openAPISidebarGroups,],
customCss: ['./src/custom.css', './src/tailwind.css', '@fontsource/ibm-plex-sans/400.css', '@fontsource/ibm-plex-sans/600.css', '@fontsource/ibm-plex-mono/400.css', '@fontsource/ibm-plex-mono/600.css']
})],
output: "server",
vite: { plugins: [tailwindcss()] },
adapter: node({
mode: "standalone"
})

4938
docs/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
{
"name": "docs",
"type": "module",
"version": "0.16.5",
"version": "0.17.0",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
@@ -11,16 +11,16 @@
},
"dependencies": {
"@astrojs/check": "^0.9.4",
"@astrojs/node": "^9.0.0",
"@astrojs/starlight": "^0.30.3",
"@astrojs/starlight-tailwind": "^3.0.0",
"@astrojs/tailwind": "^5.1.3",
"@astrojs/node": "^9.2.2",
"@astrojs/starlight": "^0.34.4",
"@astrojs/starlight-tailwind": "^4.0.1",
"@fontsource/ibm-plex-mono": "^5.0.13",
"@fontsource/ibm-plex-sans": "^5.0.20",
"astro": "^5.0.2",
"@tailwindcss/vite": "^4.1.10",
"astro": "^5.9.3",
"sharp": "^0.32.5",
"starlight-openapi": "^0.9.0",
"tailwindcss": "^3.4.4",
"tailwindcss": "^4.1.10",
"typescript": "^5.4.5"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
docs/src/assets/social.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 KiB

View File

@@ -1,7 +1,7 @@
---
import { version } from '../../package.json';
import { version } from "../../package.json";
const isNotHomepage = Astro.props.slug !== "";
const isNotHomepage = Astro.locals.starlightRoute.id !== "";
---
{
@@ -121,9 +121,7 @@ const isNotHomepage = Astro.props.slug !== "";
<h5 class="font-semibold">Resources</h5>
<ul class="mt-4 text-sm">
<li>
<a href="https://demo.wanderer.to">
Demo
</a>
<a href="https://demo.wanderer.to">Demo</a>
</li>
<li>
<a href="/api-reference">API Reference</a>
@@ -140,19 +138,13 @@ const isNotHomepage = Astro.props.slug !== "";
<h5 class="font-semibold">wanderer</h5>
<ul class="mt-4 text-sm">
<li>
<a href="/">
About
</a>
<a href="/">About</a>
</li>
<li>
<a href="#features">
Features
</a>
<a href="#features">Features</a>
</li>
<li>
<a href="/getting-started/changelog/">
Changelog
</a>
<a href="/run/changelog/">Changelog</a>
</li>
<li>
<a href="https://github.com/Flomp/wanderer/blob/main/LICENSE">
@@ -177,6 +169,9 @@ const isNotHomepage = Astro.props.slug !== "";
Contribute
</a>
</li>
<li>
<a href="https://discord.gg/USSEBY98CP">Discord</a>
</li>
</ul>
</div>
</footer>
@@ -193,7 +188,7 @@ const isNotHomepage = Astro.props.slug !== "";
color: var(--sl-color-text);
}
footer ul {
list-style-type: none;
list-style-type: none !important;
padding: 0;
}
</style>

View File

@@ -24,7 +24,7 @@ http://localhost:3000/api/v1/auth/login
## Upload trails
One common use case for wanderer's API is bulk uploading GPX files to create new trails. For that, the API provides a separate endpoint: `/trail/upload`. You must first log in to use the endpoint. Afterwards you can send a GPX file to the endpoint to let wanderer parse it an create a new trail in your collection. wanderer will try to infer as much information as possible from the file itself. All additional information can be added to the trail via the UPDATE [endpoint](/api-reference/operations/updatetrail).
One common use case for wanderer's API is bulk uploading GPX files to create new trails. For that, the API provides a separate endpoint: `/trail/upload`. You must first log in to use the endpoint. Afterwards you can send a GPX file to the endpoint to let <span class="-tracking-[0.075em]">wanderer</span> parse it an create a new trail in your collection. <span class="-tracking-[0.075em]">wanderer</span> will try to infer as much information as possible from the file itself. All additional information can be added to the trail via the UPDATE [endpoint](/api-reference/operations/updatetrail).
### Example
```bash

View File

@@ -0,0 +1,491 @@
---
title: Federation
description: Technical documentation of federation in wanderer
---
wanderer is a federated trail-sharing platform built on ActivityPub. It enables users to publish trails, follow other explorers across instances, and interact with content such as comments, lists, and summit logs. All user-generated content in wanderer—whether it's a trail, a list, a comment, or a summit log—is modeled as a `Note` object in ActivityPub, adhering to a consistent structure for federation.
This technical documentation provides a detailed overview of how federation works in wanderer, including the types of objects exchanged, the structure of those objects, and how interactions such as mentions, likes, and follows are processed across instances.
Below, youll find examples of the different JSON representations used in federated communication. These illustrate how <span class="-tracking-[0.075em]">wanderer</span> encodes and interprets core actions and content as standardized `Note` objects.
## Context
```json
"@context":[
"https://www.w3.org/ns/activitystreams"
]
```
The context is identical for all activities and objects.
## Actors
An actor represents a user of <span class="-tracking-[0.075em]">wanderer</span> in a federated context.
### Person
```json
{
"id": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"type": "Person",
"inbox": "https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox",
"outbox": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox",
"summary": "Born the day we installed the site.",
"name": "demo",
"preferredUsername": "demo",
"followers": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers",
"following": "https://demo.wanderer.to/api/v1/activitypub/user/demo/following",
"url": "https://demo.wanderer.to/profile/@demo",
"published": "2025-05-05T15:07:59.943Z",
"icon": {
"type": "Image",
"url": "https://demo.wanderer.to/api/v1/files/users/26b1si1344ficl6/wlezq_um7vh2722q.jpg"
},
"publicKey": {
"id": "https://demo.wanderer.to/api/v1/activitypub/user/demo#main-key",
"owner": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw0xyaRWP5X955bwSnUbr\nmwEF/2Fdmn5nlRRmEvej1BR0oBcPMVPYrrK4sz37mrAJ7Wbmg4KjmSDEROD4sApr\nM5FmKeU1OBsV2O3bL1DSW/8PXaf4JQRgl0AO+LiSAd7A/GO0viAzJXyJT4Rpaamf\n8Naclh7YR5E4JXrsjahPEWtUWcQ4g8Yhc6n2ptQ33ACI7Q1R3+U7q1tMaRCKAbdT\nbRahzqGs3iSxV+FjnsMR109KqDQJDMjwRB11USJTA4/nMpV6w8RS+171xNHl12Sg\nGpiuusmXMYYuoECdKDtLY7AsntusYMzXUjPzKfE+5EqPmIj5OTbg3A24p9hWIv5s\nmwIDAQAB\n-----END PUBLIC KEY-----\n"
}
}
```
### Outbox
Paginated outbox of an actor.
```json
{
"type": "OrderedCollectionPage",
"first": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox?page=1",
"next": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox?page=2",
"partOf": "https://demo.wanderer.to/api/v1/activitypub/user/demo/outbox",
"totalItems": 23,
"orderedItems": [
{
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/ecy96j9vpke00hr",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"type": "Create",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://social.tchncs.de/users/flomp/inbox",
"https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox"
],
"published": "2025-06-20 19:41:53.504Z",
"object": {
"id": "https://demo.wanderer.to/api/v1/comment/htm169g4b2i48fc",
"type": "Note",
"content": "<p><a href=\"/profile/@flomp@social.tchncs.de\" class=\"mention\" rel=\"nofollow\">@flomp@social.tchncs.de</a> </p><p>Wow! What a beautiful trail!</p>",
"attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"inReplyTo": "https://demo.wanderer.to/api/v1/trail/2ce3af7a2e80f52",
"tag": [
{
"id": "https://social.tchncs.de/users/flomp",
"type": "Mention",
"name": "@flomp@social.tchncs.de",
"href": "https://social.tchncs.de/users/flomp"
}
],
"published": "2025-06-20T19:41:53Z"
}
}
]
}
```
### Followers
Paginated collection of followers of an actor.
```json
{
"type": "OrderedCollectionPage",
"first": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers?page=1",
"partOf": "https://demo.wanderer.to/api/v1/activitypub/user/demo/followers",
"totalItems": 3,
"orderedItems": [
"https://social.tchncs.de/users/flomp",
"https://trails.magdeburg.jetzt/api/v1/activitypub/user/momar",
"https://darmstadt.social/users/stormii"
]
}
```
### Following
Paginated collection of actors being followed by an actor.
```json
{
"type": "OrderedCollectionPage",
"first": "https://demo.wanderer.to/api/v1/activitypub/user/demo/following?page=1",
"partOf": "https://demo.wanderer.to/api/v1/activitypub/user/demo/following",
"totalItems": 3,
"orderedItems": [
"https://social.tchncs.de/users/milan",
"https://social.tchncs.de/users/flomp",
"https://trails.tchncs.de/api/v1/activitypub/user/milan"
]
}
```
## Objects
### Trail
Represents a trail with various metadata like description, photos, elevation data etc.
:::note
Waypoints, comments and summit logs are not part of a federated trail object. They are instead fetched on demand from the source instance when requesting a trail.
:::
```json
{
"id": "https://demo.wanderer.to/api/v1/trail/2ce3af7a2e80f52",
"type": "Note",
"name": "12 days in the Zugspitz region on the peak hiking trail",
"content": "<h1>12 days in the Zugspitz region on the peak hiking trail</h1><p><a href=\"/profile/@flomp@social.tchncs.de\" class=\"mention\" rel=\"nofollow\">@flomp@social.tchncs.de</a> </p><p><a href=\"https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52\">https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52</a></p>",
"attachment": [
{
"type": "Image",
"mediaType": "image/jpeg",
"url": "https://demo.wanderer.to/api/v1/files/trails/2ce3af7a2e80f52/route_ldv172t0my.webp"
},
{
"type": "Document",
"mediaType": "application/xml+gpx",
"url": "https://demo.wanderer.to/api/v1/files/trails/2ce3af7a2e80f52/12_days_in_the_zugspitz_region_on_the_peak_hiking_trail_5ts04zgsuk.gpx"
}
],
"attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"location": {
"type": "Place",
"name": "Murnau am Staffelsee, Bayern, Deutschland",
"latitude": 47.678592,
"longitude": 11.196068
},
"tag": [
{
"type": "Note",
"name": "category",
"content": "Biking"
},
{
"type": "Note",
"name": "difficulty",
"content": "easy"
},
{
"type": "Note",
"name": "elevation_gain",
"content": "8902.000000m"
},
{
"type": "Note",
"name": "elevation_loss",
"content": "8906.000000m"
},
{
"type": "Note",
"name": "distance",
"content": "202403.824936m"
},
{
"type": "Note",
"name": "duration",
"content": "4037.183333m"
},
{
"id": "https://social.tchncs.de/users/flomp",
"type": "Mention",
"name": "@flomp@social.tchncs.de",
"href": "https://social.tchncs.de/users/flomp"
},
{
"type": "Note",
"name": "tag",
"content": "My awesome tag"
}
],
"url": "https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52",
"published": "2025-06-17T21:40:02Z",
"startTime": "2025-06-14T00:00:00Z"
}
```
### Summit log
Represents a summit log that is attached to a trail. The trail is referenced in the "InReplyTo" field. It contains very similar metadata to a trail object.
```json
{
"id": "https://demo.wanderer.to/api/v1/summit-log/0l889g7nbju9ic2",
"type": "Note",
"content": "<p>Hello World! This is a summit log!</p><p><a href=\"/profile/@flomp@social.tchncs.de\" class=\"mention\" rel=\"nofollow\">@flomp@social.tchncs.de</a> </p>",
"attachment": [
{
"type": "Image",
"mediaType": "image/jpeg",
"url": "https://demo.wanderer.to/api/v1/files/summit_logs/0l889g7nbju9ic2/walchensee_heimgarten_fahrenbergkopf_herzogstand_2020_10_25_loncv4fixp.jpg"
},
{
"type": "Document",
"mediaType": "application/xml+gpx",
"url": "https://demo.wanderer.to/api/v1/files/summit_logs/0l889g7nbju9ic2/12_days_in_the_zugspitz_region_on_the_peak_hiking_trail_8mw5gysia0.gpx"
}
],
"attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"inReplyTo": "https://demo.wanderer.to/api/v1/trail/2ce3af7a2e80f52",
"tag": [
{
"type": "Note",
"name": "elevation_gain",
"content": "6343.200000m"
},
{
"type": "Note",
"name": "elevation_loss",
"content": "6347.400000m"
},
{
"type": "Note",
"name": "distance",
"content": "202403.824936m"
},
{
"type": "Note",
"name": "duration",
"content": "242231.000000m"
},
{
"id": "https://social.tchncs.de/users/flomp",
"type": "Mention",
"name": "@flomp@social.tchncs.de",
"href": "https://social.tchncs.de/users/flomp"
}
],
"url": "https://demo.wanderer.to/trail/view/@demo/2ce3af7a2e80f52",
"published": "2025-06-20T19:38:19Z",
"startTime": "2025-06-20T00:00:00Z"
}
```
### Comment
A comment attached to a trail. The trail is referenced in the "InReplyTo" field. Contains only text.
```json
{
"id": "https://demo.wanderer.to/api/v1/comment/htm169g4b2i48fc",
"type": "Note",
"content": "<p><a href=\"/profile/@flomp@social.tchncs.de\" class=\"mention\" rel=\"nofollow\">@flomp@social.tchncs.de</a> </p><p>Wow! What a beautiful trail!</p>",
"attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"inReplyTo": "https://demo.wanderer.to/api/v1/trail/2ce3af7a2e80f52",
"tag": [
{
"id": "https://social.tchncs.de/users/flomp",
"type": "Mention",
"name": "@flomp@social.tchncs.de",
"href": "https://social.tchncs.de/users/flomp"
}
],
"published": "2025-06-20T19:41:53Z"
}
```
### List
A collection of trails.
```json
{
"id": "https://demo.wanderer.to/api/v1/list/65i686yf6u3b394",
"type": "Note",
"name": "My Awesome List",
"content": "<p>With my awesome description.</p><p><a href=\"https://demo.wanderer.to/lists/@demo/65i686yf6u3b394\">https://demo.wanderer.to/lists/@demo/65i686yf6u3b394</a></p>",
"attachment": [
{
"type": "Image",
"mediaType": "image/jpeg",
"url": "https://demo.wanderer.to/api/v1/files/lists/65i686yf6u3b394/walchensee_heimgarten_fahrenbergkopf_herzogstand_2020_10_25_m1ubtj7rwk.jpg"
}
],
"attributedTo": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"url": "https://demo.wanderer.to/lists/@demo/65i686yf6u3b394",
"published": "2025-05-18T22:03:19Z"
}
```
## Activities
### Create or Update trail
Issued whenever a trail is created or updated. Broadcasted to all followers and all mentions. Editing a previously created trail will broadcast an identical activity, except the `type` being `Update`. The `object` is a [Trail](#trail).
```json
{
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/wqt6poxjevq9oax",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"type": "Create",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://demo.wanderer.to/api/v1/activitypub/user/demo/followers",
"https://social.tchncs.de/users/flomp/inbox"
],
"published": "2025-06-15 14:56:38.800Z",
"object": {}
}
```
### Create or Update summit log
Issued whenever a summit log is created or updated. Broadcasted to the trail author, the author's followers and all mentions. Editing a previously created summit log will broadcast an identical activity, except the `type` being `Update`. The `object` is a [Summit Log](#summit-log).
```json
{
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/i31uc0lki3crxwm",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"to": "https://www.w3.org/ns/activitystreams#Public",
"type": "Create",
"cc": [
"https://demo.wanderer.to/api/v1/activitypub/user/demo/followers",
"https://social.tchncs.de/users/flomp/inbox"
],
"published": "2025-06-20 19:38:19.978Z",
"object": {}
}
```
### Create or Update comment
Issued whenever a comment is created or updated. Broadcasted to the trail's author and all mentions. Editing a previously created comment will broadcast an identical activity, except the `type` being `Update`. The `object` is a [Comment](#comment).
```json
{
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/ecy96j9vpke00hr",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"type": "Create",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://social.tchncs.de/users/flomp/inbox",
"https://demo.wanderer.to/api/v1/activitypub/user/demo/inbox"
],
"published": "2025-06-20 19:41:53.504Z",
"object": {}
}
```
### Create or Update list
Issued whenever a list is created or updated. Broadcasted to all followers. Editing a previously created list will broadcast an identical activity, except the `type` being `Update`. The `object` is a [List](#list).
```json
{
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/zq30he84ng9of67",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"type": "Create",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://demo.wanderer.to/api/v1/activitypub/user/demo/followers",
],
"published": "2025-06-20 19:51:37.079Z",
"object": {}
}
```
### Follow user
Each actor in <span class="-tracking-[0.075em]">wanderer</span> can be followed. The actor being followed will immediately send back an `Accept` activity. Future public trails and lists published by the actor being followed will be broadcasted to the following actors inbox.
```json
{
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/ika3t06qjyvlx72",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"type": "Follow",
"to": null,
"cc": null,
"published": "2025-06-01 07:23:56.517Z",
"object": "https://social.tchncs.de/users/flomp"
}
```
### Accept follow
Automatically send by an actor as a response upon receiving a `Follow` activity.
```json
{
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/9jpjjvvi79ayp9d",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"type": "Accept",
"to": null,
"cc": null,
"published": "2025-06-17 19:48:29.417Z",
"object": {
"id": "https://social.tchncs.de/8f702e81-9f85-419f-8e45-c44c8b6d8365",
"type": "Follow",
"actor": "https://social.tchncs.de/users/flomp",
"object": "https://demo.wanderer.to/api/v1/activitypub/user/demo"
}
}
```
### Undo follow
An unfollow is represented by an `Undo` activity with the original follow as its `object`.
```json
{
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/n3n7ka5msa3il84",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"type": "Undo",
"to": null,
"cc": null,
"published": "2025-06-20 20:14:37.107Z",
"object": {
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/ika3t06qjyvlx72",
"type": "Follow",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"object": "https://social.tchncs.de/users/flomp"
}
}
```
### Like trail
A like for a trail.
```json
{
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/jjlcgm0il3jy2y7",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"type": "Like",
"to": null,
"cc": null,
"published": "2025-06-18 18:48:55.300Z",
"object": "https://demo.wanderer.to/api/v1/trail/23fd1747a29c3af"
}
```
### Undo like trail
Removing a like from a previously liked trail.
```json
{
"id": "https://demo.wanderer.to/api/v1/activitypub/activity/jjlcgm0il3jy2y7",
"actor": "https://demo.wanderer.to/api/v1/activitypub/user/demo",
"type": "Undo",
"to": null,
"cc": null,
"published": "2025-06-18 18:48:55.300Z",
"object": "https://demo.wanderer.to/api/v1/trail/23fd1747a29c3af"
}
```

View File

@@ -1,9 +1,9 @@
---
title: Local development
description: How to install wanderer for local development
description: How to install <span class="-tracking-[0.075em]">wanderer</span> for local development
---
If you would like to set up a development environment on your own machine to work on wanderer please first follow the bare-metal installation steps in the [installation guide](/getting-started/installation#from-source). We will slightly modify the launch script to launch a node server in development mode instead:
If you would like to set up a development environment on your own machine to work on <span class="-tracking-[0.075em]">wanderer</span> please first follow the bare-metal installation steps in the [installation guide](/run/installation#from-source). We will slightly modify the launch script to launch a node server in development mode instead:
```bash
trap "kill 0" EXIT
@@ -13,6 +13,7 @@ export MEILI_URL=http://127.0.0.1:7700
export MEILI_MASTER_KEY=p2gYZAWODOrwTPr4AYoahCZ9CI8y9bUd0yQLGk-E3m8
export PUBLIC_POCKETBASE_URL=http://127.0.0.1:8090
export PUBLIC_VALHALLA_URL=https://valhalla1.openstreetmap.de
export POCKETBASE_ENCRYPTION_KEY=9ada3c93163812101e50e2bf49e880bc
cd search && ./meilisearch --master-key $MEILI_MASTER_KEY &
cd db && ./pocketbase serve &
@@ -21,15 +22,15 @@ cd web && npm run dev &
wait
```
This will bring up a `meilisearch` instance on `http://127.0.0.1:7700`, a `PocketBase` instance on `http://127.0.0.1:8090`, and a `vite` server for the wanderer frontend on `http://localhost:5173`.
This will bring up a `meilisearch` instance on `http://127.0.0.1:7700`, a `PocketBase` instance on `http://127.0.0.1:8090`, and a `vite` server for the <span class="-tracking-[0.075em]">wanderer</span> frontend on `http://localhost:5173`.
## Accessing the backend
## PocketBase dashboard
Sometimes it can be useful to edit data directly in the database. `PocketBase` offers a convenient web UI to do so. Simply head over to `http://127.0.0.1:8090/_/`. If you access the admin panel for the first time you will be asked to create an admin account. Afterwards, you can create, read, update, and delete data in the respective tables. To learn more about `PocketBase` you can head over to their extensive [documentation](https://pocketbase.io/docs).
It is highly advisable to create an admin user to access PocketBase's dashboard. To do so, please refer to the [backend configuration](/run/backend-configuration#setup) section of the documentation.
## Building
When you are done with development and would like to build wanderer for production there are some steps to follow.
When you are done with development and would like to build <span class="-tracking-[0.075em]">wanderer</span> for production there are some steps to follow.
### PocketBase
@@ -48,7 +49,7 @@ For the frontend there are no further caveats. Simply run `npm run build`.
### Docker
To create local docker images of wanderer simply run the script below. These will work as drop-in replacements for the ones hosted on docker hub. This will only work if you have already completed the steps above.
To create local docker images of <span class="-tracking-[0.075em]">wanderer</span> simply run the script below. These will work as drop-in replacements for the ones hosted on docker hub. This will only work if you have already completed the steps above.
```bash
# db

View File

@@ -1,48 +0,0 @@
---
title: Configuration
description: How to configure wanderer with environment variables
---
Global settings for wanderer can be adjusted via environment variables. If you depoloyed wanderer with docker you can change the environment variables directly in the `docker-compose.yaml`. If you deployed wanderer on bare-metal you can change the environment variables in the launch script.
## Common
These variables are shared between all three services.
| Environment Variable | Description | Default |
| -------------------- | ---------------------------------------------------------------- | ------------------------------------------- |
| MEILI_URL | IP or hostname (including the port) of your meilisearch instance | http://search:7700 |
| MEILI_MASTER_KEY | Master API key for your meilisearch instance | vODkljPcfFANYNepCHyDyGjzAMPcdHnrb6X5KyXQPWo |
## Meilisearch
Since we use an unmodified installation of meilisearch you can use all variables listed in meilisearch's documentation. You can find a full list over [here](https://www.meilisearch.com/docs/learn/configuration/instance_options).
| Environment Variable | Description | Default |
| -------------------- | ----------------------------- | ------- |
| MEILI_NO_ANALYTICS | Disable meilisearch telemetry | true |
## Pocketbase
| Environment Variable | Description | Default |
| ----------------------------- | ----------------------------------------------------------------------------------- | --------- |
| POCKETBASE_ENCRYPTION_KEY | Valid 32 character AES key. Used to encrypt secrets | |
| POCKETBASE_CRON_SYNC_SCHEDULE | Valid cron expression. Sets how often trails are synced from 3rd party integrations | 0 2 * * * |
| POCKETBASE_SMTP_ENABLED | Enables or disables SMTP functionality. Accepted values are true or false | false |
| POCKETBASE_SMTP_SENDER_ADRESS | The email address used as the "From" address in outgoing emails | |
| POCKETBASE_SMTP_SENDER_NAME | The display name shown as the sender in outgoing emails | |
| POCKETBASE_SMTP_HOST | The hostname or IP address of the SMTP server | |
| POCKETBASE_SMTP_PORT | The port number used to connect to the SMTP server | |
| POCKETBASE_SMTP_USERNAME | The username used to authenticate with the SMTP server | |
| POCKETBASE_SMTP_PASSWORD | The password used to authenticate with the SMTP server | |
## Frontend
| Environment Variable | Description | Default |
| --------------------- | -------------------------------------------------------------------- | ----------------------------------- |
| ORIGIN | Public IP or hostname (including the port) of your wanderer instance | http://localhost:3000 |
| BODY_SIZE_LIMIT | Maximum allowed upload size | Infinity |
| PUBLIC_POCKETBASE_URL | IP or hostname (including the port) of your pocketbase instance | http://db:8090 |
| PUBLIC_DISABLE_SIGNUP | Disables signup option for new users | false |
| PUBLIC_VALHALLA_URL | Public IP or hostname (including the port) of a valhalla instance | https://valhalla1.openstreetmap.de |
| PUBLIC_NOMINATIM_URL | Public IP or hostname (including the port) of a nominatim instance | https://nominatim.openstreetmap.org |
| UPLOAD_FOLDER | Folder from which wanderer auto-uploads trails | /app/uploads |
| UPLOAD_USER | Username for the account with which wanderer auto-uploads trails | |
| UPLOAD_PASSWORD | Password for the account with which wanderer auto-uploads trails | |

View File

@@ -1,192 +0,0 @@
---
title: Installation
description: Detailed installation instructions for docker and bare-metal
---
import { version } from '../../../../package.json';
wanderer consists of three components:
1. the frontend written with [SvelteKit](https://github.com/sveltejs/kit)
2. the backend, a custom [PocketBase](https://github.com/pocketbase/pocketbase) fork
3. the index, a standard [meilisearch](https://github.com/meilisearch/meilisearch) application
You can install these components in two ways.
## Docker
This is the easiest and most convenient way to install wanderer. After cloning the repository you will find a [docker-compose.yml](https://github.com/Flomp/wanderer/blob/main/docker-compose.yml) file in the root directory that will install and run all necessary components by running `docker compose up -d`.
:::note
If you are not hosting wanderer at `http://localhost:3000` make sure to change `ORIGIN` environment variable to `http(s)://<your_domain>:<your_port>`. Otherwise you will run into CORS errors.
:::
```yml
version: '3'
x-common-env: &cenv
MEILI_URL: http://search:7700
MEILI_MASTER_KEY: vODkljPcfFANYNepCHyDyGjzAMPcdHnrb6X5KyXQPWo
services:
search:
container_name: wanderer-search
image: getmeili/meilisearch:v1.11.3
environment:
<<: *cenv
MEILI_NO_ANALYTICS: true
ports:
- 7700:7700
networks:
- wanderer
volumes:
- ./data/data.ms:/meili_data/data.ms
restart: unless-stopped
healthcheck:
test: curl --fail http://localhost:7700/health || exit 1
interval: 15s
retries: 10
start_period: 20s
timeout: 10s
db:
container_name: wanderer-db
image: flomp/wanderer-db
depends_on:
search:
condition: service_healthy
environment:
<<: *cenv
ports:
- "8090:8090"
networks:
- wanderer
restart: unless-stopped
volumes:
- ./data/pb_data:/pb_data
web:
container_name: wanderer-web
image: flomp/wanderer-web
depends_on:
search:
condition: service_healthy
db:
condition: service_started
environment:
<<: *cenv
ORIGIN: http://localhost:3000
BODY_SIZE_LIMIT: Infinity
PUBLIC_POCKETBASE_URL: http://db:8090
PUBLIC_DISABLE_SIGNUP: false
UPLOAD_FOLDER: /app/uploads
UPLOAD_USER:
UPLOAD_PASSWORD:
PUBLIC_VALHALLA_URL: https://valhalla1.openstreetmap.de
PUBLIC_NOMINATIM_URL: https://nominatim.openstreetmap.org
volumes:
- ./data/uploads:/app/uploads
ports:
- "3000:3000"
networks:
- wanderer
restart: unless-stopped
networks:
wanderer:
driver: bridge
```
### Networking
All three components must be on the same network for wanderer to function properly. This is the case in the default configuration shown above. However, if you run wanderer behind a proxy like traefik, please ensure all three components can communicate.
Notice that you must set the `ORIGIN` environment variable for the web service to the public IP or hostname including the port that wanderer is reachable at. Otherwise, you will see wanderer's frontend throw an `Cross-site POST form submissions are forbidden` error.
The standard configuration makes all three services publically available by forwarding their ports. For the database and the index service this is not strictly necessary. In case you do not require direct access to them you can disable their ports in the docker-compose file.
### Volumes
By default, wanderer uses two volumes. One for meilisearch indices and one for all PocketBase data. In the default configuration, the data is stored in volumes. However, if you prefer to use bind mounts you can simply adapt the configuration accordingly.
### Environment
The default configuration contains all necessary environment variables. However, there are more options that allow you to modify how the backend and index operate. For more details, you can take a look at the respective section of the [documentation](/getting-started/configuration).
:::caution
Ensure that you change the `MEILI_MASTER_KEY` to a different value if you plan to use wanderer in a production environment.
:::
### Updating
To update all containers to a new version simply run `docker compose pull && docker compose up -d`. Make sure to read the changelog to check for breaking changes.
## From source
While not recommended it is absolutely possible to install wanderer from source.
### Prerequisites
1. git installed && git clone https://github.com/Flomp/wanderer.git --branch v{version} --single-branch
2. go >= 1.23.0 installed
3. node >= 18.17.0 installed
4. npm >= 8.15.0 installed
### meilisearch
wanderer uses meilisearch without any further modifications. As a result, you can simply head over to [their website](https://www.meilisearch.com/docs/learn/getting_started/installation) and follow the instructions for your preferred platform. We assume that you put the binary in the `wanderer/search` directory. If you did not, adapt the launch script below accordingly.
### PocketBase
wanderer uses a slightly modified version of the PocketBase backend framework. As a result, you will need to build the PocketBase binary first.
```bash
cd wanderer/db
go mod tidy && go build
```
This will create a binary in the `wanderer/db` folder. Verify that it is there.
### Web
wanderer's frontend is written in SvelteKit. We first install all dependencies and build the project.
```bash
cd wanderer/web
npm ci --omit=dev
npm run build
```
This will create a directory `wanderer/web/build`. Verify that it is there.
In case vitest is not installed please do so using
```bash
npm i -s vitest
```
### Launch
To launch our three services we will use a small bash script. This ensures that all necessary environment variables are set and the services are started in the correct order. All three services are executed as background tasks, but are being trapped so that terminating the bash script will also terminate all three services at once.
:::caution
Caution: Ensure that you change the `MEILI_MASTER_KEY` to a different value if you plan to use wanderer in a production environment.
:::
```bash
trap "kill 0" EXIT
# learn more about the configuration:
# https://wanderer.to/getting-started/configuration/
# required
export ORIGIN=http://localhost:3000
export MEILI_URL=http://127.0.0.1:7700
export MEILI_MASTER_KEY=YOU_SHOULD_DEFINITELY_CHANGE_ME
export PUBLIC_POCKETBASE_URL=http://127.0.0.1:8090
export PUBLIC_VALHALLA_URL=https://valhalla1.openstreetmap.de
# optional
# export MEILI_NO_ANALYTICS=true
# export BODY_SIZE_LIMIT=Infinity
# export PUBLIC_DISABLE_SIGNUP=false
# export UPLOAD_FOLDER=/app/uploads
# export UPLOAD_USER=
# export UPLOAD_PASSWORD=
cd search && ./meilisearch --master-key $MEILI_MASTER_KEY &
cd db && ./pocketbase serve &
cd web && node build &
wait
```
### Updating
To update wanderer to the newest version simply run `git pull origin main` and run the launch script. Make sure to read the changelog to check for breaking changes.
## Verify the installation
No matter which installation method you chose, you should now be able to access wanderer on localhost:3000.

View File

@@ -1,82 +0,0 @@
---
title: Authentication
description: Authentication with email/password and OAuth
---
For the majority of wanderer's features you need an account to interact with them.
## Email/Username & Password
The quickest way to create an account is by heading over to `/register` and entering a username, a valid email address, and a password of your choice.
After registering you will be redirected to the homepage and can start creating your first trail.
:::note
The username must be at least 3 characters long, the password at least 8.
:::
## OAuth2
Alternatively, wanderer supports authenticating via OAuth2. The following providers are supported:
- GitHub
- Apple
- Google
- Microsoft
- Yandex
- Facebook
- Instagram
- GitLab
- Bitbucket
- Gitee
- Gitea
- Discord
- Twitter
- Kakao
- VK
- Spotify
- Twitch
- Patreon (v2)
- Strava
- LiveChat
- mailcow
- OpenID Connect
### Prerequisites
To set up OAuth support you will need to access the PocketBase backend. Make sure to forward port 8090 of the `wanderer-db` container. Access the PocketBase admin panel in your browser at `http://<your_pocketbase_url>:8090/_/` and create an admin account.
### Create an OAuth app
This step will vary wildly from provider to provider. Please refer to your provider's documentation for the specific steps.
No matter your provider, you will need a redirect URL. This redirect URL must have the following format: `$ORIGIN/login/redirect`. `$ORIGIN` refers to the `ORIGIN` environment variable that defines the public host at which your wanderer instance can be reached. So for the default installation, the redirect URL is `http://localhost:3000/login/redirect`.
In any case, once you have successfully created your OAuth app you will receive a Client ID and a Client Secret.
### Enable a provider in PocketBase
![Pocketbase OAuth](../../../assets/guides/pocketbase_oauth.png)
In the PocketBase admin panel navigate to the `users` table. Click the gear icon at the top to open the table's settings and navigate to `Options`. In the tab `OAuth2`, add your provider and fill in the Client ID and Client Secret from the step before and save your changes.
### Login using OAuth
![wanderer OAuth](../../../assets/guides/wanderer_oauth.png)
That's it! You should now see your OAuth provider appear in wanderer's login form. Click the button, authorize wanderer, and wait for the authentication to finish. You are now logged in and can use wanderer like any other user.
## Forgot your password?
wanderer offers the option to send password reset emails in case a user forgets his password.
### Prerequisites
To set up password reset emails you will need to access the PocketBase backend. Make sure to forward port 8090 of the `wanderer-db` container. Access the PocketBase admin panel in your browser at `http://<your_pocketbase_url>:8090/_/` and create an admin account.
### Configure SMTP settings
![Pocketbase Mail Settings](../../../assets/guides/pocketbase_mail_settings.png)
Next in the pocketbase admin panel go to Settings -> Mail settings an enable "Use SMTP mail server". Enter the details of your SMTP server and send a test email to ensure your configuration is correct. On the same page you can also adjust the email template of the password reset email.
Alternatively, you can set these options via the respective [environment variables](/getting-started/configuration/#pocketbase).
### Request password reset
Once the SMTP access is configured, users can click the "Forgot password" link in the login form. After requesting the reset the user will receive an email with a unique link to reset their password.

View File

@@ -1,58 +0,0 @@
---
title: Create a trail
description: How to create a trail by uploading or drawing a trail using Valhalla
---
## What is a trail?
In wanderer a trail is an object that contains both GPS data and various kinds of metadata (like a description, photos, waypoints etc.) that make it easily searchable.
## Create a trail
To create a new trail click the <button class="h-10 text-white rounded-lg px-4 py-2 mx-2 bg-primary font-semibold transition-all hover:bg-primary-hover focus:ring-4 ring-zinc-400 leading-none">+ New Trail</button> button in the top right corner.
### Provide a route
A route is the GPS data of a trail. There are two main ways that a user can provide a route.
#### Upload a file
Click the `Upload file` button and choose a file. The file must be either in GPX, FIT, TCX, or KML format. Once you have selected a file you will see a couple of things happen:
- the map will display and focus on your track.
- the elevation profile and speed charts (if your file contains that information) will be updated accordingly.
- in the left-hand panel information like the trail name, location, and distance will be displayed.
#### Draw a route
Instead of clicking the `Upload file` button, you can also click the `Draw a route` button. This will activate the drawing mode. Notice that your cursor is now a cross when hovering over the map. Clicking on the map in drawing mode will create a new waypoint. You can drag and drop it anywhere on the map to update its position. To delete it, click first on the waypoint and then on the red trashcan icon. Creating a second waypoint will create a route between it and the previous one.
![Valhalla routing](../../../assets/guides/valhalla_routing.png)
By default, wanderer uses the [valhalla routing engine](https://github.com/valhalla/valhalla) to calculate the route between the two points. Via the menu in the top-left corner of the map, you can choose your preferred mode of transport which will influence the route calculation. If you disable auto-routing wanderer will not use `valhalla`, but instead, simply draw a straight line between the two points.
When you are done with drawing click the `Stop drawing` button to deactivate the drawing mode.
:::tip
wanderer uses a public, free `valhalla` server by default. The server is financed by donations. Please consider donating at [https://www.fossgis.de/verein/spenden/](https://www.fossgis.de/verein/spenden/).
:::
### Basic Info
Most of the data in this section should be self-explanatory. The only required field is the name: every trail needs a name. If you created your route by uploading a file, wanderer tries to infer most of the information directly from the file. However, you are of course free to edit this information afterwards.
Toggling the public switch to on will make the trail visible for everyone even visitors who are not logged in.
### Waypoints
Waypoints mark points of interest along the route. A trail can have as many waypoints as you like. Click the `+ Add Waypoint` button to start. By default, a waypoint will be positioned in the center of the map. You can change the position either directly by entering a new latitude and longitude or simply moving the waypoint around on the map after saving it first.
Additionally, a waypoint has an icon that is displayed in the map marker. wanderer uses fontawsome icons, so any icon from this [list](https://fontawesome.com/search?q=share&o=r&m=free) is available. If you wish, you can also add photos to the waypoint to make it event more recognizable.
### Photos
You can also add photos to the trail itself. If you add more than one photo you can choose which one should be used as the thumbnail. It will be featured in the trail overview.
### Summit book
If you do the same trail multiple times but do not want to create a new trail every time, you can simply make a new entry in the summit book to log the completion of the trail. By default a new summit log entry is created automatically when you upload a fail containing GPS data in the trail creation process. For subsequent entries to the summit book you can provide an individual file containing your route data for this particular completion of the trail.
## Save the trail
Once you are done creating your trail simply click the <button class="h-10 text-white rounded-lg px-4 py-2 mx-2 bg-primary font-semibold transition-all hover:bg-primary-hover focus:ring-4 ring-zinc-400 leading-none">Save Trail</button> button. This will save your trail to the database and create a new index entry to make ensure that you will find your trail in the future.

View File

@@ -1,21 +0,0 @@
---
title: Custom categories
description: How to create custom trail categories
---
wanderer uses categories to classify what kind of activity a trail belongs to. Out of the box you get: Biking, Canoeing, Climbing, Hiking, Skiing and Walking. However, you can adapt these categories to your needs or add completely new ones.
## Backend access
First, you need access to the PocketBase backend. If you are using docker make sure to forward the internal port 8090 to a public port. With the default configuration, the PocketBase admin panel is available at `http://localhost:8090/_/`. If this is your first time visiting the panel you will need to create an admin account.
To create backend access navigate to your docker-compose.yaml file and type:
```
docker compose exec -it db /pocketbase superuser upsert email@example.com myverysecurepassword
```
Now, you will have access with the user "email@example.com" and the password "myverysecurepassword" to all tables in the backend and can modify the underlying data directly.
## Modifying categories
![Pocketbase Categories](../../../assets/guides/pocketbase_categories.png)
In the PocketBase admin panel, click on the `categories` table in the list on the left side. All existing categories will be listed here. To edit one simply click on the row, edit the data you want to change, and click "Save". To delete a category check the box at the beginning of the row and click "Delete selected". To create a new category click the "New record" button in the top right corner, give your new category a name and a background image, and click "Save".

View File

@@ -1,65 +0,0 @@
---
title: Integrations
description: How to set up third-party integrations with wanderer.
---
You can automatically sync trails to wanderer at regular intervals using the third-party integration feature. Currently, we support two providers: **strava** and **komoot**.
It is important to note that synchronization only works from the provider to wanderer and not the other way around. Additionally, if a trail has already been synced to wanderer, subsequent changes made in the provider will not be transferred unless the trail is deleted in wanderer.
## Prerequisites
wanderer encrypts the credentials required to log in to either provider. To enable this encryption, you must create an encryption key and provide it via the `POCKETBASE_ENCRYPTION_KEY` [environment variable](/getting-started/configuration#pocketbase) to the `wanderer-db` container. To generate a new encryption key, run the following command:
```bash
openssl rand -hex 16
# Example output: ce7f0ddb97100c42e6409a8537c11e23
```
:::caution
Do not share this key with anyone!
:::
Once you have set the encryption key, restart the `wanderer-db` container and navigate to `/settings/integrations`.
## strava Integration
### Creating an App in strava
Before integrating strava with wanderer, you need to create an API application in strava. Visit [strava's API settings](https://www.strava.com/settings/api) and follow the steps to create a new API application. Your setup should resemble the following:
![strava API Application](../../../assets/guides/strava_api_app.png)
### Setting Up the Integration
1. Copy the **Client ID** and **Client Secret**.
2. Go to the integrations page in wanderer's settings.
3. Click the settings button for the strava integration.
4. Enter your **Client ID** and **Client Secret**.
5. Choose whether you want to sync routes, activities, or both.
![wanderer strava Integration](../../../assets/guides/wanderer_integration_strava.png)
6. Save the settings and toggle the integration on.
7. You will be redirected to strava's authorization page. Keep all checkboxes selected and click **Authorize**.
8. You will then be redirected back to wanderer. The strava integration is now active.
## komoot Integration
The komoot integration requires only your komoot username and password:
1. Open the komoot settings from the integrations menu.
2. Enter your komoot credentials.
3. Save the settings.
4. Toggle the integration on. It will become active immediately.
Your planned and completed trails will now sync with wanderer.
## Sync Interval
By default, trails are synced every night at **02:00 AM**. You can modify this schedule using the `POCKETBASE_CRON_SYNC_SCHEDULE` [environment variable](/getting-started/configuration#pocketbase).
:::note
Please set a reasonable sync interval. Both strava and komoot impose usage limits on their APIs. Exceeding these limits may result in rejected requests or account suspension.
:::

View File

@@ -1,19 +0,0 @@
---
title: Share trails
description: How to share trails with other users
---
wanderer allows you to share your trails with other users. You can either publish you trail making it accessible for everyone or share it with specific users. To get started head over to `/trails` and select the trail you want to share or publish.
## Publish a trail
From the ⋮ menu select "Edit". In the panel on the right toggle the "Public" switch to on and save the trail. Your trail is now public and everyone can see it. Even people without an account.
## Share a trail
![Share trail](../../../assets/guides/wanderer_share.gif)
If you want to be more particular about who can see your trail you can instead share your trail. From the ⋮ menu select "Share". In the dialog, search for the user you want to share your trail with. You can now choose the permission the user should have. You can choose between "View" or "Edit". A user with "Edit" permission can change all data (including the route) of the trail.
If you no longer want to share the trail with a user, simply click the red trashcan icon next to their name.

View File

@@ -4,8 +4,8 @@ description: The self-hosted trail database
template: splash
hero:
title: |
Welcome to <span class="-tracking-[0.075em] s-y_bCXRrkrYfP">wanderer</span>
tagline: <span class="-tracking-[0.075em] s-y_bCXRrkrYfP">wanderer</span> is a self-hosted trail database. You can upload your recorded GPS tracks or create new ones and add various metadata to build an easily searchable catalogue.
Welcome to <span class="-tracking-[0.075em]">wanderer</span>
tagline: <span class="-tracking-[0.075em]">wanderer</span> is a decentralized, self-hosted trail database. You can upload your recorded GPS tracks or create new ones and add various metadata to build an easily searchable catalogue.
image:
html: |
<video class="rounded-xl hidden md:block" poster="/favicon.svg" width="100%" src="/trailer.mp4" controls autoplay />
@@ -14,7 +14,7 @@ hero:
link: https://demo.wanderer.to
icon: rocket
- text: Read the docs
link: /getting-started/installation/
link: /welcome
icon: right-arrow
variant: secondary
@@ -22,43 +22,70 @@ hero:
import { Card, CardGrid } from '@astrojs/starlight/components';
![Mockups of wanderer on laptop, tablet and phone](../../assets/hero.png)
<div class="grid grid-cols-1 md:grid-cols-2 gap-16">
<div>
![Mockups of wanderer on laptop, tablet and phone](../../assets/hero.png)
</div>
<div>
<h1>Plan your trails wherever you go</h1>
<p>
Whether you're hiking through remote mountains or biking across the city, <span class="-tracking-[0.075em]">wanderer</span> makes it easy to plan, record, and revisit your adventures. Draw new routes, upload GPS files, and access your trail data from any device — all while keeping full control over your data.
</p>
</div>
<div>
<h1>Import your trails from your favourite providers</h1>
<p>
Already tracking your adventures with Komoot or Strava? <span class="-tracking-[0.075em]">wanderer</span> makes it easy to bring your existing trail history with you. With built-in support for both platforms, you can import your routes and activities directly — no file conversions needed. Consolidate your outdoor journeys in one place, fully under your control.
</p>
</div>
<div>
![Shocase of wanderer integrations](../../assets/integrations.png)
</div>
<div>
![Shocase of wanderer's social features](../../assets/social.png)
</div>
<div>
<h1>Explore together, even apart</h1>
<p>
<span class="-tracking-[0.075em]">wanderer</span> isnt just about trails — its about the people who share them. Follow other users to see their latest routes, like and comment on trails you love, and get notified when someone adds something new. Whether you're part of a local hiking group or just discovering new paths, <span class="-tracking-[0.075em]">wanderer</span> makes it easy to stay connected — across instances and platforms.
</p>
</div>
## Features
</div>
# Why wanderer?
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="mt-4">
<Card title="Manage your trails" icon="pencil">
Upload your trails from multiple file formats (like GPX or TCX) or plan a new trail directly in <span class="-tracking-[0.075em] s-y_bCXRrkrYfP">wanderer</span> with the route drawing tool.
[Learn more →](/guides/create-a-trail)
<Card class="mt-4" title="Decentralized" icon="random">
<span class="-tracking-[0.075em]">wanderer</span> is built on the ActivityPub protocol, meaning your instance can connect with others to share trails, profiles, and updates. Follow users across the network, discover new trails from different communities, and interact seamlessly with other federated platforms like Mastodon — all without relying on a central server.
</Card>
</div>
<Card title="Advanced filters and search" icon="magnifier">
<span class="-tracking-[0.075em] s-y_bCXRrkrYfP">wanderer</span> comes with extensive filter and search functionality right out of the box, so you can focus only on the trails relevant to you.
</Card>
<Card title="Automatic import" icon="seti:folder">
Simply upload all your trails in one go with <span class="-tracking-[0.075em] s-y_bCXRrkrYfP">wanderer</span>'s automatic import feature.
[Learn more →](/guides/import-export#import)
</Card>
<Card title="Full API support" icon="seti:json">
Use <span class="-tracking-[0.075em] s-y_bCXRrkrYfP">wanderer</span>'s API to interact with your trail data directly and automate the tasks you don't want to do manually.
<Card title="Privacy-first, always" icon="approve-check">
Self-hosted and open-source, <span class="-tracking-[0.075em]">wanderer</span> puts you in full control of your data. No tracking, no vendor lock-in, no compromises — your trails stay on your server.
</Card>
<Card title="Full-featured API" icon="seti:json">
Automate your workflows or build on top of <span class="-tracking-[0.075em]">wanderer</span> with its comprehensive JSON API. Access, modify, and query your trail data programmatically.
[API reference →](/api-reference)
</Card>
<Card title="Privacy friendly" icon="approve-check">
<span class="-tracking-[0.075em] s-y_bCXRrkrYfP">wanderer</span> is self-hosted and open-source. Your data stays on your machine and your machine only.
</Card>
<Card title="i18n" icon="translate">
We currently support 8 different languages, with plans to add more in the near future.
</Card>
</Card>
</div>
## Contributing
# Support <span class="-tracking-[0.075em]">wanderer</span>
<span class="-tracking-[0.075em]">wanderer</span> is a passion project and will always stay free and open-source. If you like <span class="-tracking-[0.075em]">wanderer</span> and want to support its development you can make a donation.
<div class="flex items-center justify-center gap-x-8">
<a class="p-4 text-white rounded-full flex items-center" style="background: var(--sl-color-text-accent)" href="https://buymeacoffee.com/wanderertrails">
<img class="mt-0 mr-2 h-8" src="https://github.githubassets.com/assets/buy_me_a_coffee-63ed78263f6e.svg" />
<span class="font-bold">Buy me a coffee</span>
</a>
<a class="p-4 text-white rounded-full flex items-center" style="background: var(--sl-color-text-accent)" href="https://liberapay.com/wanderer">
<img class="mt-0 mr-2 h-8" src="https://github.githubassets.com/assets/liberapay-48108ded7267.svg" />
<span class="font-bold">Liberapay</span>
</a>
</div>
# Contributing
Help is welcome at any time. Check out the [GitHub repository](https://github.com/Flomp/wanderer). to get started. If you are not sure where you can help, check the [roadmap](https://github.com/users/Flomp/projects/2) for features in the backlog. If you would like to contribute a translation, you can do so [here](https://crowdin.com/project/wanderer).
## Support <span class="-tracking-[0.075em] s-y_bCXRrkrYfP">wanderer</span>
<span class="-tracking-[0.075em] s-y_bCXRrkrYfP">wanderer</span> is a passion project and will always stay free and open-source. If you like <span class="-tracking-[0.075em] s-y_bCXRrkrYfP">wanderer</span> and want to support it's development you can make a small donation and [buy me a coffee](https://buymeacoffee.com/wanderertrails).

View File

@@ -0,0 +1,43 @@
---
title: Backend configuration
description: How to access the PocketBase backend
---
## Setup
For many configuration options, it is necessary that you are able to access the PocketBase backend. PocketBase comes with a handy dashboard that allows you to configure basically everything in the backend.
If you are using docker make sure to forward the internal port 8090 to a public port. With the default configuration, the PocketBase admin panel is available at `http://localhost:8090/_/`. If this is your first time visiting the panel you will need to create an admin account.
To create backend access navigate to the location of your `docker-compose.yaml` file on the server and type:
```
docker compose exec -it db /pocketbase superuser upsert email@example.com myverysecurepassword
```
Via the online dashboard, you will now have access with the user "email@example.com" and the password "myverysecurepassword" to all tables in the backend and can modify the underlying data directly.
## Configure SMTP settings
<span class="-tracking-[0.075em]">wanderer</span> can send email notifications to users (e.g. when a user gains a new follower). This is also relevant to send password reset notifications. To enable sending email, you need to configure your SMPT settings in PocketBase.
![Pocketbase Mail Settings](../../../assets/guides/pocketbase_mail_settings.png)
In the pocketbase admin panel go to Settings -> Mail settings an enable "Use SMTP mail server". Enter the details of your SMTP server and send a test email to ensure your configuration is correct. On the same page you can also adjust the email template of the password reset email.
Alternatively, you can set these options via the respective [environment variables](/run/environment-configuration/#pocketbase).
## OAuth
### Create an OAuth app
This step will vary wildly from provider to provider. Please refer to your provider's documentation for the specific steps.
No matter your provider, you will need a redirect URL. This redirect URL must have the following format: `$ORIGIN/login/redirect`. `$ORIGIN` refers to the `ORIGIN` environment variable that defines the public host at which your <span class="-tracking-[0.075em]">wanderer</span> instance can be reached. So for the default installation, the redirect URL is `http://localhost:3000/login/redirect`.
In any case, once you have successfully created your OAuth app you will receive a Client ID and a Client Secret.
### Enable a provider in PocketBase
![Pocketbase OAuth](../../../assets/guides/pocketbase_oauth.png)
In the PocketBase admin panel navigate to the `users` table. Click the gear icon at the top to open the table's settings and navigate to `Options`. In the tab `OAuth2`, add your provider and fill in the Client ID and Client Secret from the step before and save your changes.
## More options
To learn more about what you can do in the admin dashboard please refer to PocketBase's [documentation](https://pocketbase.io/docs/).

View File

@@ -0,0 +1,53 @@
---
title: Backing up your server
description: How to backup data
---
<span class="-tracking-[0.075em]">wanderer</span> has two components that persist data: meilisearch and PocketBase. However the data from meilisearch can be fully reconstructed from PocketBase. This happens automatically when you start <span class="-tracking-[0.075em]">wanderer</span>. It is therefore only necessary to backup the data generated by PocketBase.
## Backup via dashboard
![Pocketbase Backup](../../../assets/guides/pocketbase_backup.png)
Probably the most convenient method to backup your data is using the PocketBase admin dashbboard.
1. Navigate to `Settings` -> `Backups`
2. Press the `Initialize new backup` button.
3. Give your backup a name and start it. That's it!
If you want to backup your data in regular intervals you can do so by enabling auto backups in the backup options.
## Backup manually
Alternatively, if you require a more custom backup solution, you can simply backup the files directly on your server. All data is saved in folder called `pb_data`. If you installed <span class="-tracking-[0.075em]">wanderer</span> via docker it is mounted as a volume. Check your `docker-compose.yml` file for its location. In there you typically find a `data.db` and `auxillary.db` file containing all table information of your instance. Furthermore, `pb_data` contains a `storage` folder holding all file upload data (e.g. GPX/image files).
You can simply copy these files to your backup location using your preferred file transfer method.
## Restore
:::caution
**Important**: Restores are only supported when the **minor version** of your <span class="-tracking-[0.075em]">wanderer</span> instance matches the minor version of the backup. For example, a backup created with version `0.17.x` can only be restored into another `0.17.x` installation. Restoring across major or minor versions is not guaranteed to work and may result in data loss or corruption.
:::
### Restore via dashboard
If you created your backup using the PocketBase admin interface, restoring it is just as easy:
1. Open the PocketBase admin dashboard.
2. Navigate to Settings → Backups.
3. Locate the backup you want to restore.
4. Click the Restore button next to it and confirm.
PocketBase will automatically stop the running instance temporarily, replace the current data with the selected backup, and restart the database.
After that, <span class="-tracking-[0.075em]">wanderer</span> will rebuild the search index from the restored data automatically on the next start.
### Restore manually
If you backed up your data by copying the pb_data folder directly, restoring is simply a matter of replacing the current data directory:
1. Stop the running <span class="-tracking-[0.075em]">wanderer</span> instance (e.g. using docker compose down).
2. Replace the contents of your current pb_data folder with your backup copy.
3. Start <span class="-tracking-[0.075em]">wanderer</span> again (docker compose up -d or equivalent).
Just like with the dashboard method, the Meilisearch index will be rebuilt automatically from the restored PocketBase data.

View File

@@ -2,6 +2,29 @@
title: Changelog
description: What changed in the last patch?
---
## v0.17.0
:::caution
This release contains breaking changes. They are marked with a ⚠️.
**Please update to version v0.16.5 first before updating to v0.17.0.**
:::
### Configuration
Check the reopsitory's [`docker-compose.yml`](https://github.com/Flomp/wanderer/blob/main/docker-compose.yml) for a valid configuration.
- ⚠️ The PocketBase environment variable `POCKETBASE_ENCRYPTION_KEY` is now required. It requires a valid 32 character AES key as its value. To generate a key, run `openssl rand -hex 16`.
- ⚠️ The PocketBase environment variable `ORIGIN`is now required. It must be set to the public IP or hostname (including the port) of your wanderer frontend and must equal the value set for the frontend's `ORIGIN` environment variable.
### Features
- Adds federation
- Adds rich text editor for descriptions and comments
### Docs
- Adds documentation for federation
- Restructures the documentation in three distinct parts (for users, admins & developers) for better separation of concerns
### Translation
- New language: Russian (thanks @jeffscrum)
## v0.16.5
### Features
- Further performance improvements when showing large amount of trails on the map
@@ -257,7 +280,7 @@ This release contains breaking changes. Most migrations will happen automaticall
- Fixes issue with GPX export when using Google Chrome (thanks [@tofublock](https://github.com/tofublock))
### Miscellaneous
As the number of contributors to this project continues to grow (which Im very happy about), Ive set up a [Discord channel](https://discord.gg/MdpybUHc) for more direct communication. If youre interested in helping with Wanderer, feel free to join!
As the number of contributors to this project continues to grow (which Im very happy about), Ive set up a [Discord channel](https://discord.gg/MdpybUHc) for more direct communication. If youre interested in helping with wanderer, feel free to join!
## v0.11.0
### Features

View File

@@ -0,0 +1,12 @@
---
title: Custom categories
description: How to create custom trail categories
---
<span class="-tracking-[0.075em]">wanderer</span> uses categories to classify what kind of activity a trail belongs to. Out of the box you get: Biking, Canoeing, Climbing, Hiking, Skiing and Walking. However, you can adapt these categories to your needs or add completely new ones.
## Modifying categories
![Pocketbase Categories](../../../assets/guides/pocketbase_categories.png)
In the PocketBase admin panel, click on the `categories` table in the list on the left side. All existing categories will be listed here. To edit one simply click on the row, edit the data you want to change, and click "Save". To delete a category check the box at the beginning of the row and click "Delete selected". To create a new category click the "New record" button in the top right corner, give your new category a name and a background image, and click "Save".

View File

@@ -0,0 +1,50 @@
---
title: Environment configuration
description: How to configure <span class="-tracking-[0.075em]">wanderer</span> with environment variables
---
Global settings for <span class="-tracking-[0.075em]">wanderer</span> can be adjusted via environment variables. If you depoloyed <span class="-tracking-[0.075em]">wanderer</span> with docker you can change the environment variables directly in the `docker-compose.yaml`. If you deployed <span class="-tracking-[0.075em]">wanderer</span> on bare-metal you can change the environment variables in the launch script.
## Common
These variables are shared between all three services.
| Environment Variable | Description | Default |
| -------------------- | ---------------------------------------------------------------- | ------------------------------------------- |
| MEILI_URL | IP or hostname (including the port) of your meilisearch instance | http://search:7700 |
| MEILI_MASTER_KEY | Master API key for your meilisearch instance | vODkljPcfFANYNepCHyDyGjzAMPcdHnrb6X5KyXQPWo |
## Meilisearch
Since we use an unmodified installation of meilisearch you can use all variables listed in meilisearch's documentation. You can find a full list over [here](https://www.meilisearch.com/docs/learn/configuration/instance_options).
| Environment Variable | Description | Default |
| -------------------- | ----------------------------- | ------- |
| MEILI_NO_ANALYTICS | Disable meilisearch telemetry | true |
## Pocketbase
| Environment Variable | Description | Default |
| ----------------------------- | ----------------------------------------------------------------------------------------------------------------- | --------------------- |
| ORIGIN | Public IP or hostname (including the port) of your <span class="-tracking-[0.075em]">wanderer</span> frontend (must be the same as in the frontend config) | http://localhost:3000 |
| POCKETBASE_ENCRYPTION_KEY | Valid 32 character AES key. Used to encrypt secrets | |
| POCKETBASE_CRON_SYNC_SCHEDULE | Valid cron expression. Sets how often trails are synced from 3rd party integrations | 0 2 * * * |
| POCKETBASE_SMTP_ENABLED | Enables or disables SMTP functionality. Accepted values are true or false | false |
| POCKETBASE_SMTP_SENDER_ADRESS | The email address used as the "From" address in outgoing emails | |
| POCKETBASE_SMTP_SENDER_NAME | The display name shown as the sender in outgoing emails | |
| POCKETBASE_SMTP_HOST | The hostname or IP address of the SMTP server | |
| POCKETBASE_SMTP_PORT | The port number used to connect to the SMTP server | |
| POCKETBASE_SMTP_USERNAME | The username used to authenticate with the SMTP server | |
| POCKETBASE_SMTP_PASSWORD | The password used to authenticate with the SMTP server | |
## Frontend
| Environment Variable | Description | Default |
| ----------------------- | -------------------------------------------------------------------------------- | ----------------------------------- |
| ORIGIN | Public IP or hostname (including the port) of your <span class="-tracking-[0.075em]">wanderer</span> instance | http://localhost:3000 |
| BODY_SIZE_LIMIT | Maximum allowed upload size | Infinity |
| PUBLIC_POCKETBASE_URL | IP or hostname (including the port) of your pocketbase instance | http://db:8090 |
| PUBLIC_DISABLE_SIGNUP | Disables signup option for new users | false |
| PUBLIC_VALHALLA_URL | Public IP or hostname (including the port) of a valhalla instance | https://valhalla1.openstreetmap.de |
| PUBLIC_NOMINATIM_URL | Public IP or hostname (including the port) of a nominatim instance | https://nominatim.openstreetmap.org |
| PUBLIC_PRIVATE_INSTANCE | Setting this to true will block visitors from viewing content without an account | false |
| UPLOAD_FOLDER | Folder from which <span class="-tracking-[0.075em]">wanderer</span> auto-uploads trails | /app/uploads |
| UPLOAD_USER | Username for the account with which <span class="-tracking-[0.075em]">wanderer</span> auto-uploads trails | |
| UPLOAD_PASSWORD | Password for the account with which <span class="-tracking-[0.075em]">wanderer</span> auto-uploads trails | |

View File

@@ -0,0 +1,275 @@
---
title: Installation
description: Detailed installation instructions for Docker and bare-metal
---
import { version } from '../../../../package.json';
<span class="-tracking-[0.075em]">wanderer</span> is composed of three key components:
1. A frontend built with [SvelteKit](https://github.com/sveltejs/kit)
2. A backend, which is a custom fork of [PocketBase](https://github.com/pocketbase/pocketbase)
3. An index service, powered by [Meilisearch](https://github.com/meilisearch/meilisearch)
You can install these components either via Docker (recommended) or from source.
---
## Prerequisites
<span class="-tracking-[0.075em]">wanderer</span> uses encrypted secrets such as passwords and private keys. To support this, you must set an encryption key using the `POCKETBASE_ENCRYPTION_KEY` [environment variable](/run/environment-configuration#pocketbase). You can generate one using:
```bash
openssl rand -hex 16
# Example output: ce7f0ddb97100c42e6409a8537c11e23
```
:::caution
Do not share this key with anyone!
:::
Once you have set the encryption key, you can proceed to install <span class="-tracking-[0.075em]">wanderer</span>.
## Installation via Docker
This is the easiest and most convenient way to install <span class="-tracking-[0.075em]">wanderer</span>.
After cloning the repository, you will find a [`docker-compose.yml`](https://github.com/Flomp/wanderer/blob/main/docker-compose.yml) file in the root directory. This file sets up all necessary components. Start everything by running:
```bash
docker compose up -d
```
### Configuration Notes
If you're not hosting <span class="-tracking-[0.075em]">wanderer</span> at `http://localhost:3000`, update the `ORIGIN` environment variable accordingly:
```env
ORIGIN=http(s)://<your_domain>:<your_port>
```
If this is not set correctly, you may encounter CORS-related issues.
### Docker Compose Overview
Here's a minimal `docker-compose.yml` example with explanations:
```yaml
version: '3'
x-common-env: &cenv
MEILI_URL: http://search:7700
MEILI_MASTER_KEY: vODkljPcfFANYNepCHyDyGjzAMPcdHnrb6X5KyXQPWo
services:
search:
container_name: wanderer-search
image: getmeili/meilisearch:v1.11.3
environment:
<<: *cenv
MEILI_NO_ANALYTICS: true
ports:
- 7700:7700
networks:
- wanderer
volumes:
- ./data/data.ms:/meili_data/data.ms
restart: unless-stopped
healthcheck:
test: curl --fail http://localhost:7700/health || exit 1
interval: 15s
retries: 10
start_period: 20s
timeout: 10s
db:
container_name: wanderer-db
image: flomp/wanderer-db
depends_on:
search:
condition: service_healthy
environment:
<<: *cenv
POCKETBASE_ENCRYPTION_KEY: <YOUR_ENCRYPTION_KEY_HERE>
ORIGIN: http://localhost:3000
ports:
- "8090:8090"
networks:
- wanderer
restart: unless-stopped
volumes:
- ./data/pb_data:/pb_data
web:
container_name: wanderer-web
image: flomp/wanderer-web
depends_on:
search:
condition: service_healthy
db:
condition: service_started
environment:
<<: *cenv
ORIGIN: http://localhost:3000
BODY_SIZE_LIMIT: Infinity
PUBLIC_POCKETBASE_URL: http://db:8090
PUBLIC_DISABLE_SIGNUP: false
UPLOAD_FOLDER: /app/uploads
UPLOAD_USER:
UPLOAD_PASSWORD:
PUBLIC_VALHALLA_URL: https://valhalla1.openstreetmap.de
PUBLIC_NOMINATIM_URL: https://nominatim.openstreetmap.org
volumes:
- ./data/uploads:/app/uploads
ports:
- "3000:3000"
networks:
- wanderer
restart: unless-stopped
networks:
wanderer:
driver: bridge
```
### Networking
All services must be part of the same Docker network. This is handled by the default `wanderer` network in the configuration above.
Make sure to set the `ORIGIN` environment variable to the full public URL (including port) where your instance is reachable. If misconfigured, the frontend will show this error:
> Cross-site POST form submissions are forbidden
### Volumes
By default, two volumes are mounted:
- Meilisearch index data: `./data/data.ms`
- PocketBase data: `./data/pb_data`
These can be changed to bind mounts or other volume strategies if needed.
### Environment
The default Docker configuration defines all necessary environment variables. You can extend or override them as needed. For advanced options, refer to the [environment configuration documentation](/run/environment-configuration).
:::caution
Ensure you replace the default `MEILI_MASTER_KEY` with a strong, unique value in production environments. Also, remember to set the `POCKETBASE_ENCRYPTION_KEY` to the key you generated [before](#prerequisites).
:::
### Updating
To update your instance to the latest version:
```bash
docker compose pull
docker compose up -d
```
Always consult the [changelog](/run/changelog) before updating, in case of breaking changes.
## Installation from Source
While not as convenient as Docker, you can also install <span class="-tracking-[0.075em]">wanderer</span> from source.
### Prerequisites
1. Clone the repository:
```bash
git clone https://github.com/Flomp/wanderer.git --branch v{version} --single-branch
```
2. Install dependencies:
- **Go** ≥ 1.23.0
- **Node.js** ≥ 18.17.0
- **npm** ≥ 8.15.0
### meilisearch
<span class="-tracking-[0.075em]">wanderer</span> uses a standard Meilisearch binary. Download and install it according to your platform:
https://www.meilisearch.com/docs/learn/getting_started/installation
Place the binary in `wanderer/search`. If you choose a different location, update your scripts accordingly.
### PocketBase
<span class="-tracking-[0.075em]">wanderer</span> uses a customized fork of PocketBase. You must build it before launching:
```bash
cd wanderer/db
go mod tidy && go build
```
This will generate a `pocketbase` binary in the `wanderer/db` folder.
### Web
Build the frontend using:
```bash
cd wanderer/web
npm ci --omit=dev
npm run build
```
You should see a `build/` directory in `wanderer/web`.
If `vitest` is not installed, add it manually:
```bash
npm i -s vitest
```
### Launch
You can launch all three services using a shell script that sets environment variables and ensures proper startup order:
```bash
trap "kill 0" EXIT
# Required configuration
export ORIGIN=http://localhost:3000
export MEILI_URL=http://127.0.0.1:7700
export MEILI_MASTER_KEY=YOU_SHOULD_DEFINITELY_CHANGE_ME
export PUBLIC_POCKETBASE_URL=http://127.0.0.1:8090
export PUBLIC_VALHALLA_URL=https://valhalla1.openstreetmap.de
export POCKETBASE_ENCRYPTION_KEY=YOUR_ENCRYPTION_KEY_HERE
# Optional configuration
# export MEILI_NO_ANALYTICS=true
# export BODY_SIZE_LIMIT=Infinity
# export PUBLIC_DISABLE_SIGNUP=false
# export UPLOAD_FOLDER=/app/uploads
# export UPLOAD_USER=
# export UPLOAD_PASSWORD=
cd search && ./meilisearch --master-key $MEILI_MASTER_KEY &
cd db && ./pocketbase serve &
cd web && node build &
wait
```
:::caution
Make sure you replace `MEILI_MASTER_KEY` with a secure value before going to production. Also, remember to set the `POCKETBASE_ENCRYPTION_KEY` to the key you generated [before](#prerequisites).
:::
### Updating
To update to the latest version:
```bash
git pull origin main
```
Then re-run the launch script. Always review the [changelog](/run/changelog) for breaking changes.
## Verify the Installation
Regardless of the installation method, once everything is running you should be able to access <span class="-tracking-[0.075em]">wanderer</span> at:
```
http://localhost:3000
```
If you see the UI and no errors in the logs, you're all set!

View File

@@ -0,0 +1,50 @@
---
title: Authentication
description: Authentication with email/password and OAuth
---
For the majority of <span class="-tracking-[0.075em]">wanderer</span>'s features you need an account to interact with them.
## Email/Username & Password
The quickest way to create an account is by heading over to `/register` and entering a username, a valid email address, and a password of your choice.
After registering you will be redirected to the homepage and can start creating your first trail.
:::note
The username must be at least 3 characters long, the password at least 8.
:::
## OAuth2
Alternatively, <span class="-tracking-[0.075em]">wanderer</span> supports authenticating via OAuth2. The following providers are supported:
- GitHub
- Apple
- Google
- Microsoft
- Yandex
- Facebook
- Instagram
- GitLab
- Bitbucket
- Gitee
- Gitea
- Discord
- Twitter
- Kakao
- VK
- Spotify
- Twitch
- Patreon (v2)
- Strava
- LiveChat
- mailcow
- OpenID Connect
![wanderer OAuth](../../../assets/guides/wanderer_oauth.png)
If your instance offers OAuth logins, the enabled providers appear in <span class="-tracking-[0.075em]">wanderer</span>'s login form. Click the button, authorize <span class="-tracking-[0.075em]">wanderer</span>, and wait for the authentication to finish. You are now logged in and can use <span class="-tracking-[0.075em]">wanderer</span> like any other user.
## Forgot your password?
<span class="-tracking-[0.075em]">wanderer</span> offers the option to send password reset emails in case a user forgets his password.
You can click the "Forgot password" link in the login form. After requesting the reset the user will receive an email with a unique link to reset their password.

View File

@@ -0,0 +1,69 @@
---
title: Interact with the community
description: How federation works on <span class="-tracking-[0.075em]">wanderer</span>
---
<span class="-tracking-[0.075em]">wanderer</span> is part of the fediverse — a decentralized network of connected apps and communities. This allows users across different platforms and servers to follow each other, interact with trails, and stay updated on adventures — all using a universal identity.
## Your Federated Identity
Every <span class="-tracking-[0.075em]">wanderer</span> user has a unique handle in the format:
```
@username@domain
```
For example: `@alice@wanderer.to`. This lets others on compatible platforms (like Mastodon or other wanderer instances) discover and follow you.
---
## Following Other Users
![Follow user](../../../assets/guides/wanderer_follow.png)
You can follow other <span class="-tracking-[0.075em]">wanderer</span> users. Once you follow someone, their new public trails and lists will be automatically synced to your instance and appear in your feed. You can interact with these trails and lists as if they exist on your own instance.
### How to Find Users
To discover and connect with other <span class="-tracking-[0.075em]">wanderer</span> users, you can use the search bar located on the <span class="-tracking-[0.075em]">wanderer</span> homepage. Simply enter the name or full handle of the user you're looking for—for example, `@bob@trails.social`. The search will return matching profiles from your instance as well as from other federated <span class="-tracking-[0.075em]">wanderer</span> servers.
Once you've found the profile you're interested in, click on it to view the user's public profile page. From there, you can see their shared trails and lists, and choose to follow them.
## Social Features
<span class="-tracking-[0.075em]">wanderer</span> supports a rich social experience:
- **Summit Logs**
Other users can add summit logs to your trails to share their experiences.
- **Comments & Likes**
Users can comment on and like any public trail.
- **Mentions**
Users can mention each other using their handle: `@username@domain`
Mentions work in:
- Comments
- Trail descriptions
- Summit log descriptions
## Notifications
<span class="-tracking-[0.075em]">wanderer</span> notifies you about important interactions from the community. Notifications can appear on the website and/or be sent via email, depending on your preferences.
You can configure which types of notifications you want to receive in your settings. Each notification type can be toggled individually, and you can choose whether to receive it on the website, by email, or both.
### Notification Triggers
You may receive a notification when:
- Someone leaves a comment on your trail
- You have a new follower
- Someone shares a trail with you
- Someone likes your trail
- Someone shares a list with you
- Someone creates a summit log on your trail
- Someone mentions you in a trail description
- Someone mentions you in a comment
- Someone mentions you in a summit log description

View File

@@ -0,0 +1,108 @@
---
title: Create a trail
description: How to create a trail by uploading or drawing a trail using Valhalla
---
## What is a trail?
In <span class="-tracking-[0.075em]">wanderer</span>, a trail is a digital route that includes GPS data and descriptive metadata like name, difficulty, category, photos, and waypoints. Trails can be explored by others and searched in the app.
## Create a trail
To start, click the <button class="h-10 text-white rounded-lg px-4 py-2 mx-2 bg-primary font-semibold transition-all hover:bg-primary-hover focus:ring-4 ring-zinc-400 leading-none">+ New Trail</button> button in the top right corner.
## Step 1: Pick a route
Each trail must begin with a route. There are two ways to provide one:
### Upload a file
Click the **Upload file** button to select a GPS file. Accepted formats are **GPX**, **FIT**, **TCX**, or **KML**.
After uploading:
- The map centers on the route
- Elevation profile and speed (if available) are rendered
- Distance, elevation gain/loss, and other metadata are extracted
- The form fields on the left will be partially prefilled with data that extracted from the file
### Draw a route
Click the **Draw a route** button to manually define a route on the map. While in drawing mode:
- Click on the map to place waypoints
- <span class="-tracking-[0.075em]">wanderer</span> will automatically route between points using the [Valhalla routing engine](https://github.com/valhalla/valhalla)
- You can drag points to reposition them
- Use the top-left menu to change routing mode (e.g. walking, cycling)
- To remove a point, click on it and then click the red trash icon
If you disable Valhalla routing, straight lines will be used between points instead.
To finish drawing, click **Stop drawing**.
:::tip
<span class="-tracking-[0.075em]">wanderer</span> uses a public, donation-financed Valhalla server by default. Please consider supporting it at [https://www.fossgis.de/verein/spenden/](https://www.fossgis.de/verein/spenden/).
:::
## Step 2: Fill out trail details
### Basic Info
- **Name** Required. Every trail needs a name.
- **Location** Autofilled if available in the uploaded file.
- **Date** Defaults to today.
- **Description** Use the editor to describe your trail in as much detail as you want.
- **Distance / Duration / Elevation** These are automatically calculated but can be manually adjusted if needed.
- **Tags** Add descriptive tags to help categorize and search for your trail (e.g. forest, sunset, dog-friendly). Start typing to add a tag and press Enter to confirm.
- **Difficulty** Select the trail's difficulty (e.g. Easy, Moderate, Hard)
- **Category** Choose the activity type (e.g. Hiking, Cycling)
### Visibility
Toggle the **Private** switch if you do not want the trail to be visible to others. When set to private, only you will be able to view and access this trail.
:::note
Creating a public trail will automatically publish that trail to all your followers.
:::
## Step 3: Add Waypoints
Waypoints are points of interest along the trail.
- Click **+ Add Waypoint** to add one manually. It will appear centered on the map and can be dragged to another location.
- Each waypoint can have a name, description, icon, and photos.
- Use Font Awesome icons for map markers. You can browse them at [fontawesome.com](https://fontawesome.com/search?q=share&o=r&m=free).
Alternatively, click **From Photos** to upload photos with GPS metadata. Waypoints will be created automatically based on the photo locations.
## Step 4: Add Photos & Videos
You can attach photos and videos to the trail itself. These will be shown in the trail's detail view. If you upload more than one, you can select one to be the trails thumbnail in the overview.
## Step 5: Add to Summit Book
If you've completed this trail yourself, you can log a summit book entry.
- Click **+ Add Entry**
- Upload a separate GPS file or just log the date of your completion
- You can add multiple summit entries over time without creating duplicate trails
To learn more about summit logs visit the [dedicated section](/use/summit-logs) of the documentation.
## Step 6: Save the trail
When you're done, click <button class="h-10 text-white rounded-lg px-4 py-2 mx-2 bg-primary font-semibold transition-all hover:bg-primary-hover focus:ring-4 ring-zinc-400 leading-none">Save Trail</button> to persist your trail to the database. This will also re-index it for search and display it in your trail list.

View File

@@ -3,7 +3,7 @@ title: Customize the map
description: How to customize the map with user defined tile sets
---
wanderer is compatible with any provider of vector tile maps (e.g. CARTO, mapbox, maptiler, or self-hosted OpenMapTiles). Out of the box it comes with 4 different map styles:
<span class="-tracking-[0.075em]">wanderer</span> is compatible with any provider of vector tile maps (e.g. CARTO, mapbox, maptiler, or self-hosted OpenMapTiles). Out of the box it comes with 4 different map styles:
1. Open Street Maps
2. Open Topo Maps
3. CARTO Light
@@ -30,7 +30,7 @@ Once added, your custom style will be available in the style switcher menu, allo
![Custom tilesets](../../../assets/guides/wanderer_terrain.png)
To enhance wanderer's map visualization, you can add two types of data sources to display 3D Terrain and Hillshading. This is achieved by providing URLs pointing to the required `tiles.json` files. Both the terrain and hillshading data must be in Mapbox TileJSON format and accessible through the provided URLs.
To enhance <span class="-tracking-[0.075em]">wanderer</span>'s map visualization, you can add two types of data sources to display 3D Terrain and Hillshading. This is achieved by providing URLs pointing to the required `tiles.json` files. Both the terrain and hillshading data must be in Mapbox TileJSON format and accessible through the provided URLs.
To add the respective URLs navigate to `Settings -> Display` and add them in the `Terrain` section. After adding the terrain & hillshading source, you can explore the 3D map view by interacting with the compass control on the map.

View File

@@ -5,7 +5,7 @@ description: How to import and export trails in wanderer
## Import
wanderer supports bulk uploading of trails via an auto-upload folder. A cronjob fetches all files from this folder and uploads them automatically every 15 minutes. This feature is currently only available for docker installations. If you want to replicate it in a bare metal installation you will need to create your own cronjob using the `web/cron.sh` script.
<span class="-tracking-[0.075em]">wanderer</span> supports bulk uploading of trails via an auto-upload folder. A cronjob fetches all files from this folder and uploads them automatically every 15 minutes. This feature is currently only available for docker installations. If you want to replicate it in a bare metal installation you will need to create your own cronjob using the `web/cron.sh` script.
:::caution
Successfully uploaded files will be deleted from the auto-upload folder.
@@ -16,7 +16,7 @@ Currently only GPX files are supported.
:::
### Configuration
The following environment variables must be present in the `wanderer-web` docker container and set to valid values.
The following environment variables must be present in the `<span class="-tracking-[0.075em]">wanderer</span>-web` docker container and set to valid values.
| Environment Variable | Description | Default |
|----------------------|------------------------------------------------------------------------|--------------|
@@ -36,11 +36,6 @@ docker exec -it wanderer-web run-parts /etc/periodic/15min
## Export
To export a single trail head over to `/trails` and select the trail you want to export. From the menu select "Export". You can export the route data either in GPX or in GeoJSON format. Furthermore, you can choose whether you want to include the photos and the summit book of the trail. In any case, wanderer will create a ZIP archive with all the data that is then downloaded.
To export a single trail head over to `/trails` and select the trail you want to export. From the <span class="inline-block w-8 h-8 bg-primary rounded-full text-center text-white"></span> menu select "Export". You can export the route data either in GPX or in GeoJSON format. Furthermore, you can choose whether you want to include the photos and the summit book of the trail. In any case, <span class="-tracking-[0.075em]">wanderer</span> will create a ZIP archive with all the data that is then downloaded.
You can also export all of your trails at once. To do so, head over to `/settings/export` and click "Export all trails". The other steps remain analogous to exporting a single trail.
## Backups
All of wanderer's persistent data is stored in PocketBase. PocketBase offers (automated) backups to local storage or S3. To learn more, check out [PocketBase's documentation](https://pocketbase.io/docs/going-to-production/#backup-and-restore).

View File

@@ -0,0 +1,50 @@
---
title: Integrations
description: How to set up third-party integrations with wanderer.
---
You can automatically sync trails to <span class="-tracking-[0.075em]">wanderer</span> at regular intervals using the third-party integration feature. Currently, we support two providers: **strava** and **komoot**.
It is important to note that synchronization only works from the provider to <span class="-tracking-[0.075em]">wanderer</span> and not the other way around. Additionally, if a trail has already been synced to <span class="-tracking-[0.075em]">wanderer</span>, subsequent changes made in the provider will not be transferred unless the trail is deleted in <span class="-tracking-[0.075em]">wanderer</span>.
## strava Integration
### Creating an App in strava
Before integrating strava with <span class="-tracking-[0.075em]">wanderer</span>, you need to create an API application in strava. Visit [strava's API settings](https://www.strava.com/settings/api) and follow the steps to create a new API application. Your setup should resemble the following:
![strava API Application](../../../assets/guides/strava_api_app.png)
### Setting Up the Integration
1. Copy the **Client ID** and **Client Secret**.
2. Go to the integrations page in <span class="-tracking-[0.075em]">wanderer</span>'s settings.
3. Click the settings button for the strava integration.
4. Enter your **Client ID** and **Client Secret**.
5. Choose whether you want to sync routes, activities, or both.
![wanderer strava Integration](../../../assets/guides/wanderer_integration_strava.png)
6. Save the settings and toggle the integration on.
7. You will be redirected to strava's authorization page. Keep all checkboxes selected and click **Authorize**.
8. You will then be redirected back to <span class="-tracking-[0.075em]">wanderer</span>. The strava integration is now active.
## komoot Integration
The komoot integration requires only your komoot username and password:
1. Open the komoot settings from the integrations menu.
2. Enter your komoot credentials.
3. Save the settings.
4. Toggle the integration on. It will become active immediately.
Your planned and completed trails will now sync with <span class="-tracking-[0.075em]">wanderer</span>.
## Sync Interval
By default, trails are synced every night at **02:00 AM**. You can modify this schedule using the `POCKETBASE_CRON_SYNC_SCHEDULE` [environment variable](/run/environment-configuration#pocketbase).
:::note
Please set a reasonable sync interval. Both strava and komoot impose usage limits on their APIs. Exceeding these limits may result in rejected requests or account suspension.
:::

View File

@@ -18,7 +18,7 @@ Once you are done creating your list simply click the <button class="h-10 text-w
![Lists edit](../../../assets/guides/wanderer_lists_edit.png)
## Share a list
You can also share a list to allow other users access it. To do so select the list in the overview and click "Share" in the menu. Everything else works analogous to <a href="/guides/share-trails#share-a-trail">sharing a trail</a>. Depending on the permission you set for the shared list a user can simply view the list or also modify its contents.
You can also share a list to allow other users access it. To do so select the list in the overview and click "Share" in the <span class="inline-block w-8 h-8 bg-primary rounded-full text-center text-white"></span> menu. Everything else works analogous to <a href="/use/share-trails#share-a-trail">sharing a trail</a>. Depending on the permission you set for the shared list a user can simply view the list or also modify its contents.
:::caution
Sharing a list with another user will also automatically share all trails contained in that list with the user. Unsharing a list will _not_ automatically unshare all trails contained in the list.
@@ -26,4 +26,4 @@ Sharing a list with another user will also automatically share all trails contai
## Edit & delete a list
To edit or delete a list first select it from the overview. Then you can select the respective entry from the menu.
To edit or delete a list first select it from the overview. Then you can select the respective entry from the <span class="inline-block w-8 h-8 bg-primary rounded-full text-center text-white"></span> menu.

View File

@@ -0,0 +1,29 @@
---
title: Share trails
description: How to share trails with other users
---
<span class="-tracking-[0.075em]">wanderer</span> allows you to share your trails with other users. You can either publish you trail making it accessible for everyone or share it with specific users. To get started head over to `/trails` and select the trail you want to share or publish.
## Publish a trail
From the <span class="inline-block w-8 h-8 bg-primary rounded-full text-center text-white"></span> menu select "Edit". In the panel on the right toggle the "Public" switch to on and save the trail. Your trail is now public and everyone can see it. Even people without an account.
## Share a trail
![Share trail](../../../assets/guides/wanderer_share.gif)
If you want to be more particular about who can see your trail you can instead share your trail. From the <span class="inline-block w-8 h-8 bg-primary rounded-full text-center text-white"></span> menu select "Share". In the dialog, search for the user you want to share your trail with. You can now choose the permission the user should have. You can choose between "View" or "Edit". A user with "Edit" permission can change all data (including the route) of the trail.
If you no longer want to share the trail with a user, simply click the red trashcan icon next to their name.
:::note
<span class="-tracking-[0.075em]">wanderer</span> supports trail sharing between users on different instances (servers), thanks to its federated design. However, there are important limitations to be aware of:
- **The trail must be public** in order to be shareable with users on other instances.
- **Shared trails are view-only**: The user you share it with will be able to view the trail and engage with it (like or comment), but **they cannot edit it**.
- Sharing a trail with another user is similar to a **mention** in the fediverse—it notifies them and gives them visibility, but does not grant collaborative access.
If you're looking for true collaboration on a trail (such as shared editing), both users must be on the same instance.
:::

View File

@@ -3,7 +3,7 @@ title: Statistics
description: Where can I find statistics and how are they derived?
---
wanderer can you show you a wide range of useful statistics about your latest adventures. Head over to the profile page (`/profile`) to get started. wanderer derives the values for your statistics from the [summit books](guides/create-a-trail/#summit-book) of your trails. So make sure to add some entries with GPS data beofre proceeding.
<span class="-tracking-[0.075em]">wanderer</span> can you show you a wide range of useful statistics about your latest adventures. Head over to the profile page (`/profile`) to get started. <span class="-tracking-[0.075em]">wanderer</span> derives the values for your statistics from the [summit logs](/use/summit-logs) of your trails. So make sure to add some entries with GPS data beofre proceeding.
![Statistics](../../../assets/guides/wanderer_stats.gif)

View File

@@ -0,0 +1,34 @@
---
title: Summit logs
description: What are summit logs?
---
Summit logs are a way to document and share each of your trail completions, whether you're repeating a route or contributing your experience to a trail uploaded by someone else.
## What is a Summit Log?
A summit log is an entry attached to a trail that records an individual outing. It can be created by the author of the trail or by any other user, as long as the trail is public. Summit logs allow for a more detailed and personal view of how and when a trail was completed, including photos, GPS data, and written reflections.
## When to Use a Summit Log
If you are hiking a trail that already exists on <span class="-tracking-[0.075em]">wanderer</span> — whether uploaded by you or another user — you can log your hike by creating a summit log instead of uploading the trail again. This helps avoid duplicates and keeps the trail history consolidated. Summit logs are perfect for re-hikes, community contributions, or simply marking your progress over time.
## What You Can Include
When creating a summit log, you can provide the following:
- **Date** of the outing
- **Photos and videos** specific to this hike
- **A separate GPS track** (if different from the original)
- **Text description** with formatting options
Mentions of other users can be included directly in the description field using the `@user@domain` format. Mentioned users will receive a notification and can view the summit log where they were referenced.
## Creating a Summit Log
To create a summit log, go to the trail's page and select the **"Add Entry"** button in the **Summit Book** tab. A form will appear where you can input your outing's details. If you are the author of the trail or have permission to edit the trail, you can also add a new summit log by editing an existing trail. Once saved, your entry will appear in the Summit Book table on the trail page.
## Visibility and Interaction
Summit logs are visible to other users but cannot receive comments or likes. Interaction is limited to the original trail, where others can leave feedback and appreciation.
For more on mentions and notifications, refer to the [community interaction](/use/community-interaction) section of the documentation.

View File

@@ -0,0 +1,77 @@
---
title: Welcome to wanderer
description: What is wanderer?
---
import { LinkCard } from '@astrojs/starlight/components';
<span class="-tracking-[0.075em]">wanderer</span> is a self-hosted, federated trail database built for explorers who want full control over their outdoor data. Whether you're tracking personal hikes or publishing trail networks for a wider community, <span class="-tracking-[0.075em]">wanderer</span> gives you the tools to manage, share, and discover trails all on your own terms.
## What is wanderer?
<span class="-tracking-[0.075em]">wanderer</span> is an open-source web application that allows you to:
- Upload GPS tracks from formats like GPX or TCX
- Create new trails using a built-in route planner
- Add metadata such as difficulty, terrain, tags, or region
- Organize and search your trail collection with advanced filters
- Follow other users, like and comment on trails
- Host your own instance, with full data ownership and control
Whether you're a solo adventurer, a local trail group, or building a public archive, <span class="-tracking-[0.075em]">wanderer</span> adapts to your use case and keeps your data in your hands.
## What is federation?
Federation allows <span class="-tracking-[0.075em]">wanderer</span> servers — called instances — to communicate with each other. This means users on different servers can interact, follow one another, and share trails across the network, even if their data lives on separate machines.
But federation is completely optional. You can run <span class="-tracking-[0.075em]">wanderer</span> entirely on your own, as a private trail database with no external connections. All features, from route planning to metadata management and search, work fully in standalone mode. Your server doesnt need to talk to any others unless you choose to enable it.
When federation is enabled, <span class="-tracking-[0.075em]">wanderer</span> becomes part of a wider decentralized network. You can still control exactly who your instance connects with — or keep it entirely private if you prefer.
This flexible design means <span class="-tracking-[0.075em]">wanderer</span> works equally well for:
- Individuals who want a private, local trail archive
- Small groups collaborating on a shared server
- Public communities contributing to a federated network of outdoor explorers
For more detail on how <span class="-tracking-[0.075em]">wanderer</span> uses federation, see the [community interaction guide](/use/community-interaction/).
## What is ActivityPub?
ActivityPub is an open, standardized protocol for decentralized social networking. It was developed by the W3C (World Wide Web Consortium) and is used by platforms like Mastodon (microblogging), PeerTube (video hosting), and WriteFreely (blogging). These platforms form whats known as the Fediverse — a network of independently hosted services that can talk to each other.
<span class="-tracking-[0.075em]">wanderer</span> uses ActivityPub to enable federation between instances. This allows users on different <span class="-tracking-[0.075em]">wanderer</span> servers to:
- Follow each other
- View and interact with trails across servers
- Like and comment on trails, even if they were created elsewhere
- Receive notifications about new trails or updates from followed users
Because it follows a common standard, <span class="-tracking-[0.075em]">wanderer</span> can also potentially interact with users from entirely different platforms in the Fediverse — for example, someone on Mastodon could follow a <span class="-tracking-[0.075em]">wanderer</span> account and receive updates when new trails are published.
## Community and support
<span class="-tracking-[0.075em]">wanderer</span> is open-source and developed in the open. You can help shape its future or get involved in many ways:
- [GitHub repository](https://github.com/Flomp/wanderer)
- [Issue tracker](https://github.com/Flomp/wanderer/issues)
- [Translation project on Crowdin](https://crowdin.com/project/wanderer)
- [Discord server](https://discord.gg/USSEBY98CP)
Want to contribute? Start by checking the [roadmap](https://github.com/users/Flomp/projects/2) or browsing open issues on GitHub.
## Next steps
<div class="grid grid-cols-1 md:grid-cols-3 gap-x-2">
<div class="mt-4 flex">
<LinkCard href="/use/authentication" title="How to use wanderer" description="Learn how to upload, create, and organize trails in your own instance of wanderer.">
</LinkCard>
</div>
<LinkCard href="/run/installation" title="How to run wanderer" description="Want to host your own instance? This guide covers everything you need to know to deploy wanderer.">
</LinkCard>
<LinkCard href="/develop/local-development" title="How to develop wanderer" description="This section covers the development environment, architecture overview, and how to get involved in the project.">
</LinkCard>
</div>

View File

@@ -1,11 +1,18 @@
@import 'tailwindcss/utilities';
@import 'tailwindcss/base';
@import 'tailwindcss/components';
@import 'tailwindcss';
@reference "./tailwind.css";
.card {
@apply rounded-xl
}
.content-panel ul {
@apply list-disc list-inside ml-4
}
.content-panel ol {
@apply list-decimal list-inside ml-4
}
.card .icon {
background-color: transparent !important;

View File

@@ -1,8 +1,32 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
@layer base, starlight, theme, components, utilities;
@import '@astrojs/starlight-tailwind';
@import "tailwindcss/theme.css" layer(theme);
@import "tailwindcss/preflight.css" layer(base);
@import "tailwindcss/utilities.css";
@theme {
--color-primary: #242734;
/* Generated accent color palettes. */
--color-accent-200: #b3c7ff;
--color-accent-600: #364bff;
--color-accent-900: #182775;
--color-accent-950: #131e4f;
/* Generated gray color palettes. */
--color-gray-100: #f5f6f8;
--color-gray-200: #eceef2;
--color-gray-300: #c0c2c7;
--color-gray-400: #888b96;
--color-gray-500: #545861;
--color-gray-700: #353841;
--color-gray-800: #24272f;
--color-gray-900: #17181c;
--font-sans: "IBMPlexSans"
}
/*
Add additional Tailwind styles to this file, for example with @layer:
https://tailwindcss.com/docs/adding-custom-styles#using-css-and-layer
Add additional Tailwind styles to this file:
https://tailwindcss.com/docs/adding-custom-styles#using-custom-css
*/

View File

@@ -1,27 +0,0 @@
import colors from 'tailwindcss/colors';
import starlightPlugin from '@astrojs/starlight-tailwind';
const accent = { 200: '#b0c8fd', 600: '#2a56f1', 900: '#152b6d', 950: '#112149' };
/** @type {import('tailwindcss').Config} */
export default {
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
theme: {
extend: {
colors: {
primary: "#242734",
// Your preferred accent color. Indigo is closest to Starlights defaults.
accent: accent,
// Your preferred gray scale. Zinc is closest to Starlights defaults.
gray: colors.gray,
},
fontFamily: {
// Deine bevorzugte Schriftart. Starlight verwendet standardmäßig eine Systemschriftart.
sans: ['"IBM Plex Sans"'],
// Deine bevorzugte Code-Schriftart. Starlight verwendet standardmäßig die Systemschriftart Monospace.
mono: ['"IBM Plex Mono"'],
},
},
},
plugins: [starlightPlugin()],
};

File diff suppressed because it is too large Load Diff