junv f7ac32cf4c fix(links): custom link edits spuriously logged URL changes
When editing a CUSTOM link's text content, the ViewUpdateView's
URL-change check was comparing the captured original_url (e.g.
'/custom/mynote') against form.cleaned_data['original_url'], which
for custom links is blank because the original_url input is hidden in
link_form.html and not submitted. They never matched, so every edit
produced a spurious LinkChangeLog 'URL changed' row.

Use the recomputed /custom/{alias} value (already set on
form.instance.original_url) for custom links, and only the submitted
form value for regular links. So the log now fires only when:

- a regular link's URL actually changes, or
- a custom link's alias changes (which derives a new /custom/{alias}).

Add TestCustomLinkEditUrlChangeLog covering:
  - custom link text-edit produces no URL-change log
  - regular link edit leaving URL unchanged produces no log
  - regular link URL change logs once with old/new URL
  - custom link alias change logs once with old/new derived URL
2026-07-16 11:11:25 +10:00
2026-01-18 10:28:00 +11:00
2026-03-21 16:41:14 +11:00
2025-08-18 21:20:14 +10:00
2026-03-30 19:51:12 +11:00
2026-05-11 22:57:25 +10:00
2026-06-23 16:25:59 +10:00
2026-04-01 21:33:07 +11:00
2026-07-15 15:51:37 +10:00
2024-11-17 11:11:08 +11:00
2025-11-04 22:22:40 +11:00
2026-04-01 21:33:07 +11:00
2026-07-15 15:51:37 +10:00
2025-11-05 20:56:35 +11:00
2024-11-18 15:47:35 +11:00
2026-04-01 15:51:20 +11:00
2024-11-04 15:20:18 +11:00
2026-03-21 16:41:14 +11:00
2026-03-30 19:51:12 +11:00
2026-01-18 10:28:00 +11:00
2026-01-18 10:28:00 +11:00
2026-04-01 15:51:20 +11:00

URL Manager

A URL management tool that helps you organize and access your links efficiently.

Features

  • Create and manage short links
  • Template links with dynamic parameters
  • Bookmark pages with automatic title and summary extraction
  • Screenshot capture for bookmarked pages
  • Advanced search capabilities
  • REST API access
  • In-process background task scheduling (APScheduler)
  • Network security scanner (NetScan)

Prerequisites

  • Python 3.12+
  • uv — fast Python package manager
  • just — command runner (brew install just)
  • Docker + Docker Compose (for containerised setup)

Quick Start (Local)

# 1. Install dependencies and apply migrations
just install

# 2. Install Playwright browsers (for screenshot capture)
just install-browsers

# 3. Run the full stack (Django + Tailwind watcher)
just dev-all

The app will be available at http://localhost:8000

Run just (no arguments) to see all available recipes.

Local Development Commands

Recipe Description
just dev Run Django server + Tailwind together
just tailwind Run Tailwind CSS watcher (standalone)
just migrate Apply pending migrations
just makemigrations Generate new migrations
just shell Open Django shell
just dbshell Open raw DB shell
just superuser Create a superuser
just build-css Build minified Tailwind CSS
just collectstatic Collect static files
just test Run tests
just compilemessages Compile i18n translation files
just makemessages Extract translatable strings (zh_Hans)

Docker Commands

Recipe Description
just docker-build Build images
just docker-start Start all services (detached)
just docker-stop Stop all services
just docker-restart Restart services
just docker-logs Tail logs (all services)
just docker-logs web Tail logs for a specific service
just docker-shell Shell into the web container
just docker-migrate Run migrations inside Docker
just docker-static Collect static files inside Docker
just docker-rebuild web Rebuild and restart a specific service

Docker Services

  • web — Django server on port 8000 (APScheduler runs in-process)
  • node — Tailwind CSS compiler

Usage

  1. Create a new link at /create/
  2. Access a link at http://localhost:8000/your-alias
  3. For template links use {param, default=value} syntax in the URL

Managing Pages (Bookmarks)

  1. Add a bookmark at /ui/pages/new/ — title and summary are auto-extracted
  2. Screenshots are captured automatically in the background
  3. View all bookmarks at /ui/pages/

Network Scanner (NetScan)

Available at /ui/netscan/. Create a scan profile to automatically monitor your home network for security issues (router exposure, DNS, TLS certs, camera access).

API

  • List pages: GET /api/pages/
  • Full API docs: /ui/api-docs/

Architecture

core/         — Django project config, APScheduler setup
links/        — Main app: links, pages, tags, posts, collections
netscan/      — Network security scanner
templates/    — Base HTML templates

Background tasks (screenshot capture, page metadata extraction, network scans) run via APScheduler in-process — no separate worker or Redis needed.

Dependencies

Managed with uv via pyproject.toml.

# Add a new package
uv add package-name

# Sync environment from lockfile
uv sync

Favicon

Generated using the Zen Tokyo Zoo font (https://fonts.gstatic.com/s/zentokyozoo/).

Image Resizing (Cloudflare)

S
Description
No description provided
Readme
27 MiB
Languages
HTML 45%
Python 37.9%
Swift 9.7%
JavaScript 5.2%
CSS 1.5%
Other 0.6%