diff --git a/PRIVACY.md b/PRIVACY.md
deleted file mode 100644
index 9333e0a..0000000
--- a/PRIVACY.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Privacy Policy
-
-**Last updated: September 29, 2025**
-
-This Privacy Policy describes our policies and procedures regarding the collection, use, and disclosure of your information when you use my software.
-
-## No Data Collection
-
-I do not collect any personal information, analytics, or data of any kind. This software is designed to be self-hosted or run entirely offline.
-
-All data generated by or used with this software remains on your local machine or self-hosted environment under your control. I have no access to it.
-
-## No Tracking or Analytics
-
-This software does not use cookies, tracking pixels, or any other analytics or tracking mechanisms. Your usage of the software is completely private.
-
-## Contact Us
-
-If you have any questions about this Privacy Policy, you can contact me:
-
-* **By email:** me@atri.dad
diff --git a/README.md b/README.md
index bdcf278..da132f1 100644
--- a/README.md
+++ b/README.md
@@ -2,43 +2,11 @@
_Formerly OpenClimb_
-This is a FOSS app meant to help climbers track their sessions, routes/problems, and overall progress. This app is offline-first, with an optional sync server and integrations with Apple Health and Health Connect. Its built using Jetpack Compose with Material You support on Android and SwiftUI on iOS.
+Ascently is an **offline-first FOSS** app designed to help climbers track their sessions, routes/problems, and overall progress. There is an optional self-hosted sync server and integrations with Apple Health and Health Connect. There are no analytics or tracking baked into any part of this project. I am committed to maintaining a transparent and open-source solution for climbers, ensuring that you have full control over your data and privacy.
-## Download
+## Documentation
-For Android do one of the following:
-
-1. Download the latest APK from the Releases page
-2. [
](https://apps.obtainium.imranr.dev/redirect?r=obtainium://app/%7B%22id%22%3A%22com.atridad.ascently%22%2C%22url%22%3A%22https%3A%2F%2Fgit.atri.dad%2Fatridad%2FAscently%2Freleases%22%2C%22author%22%3A%22git.atri.dad%22%2C%22name%22%3A%22Ascently%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22intermediateLink%5C%22%3A%5B%5D%2C%5C%22customLinkFilterRegex%5C%22%3A%5C%22%5C%22%2C%5C%22filterByLinkText%5C%22%3Afalse%2C%5C%22skipSort%5C%22%3Afalse%2C%5C%22reverseSort%5C%22%3Afalse%2C%5C%22sortByLastLinkSegment%5C%22%3Afalse%2C%5C%22versionExtractWholePage%5C%22%3Afalse%2C%5C%22requestHeader%5C%22%3A%5B%7B%5C%22requestHeader%5C%22%3A%5C%22User-Agent%3A%20Mozilla%2F5.0%20(Linux%3B%20Android%2010%3B%20K)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F114.0.0.0%20Mobile%20Safari%2F537.36%5C%22%7D%5D%2C%5C%22defaultPseudoVersioningMethod%5C%22%3A%5C%22partialAPKHash%5C%22%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%5C%22%2C%5C%22versionDetection%5C%22%3Afalse%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22invertAPKFilter%5C%22%3Afalse%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22Ascently%5C%22%2C%5C%22appAuthor%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22allowInsecure%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22%5C%22%2C%5C%22refreshBeforeDownload%5C%22%3Afalse%7D%22%2C%22overrideSource%22%3Anull%7D)
-
-For iOS:
-
-Download from the AppStore (LINK TO BE DETERMINED)!
-For development builds, sign up for the TestFlight [here](https://testflight.apple.com/join/E2DYRGH8)!
-
-## Self-Hosted Sync Server
-
-You can run your own sync server to keep your data in sync across devices. The server is lightweight and easy to set up using Docker.
-
-### Quick Start with Docker Compose
-
-1. Create a `.env` file with your configuration:
-```
-IMAGE=git.atri.dad/atridad/ascently-sync:latest
-APP_PORT=8080
-AUTH_TOKEN=your-secure-auth-token-here
-DATA_FILE=/data/ascently.json
-IMAGES_DIR=/data/images
-ROOT_DIR=./ascently-data
-```
-
-2. Use the provided `docker-compose.yml` in the `sync/` directory:
-```bash
-cd sync/
-docker-compose up -d
-```
-
-The server will be available at `http://localhost:8080`. Configure your clients with your server URL and auth token to start syncing.
+Documentation can be found at [https://ascently.atri.dad](https://ascently.atri.dad)!
## Requirements
diff --git a/android/README.md b/android/README.md
index e18053f..189d1a1 100644
--- a/android/README.md
+++ b/android/README.md
@@ -18,5 +18,3 @@ This is a standard Android Gradle project. The main code lives in `app/src/main/
- `navigation/`: Navigation graph and routes using Jetpack Navigation.
- `service/`: Background service for tracking climbing sessions.
- `utils/`: Helpers for things like date formatting and image handling.
-
-The app is built to be offline-first. All data is stored locally on your device and works without an internet connection.
\ No newline at end of file
diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs
index 5885cbf..e9f949d 100644
--- a/docs/astro.config.mjs
+++ b/docs/astro.config.mjs
@@ -12,7 +12,7 @@ export default defineConfig({
starlight({
title: "Ascently",
description:
- "A FOSS climbing tracking app with offline-first design and optional sync server",
+ "An offline-first FOSS climb tracking app with an optional sync server.",
logo: {
light: "./src/assets/logo.svg",
dark: "./src/assets/logo-dark.svg",
@@ -20,8 +20,8 @@ export default defineConfig({
favicon: "/favicon.png",
social: [
{
- icon: "github",
- label: "GitHub",
+ icon: "seti:git",
+ label: "Gitea",
href: "https://git.atri.dad/atridad/Ascently",
},
{
@@ -46,6 +46,10 @@ export default defineConfig({
label: "Reference",
autogenerate: { directory: "reference" },
},
+ {
+ label: "Privacy",
+ link: "/privacy/",
+ },
],
customCss: ["./src/styles/custom.css"],
}),
@@ -54,4 +58,4 @@ export default defineConfig({
adapter: node({
mode: "standalone",
}),
-});
\ No newline at end of file
+});
diff --git a/docs/package.json b/docs/package.json
index 087ad1c..1410c49 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -27,7 +27,7 @@
"dependencies": {
"@astrojs/node": "^9.5.0",
"@astrojs/starlight": "^0.36.0",
- "astro": "^5.14.4",
+ "astro": "^5.14.5",
"sharp": "^0.34.4"
}
}
diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml
index 9a58e8b..50e9c0c 100644
--- a/docs/pnpm-lock.yaml
+++ b/docs/pnpm-lock.yaml
@@ -10,13 +10,13 @@ importers:
dependencies:
'@astrojs/node':
specifier: ^9.5.0
- version: 9.5.0(astro@5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))
+ version: 9.5.0(astro@5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))
'@astrojs/starlight':
specifier: ^0.36.0
- version: 0.36.0(astro@5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))
+ version: 0.36.0(astro@5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))
astro:
- specifier: ^5.14.4
- version: 5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)
+ specifier: ^5.14.5
+ version: 5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)
sharp:
specifier: ^0.34.4
version: 0.34.4
@@ -669,8 +669,8 @@ packages:
peerDependencies:
astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0
- astro@5.14.4:
- resolution: {integrity: sha512-yqgMAO2Whi9GmZkByyiPcG7CiiPr0Me0iBSorMa6M0g+wQk/ewnIqUyr7T/uFCPTQndoKwucnYFTrf0yfb0urw==}
+ astro@5.14.5:
+ resolution: {integrity: sha512-EHt7y3+nHYyKzBats1AL3N4Pyrvqyr+zXBC7njUa9Tfe+gsiHlunaw+lXitTT/DDVwO2R/f/qVG7Xc6rl0b2KQ==}
engines: {node: 18.20.8 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
hasBin: true
@@ -1753,8 +1753,8 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
- vite@6.3.6:
- resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==}
+ vite@6.3.7:
+ resolution: {integrity: sha512-mQYaKepA0NGMBsz8Xktt3tJUG5ELE2iT7IJ+ssXI6nxVdE2sFc/d/6w/JByqMLvWg8hNKHpPgzjgOkrhpKFnrA==}
engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
hasBin: true
peerDependencies:
@@ -1884,12 +1884,12 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@astrojs/mdx@4.3.7(astro@5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))':
+ '@astrojs/mdx@4.3.7(astro@5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))':
dependencies:
'@astrojs/markdown-remark': 6.3.8
'@mdx-js/mdx': 3.1.1
acorn: 8.15.0
- astro: 5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)
+ astro: 5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)
es-module-lexer: 1.7.0
estree-util-visit: 2.0.0
hast-util-to-html: 9.0.5
@@ -1903,10 +1903,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@astrojs/node@9.5.0(astro@5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))':
+ '@astrojs/node@9.5.0(astro@5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))':
dependencies:
'@astrojs/internal-helpers': 0.7.4
- astro: 5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)
+ astro: 5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)
send: 1.2.0
server-destroy: 1.0.1
transitivePeerDependencies:
@@ -1922,17 +1922,17 @@ snapshots:
stream-replace-string: 2.0.0
zod: 3.25.76
- '@astrojs/starlight@0.36.0(astro@5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))':
+ '@astrojs/starlight@0.36.0(astro@5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))':
dependencies:
'@astrojs/markdown-remark': 6.3.8
- '@astrojs/mdx': 4.3.7(astro@5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))
+ '@astrojs/mdx': 4.3.7(astro@5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))
'@astrojs/sitemap': 3.6.0
'@pagefind/default-ui': 1.4.0
'@types/hast': 3.0.4
'@types/js-yaml': 4.0.9
'@types/mdast': 4.0.4
- astro: 5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)
- astro-expressive-code: 0.41.3(astro@5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))
+ astro: 5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)
+ astro-expressive-code: 0.41.3(astro@5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3))
bcp-47: 2.1.0
hast-util-from-html: 2.0.3
hast-util-select: 6.0.4
@@ -2428,12 +2428,12 @@ snapshots:
astring@1.9.0: {}
- astro-expressive-code@0.41.3(astro@5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)):
+ astro-expressive-code@0.41.3(astro@5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)):
dependencies:
- astro: 5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)
+ astro: 5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3)
rehype-expressive-code: 0.41.3
- astro@5.14.4(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3):
+ astro@5.14.5(@types/node@24.7.2)(rollup@4.52.4)(typescript@5.9.3):
dependencies:
'@astrojs/compiler': 2.13.0
'@astrojs/internal-helpers': 0.7.4
@@ -2489,8 +2489,8 @@ snapshots:
unist-util-visit: 5.0.0
unstorage: 1.17.1
vfile: 6.0.3
- vite: 6.3.6(@types/node@24.7.2)
- vitefu: 1.1.1(vite@6.3.6(@types/node@24.7.2))
+ vite: 6.3.7(@types/node@24.7.2)
+ vitefu: 1.1.1(vite@6.3.7(@types/node@24.7.2))
xxhash-wasm: 1.1.0
yargs-parser: 21.1.1
yocto-spinner: 0.2.3
@@ -4116,7 +4116,7 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vite@6.3.6(@types/node@24.7.2):
+ vite@6.3.7(@types/node@24.7.2):
dependencies:
esbuild: 0.25.10
fdir: 6.5.0(picomatch@4.0.3)
@@ -4128,9 +4128,9 @@ snapshots:
'@types/node': 24.7.2
fsevents: 2.3.3
- vitefu@1.1.1(vite@6.3.6(@types/node@24.7.2)):
+ vitefu@1.1.1(vite@6.3.7(@types/node@24.7.2)):
optionalDependencies:
- vite: 6.3.6(@types/node@24.7.2)
+ vite: 6.3.7(@types/node@24.7.2)
web-namespaces@2.0.1: {}
diff --git a/docs/src/content/docs/download.md b/docs/src/content/docs/download.md
index 5085373..1866e48 100644
--- a/docs/src/content/docs/download.md
+++ b/docs/src/content/docs/download.md
@@ -3,8 +3,6 @@ title: Download
description: Get Ascently on your Android or iOS device
---
-
-
## Android
### Option 1: Direct APK Download
@@ -25,4 +23,4 @@ App Store release coming soon.
## Requirements
-- **Android 12+** or **iOS 17+**
\ No newline at end of file
+- **Android 12+** or **iOS 17+**
diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx
index e8bd611..dc07bce 100644
--- a/docs/src/content/docs/index.mdx
+++ b/docs/src/content/docs/index.mdx
@@ -1,9 +1,9 @@
---
title: Ascently
-description: A FOSS climbing tracking app with offline-first design and optional sync server
+description: An offline-first FOSS climb tracking app with an optional sync server.
template: splash
hero:
- tagline: Track your climbing sessions, routes, and progress
+ tagline: Track your climbing sessions, routes, and progress.
image:
file: ../../assets/logo-highres.svg
alt: "Ascently app icon"
@@ -23,7 +23,7 @@ import { Card, CardGrid } from '@astrojs/starlight/components';
_Formerly OpenClimb_
-Ascently is a **FOSS (Free and Open Source Software)** app designed to help climbers track their sessions, routes/problems, and overall progress. This app is offline-first, with an optional sync server and integrations with Apple Health and Health Connect.
+Ascently is an **offline-first FOSS** app designed to help climbers track their sessions, routes/problems, and overall progress. There is an optional self-hosted sync server and integrations with Apple Health and Health Connect. There are no analytics or tracking baked into any part of this project. I am committed to maintaining a transparent and open-source solution for climbers, ensuring that you have full control over your data and privacy.
@@ -35,14 +35,14 @@ Ascently is a **FOSS (Free and Open Source Software)** app designed to help clim
Integrates with Apple Health and Health Connect to track your fitness data.
-
+
Run your own lightweight sync server to keep data synchronized across devices.
## Requirements
-- **Android:** Version 12+
+- **Android:** Version 12+
- **iOS:** Version 17+
## Download
@@ -59,4 +59,4 @@ Ascently is a **FOSS (Free and Open Source Software)** app designed to help clim
*Built with ❤️ by Atridad Lahiji*
-*Contact: me@atri.dad*
\ No newline at end of file
+*Contact: me@atri.dad*
diff --git a/docs/src/content/docs/privacy.md b/docs/src/content/docs/privacy.md
new file mode 100644
index 0000000..5b6c7c4
--- /dev/null
+++ b/docs/src/content/docs/privacy.md
@@ -0,0 +1,43 @@
+---
+title: Privacy Policy
+description: Ascently's Privacy Policy
+---
+
+**Last updated: September 29, 2025**
+
+This Privacy Policy describes our policies and procedures regarding the collection, use, and disclosure of your information when you use my software.
+
+## No Data Collection
+
+I do not collect any personal information, analytics, or data of any kind. This software is designed to be self-hosted or run entirely offline.
+
+All data generated by or used with this software remains on your local machine or self-hosted environment under your control. I have no access to it.
+
+## Optional Sync Server
+
+You may optionally configure a sync server to synchronize your data across multiple devices. When using a sync server:
+
+- Your data is transmitted only to the server you specify
+- You are responsible for the server's security and privacy practices
+- I have no access to or control over your chosen sync server
+- All data remains encrypted during transmission
+
+## Optional Health Data Integration
+
+You may optionally integrate with Apple Health or Android Health Connect to import health and fitness data. When enabled:
+
+- Health data is accessed only on your local device
+- No health data is transmitted to me, but Apple or Google may receive data according to their respective privacy policies
+- You control which health metrics are imported
+- You can revoke access at any time through your device's health app settings
+- Please refer to Apple's Privacy Policy or Google's Privacy Policy for information about their data practices
+
+## No Tracking or Analytics
+
+This software does not use cookies, tracking pixels, or any other analytics or tracking mechanisms. Your usage of the software is completely private.
+
+## Contact Us
+
+If you have any questions about this Privacy Policy, you can contact me:
+
+* **By email:** me@atri.dad
diff --git a/ios/README.md b/ios/README.md
index 28aca6d..3facd49 100644
--- a/ios/README.md
+++ b/ios/README.md
@@ -18,5 +18,3 @@ This is a standard Xcode project. The main app code is in the `Ascently/` direct
- `ClimbingActivityWidget/`: A home screen widget.
- `SessionStatusLive/`: A Live Activity for the lock screen.
-
-The app is built to be offline-first. All data is stored locally on your device and works without an internet connection.
diff --git a/sync/README.md b/sync/README.md
index 66e1f39..8b5348d 100644
--- a/sync/README.md
+++ b/sync/README.md
@@ -2,10 +2,6 @@
A simple Go server for self-hosting your Ascently sync data.
-## How It Works
-
-This server is dead simple. It uses a single `ascently.json` file for your data and a directory for images. The last client to upload wins, overwriting the old data. Authentication is just a static bearer token.
-
## Getting Started
1. Create a `.env` file in this directory:
@@ -27,11 +23,11 @@ This server is dead simple. It uses a single `ascently.json` file for your data
## API
-The API is minimal, just enough for the app to work. All endpoints require an `Authorization: Bearer ` header.
+All endpoints require an `Authorization: Bearer ` header.
- `GET /sync`: Download `ascently.json`.
- `POST /sync`: Upload `ascently.json`.
- `GET /images/{imageName}`: Download an image.
- `POST /images/{imageName}`: Upload an image.
-Check out `main.go` for the full details.
\ No newline at end of file
+Check out `main.go` for the full details.