{"id":1699,"date":"2025-09-12T14:08:53","date_gmt":"2025-09-12T14:08:53","guid":{"rendered":"https:\/\/paoloronco.it\/?p=1699"},"modified":"2025-11-18T10:08:38","modified_gmt":"2025-11-18T10:08:38","slug":"lynx-un-link-manager-open-source-e-self-hosted","status":"publish","type":"post","link":"https:\/\/paoloronco.it\/en\/lynx-un-link-manager-open-source-e-self-hosted\/","title":{"rendered":"Lynx \u2013 An Open-Source and Self-Hosted Link Manager"},"content":{"rendered":"<p class=\"wp-block-paragraph\">In an era where our digital identity is spread across dozens of platforms, having a single point of contact for our touchpoints becomes essential.<br><strong>Lynx<\/strong> was born with this idea: a <strong>Open-source, self-hosted link manager<\/strong>, which allows you to create a personal page where you can collect links, profile and content, with a fully customizable design and a secure authentication system.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">? <strong>Public Demo (resets every 15 minutes):<\/strong> <a href=\"https:\/\/lynx-demo.up.railway.app\/\">https:\/\/lynx-demo.up.railway.app\/<\/a><br>Credentials: <code>admin \/ demo123<\/code><br>? <strong>Production:<\/strong> <a href=\"https:\/\/lynx.paoloronco.it\/\">https:\/\/lynx.paoloronco.it\/<\/a><br>? <strong>GitHub Repository:<\/strong> <a href=\"https:\/\/github.com\/paoloronco\/Lynx\">paoloronco\/Lynx<\/a> \u2013 <a href=\"https:\/\/github.com\/paoloronco\/Lynx-Demo\">paoloronco\/Lynx-Demo<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">? What does Lynx do?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lynx is proposed as a self-hosted alternative to Linktree and similar services, with the advantage of being <strong>totally independent<\/strong> And <strong>customizable<\/strong>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/github.com\/paoloronco\/Lynx\/blob\/main\/docs\/screenshots\/Lynx-Ad1.png\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Custom profile and theme<\/strong> \u2192 colors, fonts, layouts and styles can be defined with a simple JSON or via the admin panel.<\/li>\n\n\n\n<li><strong>Secure link management<\/strong> \u2192 bcryptjs and JWT-based authentication, session protection with HttpOnly cookies.<\/li>\n\n\n\n<li><strong>Integrated admin panel<\/strong> \u2192 Manage links, bios, and themes without touching code.<\/li>\n\n\n\n<li><strong>Lightweight database<\/strong> \u2192 SQLite, without dependencies on external services.<\/li>\n\n\n\n<li><strong>Flexible deployment<\/strong> \u2192 Compatible with Railway, Render, Docker, Google Cloud Run, Digital Ocean, and many other platforms.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The result is a <strong>responsive personal landing page<\/strong>, quick to set up and secure to maintain, ideal for creators, professionals and brands.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">? Technical Skills Acquired<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The development and deployment of Lynx has allowed us to experience first-hand different areas of the world <strong>full stack<\/strong> And <strong>DevOps<\/strong>:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">? Frontend &amp; Backend Development<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Modern Stack<\/strong>: React, Vite and Tailwind CSS for the frontend; Node.js, Express.js and server-side SQLite.<\/li>\n\n\n\n<li><strong>Authentication and security<\/strong>: password hashing (bcryptjs), expiring JWT, parametric queries on SQLite.<\/li>\n\n\n\n<li><strong>Self-contained architecture<\/strong>: no dependency on external databases or third-party providers.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">? Deployment and CI\/CD<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Railway &amp; Render<\/strong>: used for quick demo and testing, with automatic database reset every 15 minutes.<\/li>\n\n\n\n<li><strong>Google Cloud Run<\/strong>: the choice for production, thanks to automatic scalability and low costs.\n<ul class=\"wp-block-list\">\n<li>Configuring <strong>Workload Identity Federation<\/strong> to allow GitHub Actions to deploy without static keys.<\/li>\n\n\n\n<li><strong>Artifact Registry<\/strong> to build and save Docker images.<\/li>\n\n\n\n<li>Custom domain mapping <code>lynx.paoloronco.it<\/code> with Cloudflare and Google Domains.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>GitHub Actions<\/strong>: CI\/CD pipeline that builds the app with Dockerfile and automatically releases it to Cloud Run on every push to <code>main<\/code>.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">? DevOps Best Practices<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Demo hardening<\/strong>: restrictions on password resets and data resets, rate limiting, and anti-bot protection.<\/li>\n\n\n\n<li><strong>Total automation of the flow<\/strong>: from commit to live deployment, without manual intervention.<\/li>\n\n\n\n<li><strong>Code cleaning<\/strong>: refactoring to remove no longer used dependencies (Supabase, Firebase).<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">? An Open-Source Product, for Everyone<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lynx is released under <strong>MIT License<\/strong> and is intended to be used and modified freely.<br>Anyone can fork it, adapt it to their brand and deploy it on their favorite service.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In addition to its practical utility, Lynx also represents a <strong>showcase project<\/strong>: an example of how it is possible to build a complete, secure and scalable product by combining modern development and DevOps skills.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">? Useful Links<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>? <strong>Production<\/strong> \u2192 <a href=\"https:\/\/lynx.paoloronco.it\/\">https:\/\/lynx.paoloronco.it\/<\/a><\/li>\n\n\n\n<li>? <strong>Demo (reset every 15 minutes)<\/strong> \u2192 <a href=\"https:\/\/lynx-demo.up.railway.app\/\">https:\/\/lynx-demo.up.railway.app\/<\/a><\/li>\n\n\n\n<li>? <strong>GitHub Repository<\/strong> \u2192 <a href=\"https:\/\/github.com\/paoloronco\/Lynx\">Lynx<\/a> | <a href=\"https:\/\/github.com\/paoloronco\/Lynx-Demo\">Lynx-Demo<\/a><\/li>\n\n\n\n<li>? <strong>Interactive demo<\/strong> \u2192 <a href=\"https:\/\/app.storylane.io\/share\/tjpm3tey6ven\">Storylane<\/a><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p class=\"wp-block-paragraph\">\u270d\ufe0f <strong>In summary:<\/strong> Lynx is not just a link manager, but a project that demonstrates real skills in development <strong>full stack<\/strong> and in the <strong>cloud-native deployment<\/strong>.<br>A portfolio project that combines design, security, and DevOps automation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>","protected":false},"excerpt":{"rendered":"<p>In un\u2019epoca in cui la nostra identit\u00e0 digitale si distribuisce su decine di piattaforme, avere un punto di raccolta unico per i propri touchpoint diventa fondamentale.Lynx nasce con questa idea: un link manager open-source, self-hosted, che permette di creare una pagina personale dove raccogliere link, profilo e contenuti, con un design completamente personalizzabile e un &hellip; <a href=\"https:\/\/paoloronco.it\/en\/lynx-un-link-manager-open-source-e-self-hosted\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Lynx \u2013 Un Link Manager Open-Source e Self-Hosted&#8221;<\/span><\/a><\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[23],"class_list":["post-1699","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-portfolio"],"_links":{"self":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/1699","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/comments?post=1699"}],"version-history":[{"count":2,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/1699\/revisions"}],"predecessor-version":[{"id":1704,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/posts\/1699\/revisions\/1704"}],"wp:attachment":[{"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/media?parent=1699"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/categories?post=1699"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/paoloronco.it\/en\/wp-json\/wp\/v2\/tags?post=1699"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}