383cec1f81
feat(collections): routes — PATCH|DELETE /api/archives/:id/collections/:uid, visibility_bits in GET response
2026-06-26 17:33:38 +02:00
ea0a8f80d1
test(settings): routes tests for profile update, password change, instance settings
2026-06-26 17:19:26 +02:00
44f18f4dcc
build(frontend): bundle assets for settings UI
2026-06-26 17:18:30 +02:00
dabe014e7e
feat(settings): routes — PATCH /api/auth/me, GET|PATCH /api/admin/instance-settings
2026-06-26 17:17:37 +02:00
cb390dfaab
build(frontend): bundle assets for collections UI
2026-06-26 17:05:22 +02:00
dd56fc8c70
test(collections): update tag-search test to send auth (private entries require auth)
2026-06-26 17:01:43 +02:00
24c5321f6e
feat(collections): collection CRUD + entry-visibility routes
2026-06-26 17:00:19 +02:00
2335776347
feat(users): admin routes — list/create users, roles, set status
2026-06-26 16:22:08 +02:00
9f7b3c912a
build(frontend): update bundled assets for async capture polling
2026-06-26 12:59:00 +02:00
da2b58ef96
feat(capture): mark stalled running jobs failed on server startup
2026-06-26 12:57:59 +02:00
cfd51778b1
feat(capture): async capture_handler (spawn_blocking) + job poll endpoint
2026-06-26 12:57:44 +02:00
37fd057c1f
fix(auth): use rfc3339 for session expires_at; update tag tests for auth guards
2026-06-26 12:03:13 +02:00
f9d2ac80e7
feat(auth): session cleanup background task (24h interval)
2026-06-26 11:57:14 +02:00
cb376aa986
feat(auth): apply ROLE_USER guard to WRITE routes (captures, tags)
2026-06-26 11:56:38 +02:00
36c7d575e2
feat(auth): API token endpoints (create, list, delete)
2026-06-26 11:55:05 +02:00
affb8aadc0
feat(auth): login, logout, /me, setup endpoints + setup_guard middleware
2026-06-26 11:53:58 +02:00
db28d038d9
feat(auth): AuthUser extractor, password helpers, token generation
2026-06-26 11:50:29 +02:00
a4239ba5fc
feat(auth): add auth_db_path to AppState, registry, and main.rs
2026-06-26 11:46:23 +02:00
57fc48d73c
feat(auth): add argon2, rand, axum-extra dependencies
2026-06-26 11:28:51 +02:00
351e74df09
feat(fonts): wire font extraction into capture pipeline + blob serving route
...
- capture.rs: add archive_id: Option<&str> to perform_capture; when Some,
call font_extractor::extract_and_rewrite before hashing HTML, register
each font as a deduplicated blob + 'font' artifact
- main.rs: pass None as archive_id (CLI keeps fonts embedded)
- routes.rs: add GET /api/archives/:id/blobs/:sha256 (serve_blob handler),
pass Some(&archive_id) to perform_capture in capture_handler,
add ApiError::internal constructor
2026-06-25 16:07:50 +02:00
fbb96fbd05
build(frontend): update bundled assets after favicon+rendering changes
2026-06-24 21:05:35 +02:00
1206d7103d
feat(server): add GET /entries/:uid/favicon endpoint
2026-06-24 19:16:21 +02:00
a76dcf647f
fix(server): serve /assets/* from static_dir/assets/ for Vite output
2026-06-24 12:31:56 +02:00
4458f17b13
feat(ui): rewrite frontend in React with Vite
...
- Scaffold Vite+React project in frontend/ (bun, react 18, @vitejs/plugin-react)
- vite.config.js outputs to crates/archivr-server/static/ directly
- src/utils.js: formatBytes, valueText, formatTimestamp, SOURCE_ICONS, sourceIconSvg
- src/api.js: typed fetch wrappers for all API endpoints
- App.jsx: full state management, archive switching, debounced search,
tag filter, view routing, capture dialog orchestration
- components/Topbar.jsx: archive switcher, nav, capture button
- components/CaptureDialog.jsx: native <dialog> ref with showModal/close,
Escape key support, locator validation
- components/EntriesView.jsx + EntryRow.jsx: flex table with source icons,
type pills, keyboard selection
- components/ContextRail.jsx: parallel detail+tags fetch, stale-race guard
via selectSeqRef, inline tag assign/remove
- components/RunsView.jsx: runs kept as <table> (matches original)
- components/AdminView.jsx: mounted archives list
- components/TagsView.jsx: recursive tag tree with active state
- Remove old app.js; styles.css moved to frontend/src/ (Vite bundles it)
2026-06-24 12:24:34 +02:00
b895d6331c
refactor(ui): replace entry table with flexbox layout
2026-06-23 22:45:37 +02:00
623d2a12cc
fix(ui): handle +00:00 timezone in formatTimestamp
2026-06-23 22:40:57 +02:00
8ec369a704
feat(ui): source-type icons next to entry titles
2026-06-23 22:40:57 +02:00
2d7a4f1766
feat(server): configurable bind address with loopback default and non-loopback warning
...
- Add optional `bind` field to ServerRegistry (TOML + ARCHIVR_BIND env var)
- Default bind address remains 127.0.0.1:8080; non-loopback prints a warning
- Add route security classification comment block (READ/ADMIN/WRITE/STATIC)
- Add Security and Deployment section to docs/README.md
- Replace vague auth note in ARCHIVR-MENTAL-MODEL.md with concrete model description
- Add three registry tests covering bind field round-trip and defaults
2026-06-23 17:24:24 +02:00
8d0352c2c4
feat: browser capture button (Track 4)
...
- Add archivr-core/src/capture.rs: Source enum, all capture helpers,
fail_run (replaces process::exit fail_archive_and_exit), and
perform_capture() as the public entry point
- Slim archivr-cli/src/main.rs to 103 lines: thin adapter over
archivr_core::capture::perform_capture
- Move all source-classification and tweet-entry tests from CLI to
archivr-core/src/capture.rs (they test core logic, belong in core)
- Add POST /api/archives/:archive_id/captures route in archivr-server:
validates non-empty locator (400), resolves archive (404), delegates
to perform_capture, returns {run_uid, status}
- Add capture dialog to browser UI: dialog markup in index.html,
showModal/submit/cancel/loading/error wiring in app.js, dialog
styles in styles.css
- 77 tests pass, clean build (0 warnings)
2026-06-22 22:18:44 +02:00
9c4f05b013
fix(server): remove unused post import from routes.rs
2026-06-22 14:48:47 +02:00
5803f2119b
feat(server+ui): tag management API routes and browser UI
...
- 5 tag routes (list tree, create, assign, remove, search with tag=)
- Tags nav, tag tree view, tag filter badge
- Entry tag pills with remove, assign-tag form in context rail
2026-06-22 14:48:47 +02:00
83f909585f
feat: server-side search with structured prefix query language
2026-06-22 14:48:46 +02:00
fa2968a21a
fix(server): remove unused Body import; keep bonus happy-path artifact test
2026-06-22 14:48:46 +02:00
dcf9e127bb
feat: entry detail view and artifact file serving
2026-06-22 14:48:46 +02:00
b56c969624
feat: add db and multi-archive web UI foundation ( #8 )
...
* Add SQLite metadata database support
* Implement archive metadata database
* chore: let's guess cargoHash because there's something wrong with nixpkgs!
* Gate test-only database helpers behind cfg(test)
* Fix archive database row identity
* Use serde for archive metadata JSON
* Finalize archive runs at command level
* Handle archive command errors without panics
* Cover tweet entry metadata recording
* Document static regex invariants
* docs: add web UI design spec
* docs: add web UI implementation plan
* chore: move cli into workspace crate
* chore: track workspace crates directory
* refactor: extract archive core crate
* refactor: add core archive opening APIs
* refactor: rename taxonomy model to tags
* feat: add archive query APIs
* feat: add web server registry
* feat: expose archive server APIs
* feat: add archive table web UI
* fix: complete web UI smoke path
* docs: add architecture mental model
* docs: remove private superpowers plans
* nix: split cli and server packages
* chore: remove PLAN.md
2026-06-14 00:27:16 +02:00