From cbfb60f0c37d2ff0f367cccf264bd3e800c5d136 Mon Sep 17 00:00:00 2001 From: Markus Date: Sun, 16 Nov 2025 23:18:39 +0100 Subject: [PATCH 01/10] removed apps linkace and readeck --- apps/linkace/config.json | 20 --- apps/linkace/docker-compose.json | 39 ------ apps/linkace/metadata/description.md | 118 ------------------ apps/linkace/metadata/logo.jpg | Bin 7321 -> 0 bytes apps/readeck/config.json | 20 --- apps/readeck/docker-compose.json | 48 -------- apps/readeck/metadata/description.md | 175 --------------------------- apps/readeck/metadata/logo.jpg | Bin 6999 -> 0 bytes 8 files changed, 420 deletions(-) delete mode 100644 apps/linkace/config.json delete mode 100644 apps/linkace/docker-compose.json delete mode 100644 apps/linkace/metadata/description.md delete mode 100644 apps/linkace/metadata/logo.jpg delete mode 100644 apps/readeck/config.json delete mode 100644 apps/readeck/docker-compose.json delete mode 100644 apps/readeck/metadata/description.md delete mode 100644 apps/readeck/metadata/logo.jpg diff --git a/apps/linkace/config.json b/apps/linkace/config.json deleted file mode 100644 index 91b1c7d..0000000 --- a/apps/linkace/config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "LinkAce", - "available": true, - "port": 8874, - "exposable": true, - "dynamic_config": true, - "id": "linkace", - "description": "LinkAce is a self-hosted archive to collect links of your favorite websites.", - "tipi_version": 1, - "version": "2.4.0", - "categories": ["utilities"], - "short_desc": "self-hosted bookmark manager", - "author": "kovah", - "source": "https://github.com/Kovah/LinkAce/", - "website": "https://www.linkace.org/", - "form_fields": [], - "supported_architectures": ["arm64", "amd64"], - "created_at": 1762383896259, - "updated_at": 1762383896259 -} diff --git a/apps/linkace/docker-compose.json b/apps/linkace/docker-compose.json deleted file mode 100644 index 420512d..0000000 --- a/apps/linkace/docker-compose.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "schemaVersion": 2, - "services": [ - { - "name": "linkace", - "image": "linkace/linkace:v2.4.0", - "isMain": true, - "internalPort": 80, - "environment": [ - { "key": "APP_KEY", "value": "base64:f6pz5BcY1ITOy0xkcO+8NrtaGXlZqFAX2YmZmgxkoFA="}, - { "key": "DB_CONNECTION", "value": "sqlite"}, - { "key": "DB_DATABASE", "value": "/data/database.sqlite"} - ], - "volumes": [ - { - "hostPath": "${APP_DATA_DIR}/data/", - "containerPath": "/data/", - "readOnly": false, - "shared": false, - "private": false - } - ], - "dependsOn": { - "valkey": { - "condition": "service_started" - } - } - }, - { - "name": "valkey", - "image": "valkey/valkey:alpine", - "healthCheck": { - "test": "CMD valkey-cli ping", - "interval": "20s", - "timeout": "3s" - } - } - ] -} diff --git a/apps/linkace/metadata/description.md b/apps/linkace/metadata/description.md deleted file mode 100644 index 4bc9949..0000000 --- a/apps/linkace/metadata/description.md +++ /dev/null @@ -1,118 +0,0 @@ -

- - - Linkace - -

- -

Your self-hosted tool for effortlessly archiving, organizing, and sharing your favorite web links.

- -

- Follow LinkAce on Mastodon - Follow LinkAce on X.com - Latest Release - License -

-

 

- - -### Contents - -* [About LinkAce](#about-linkace) -* [Setup](#gear-setup) -* [Support](#bulb-support-for-linkace) -* [Contribution](#construction-contribution) - - -  - - -### About LinkAce - -![Preview Screenshot](https://www.linkace.org/images/preview/dashboard-preview_2.0.jpg) - -LinkAce ia a powerful, self-hosted solution for managing your personal link archive. Save articles for later reading, bookmark useful tools, and preserve important web content long-term – all in one place. With a clean, user-friendly interface, you can easily categorize and retrieve your links, and even share collections with friends, family, or coworkers. LinkAce isn't meant to replace your browser bookmarks, but rather to provide you with a robust, personalized database for curating and managing your online discoveries. Whether you're a professional, a researcher or simply an avid internet user, you'll find this tool invaluable for organizing your web resources efficiently and effectively. - -👉 [**Try the Demo**](https://demo.linkace.org) - - -#### Feature Highlights - -* Organize bookmarks with the help of lists and tags. -* Multi-user support with internal sharing of links, lists or tags. -* OAuth and OIDC are supported for SSO login to LinkAce. -* Automated link monitoring informs you when any links become unavailable or were moved. -* Automated archiving of saved sites via the [Internet Archive](https://web.archive.org/). -* A full REST API offers access to all features of LinkAce from other apps and services. -* LinkAce is also [available on Zapier](https://zapier.com/apps/linkace/integrations) and integrates with over 2500+ applications. -* An advanced search including different filters and ordering. -* A bookmarklet to quickly save links from any browser. -* Save links with automatic title and description generation. -* LinkAce ships with a light and dark theme, that can be toggled or changes automatically. -* Links can be private or public, so friends or internet strangers may see your collection. -* Both private and public lists of links are accessible via RSS feeds. -* Import and export of bookmarks from and to HTML. -* Support for complete database and application backups to any AWS S3-compatible storage. - -More screenshots of the app and further details about the features can be found on the [LinkAce Website](https://www.linkace.org/). - - -  - - -### :gear: Setup - -LinkAce provides multiple ways of installing it on your server. The complete documentation for all installation methods can be found [**in the wiki**](https://www.linkace.org/docs/v2/setup/). - -* [Setup with Docker](https://www.linkace.org/docs/v2/setup/setup-with-docker/) -* [Setup without Docker](https://www.linkace.org/docs/v2/setup/setup-with-php/) -* [One-Click Deployment to the Cloud](https://www.linkace.org/docs/v2/setup/one-click-deploy/) -* [Setup with Kubernetes](https://www.linkace.org/docs/v2/setup/setup-to-k8s/) (Beta) -* [Official managed Hosting](https://hosting.linkace.org) (_Beta Waitlist_) - -  - -> **LinkAce 2.0 was just released!** This is a big upgrade to the application. Please read the [upgrade guide](https://www.linkace.org/docs/v2/upgrade/from-v1/) if you are still using LinkAce 1 and want to use version 2. - -  - - -### :bulb: Support for LinkAce - -I built LinkAce to solve my own problem, and I now offer my solution and code without charging any money. I spent a lot of my free time building this application, so I won't offer any *free* personal support, customization or installation help. If you need help please visit the [community discussions](https://github.com/Kovah/LinkAce/discussions) and post your issue there. - -:star: You can get personal and dedicated support by **becoming a supporter on [Open Collective](https://opencollective.com/linkace), [Patreon](https://www.patreon.com/Kovah) or [Github](https://github.com/sponsors/Kovah)**. - -#### Our Supporters on Open Collective - - - - -### Documentation and Community - -Details about all features and advanced configuration can be found in the [**project documentation**](https://www.linkace.org/docs/v2). -Additionally, you may visit the [community discussions](https://github.com/Kovah/LinkAce/discussions) to share your ideas, talk with other users or find help for specific problems. - - -  - - -### :construction: Contribution - -[![Translations](https://img.shields.io/badge/Translations-Crowdin-2b303d)](https://crowdin.com/project/linkace) [![Codacy Badge](https://app.codacy.com/project/badge/Grade/c32c698ee97b4af2b04d7b7f45f39bae)](https://app.codacy.com/gh/Kovah/LinkAce/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade) ![GitHub branch check runs](https://img.shields.io/github/check-runs/kovah/linkace/2.x?label=Checks) - -Please consult the [**contribution guidelines**](CONTRIBUTING.md) to start working on LinkAce. - - -  - - -Thanks go to these wonderful people for their contributions: - -[![List of contributors](https://contrib.rocks/image?repo=kovah/linkace)](https://github.com/Kovah/LinkAce/graphs/contributors) - - -  - - -LinkAce is a project by [Kevin Woblick](https://woblick.dev) and [Contributors](https://github.com/Kovah/LinkAce/graphs/contributors) diff --git a/apps/linkace/metadata/logo.jpg b/apps/linkace/metadata/logo.jpg deleted file mode 100644 index 91019621de2ee3c8089075e175ba30fdee4857a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7321 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 OKdv|a=UzjuCjJl2erU-6 diff --git a/apps/readeck/config.json b/apps/readeck/config.json deleted file mode 100644 index 386c665..0000000 --- a/apps/readeck/config.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "Readeck", - "available": true, - "port": 8315, - "exposable": true, - "dynamic_config": true, - "id": "readeck", - "description": "Readeck helps you keep all that web content you’ll want to revisit in an hour, tomorrow, or in 20 years.", - "tipi_version": 1, - "version": "0.20.4", - "categories": ["utilities"], - "short_desc": "self-hosted bookmark manager", - "author": "readeck", - "source": "https://codeberg.org/readeck/readeck", - "website": "https://readeck.org/", - "form_fields": [], - "supported_architectures": ["arm64", "amd64"], - "created_at": 1762811851670, - "updated_at": 1762811851670 -} diff --git a/apps/readeck/docker-compose.json b/apps/readeck/docker-compose.json deleted file mode 100644 index 02d0b30..0000000 --- a/apps/readeck/docker-compose.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "schemaVersion": 2, - "services": [ - { - "name": "readeck", - "image": "codeberg.org/readeck/readeck:latest", - "isMain": true, - "environment": [ - { - "key": "READECK_LOG_LEVEL", - "value": "info" - }, - { - "key": "READECK_SERVER_HOST", - "value": "0.0.0.0" - }, - { - "key": "READECK_SERVER_PORT", - "value": "8000" - }, - { - "key": "READECK_TRUSTED_PROXIES", - "value": "['127.0.0.0/8', '::1/128']" - }, - { - "key": "READECK_LOG_FORMAT", - "value": "text" - } - ], - "internalPort": 8000, - "volumes": [ - { - "hostPath": "${APP_DATA_DIR}/data/", - "containerPath": "/readeck", - "readOnly": false, - "shared": false, - "private": false - } - ], - "healthCheck": { - "test": "/bin/readeck healthcheck -config /readeck/config.toml", - "interval": "30s", - "timeout": "2s", - "retries": 3 - } - } - ] -} diff --git a/apps/readeck/metadata/description.md b/apps/readeck/metadata/description.md deleted file mode 100644 index 3780438..0000000 --- a/apps/readeck/metadata/description.md +++ /dev/null @@ -1,175 +0,0 @@ -# Readeck - -[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0) -Follow on Mastodon - -Readeck is a simple web application that lets you save the -precious readable content of web pages you like and want to keep -forever. \ -See it as a bookmark manager and a read later tool. - -![Readeck Bookmark List](./screenshots/bookmark-list.webp) - -## Contents - -- [Features](#features) -- [Installation](#how-to-test-or-install) -- [FAQ](#faq) -- [Under the hood](#under-the-hood) -- [License](#license) - -## Features - -### 🔖 Bookmarks - -Like a page you're reading? Paste the link in Readeck and you're done! - -### 📸 Articles, pictures and videos - -Readeck saves the readable content of web pages for you to read later. It also detects when a page is an image or a video and adapts its process accordingly. - -### ⭐ Labels, favorites, archives - -Move bookmarks to archives or favorites and add as many labels as you want. - -### 🖍️ Highlights - -Highlight the important content of your bookmarks to easily find it later. - -### 🗃️ Collections - -If you need a dedicated section with all your bookmarks from the past 2 weeks labeled with "cat", Readeck lets you save this search query into a collection so you can access it later. - -### 🧩 Browser Extension - -Want to keep something for later while browsing? No need to copy and paste a link. Install the browser extension and save bookmarks in one click! - -- [For Mozilla Firefox](https://addons.mozilla.org/en-US/firefox/addon/readeck/) -- [For Google Chrome](https://chromewebstore.google.com/detail/readeck/jnmcpmfimecibicbojhopfkcbmkafhee) -- [More Information and Source Code](https://codeberg.org/readeck/browser-extension) - -### 📖 E-Book export - -What's better than reading your collected articles on your e-reader? You can export any article to an e-book file (EPUB). You can even export a collection to a single book! - -On top of that, you can directly access Readeck's catalog and collections from your e-reader if it supports OPDS. - -### 🔎 Full text search - -Whether you need to find a vague piece of text from an article, or all the articles with a specific label or from a specific website, we've got you covered! - -### 🚀 Fast! - -Readeck is a modern take on so-called boring, but proven, technology pieces. It guarantees very quick response times and a smooth user experience. - -### 🔒 Built for your privacy and long term archival - -Will this article you like be online next year? In 10 year? Maybe not; maybe it's all gone, text and images. For this reason, and for your privacy, text and images are all stored in your Readeck instance the moment you save a link. - -With the exception of videos, not a single request is made from your browser to an external website. - -## How to test or install - -Done reading this promotional content? Good! Want to try Readeck on your laptop or a server? Even better! - -### Container - -To install or test Readeck with Docker or Podman, simply run the image: - -```shell -docker run --rm -ti -p 8000:8000 -v readeck-data:/readeck codeberg.org/readeck/readeck:latest -``` - -You'll find all the container images there: \ -[https://codeberg.org/readeck/-/packages/container/readeck/latest](https://codeberg.org/readeck/-/packages/container/readeck/latest) - -### Binary file installation - -Readeck is distributed as a single binary file. Using it is almost as easy as a container. - -- Create a new directory - ```shell - mkdir -p readeck-install - cd readeck-install - ``` -- Download the file matching your system from the [last release](https://codeberg.org/readeck/readeck/releases) - -- Make this file executable -- Launch Readeck with the `serve` argument, for example: - ```shell - ./readeck-0.9.1-linux-amd64 serve - ``` - -### First time launch - -Once Readeck has started, it is accessible at: \ -**[http://localhost:8000/](http://localhost:8000/)** - -### Installation from source code - -Installing from source can be useful to try out unreleased Readeck versions, or to set up a development environment for contributing code. For more information, see the [development documentation](https://readeck.org/en/docs/dev). - -### Installation for production - -If you already know how to deploy containers on a server, installing Readeck for production should be quite straightforward. As for deploying to Linux servers with systemd and NGINX reverse proxy, see the [deployment guide](https://readeck.org/en/docs/deploy). - -## FAQ - -Please refer to the [FAQ on readeck.org](https://readeck.org/en/docs/faq). - -## Under the hood - -Readeck was born out of frustration (and COVID lock-downs) from the tools that don't save everything related to the saved content, primarily images. -This key principle guided every step of Readeck development. - -### The ZIP file - -Every bookmark is stored in a single, immutable, ZIP file. Parts of this file (HTML content, images, etc.) are directly served by the application or converted to a web page or an e-book when needed. - -### A simple database - -Readeck has a very simple database schema with a few tables (and a bit of clever JSON fields here and there). The recommended database engine is SQLite for most installations. - -### A simple stack - -Unlike many modern web applications, Readeck is not a single page application built on top of an API with impossible to install dependencies and a mess of background processes. - -Readeck is written in [Go](https://go.dev/) and all its content is rendered server side with some interactivity brought by [Stimulus](https://stimulus.hotwired.dev/) and [Turbo](https://turbo.hotwired.dev/). - -This has proven to be a great combination when performance really matters. - -### Contributing - -Readeck's simple stack means that the barrier to entry is relatively low when it comes to contributing to the Readeck project. Contributions are welcome by filing issues, participating in community discussions, submitting translations, and proposing changes to the source code. For more information, see the [documentation on contributing](https://readeck.org/en/contribute). - -## License - -Readeck is distributed under the terms of the [GNU Affero General Public License v3.0](https://www.gnu.org/licenses/agpl-3.0.html). Here's a short summary of the license conditions: - -- Permissions - - **Commercial use** \ - The licensed material and derivatives may be used for commercial purposes. - - **Distribution** \ - The licensed material may be distributed. - - **Modification** \ - The licensed material may be modified. - - **Patent use** \ - This license provides an express grant of patent rights from contributors. - - **Private use** \ - The licensed material may be used and modified in private. -- Conditions - - **Disclose source** \ - Source code must be made available when the licensed material is distributed. - - **License and copyright notice** \ - A copy of the license and copyright notice must be included with the licensed material. - - **Network use is distribution** \ - Users who interact with the licensed material via network are given the right to receive a copy of the source code. - - **Same license** \ - Modifications must be released under the same license when distributing the licensed material. In some cases a similar or related license may be used. - - **State changes** \ - Changes made to the licensed material must be documented. -- Limitations - - **Liability** \ - This license includes a limitation of liability. - - **Warranty** \ - This license explicitly states that it does NOT provide any warranty. diff --git a/apps/readeck/metadata/logo.jpg b/apps/readeck/metadata/logo.jpg deleted file mode 100644 index 2053f1798252369fa130d069e9f293c01886b5f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6999 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 Date: Sun, 16 Nov 2025 23:19:38 +0100 Subject: [PATCH 02/10] added new app: linkding (1.44.1) --- apps/linkding/config.json | 20 +++++++ apps/linkding/docker-compose.json | 20 +++++++ apps/linkding/metadata/description.md | 82 ++++++++++++++++++++++++++ apps/linkding/metadata/logo.jpg | Bin 0 -> 40686 bytes 4 files changed, 122 insertions(+) create mode 100644 apps/linkding/config.json create mode 100644 apps/linkding/docker-compose.json create mode 100644 apps/linkding/metadata/description.md create mode 100644 apps/linkding/metadata/logo.jpg diff --git a/apps/linkding/config.json b/apps/linkding/config.json new file mode 100644 index 0000000..a82c815 --- /dev/null +++ b/apps/linkding/config.json @@ -0,0 +1,20 @@ +{ + "name": "linkding", + "available": true, + "port": 8690, + "exposable": true, + "dynamic_config": true, + "id": "linkding", + "description": "linkding is a bookmark manager that you can host yourself. It's designed be to be minimal, fast, and easy to set up using Docker.", + "tipi_version": 1, + "version": "1.44.1", + "categories": ["utilities"], + "short_desc": "self-hosted bookmark manager", + "author": "sissbruecker", + "source": "https://github.com/sissbruecker/linkding", + "website": "https://www.linkding.link/", + "form_fields": [], + "supported_architectures": ["arm64", "amd64"], + "created_at": 1763331296327, + "updated_at": 1763331296327 +} diff --git a/apps/linkding/docker-compose.json b/apps/linkding/docker-compose.json new file mode 100644 index 0000000..864d4c0 --- /dev/null +++ b/apps/linkding/docker-compose.json @@ -0,0 +1,20 @@ +{ + "schemaVersion": 2, + "services": [ + { + "name": "linkding", + "image": "sissbruecker/linkding:1.44.1-alpine", + "isMain": true, + "internalPort": 9090, + "volumes": [ + { + "hostPath": "${APP_DATA_DIR}/data", + "containerPath": "/etc/linkding/data", + "readOnly": false, + "shared": false, + "private": false + } + ] + } + ] +} diff --git a/apps/linkding/metadata/description.md b/apps/linkding/metadata/description.md new file mode 100644 index 0000000..04c01b0 --- /dev/null +++ b/apps/linkding/metadata/description.md @@ -0,0 +1,82 @@ +## Introduction + +linkding is a bookmark manager that you can host yourself. +It's designed be to be minimal, fast, and easy to set up using Docker. + +The name comes from: +- *link* which is often used as a synonym for URLs and bookmarks in common language +- *Ding* which is German for thing +- ...so basically something for managing your links + +**Feature Overview:** +- Clean UI optimized for readability +- Organize bookmarks with tags +- Bulk editing, Markdown notes, read it later functionality +- Share bookmarks with other users or guests +- Automatically provides titles, descriptions and icons of bookmarked websites +- Automatically archive websites, either as local HTML file or on Internet Archive +- Import and export bookmarks in Netscape HTML format +- Installable as a Progressive Web App (PWA) +- Extensions for [Firefox](https://addons.mozilla.org/firefox/addon/linkding-extension/) and [Chrome](https://chrome.google.com/webstore/detail/linkding-extension/beakmhbijpdhipnjhnclmhgjlddhidpe), as well as a bookmarklet +- SSO support via OIDC or authentication proxies +- REST API for developing 3rd party apps +- Admin panel for user self-service and raw data access + + +**Demo:** https://demo.linkding.link/ + +**Screenshot:** + +![Screenshot](/docs/public/linkding-screenshot.png?raw=true "Screenshot") + +## Getting Started + +The following links help you to get started with linkding: +- [Install linkding on your own server](https://linkding.link/installation) or [check managed hosting options](https://linkding.link/managed-hosting) +- [Install the browser extension](https://linkding.link/browser-extension) +- [Check out community projects](https://linkding.link/community), which include mobile apps, browser extensions, libraries and more + +## Documentation + +The full documentation is now available at [linkding.link](https://linkding.link/). + +If you want to contribute to the documentation, you can find the source files in the `docs` folder. + +If you want to contribute a community project, feel free to [submit a PR](https://github.com/sissbruecker/linkding/edit/master/docs/src/content/docs/community.md). + +## Contributing + +Small improvements, bugfixes and documentation improvements are always welcome. If you want to contribute a larger feature, consider opening an issue first to discuss it. I may choose to ignore PRs for features that don't align with the project's goals or that I don't want to maintain. + +## Development + +The application is built using the Django web framework. You can get started by checking out the excellent [Django docs](https://docs.djangoproject.com/en/4.1/). The `bookmarks` folder contains the actual bookmark application. Other than that the code should be self-explanatory / standard Django stuff 🙂. + +### Prerequisites +- Python 3.13 +- [uv](https://docs.astral.sh/uv/getting-started/installation/) +- Node.js + +### Setup + +Initialize the development environment with: +``` +make init +``` +This sets up a virtual environment using uv, installs NPM dependencies and runs migrations to create the initial database. + +Create a user for the frontend: +``` +uv run manage.py createsuperuser --username=joe --email=joe@example.com +``` + +Run the frontend build for bundling frontend components with: +``` +make frontend +``` + +Then start the Django development server with: +``` +make serve +``` +The frontend is now available under http://localhost:8000 diff --git a/apps/linkding/metadata/logo.jpg b/apps/linkding/metadata/logo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..305cacdb753e1fc2f83c4bd28930f1f02a97a26e GIT binary patch literal 40686 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

S70zol6v7bsHP($ZkbPIXV!KBk(lb_`mG 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 oNMGsS`a(Qdh~%r?CxqMNF9Y1 Date: Sun, 16 Nov 2025 23:38:19 +0100 Subject: [PATCH 03/10] changed app linkding: added form fields for initial superuser --- apps/linkding/config.json | 18 +++++++++++++++++- apps/linkding/docker-compose.json | 6 +++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/apps/linkding/config.json b/apps/linkding/config.json index a82c815..752dcc4 100644 --- a/apps/linkding/config.json +++ b/apps/linkding/config.json @@ -13,7 +13,23 @@ "author": "sissbruecker", "source": "https://github.com/sissbruecker/linkding", "website": "https://www.linkding.link/", - "form_fields": [], + "form_fields": [ + { + "type": "text", + "label": "Initial superuser name", + "max": "50", + "required": true, + "placeholder": "admin", + "env_variable": "ENV_SUPERUSER_NAME" + }, + { + "type": "password", + "label": "Initial superuser password", + "max": "100", + "required": true, + "env_variable": "ENVLD_SUPERUSER_PASSWORD" + } + ], "supported_architectures": ["arm64", "amd64"], "created_at": 1763331296327, "updated_at": 1763331296327 diff --git a/apps/linkding/docker-compose.json b/apps/linkding/docker-compose.json index 864d4c0..60ae035 100644 --- a/apps/linkding/docker-compose.json +++ b/apps/linkding/docker-compose.json @@ -6,6 +6,10 @@ "image": "sissbruecker/linkding:1.44.1-alpine", "isMain": true, "internalPort": 9090, + "environment": [ + {"key": "LD_SUPERUSER_NAME", "value": "ENV_SUPERUSER_NAME"}, + {"key": "LD_SUPERUSER_PASSWORD", "value": "ENV_SUPERUSER_PASSWORD"} + ], "volumes": [ { "hostPath": "${APP_DATA_DIR}/data", @@ -17,4 +21,4 @@ ] } ] -} + From 77fd1d0e743886c2b63dbcf7259416e363e8014d Mon Sep 17 00:00:00 2001 From: Markus Date: Sun, 16 Nov 2025 23:40:06 +0100 Subject: [PATCH 04/10] changed app linkding: fixed json structure --- apps/linkding/docker-compose.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/linkding/docker-compose.json b/apps/linkding/docker-compose.json index 60ae035..5d941c8 100644 --- a/apps/linkding/docker-compose.json +++ b/apps/linkding/docker-compose.json @@ -21,4 +21,4 @@ ] } ] - +} From 94478193d8d308dbf0f8132ce9da76aa4018ed5a Mon Sep 17 00:00:00 2001 From: Markus Date: Sun, 16 Nov 2025 23:42:21 +0100 Subject: [PATCH 05/10] changed app linkding: fixed form-feeded env variables --- apps/linkding/docker-compose.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/linkding/docker-compose.json b/apps/linkding/docker-compose.json index 5d941c8..a8d9641 100644 --- a/apps/linkding/docker-compose.json +++ b/apps/linkding/docker-compose.json @@ -7,8 +7,8 @@ "isMain": true, "internalPort": 9090, "environment": [ - {"key": "LD_SUPERUSER_NAME", "value": "ENV_SUPERUSER_NAME"}, - {"key": "LD_SUPERUSER_PASSWORD", "value": "ENV_SUPERUSER_PASSWORD"} + {"key": "LD_SUPERUSER_NAME", "value": "${ENV_SUPERUSER_NAME}"}, + {"key": "LD_SUPERUSER_PASSWORD", "value": "${ENV_SUPERUSER_PASSWORD}"} ], "volumes": [ { From 0cf1a73c76a8aead96aff0c11c6217182658b989 Mon Sep 17 00:00:00 2001 From: Markus Date: Sun, 16 Nov 2025 23:45:35 +0100 Subject: [PATCH 06/10] changed app linkding: fixed form-feeded env variables --- apps/linkding/config.json | 4 ++-- apps/linkding/docker-compose.json | 4 ---- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/apps/linkding/config.json b/apps/linkding/config.json index 752dcc4..3204265 100644 --- a/apps/linkding/config.json +++ b/apps/linkding/config.json @@ -20,14 +20,14 @@ "max": "50", "required": true, "placeholder": "admin", - "env_variable": "ENV_SUPERUSER_NAME" + "env_variable": "LD_SUPERUSER_NAME" }, { "type": "password", "label": "Initial superuser password", "max": "100", "required": true, - "env_variable": "ENVLD_SUPERUSER_PASSWORD" + "env_variable": "LD_SUPERUSER_PASSWORD" } ], "supported_architectures": ["arm64", "amd64"], diff --git a/apps/linkding/docker-compose.json b/apps/linkding/docker-compose.json index a8d9641..864d4c0 100644 --- a/apps/linkding/docker-compose.json +++ b/apps/linkding/docker-compose.json @@ -6,10 +6,6 @@ "image": "sissbruecker/linkding:1.44.1-alpine", "isMain": true, "internalPort": 9090, - "environment": [ - {"key": "LD_SUPERUSER_NAME", "value": "${ENV_SUPERUSER_NAME}"}, - {"key": "LD_SUPERUSER_PASSWORD", "value": "${ENV_SUPERUSER_PASSWORD}"} - ], "volumes": [ { "hostPath": "${APP_DATA_DIR}/data", From 8ef85cba21019971494726b94308949b08cc0822 Mon Sep 17 00:00:00 2001 From: Markus Date: Sun, 16 Nov 2025 23:49:08 +0100 Subject: [PATCH 07/10] changed app linkding: fixed form-feeded env variables --- apps/linkding/config.json | 4 ++-- apps/linkding/docker-compose.json | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/apps/linkding/config.json b/apps/linkding/config.json index 3204265..2625f4f 100644 --- a/apps/linkding/config.json +++ b/apps/linkding/config.json @@ -20,14 +20,14 @@ "max": "50", "required": true, "placeholder": "admin", - "env_variable": "LD_SUPERUSER_NAME" + "env_variable": "SUPERUSER_NAME" }, { "type": "password", "label": "Initial superuser password", "max": "100", "required": true, - "env_variable": "LD_SUPERUSER_PASSWORD" + "env_variable": "SUPERUSER_PASSWORD" } ], "supported_architectures": ["arm64", "amd64"], diff --git a/apps/linkding/docker-compose.json b/apps/linkding/docker-compose.json index 864d4c0..27ebab9 100644 --- a/apps/linkding/docker-compose.json +++ b/apps/linkding/docker-compose.json @@ -6,6 +6,10 @@ "image": "sissbruecker/linkding:1.44.1-alpine", "isMain": true, "internalPort": 9090, + "environment": [ + { "key": "LD_SUPERUSER_NAME", "value": "${SUPERUSER_NAME}" }, + { "key": "LD_SUPERUSER_PASSWORD", "value": "${SUPERUSER_PASSWORD}" } + ], "volumes": [ { "hostPath": "${APP_DATA_DIR}/data", From 432095c29a5a90d15d34ba8376d74b8f0cdb7887 Mon Sep 17 00:00:00 2001 From: Markus Date: Sun, 16 Nov 2025 23:58:20 +0100 Subject: [PATCH 08/10] changed app linkding: fixed form-feeded env variables --- apps/linkding/config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/linkding/config.json b/apps/linkding/config.json index 2625f4f..beb4590 100644 --- a/apps/linkding/config.json +++ b/apps/linkding/config.json @@ -6,7 +6,7 @@ "dynamic_config": true, "id": "linkding", "description": "linkding is a bookmark manager that you can host yourself. It's designed be to be minimal, fast, and easy to set up using Docker.", - "tipi_version": 1, + "tipi_version": 2, "version": "1.44.1", "categories": ["utilities"], "short_desc": "self-hosted bookmark manager", @@ -32,5 +32,5 @@ ], "supported_architectures": ["arm64", "amd64"], "created_at": 1763331296327, - "updated_at": 1763331296327 + "updated_at": 1763333712520 } From ce80789de112c35339c216044582ed9531c60c81 Mon Sep 17 00:00:00 2001 From: Markus Date: Mon, 17 Nov 2025 00:04:09 +0100 Subject: [PATCH 09/10] changed app linkding: testing env variables --- apps/linkding/config.json | 17 ----------------- apps/linkding/docker-compose.json | 4 ++-- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/apps/linkding/config.json b/apps/linkding/config.json index beb4590..f67b8b3 100644 --- a/apps/linkding/config.json +++ b/apps/linkding/config.json @@ -13,23 +13,6 @@ "author": "sissbruecker", "source": "https://github.com/sissbruecker/linkding", "website": "https://www.linkding.link/", - "form_fields": [ - { - "type": "text", - "label": "Initial superuser name", - "max": "50", - "required": true, - "placeholder": "admin", - "env_variable": "SUPERUSER_NAME" - }, - { - "type": "password", - "label": "Initial superuser password", - "max": "100", - "required": true, - "env_variable": "SUPERUSER_PASSWORD" - } - ], "supported_architectures": ["arm64", "amd64"], "created_at": 1763331296327, "updated_at": 1763333712520 diff --git a/apps/linkding/docker-compose.json b/apps/linkding/docker-compose.json index 27ebab9..2871e7c 100644 --- a/apps/linkding/docker-compose.json +++ b/apps/linkding/docker-compose.json @@ -7,8 +7,8 @@ "isMain": true, "internalPort": 9090, "environment": [ - { "key": "LD_SUPERUSER_NAME", "value": "${SUPERUSER_NAME}" }, - { "key": "LD_SUPERUSER_PASSWORD", "value": "${SUPERUSER_PASSWORD}" } + { "key": "LD_SUPERUSER_NAME", "value": "${SUPERUSER_NAME:-admin}" }, + { "key": "LD_SUPERUSER_PASSWORD", "value": "${SUPERUSER_PASSWORD:-l1nkd1ng}" } ], "volumes": [ { From 6eeffae436518b5652ed546819401ce89cbe554a Mon Sep 17 00:00:00 2001 From: Markus Date: Mon, 17 Nov 2025 00:07:04 +0100 Subject: [PATCH 10/10] changed app linkding: testing env variables --- apps/linkding/config.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/linkding/config.json b/apps/linkding/config.json index f67b8b3..f1c719b 100644 --- a/apps/linkding/config.json +++ b/apps/linkding/config.json @@ -14,6 +14,24 @@ "source": "https://github.com/sissbruecker/linkding", "website": "https://www.linkding.link/", "supported_architectures": ["arm64", "amd64"], + "form_fields": [ + { + "type": "text", + "label": "Initial superuser name", + "max": 50, + "required": true, + "placeholder": "admin", + "env_variable": "SUPERUSER_NAME" + }, + { + "type": "password", + "label": "Initial superuser password", + "max": 50, + "min": 6, + "required": true, + "env_variable": "SUPERUSER_PASSWORD" + } + ], "created_at": 1763331296327, "updated_at": 1763333712520 }