A self-hosted bookmark manager built with Rust and Dioxus. Organize, search, and manage your links with automatic metadata extraction and GitHub integration.
Features β’ Quick Start β’ Documentation β’ Contributing
- π Single-user authentication with secure Argon2 password hashing
- π Link management with full CRUD operations
- π€ Automatic metadata extraction - titles, descriptions, logos
- π GitHub integration - stars, languages, licenses auto-detected
- π Hierarchical categories (up to 3 levels)
- π·οΈ Tags, languages, and licenses for organization
- π Full-text search with advanced filtering
- β° Scheduled updates to keep metadata fresh
- π± Responsive UI - works on mobile, tablet, desktop
- π³ Docker ready - one command deployment
- π Privacy-first - self-hosted, your data stays yours
-
Clone the repository
git clone https://github.com/YOUR-USERNAME/rusty-links.git cd rusty-links -
Configure environment
cp .env.example .env # Edit .env and set a secure database password -
Start services
docker compose up -d
-
Access the application
- Open http://localhost:8080
- Create your account (first user only)
- Start adding links!
# Pull latest image
docker pull ghcr.io/NiceGuyIT/rusty-links:latest
# Run with external PostgreSQL
docker run -d \
-e DATABASE_URL=postgres://user:pass@host/db \
-e APP_PORT=8080 \
-p 8080:8080 \
ghcr.io/YOUR-USERNAME/rusty-links:latestSee Building from Source below.
Screenshots will be added as the UI is developed
Configure via environment variables:
| Variable | Description | Default |
|---|---|---|
DATABASE_URL |
PostgreSQL connection string | Required |
APP_PORT |
Application port | 8080 |
UPDATE_INTERVAL_DAYS |
Days between metadata updates | 30 |
UPDATE_INTERVAL_HOURS |
Metadata update frequency (hours) | 24 |
BATCH_SIZE |
Links processed per batch | 50 |
JITTER_PERCENT |
Update scheduling jitter (0-100) | 20 |
RUST_LOG |
Log level (trace, debug, info, warn, error) | info |
GITHUB_TOKEN |
GitHub API token (optional, for higher rate limits) | None |
See .env.example for all available options.
- Docker Deployment Guide - Complete Docker setup and deployment
- Release Process - How to create and publish releases
- Project Architecture - System design and architecture overview
- Rust 1.75 or later
- PostgreSQL 14+
- Node.js 18+ (for Dioxus CLI)
-
Install dependencies
cargo install dioxus-cli
-
Set up database
createdb rustylinks
-
Configure environment
cp .env.example .env # Edit .env with your database URL -
Run migrations
cargo install sqlx-cli --no-default-features --features postgres sqlx migrate run
-
Run development server
dx serve
-
Build for production
cargo build --release ./target/release/rusty-links
- Backend: Rust with Axum web framework
- Frontend: Dioxus (React-like for Rust)
- Database: PostgreSQL with SQLx
- Authentication: Session-based with Argon2
- Scraping: reqwest + scraper crate
- Deployment: Docker + Docker Compose
rusty-links/
βββ src/
β βββ main.rs # Application entry point
β βββ api/ # REST API endpoints
β βββ auth/ # Authentication logic
β βββ ui/ # Dioxus frontend components
β βββ models/ # Database models
β βββ config.rs # Configuration management
β βββ error.rs # Error handling
βββ migrations/ # Database migrations
βββ assets/ # Static assets
βββ docs/ # Documentation
βββ Dockerfile # Production container
cargo testFor development with hot reloading:
docker compose -f compose.yml -f compose.dev.yml upThis will:
- Mount source code as volumes
- Use
cargo watchfor automatic reloads - Enable debug logging
Migrations run automatically on application startup. For manual control:
# Install SQLx CLI
cargo install sqlx-cli --no-default-features --features postgres
# Create new migration
sqlx migrate add <migration_name>
# Run migrations
sqlx migrate run
# Revert last migration
sqlx migrate revert# Format code
cargo fmt
# Run linter
cargo clippy
# Check without building
cargo checkSee docs/DOCKER.md for complete deployment instructions.
Quick production deployment:
# Pull published image
docker pull ghcr.io/YOUR-USERNAME/rusty-links:latest
# Start with Docker Compose
docker compose up -d
# View logs
docker compose logs -f app
# Check status
docker compose ps- Always use strong database passwords
- Run as non-root user (default in Docker)
- Keep dependencies updated
- Use HTTPS in production (reverse proxy recommended)
- Regularly backup your database
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests:
cargo test - Run linter:
cargo clippy - Format code:
cargo fmt - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Use GitHub Issues for bug reports and feature requests
- Check existing issues before creating new ones
- Provide clear reproduction steps for bugs
- Include system information (OS, Rust version, etc.)
This project is licensed under the MIT License - see LICENSE for details.
Built with:
- Rust - Systems programming language
- Dioxus - React-like UI framework for Rust
- Axum - Web framework
- SQLx - Async SQL toolkit
- PostgreSQL - Database
- Docker - Containerization
If you find this project useful, please consider giving it a star!
This is the prompt to create vibe coding prompts.
Part 8: Deployment & Documentation (Steps 46-55)
Read the
IMPLEMENTATION_GUIDEfor Part 8: Deployment & Documentation (Steps 46-55). Draft a detailed, step-by-step blueprint for building Part 8: Deployment & Documentation (Steps 46-55). Then, once you have a solid plan, break it down into small, iterative chunks that build on each other. Look at these chunks and then go another round to break it into small steps. Review the results and make sure that the steps are small enough to be implemented safely, but big enough to move the project forward. Iterate until you feel that the steps are right sized for this project.From here you should have the foundation to provide a series of prompts for a code-generation LLM that will implement each step. Prioritize best practices, and incremental progress, ensuring no big jumps in complexity at any stage. Make sure that each prompt builds on the previous prompts, and ends with wiring things together. There should be no hanging or orphaned code that isn't integrated into a previous step.
Make sure and separate each prompt section. Use markdown. Each prompt should be tagged as text using code tags using quadruple (4) backticks. The goal is to output prompts, but context, etc is important as well. The inner code tags should use triple (3) backticks. Save the prompts in the
docs/directory.
Read the
IMPLEMENTATION_GUIDEand draft a detailed, step-by-step blueprint for building the Link Flow in step 36. Then, once you have a solid plan, break it down into small, iterative chunks that build on each other. Look at these chunks and then go another round to break it into small steps. Review the results and make sure that the steps are small enough to be implemented safely, but big enough to move the project forward. Iterate until you feel that the steps are right sized for this project.From here you should have the foundation to provide a series of prompts for a code-generation LLM that will implement each step. Prioritize best practices, and incremental progress, ensuring no big jumps in complexity at any stage. Make sure that each prompt builds on the previous prompts, and ends with wiring things together. There should be no hanging or orphaned code that isn't integrated into a previous step.
Make sure and separate each prompt section. Use markdown. Each prompt should be tagged as text using code tags. The goal is to output prompts, but context, etc. is important as well. Each prompt will use quadruple (4) backtick code tags while the inner code tags will use triple (3) backticks. Save the prompts in the
docs/directory.
- β Server feature compiles successfully (cargo check --features server)
- β Web feature compiles successfully for WASM (cargo check --features web --target wasm32-unknown-unknown)