diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index beacd6d0..ef60d323 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,16 +1,16 @@ ## Summary - + -## Changes +## Verification -- + ## Checklist -- [ ] TypeScript type-check passes (`npm run type-check`) -- [ ] Frontend builds (`npm run build`) -- [ ] Tests pass (`npm test`) -- [ ] Rust clippy clean (if backend changes) -- [ ] No new compiler warnings -- [ ] Tested on live server +- [ ] Rust formatting/clippy/tests pass when backend code changed. +- [ ] Frontend type-check/build/tests pass when frontend code changed. +- [ ] App manifests validate when app packaging changed. +- [ ] Generated catalogs are updated when manifest-owned catalog fields changed. +- [ ] Docs are updated for user-facing or developer-facing behavior changes. +- [ ] No secrets, generated build outputs, local screenshots, or private host details are included. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 88697e19..d385323b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,11 +8,11 @@ on: env: RUST_VERSION: stable - NODE_VERSION: 18 + NODE_VERSION: 20 jobs: rust: - name: Rust (fmt + clippy + test) + name: Rust runs-on: ubuntu-latest defaults: run: @@ -28,17 +28,17 @@ jobs: toolchain: ${{ env.RUST_VERSION }} components: rustfmt, clippy - - name: Check formatting + - name: Format run: cargo fmt --all -- --check - name: Clippy run: cargo clippy --all-targets --all-features -- -D warnings - - name: Tests + - name: Test run: cargo test --all-features frontend: - name: Frontend (type-check + lint) + name: Frontend runs-on: ubuntu-latest defaults: run: @@ -52,14 +52,31 @@ jobs: uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - cache: 'npm' + cache: npm cache-dependency-path: neode-ui/package-lock.json - - name: Install dependencies + - name: Install run: npm ci - name: Type check run: npm run type-check + - name: Test + run: npm test + - name: Build run: npm run build + + manifests: + name: App Manifests + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Validate manifests + run: | + for manifest in apps/*/manifest.yml; do + ./scripts/validate-app-manifest.sh --repo-audit "$manifest" + done diff --git a/.gitignore b/.gitignore index 53492bb0..82c46e47 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,9 @@ -# SSH keys (sandbox copies) +# SSH keys and sandbox copies .ssh/ # Rust build output target/ **/target/ -Cargo.lock # Node.js node_modules/ @@ -12,7 +11,6 @@ node_modules/ npm-debug.log* yarn-debug.log* yarn-error.log* -package-lock.json pnpm-debug.log* # Build outputs @@ -28,49 +26,46 @@ build/ *.swo *~ .DS_Store +._* +Thumbs.db # Environment and local overrides .env .env.local .env.*.local +.env.production +core/.env.production scripts/deploy-config.sh # Logs logs/ *.log -# OS -.DS_Store -Thumbs.db - # Testing coverage/ .nyc_output/ -# Temporary files -*.tmp -*.temp - -# Build artifacts +# Image / release artifacts *.iso *.img *.dmg *.app +*.apk +*.keystore +*.s9pk +*.tar.gz -# Release artifacts live in Gitea Release attachments, not Git history. +# Release artifacts live in release attachments, not Git history. releases/** !releases/ !releases/manifest.json -# macOS build output -build/macos/ - # Image recipe output image-recipe/output/ image-recipe/*.iso image-recipe/*.img -# Loop tool artifacts (created in every subdirectory) +# Loop tool artifacts */loop/ loop/loop/ loop/loop.log.bak @@ -78,19 +73,17 @@ loop/loop.log.bak # Separate repos nested in tree web/ -._* - -# Resilience harness reports (generated, contains session cookies) +# Resilience harness reports contain session cookies. scripts/resilience/reports/ # Codex / pnpm / python caches / editor backups .codex .codex-target-*/ .codex-tmp/ +.claude/ .pnpm-store/ **/__pycache__/ *.bak -.claude/scheduled_tasks.lock # Local evidence screenshots; intentional UI screenshots should live under an # app/docs asset path with a descriptive filename. diff --git a/Android/app/debug.keystore b/Android/app/debug.keystore deleted file mode 100644 index d99c47cf..00000000 Binary files a/Android/app/debug.keystore and /dev/null differ diff --git a/Android/app/src/main/java/com/archipelago/app/ui/screens/WebViewScreen.kt b/Android/app/src/main/java/com/archipelago/app/ui/screens/WebViewScreen.kt index 2cb57488..dbf90741 100644 --- a/Android/app/src/main/java/com/archipelago/app/ui/screens/WebViewScreen.kt +++ b/Android/app/src/main/java/com/archipelago/app/ui/screens/WebViewScreen.kt @@ -197,6 +197,12 @@ private fun injectSafeAreaVars(view: WebView) { * the status-bar height: the padded strip shows the page's OWN background * (padding is inside the element), so the bar keeps the page colour while * content starts below it — the pre-edge-to-edge look, without the black bar. + * + * Body padding only moves normal-flow content. fixed/sticky elements anchored + * at the viewport top (IndeeHub's floating header) stayed glued under the + * status bar, so we also push each of those down by the inset — once, marked + * via data attribute — and keep a throttled MutationObserver running so + * headers an SPA mounts after load get the same treatment. * Idempotent; runs on start (early) and finish (after the app rewrites head). */ private fun injectTopInset(view: WebView) { val insets = view.rootWindowInsets ?: return @@ -206,6 +212,7 @@ private fun injectTopInset(view: WebView) { view.evaluateJavascript( """ (function() { + var SAT = $sat; var s = document.getElementById('archy-top-inset'); if (!s) { s = document.createElement('style'); @@ -213,7 +220,40 @@ private fun injectTopInset(view: WebView) { (document.head || document.documentElement).appendChild(s); } s.textContent = - 'body{padding-top:${sat}px!important;box-sizing:border-box!important;}'; + 'body{padding-top:' + SAT + 'px!important;box-sizing:border-box!important;}'; + function push(el) { + if (el.dataset.archyInset) return; + var cs = getComputedStyle(el); + if (cs.position !== 'fixed' && cs.position !== 'sticky') return; + var top = parseFloat(cs.top); // 'auto' -> NaN skips bottom bars + if (isNaN(top) || top >= SAT) return; + el.style.setProperty('top', (top + SAT) + 'px', 'important'); + el.dataset.archyInset = '1'; + } + function sweep() { + if (!document.body) return; + // Fixed/sticky bars live shallow in the tree (portals mount on + // body); depth cap keeps the computed-style pass off big lists. + var els = document.body.querySelectorAll( + 'body > *, body > * > *, body > * > * > *, body > * > * > * > *'); + for (var i = 0; i < els.length; i++) push(els[i]); + } + sweep(); + if (!window.__archyInsetObserver) { + var queued = false, last = 0; + window.__archyInsetObserver = new MutationObserver(function() { + if (queued) return; + queued = true; + var wait = Math.max(0, 250 - (Date.now() - last)); + setTimeout(function() { + queued = false; + last = Date.now(); + sweep(); + }, wait); + }); + window.__archyInsetObserver.observe(document.documentElement, + { childList: true, subtree: true }); + } })(); """.trimIndent(), null, diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c8ddf29..d1088d0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## v1.7.117-alpha (2026-07-27) + +- FIPS startup is more reliable on nodes that have the packaged `fips.service` instead of Archipelago's `archipelago-fips.service`. Startup self-heal, onboarding, dashboard Start, and reconnect now use the systemd unit the node actually has, so FIPS no longer looks like it needs to be installed when it only needs to be started. +- App screens over the FIPS mesh now bind their relay only to the node's FIPS address instead of reserving the same host ports Podman needs. This keeps apps such as FileBrowser and Botfights from restart-looping because the backend was already holding their published ports. +- Companion WebView safe-area handling now also moves fixed and sticky top bars below the phone status bar, including headers mounted after page load by single-page apps. +- Public-source preparation now includes a Nostr Git hosting plan using `ngit`, NIP-34, and GRASP: anyone can clone, fork, review, and propose changes from their Archipelago node, while canonical merge authority stays with a small signed maintainer set in the style of Bitcoin Core. +- Node OS release notes for v1.7.117 are still open; add any installer, service, kernel, firewall, or package changes here before cutting the release. + ## v1.7.116-alpha (2026-07-27) - Nodes no longer get stuck on "server starting up" after an update or reboot. On a node running many apps, the backend used to spend minutes recovering containers before it told the system it was ready, and anything that touched it during that window could leave it down for good. It now reports ready immediately and recovers in the background, and it always restarts itself if it ever does go down. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..90378f2b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,19 @@ +# Code of Conduct + +## Our standard + +Be direct, respectful, and focused on the work. Healthy disagreement is welcome; +harassment, personal attacks, and discriminatory language are not. + +## Scope + +This code of conduct applies to project repositories, issue trackers, pull +requests, documentation, chat, and community spaces connected to Archipelago. + +## Enforcement + +Maintainers may edit, hide, or remove comments and may restrict participation +for behavior that makes collaboration unsafe or unproductive. + +Report conduct concerns privately through the repository owner account or the +private contact channel listed on the project homepage. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b255972c..ab6cdb0b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,161 +1,100 @@ # Contributing to Archipelago -Thank you for your interest in contributing to Archipelago! This document covers the process for contributing code, reporting bugs, and submitting apps. +This project is preparing for public developer contribution. The highest-value +contributions are focused fixes, tests, app manifests, documentation +improvements, and clear bug reports with reproducible evidence. -## Code of Conduct +## Development setup -Be respectful. We follow the [Contributor Covenant](https://www.contributor-covenant.org/version/2/1/code_of_conduct/). - -## Getting Started - -1. Fork the repository on the project's Gitea instance -2. Clone your fork: `git clone /archy.git` -3. Set up the dev environment (see `docs/developer-guide.md`) -4. Create a feature branch: `git checkout -b feature/your-feature` - -## Development Setup - -### Frontend (Vue.js) +### Frontend ```bash cd neode-ui npm install -npm start # Dev server on :8100 -npm run type-check # TypeScript validation -npm run build # Production build -npm test # Run tests +npm start +npm run type-check +npm test ``` -### Backend (Rust) - -Build on a Linux server (Debian 13), **not** macOS: +### Backend ```bash -cargo clippy --all-targets --all-features -cargo fmt --all +cd core +cargo fmt --all -- --check +cargo clippy --all-targets --all-features -- -D warnings cargo test --all-features ``` -### Deploy to dev server +Linux is required for host integration work involving Podman, systemd, +networking, or image builds. Frontend development works locally with the mock +backend. + +## App manifests + +App packages live under `apps//manifest.yml` and use the schema +documented in [docs/app-manifest-spec.md](docs/app-manifest-spec.md). Validate +before submitting: ```bash -./scripts/deploy-to-target.sh --live +./scripts/validate-app-manifest.sh apps//manifest.yml +python3 scripts/generate-app-catalog.py +python3 scripts/check-app-catalog-drift.py --release --strict ``` -## Code Style +App submissions must: -### Frontend (TypeScript + Vue) +- pin container image versions; +- avoid hardcoded secrets; +- use `security.no_new_privileges: true`; +- use `security.readonly_root: true` unless the manifest explains why writable + root is required; +- request only necessary Linux capabilities; +- store durable data under `/var/lib/archipelago//`; +- define truthful health checks and launch interfaces for user-facing UIs. -- `