Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
77 commits
Select commit Hold shift + click to select a range
969fbf8
docs: add design spec + Plan 1 (Rust backend implementation)
bitxwave May 19, 2026
3eaa09c
feat: Rust backend (Plan 1) — Axum + SQLite + auth + CRUD + CLI
bitxwave May 20, 2026
cfe7b2e
chore(web): upgrade Svelte 3 → Svelte 5 + Kit 2 + Vite 5 + ESLint 9 (…
bitxwave May 20, 2026
1936707
feat(web): foundation — types + i18n + design system + UI primitives …
bitxwave May 20, 2026
3ddebe4
feat(web): read-only browse — stores + Header + NavGrid + Footer (Pla…
bitxwave May 20, 2026
18df6f8
feat(web): edit mode MVP — login + item CRUD + change password (Plan 4)
bitxwave May 20, 2026
3f282c7
feat(deploy): Docker + Playwright e2e + README (Plan 5)
bitxwave May 20, 2026
1915053
fix(deploy): make image actually build/run + fix theme palette clash
bitxwave May 20, 2026
16eda60
fix(web): UX feedback round 1 — gradient + glass header + center sear…
bitxwave May 20, 2026
ab6aa47
feat: layout mode (flat/grouped) configurable in Settings + drag-drop…
bitxwave May 20, 2026
ef62874
feat(web): redesign UI to master visual + Launchpad folder mode
bitxwave May 21, 2026
43cc479
chore(deploy): drop Caddy front-proxy, make PORT configurable end-to-end
bitxwave May 21, 2026
97f4d63
fix: persist tag_slugs by upserting tag rows + clearer Grouped/Flat m…
bitxwave May 21, 2026
b24c861
fix(web): align Grouped mockup with actual GroupHeader (chevron, not …
bitxwave May 21, 2026
673cb0a
fix(web): redraw Grouped mockup as Launchpad folder grid
bitxwave May 21, 2026
720fb50
feat(admin): consolidate config under /admin route + reject deletes t…
bitxwave May 21, 2026
ddc33da
feat: remove the tag system entirely
bitxwave May 21, 2026
715c95c
feat(admin): drag-to-reorder Groups and Sites
bitxwave May 21, 2026
4a347cb
docs: add Launchpad unification design spec
bitxwave May 21, 2026
f89891e
feat(launchpad): migrate to cards model + jiggle UX + link-per-site
bitxwave May 25, 2026
fa5ae46
feat(launchpad): horizontal pager with dot indicator (P1)
bitxwave May 25, 2026
dc8f2b9
feat(launchpad): cross-page drag via edge-pan dwell (P2)
bitxwave May 25, 2026
70028b3
feat(launchpad): site switcher as horizontal pill row (P3)
bitxwave May 25, 2026
c628d9c
feat(launchpad): jiggle-mode click on item opens edit dialog (P4)
bitxwave May 25, 2026
9a5e35d
feat(launchpad): empty-grid placeholder card for first-time add (P5)
bitxwave May 25, 2026
47869c1
feat(launchpad): jiggle phase stagger + hover lift (P6)
bitxwave May 25, 2026
250bc7c
chore(launchpad): P7 — Tab cycle a11y + scope review
bitxwave May 25, 2026
001b2a9
fix(launchpad): site switch back to dropdown + fix folder thumb overf…
bitxwave May 25, 2026
fb5e255
fix(launchpad): soften card drop-shadow, drop the dark halo (P9)
bitxwave May 25, 2026
325dfb2
fix(launchpad): folder title floats above the panel (P10)
bitxwave May 25, 2026
3426567
fix(launchpad): drop the explicit close × from folder panel
bitxwave May 25, 2026
1c9c452
fix(launchpad): more breathing room between folder title and panel
bitxwave May 25, 2026
83bc9e0
fix(launchpad): folder title editable in jiggle, drop the pencil affo…
bitxwave May 25, 2026
ecff276
fix(launchpad): rename racing two PATCHes against the SQLite lock
bitxwave May 25, 2026
f6f3ef3
fix(launchpad): long-press release stays a pure mode switch
bitxwave May 25, 2026
abd4fd8
fix(launchpad): auto-close folder panel when dragging a child out
bitxwave May 25, 2026
0222e1d
fix(launchpad): spring-load only when drag started from root
bitxwave May 25, 2026
bc52e48
fix(launchpad): dragGrid only attaches to the main card/folder button
bitxwave May 25, 2026
87fad65
fix(launchpad): folder name in home grid is no longer editable
bitxwave May 25, 2026
e447d9d
fix(launchpad): auto-close folder panel reliably when dragging out
bitxwave May 25, 2026
004b315
fix(launchpad): don't spring-load when source is a folder
bitxwave May 25, 2026
369afc4
fix(launchpad): swallow trailing click after long-press, regardless o…
bitxwave May 25, 2026
72e3d6e
refactor(launchpad): extend MergeCandidate with phase and add cellShi…
bitxwave May 26, 2026
5f022d2
feat(launchpad): pure computeShifts function with unit tests
bitxwave May 26, 2026
b2590cc
test(launchpad): cover computeShifts cellAdvance extrapolation and gu…
bitxwave May 26, 2026
f9fc456
feat(launchpad): layout cache builder and cursorOnLeftHalfOf helper
bitxwave May 26, 2026
0a0b533
docs(launchpad): document cellAdvanceByZone absence semantics
bitxwave May 26, 2026
03de5fd
feat(launchpad): dwell session state and merge-arm helpers
bitxwave May 26, 2026
fb79d83
refactor(launchpad): split clearMergeArmInternal to avoid mergeCandid…
bitxwave May 26, 2026
83a060e
feat(launchpad): wire layout cache, dwell, and shift preview in dragGrid
bitxwave May 26, 2026
054fcdd
perf(launchpad): dedupe cellShifts writes and cache bucketsRecord
bitxwave May 26, 2026
117c5d3
feat(launchpad): resolve drop intent based on merge-arm gate
bitxwave May 26, 2026
d9d540a
feat(launchpad): card visual reorder shift and two-tier merge halo
bitxwave May 26, 2026
b69fbbb
refactor(launchpad): tighten Card.svelte CSS — pause jiggle on merge,…
bitxwave May 26, 2026
659f80d
feat(launchpad): rebuild drag layout cache on spring-load and edge-pan
bitxwave May 26, 2026
944d26a
fix(launchpad): correct drop index when src is before target + handle…
bitxwave May 26, 2026
9deb642
fix(launchpad): three drop-UX issues — flicker, folder-source halo, m…
bitxwave May 26, 2026
c719703
fix(launchpad): keep jiggle animation phase stable across drag-induce…
bitxwave May 26, 2026
ba54552
fix(launchpad): defer cellShifts/data-dragging cleanup until drop API…
bitxwave May 26, 2026
7e2238e
fix(launchpad): make the "+" affordance shift along with displaced cards
bitxwave May 26, 2026
f8dbfc6
fix(launchpad): hide "+" affordance during active drag instead of shi…
bitxwave May 26, 2026
65ad1aa
fix(launchpad): switch drag-active gating from :has() to store-backed…
bitxwave May 26, 2026
e6f5fa5
fix(launchpad): unblock folder-source drag — 5 UX fixes
bitxwave May 26, 2026
82cdbef
fix(launchpad): anchor folder panel + guard JiggleHost click
bitxwave May 27, 2026
21aa14e
fix(ui): drop backdrop dismissal + restore footer Cancel contrast
bitxwave May 27, 2026
df6718c
feat(admin): dedicated dashboard layout, i18n, password move
bitxwave May 27, 2026
383ea16
docs(launchpad): drag merge / reorder disambiguation spec + plan
bitxwave May 27, 2026
69d2ca8
refactor(server): rename crate navsrv → lens
bitxwave May 27, 2026
6c4f720
refactor(deploy): rename Docker image, service, container to lens
bitxwave May 27, 2026
01517f5
chore: rebrand defaults — Lens project name, no personal info
bitxwave May 27, 2026
331af33
docs: rebrand to Lens across READMEs and historical specs/plans
bitxwave May 27, 2026
7266930
chore: complete navigation-website → lens rebrand sweep
bitxwave May 27, 2026
e5356e7
ci: rewrite workflows for web+server architecture
bitxwave May 27, 2026
56fef4d
chore: apply rustfmt and prettier to satisfy CI
bitxwave May 27, 2026
5002de7
fix(web): add @types/node and drop unused get import
bitxwave May 27, 2026
31af5f1
fix(server): drop redundant .into_iter() flagged by clippy 1.95
bitxwave May 27, 2026
4fc5833
chore(server): collapse short chain into single line per rustfmt
bitxwave May 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 21 additions & 11 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,15 +1,25 @@
# README.md
README.md
# Build artifacts
**/node_modules
**/.svelte-kit
**/build
**/target

# .git
# Local data / env
**/.env
**/.env.*
!**/.env.example
**/dev-data
data/

# Git / dev
.git
.gitignore

# .vscode
.github
.worktrees
.vscode

# node_modules
node_modules

#editorconfig
.editorconfig
.idea
docs
tests
*.md
!README.md
snapshot_*.png
13 changes: 0 additions & 13 deletions .eslintignore

This file was deleted.

20 changes: 0 additions & 20 deletions .eslintrc.cjs

This file was deleted.

86 changes: 86 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
name: ci

on:
pull_request:
branches: [master, main]
push:
branches: [master, main]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
web:
name: Web (lint + typecheck + unit + build)
runs-on: ubuntu-latest
defaults:
run:
working-directory: web
steps:
- uses: actions/checkout@v4

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10

- name: Setup Node 20
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'pnpm'
cache-dependency-path: web/pnpm-lock.yaml

- name: Install
run: pnpm install --frozen-lockfile

- name: Lint
run: pnpm lint

- name: Typecheck
run: pnpm check

- name: Unit tests
run: pnpm test:unit

- name: Build
run: pnpm build

- name: Upload web build
uses: actions/upload-artifact@v4
with:
name: web-build
path: web/build
retention-days: 7

server:
name: Server (fmt + clippy + test)
runs-on: ubuntu-latest
defaults:
run:
working-directory: server
env:
SQLX_OFFLINE: 'true'
RUSTFLAGS: '-D warnings'
steps:
- uses: actions/checkout@v4

- name: Setup Rust
uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy

- name: Cache cargo
uses: Swatinem/rust-cache@v2
with:
workspaces: server

- name: Format
run: cargo fmt --all -- --check

- name: Clippy
run: cargo clippy --all-targets --all-features

- name: Test
run: cargo test --all-features
117 changes: 98 additions & 19 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,35 +9,114 @@ permissions:
contents: write

jobs:
release:
build:
name: Build release tarball (linux-x86_64)
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v4

- name: Setup Node Version 20
uses: actions/setup-node@v3
- name: Get version
id: version
run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"

# ── Frontend ──────────────────────────────────────────
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
node-version: '20.x'
version: 10

- name: Install And Build
run: |
pnpm install
pnpm build
- name: Setup Node 20
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'pnpm'
cache-dependency-path: web/pnpm-lock.yaml

- name: Install web deps
working-directory: web
run: pnpm install --frozen-lockfile

- name: Build web
working-directory: web
run: pnpm build

- name: Get Version
id: get_version
run: echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT
# ── Backend ───────────────────────────────────────────
- name: Setup Rust
uses: dtolnay/rust-toolchain@stable

- name: Package files
- name: Cache cargo
uses: Swatinem/rust-cache@v2
with:
workspaces: server

- name: Build server (release)
working-directory: server
env:
SQLX_OFFLINE: 'true'
run: cargo build --release --bin lens

# ── Package ───────────────────────────────────────────
- name: Assemble release tree
run: |
mv ./build ./navigation-website-${{ steps.get_version.outputs.VERSION }}
tar -zcvf navigation-website-${{ steps.get_version.outputs.VERSION }}.tar.gz ./navigation-website-${{ steps.get_version.outputs.VERSION }}
zip -r navigation-website-${{ steps.get_version.outputs.VERSION }}.zip ./navigation-website-${{ steps.get_version.outputs.VERSION }}
set -eux
DIST="lens-${{ steps.version.outputs.VERSION }}-linux-x86_64"
mkdir -p "dist/$DIST/static"
cp server/target/release/lens "dist/$DIST/lens"
cp -r web/build/. "dist/$DIST/static/"
cp README.md "dist/$DIST/README.md"
(cd dist && tar -zcvf "$DIST.tar.gz" "$DIST")
(cd dist && zip -r "$DIST.zip" "$DIST")

- name: Release
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
uses: softprops/action-gh-release@v2
with:
files: ./navigation-website-*
files: |
dist/lens-*.tar.gz
dist/lens-*.zip
draft: false

docker:
name: Build & push Docker image
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Get version
id: version
run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> "$GITHUB_OUTPUT"

- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Image metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=raw,value=latest

- name: Build & push
uses: docker/build-push-action@v6
with:
context: .
file: Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
58 changes: 40 additions & 18 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,19 +1,41 @@
# OS
.DS_Store
node_modules
/build
/.svelte-kit
/package
.env
.env.*
!.env.example
.vercel
.output
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
.yarn/*
!.yarn/patches
!.yarn/releases
!.yarn/plugins
!.yarn/sdks
!.yarn/versions
.pnp.*
Thumbs.db

# Editors
.vscode/
.idea/

# Frontend
web/node_modules/
web/.svelte-kit/
web/build/
web/.env
web/.env.*
!web/.env.example

# Root e2e harness
/node_modules/

# Backend
server/target/
server/.env
server/.env.*
!server/.env.example
server/dev-data/

# Local volumes / runtime
data/
local-data/
*.log
*.pid

# Generated at build time by vite plugin (web/vite.config.ts)
web/static/navIcons-manifest.json

# Worktrees (per ~/.claude/rules/worktree-location.md)
.worktrees/

# Tests
test-results/
playwright-report/
18 changes: 0 additions & 18 deletions .prettierrc

This file was deleted.

Loading
Loading