Docs updates
All checks were successful
Ascently - Sync Deploy / build-and-push (push) Successful in 2m43s
Ascently - Docs Deploy / build-and-push (push) Successful in 3m34s

This commit is contained in:
2025-10-14 14:26:56 -06:00
parent 082cb79630
commit 7601e7bb03
11 changed files with 88 additions and 104 deletions

View File

@@ -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

View File

@@ -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. [<img src="https://github.com/ImranR98/Obtainium/blob/main/assets/graphics/badge_obtainium.png?raw=true" alt="Obtainium" height="41">](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

View File

@@ -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.

View File

@@ -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",
}),
});
});

View File

@@ -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"
}
}

48
docs/pnpm-lock.yaml generated
View File

@@ -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: {}

View File

@@ -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+**
- **Android 12+** or **iOS 17+**

View File

@@ -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.
<CardGrid stagger>
<Card title="Offline-First" icon="laptop">
@@ -35,14 +35,14 @@ Ascently is a **FOSS (Free and Open Source Software)** app designed to help clim
<Card title="Health Integration" icon="heart">
Integrates with Apple Health and Health Connect to track your fitness data.
</Card>
<Card title="Optional Sync" icon="setting">
<Card title="Optional Sync" icon="cloud-download">
Run your own lightweight sync server to keep data synchronized across devices.
</Card>
</CardGrid>
## 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*
*Contact: me@atri.dad*

View File

@@ -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

View File

@@ -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.

View File

@@ -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 <your-auth-token>` header.
All endpoints require an `Authorization: Bearer <your-auth-token>` 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.
Check out `main.go` for the full details.