buru
buru is a Rust application that lets you archive and tag images either from the command line or through a small web API. It stores image metadata in a database and exposes convenient tools for managing that data.
Features
- CLI for archiving images and adding tags
- Web server exposing a REST API for programmatic access
- SQLite database integration (optional PostgreSQL via feature flag)
- Asynchronous processing for good runtime performance
- Docker configuration for easy deployment
Quick start
Requirements
Build and run
Clone the repository and build the project:
Run the CLI to archive images:
Start the web server (listens on port 3000 by default):
Docker
A docker-compose.yml file is provided. To build and start all services:
Web API
The web server exposes a small REST-style API that returns JSON. Endpoints are
listed below using the default port 3000.
GET /images
List images. Query parameters:
tags– space separated tag querypage– page number (default 1)limit– results per page (default 20)
GET /images/{id}
Retrieve metadata for a single image by numeric identifier.
POST /images
Upload a new image using multipart/form-data with these fields:
file– binary file contents (required)tags– space separated tags (optional)source– original source URL (optional)
PUT /images/{id}/tags
Replace all tags for the image identified by id. Supply new tags via the
tags query parameter (e.g. ?tags=cute+cat).
DELETE /images/{id}
Remove an image and its metadata.
GET /tags
List tags. Supports the following query parameters:
search[name_comma]– comma separated tag names to matchpageandlimit– pagination controls
GET /tags/suggest
Suggest tags by prefix. Use search[query] to supply the prefix and limit to
cap results.
PUT /refresh/tag_counts
Recompute stored counts for all tags.
GET /files/{vari}/{hash}
Fetch an image file. The {vari} segment is one of the generated variants
(original, sample, 180x180, etc.) and {hash} is the image file path.
License
This project is licensed under the MIT OR Apache-2.0 license. See the LICENSE file for details.