{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreidszq5ikwnyr5xmjin7drphc7scrwkhznpaa2zz6wsnmmkpwyfgoa",
    "uri": "at://did:plc:t4aigbwuwix7x3q42qzjc6mn/app.bsky.feed.post/3mdhj3ncitbl2"
  },
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreieehsdjufgnt5zvf4kxa6epwcf7khbcyxkdkokrnu55p2eh774xxe"
    },
    "mimeType": "image/jpeg",
    "size": 2453
  },
  "path": "/link/535/17264591/a-url-router-that-turns-your-local-network-into-a-workflow-engine",
  "publishedAt": "2026-01-27T14:00:00.000Z",
  "site": "https://brett.trpstra.net",
  "tags": [
    "dy.lan",
    "GitHub repository",
    "on Mastodon",
    "Bluesky",
    "Twitter",
    "Click here if you'd like to help out.",
    "Mastodon",
    "Bluesky",
    "GitHub",
    "everywhere else"
  ],
  "textContent": "Have you ever wished you could turn your local network into a smart routing system? Instead of remembering IP addresses and ports, what if you could use simple, memorable URLs that trigger workflows, redirect to services, or even search your notes?\n\nThat’s exactly what dy.lan does. It’s a self-hosted URL router with a plugin architecture that transforms your local network into a powerful automation platform. Built by Ralf Hülsmann, a Ruby rookie from Sevelen, Germany, dy.lan (pronounced “Dylan”) is a lightweight HTTP router designed specifically for local networks.\n\n## The Basic Concept\n\nAt its core, dy.lan acts as a central entry point that translates URLs into actions. Instead of remembering `192.168.1.73:8384` for Syncthing, you can access `http://sync.lan`. Instead of writing complex scripts, you can use `http://dy.lan/n/meeting` to search your Apple Notes.\n\nThe project solves several common problems:\n\n  * **Infrastructure abstraction** : When a service moves to a new IP or port, you update one config line instead of hunting down bookmarks and scripts\n  * **Workflow shortcuts** : Turn URLs into actions with pattern-based routing\n  * **Clean local services** : Route HTTP traffic without the complexity of full reverse proxies like Traefik or nginx for simple use cases\n  * **Extensibility** : YAML configs for simple redirects, Ruby plugins for custom logic\n\n\n\n## Plugin Architecture and Extensibility\n\nWhat makes dy.lan powerful is its plugin system. The architecture is built around numbered plugins (00-, 10-, 20-…) that follow a first-match-wins priority system. Each plugin can:\n\n  * Match URLs using regex patterns with capture groups\n  * Filter by domain/host\n  * Execute custom Ruby logic\n  * Handle timeouts (default 500ms, configurable per plugin)\n  * Auto-disable after 5 errors (circuit breaker pattern)\n\n\n\nPlugins are hot-reloadable for YAML configs (after domain-match), and the system is resilient — syntax errors and loops won’t crash the server.\n\nThe project includes 8 example plugins covering everything from simple redirects to API integrations, monitoring dashboards, and cron jobs. You can extend it with any feature you can implement in Ruby.\n\n## Real-World Examples\n\nHere are some practical ways dy.lan can be used:\n\n**Google Search Shortcut**\n\n\n    # config/redirects.yaml redirects: - pattern: '^/g/(.+)$' target: 'https://google.com/search?q=${1}'\n\nAccess `http://dy.lan/g/ruby` and it redirects to a Google search for “ruby”. Simple, memorable, and no coding required.\n\n**DEVONthink Search** For more complex workflows, you can use a Ruby plugin:\n\n\n    class DevonthinkPlugin < Dylan::Plugin pattern %r{^/(\\d{8})} def call(host, path, request) alias_id = path.match(pattern)[1] Dylan::Response.redirect(\"x-devonthink-item://#{alias_id}\") end end\n\nNow `http://dy.lan/12345678` opens the document with that alias in DEVONthink.\n\n**Apple Notes Search**\n\n\n    class NotesPlugin < Dylan::Plugin pattern %r{^/n/(.+)} def call(host, path, request) query = path.match(pattern)[1] Dylan::Response.redirect(\"shortcuts://run-shortcut?name=search_notes&input=#{query}\") end end\n\nAccess `http://dy.lan/n/example` to search your Apple Notes for “example” via Shortcuts.\n\n## Deployment Options\n\nOne of the great things about dy.lan is its flexibility. It can run on your Mac for local development or on a Synology NAS for 24/7 operation.\n\n**On Your Mac:**\n\n\n    git clone https://github.com/rhsev/dy.lan cd dy.lan docker-compose -f docker-compose.mac.yml up -d\n\n**On Synology:** The project includes `docker-compose.synology.yml` for easy deployment on NAS devices. With macvlan networking, you can give dy.lan its own dedicated IP address, avoiding conflicts with other reverse proxies.\n\nThe performance is impressive: 6,000 requests per second on a Mac mini M4, and 2,500 requests per second on a Synology DS224+ (compared to ~200 req/s for YOURLS on similar hardware). All while using just 20-30 MB of RAM.\n\n## Technical Highlights\n\nBuilt with Ruby 4.0’s async/fiber-based concurrency, dy.lan uses non-blocking I/O so slow plugins don’t block fast ones. It’s a pure Ruby implementation with no Rails, no middleware, and no database. Configuration is done through YAML files and Ruby plugins, with a browser-based dashboard for stats and container management.\n\nThe system includes modern Ruby syntax (using `it` parameter in core code while keeping plugins explicit), configurable timeouts, circuit breakers, and domain filtering per plugin. It’s designed to be simple, transparent, and easy to extend.\n\n## Getting Started\n\nIf you want to try dy.lan yourself, check out the GitHub repository. The project is shared as-is, built to solve specific friction in personal automation workflows. Ralf has been developing and sharing this with me for a while, and I’m glad he decided to make it public so others can benefit.\n\nWhether you need simple URL redirects, workflow automation, or a lightweight reverse proxy for local services, dy.lan provides a clean and extensible solution.\n\nLike or share this post on Mastodon, Bluesky, or Twitter.\n\n* * *\n\nBrettTerpstra.com is supported by readers like you. Click here if you'd like to help out.\n\nFind Brett on Mastodon, Bluesky, GitHub, and everywhere else.",
  "title": "Dy.lan: turn your local network into a workflow engine",
  "updatedAt": "2026-01-27T14:00:00.000Z"
}