commits
* enables building slurp as a proper nix package
* includes dev shell with rust toolchain and dependencies
* uses rustPlatform.buildRustPackage with cargo lock
* adds flake-utils for cross-platform support
This allows referencing slurp as a flake input in nixos config
without requiring --impure flag or absolute paths.
Hard cutover from Fever API to Miniflux-compatible v1 API with
DB as source of truth for categories/feeds/items.
* add migrations for items.is_starred and items.changed_at
* remove fever handler, routes, and all fever tests
* replace destructive sync_config with one-time legacy bootstrap
that only imports from config when DB is empty
* add miniflux auth middleware (X-Auth-Token + HTTP Basic)
* implement full miniflux endpoint surface: categories/feeds/entries
CRUD, counters, icons, OPML export, bookmarks, health, version
* add broadcast channel for manual feed refresh triggers
* replace CLI auth/add commands with token generator and DB-based
OPML import
* add 30 integration tests covering auth, CRUD, filtering, and
status updates
Co-authored-by: Claude <noreply@anthropic.com>
* implement `before` timestamp parameter for mark feed/group read operations
* add `mark_group_read` db function to mark all items in a group as read
* filter items by COALESCE(published_at, created_at) < before timestamp
* add integration and unit tests for new mark operations
The Fever API spec supports a `before` parameter that allows clients to
mark only items older than a given timestamp as read, which is useful
for partial sync operations.
* removes manual row.get() calls in favor of derive macros
* uses #[sqlx(rename)] for columns with different struct field names
* uses #[sqlx(skip)] for constant fields like is_spark and is_saved
* removes unused sqlx::Row import
This reduces boilerplate and makes the mapping less error-prone since
field names are checked at compile time.
* uses tokio JoinSet and Semaphore for bounded concurrency
* SLURP_FETCH_CONCURRENCY env var controls limit (default: 5)
* setting concurrency to 0 allows unlimited parallel fetches
Sequential fetching was slow when subscribed to many feeds.
* add is_read column to items table with migration
* handle mark=item/feed + as=read/unread POST params
* filter unread_item_ids by actual read status
* return real is_read value from get_items queries
Previously the API accepted mark operations as no-ops and
returned all items as unread. Now read state persists and
syncs correctly with Fever-compatible clients like ReadKit.
* use case-insensitive comparison for MD5 api_key
* add debug logging for auth troubleshooting
ReadKit sends the api_key in uppercase while we store it lowercase.
MD5 hex strings should compare case-insensitively per convention.
* prefer link with rel="alternate" over first link
* add resolve_url helper for relative URL handling
* resolves favicon 404s caused by using feed URL as site URL
Atom feeds can have multiple <link> elements - the "self" link points
to the feed itself while "alternate" points to the HTML site. Using
the first link (often "self") caused favicon fetches to construct
invalid URLs like feed.xml/favicon.ico.
* enables building slurp as a proper nix package
* includes dev shell with rust toolchain and dependencies
* uses rustPlatform.buildRustPackage with cargo lock
* adds flake-utils for cross-platform support
This allows referencing slurp as a flake input in nixos config
without requiring --impure flag or absolute paths.
Hard cutover from Fever API to Miniflux-compatible v1 API with
DB as source of truth for categories/feeds/items.
* add migrations for items.is_starred and items.changed_at
* remove fever handler, routes, and all fever tests
* replace destructive sync_config with one-time legacy bootstrap
that only imports from config when DB is empty
* add miniflux auth middleware (X-Auth-Token + HTTP Basic)
* implement full miniflux endpoint surface: categories/feeds/entries
CRUD, counters, icons, OPML export, bookmarks, health, version
* add broadcast channel for manual feed refresh triggers
* replace CLI auth/add commands with token generator and DB-based
OPML import
* add 30 integration tests covering auth, CRUD, filtering, and
status updates
Co-authored-by: Claude <noreply@anthropic.com>
* implement `before` timestamp parameter for mark feed/group read operations
* add `mark_group_read` db function to mark all items in a group as read
* filter items by COALESCE(published_at, created_at) < before timestamp
* add integration and unit tests for new mark operations
The Fever API spec supports a `before` parameter that allows clients to
mark only items older than a given timestamp as read, which is useful
for partial sync operations.
* removes manual row.get() calls in favor of derive macros
* uses #[sqlx(rename)] for columns with different struct field names
* uses #[sqlx(skip)] for constant fields like is_spark and is_saved
* removes unused sqlx::Row import
This reduces boilerplate and makes the mapping less error-prone since
field names are checked at compile time.
* add is_read column to items table with migration
* handle mark=item/feed + as=read/unread POST params
* filter unread_item_ids by actual read status
* return real is_read value from get_items queries
Previously the API accepted mark operations as no-ops and
returned all items as unread. Now read state persists and
syncs correctly with Fever-compatible clients like ReadKit.
* prefer link with rel="alternate" over first link
* add resolve_url helper for relative URL handling
* resolves favicon 404s caused by using feed URL as site URL
Atom feeds can have multiple <link> elements - the "self" link points
to the feed itself while "alternate" points to the HTML site. Using
the first link (often "self") caused favicon fetches to construct
invalid URLs like feed.xml/favicon.ico.