Littlelink Server
Stack
LittleLink is an open source DIY self-hosted alternative to services like Linktree and many.link.
Image details
Source details
Configuration
TypeComposelinuxghcr.io/techno-tim/littlelink-server:latest8480:3000META_TITLE=PUTYOURNAMEHEREMETA_DESCRIPTION=NAME pageMETA_AUTHOR=PUTYOURNAMEHERELANG=enMETA_INDEX_STATUS=allGA_TRACKING_ID=G-XXXXXXXXXXTHEME=DarkFAVICON_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_200x200.jpgAVATAR_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_200x200.jpgAVATAR_2X_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_400x400.jpgAVATAR_ALT=PUTYOURNAMEHERE Profile PicNAME=PUTYOURNAMEHEREBIO=Hey! Just a place where you can connect with me!FOOTER=Thanks for stopping by!GITHUB=https://github.com/TWITTER=https://twitter.com/INSTAGRAM=https://www.instagram.com/YOUTUBE=https://www.youtube.com/TWITCH=https://www.twitch.tvDISCORD=https://discord.gg/TIKTOK=https://www.tiktok.com/KIT=https://kit.co/FACEBOOK=https://facebook.comFACEBOOK_MESSENGER=https://facebook.comLINKED_IN=https://linkedin.comPRODUCT_HUNT=https://www.producthunt.com/SNAPCHAT=https://www.snapchat.com/SPOTIFY=https://www.spotify.com/REDDIT=https://www.reddit.com/MEDIUM=https://medium.comPINTEREST=https://www.pinterest.com/[email protected]EMAIL_TEXT=Email Me![email protected]EMAIL_ALT_TEXT=Email me!SOUND_CLOUD=https://soundcloud.comFIGMA=https://figma.comTELEGRAM=https://telegram.org/TUMBLR=https://www.tumblr.com/STEAM=https://steamcommunity.com/VIMEO=https://vimeo.com/WORDPRESS=https://wordpress.com/GOODREADS=https://www.goodreads.com/SKOOB=https://www.skoob.com.br/LETTERBOXD=https://letterboxd.com/MASTODON=https://mastodon.social/MICRO_BLOG=https://micro.blog/WHATSAPP=https://www.whatsapp.com/STRAVA=https://www.strava.com/BUYMEACOFFEE=https://www.buymeacoffee.com/GITLAB=https://www.gitlab.com/PATREON=https://www.patreon.com/technotimDEVTO=https://dev.to/UMAMI_WEBSITE_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxUMAMI_APP_URL=https://your-umami-app.comBUTTON_ORDER=YOUTUBE,TWITCH,TWITTER,GITHUB,INSTAGRAM,DISCORD,FACEBOOK,TIKTOK,KIT,PATREONPAYPAL=https://www.paypal.me/userSLACK=https://slack.com/unless-stoppedStandalone Install
Select an install method, to see config/commands for deploying Littlelink Server
Install on Portainer
Import all app templates into your Portainer instance, for easy 1-click deploys
- Ensure both Docker and Portainer are installed, and up-to-date
- Log into your Portainer web UI
- Under Settings → App Templates, paste the below URL
- Head to Home → App Templates, and the list of apps will show up
- Select Littlelink Server, fill in any config options, and hit Deploy
Template Import URL
https://raw.githubusercontent.com/Lissy93/portainer-templates/main/templates.json
Show Me
Original stackfile
The compose file this template deploys, straight from its repo:
services:
littlelink-server:
image: ghcr.io/techno-tim/littlelink-server:latest
# dockerhub is also supported timothystewart6/littlelink-server
#image: timothystewart6/littlelink-server:latest
container_name: littlelink-server
environment:
- META_TITLE=PUTYOURNAMEHERE
- META_DESCRIPTION=NAME page
- META_AUTHOR=PUTYOURNAMEHERE
- LANG=en
- META_INDEX_STATUS=all
- GA_TRACKING_ID=G-XXXXXXXXXX
- THEME=Dark
- FAVICON_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_200x200.jpg
- AVATAR_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_200x200.jpg
- AVATAR_2X_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_400x400.jpg
- AVATAR_ALT=PUTYOURNAMEHERE Profile Pic
- NAME=PUTYOURNAMEHERE
- BIO=Hey! Just a place where you can connect with me!
- FOOTER=Thanks for stopping by!
- GITHUB=https://github.com/
- TWITTER=https://twitter.com/
- INSTAGRAM=https://www.instagram.com/
- YOUTUBE=https://www.youtube.com/
- TWITCH=https://www.twitch.tv
- DISCORD=https://discord.gg/
- TIKTOK=https://www.tiktok.com/
- KIT=https://kit.co/
- FACEBOOK=https://facebook.com
- FACEBOOK_MESSENGER=https://facebook.com
- LINKED_IN=https://linkedin.com
- PRODUCT_HUNT=https://www.producthunt.com/
- SNAPCHAT=https://www.snapchat.com/
- SPOTIFY=https://www.spotify.com/
- REDDIT=https://www.reddit.com/
- MEDIUM=https://medium.com
- PINTEREST=https://www.pinterest.com/
- [email protected]
- EMAIL_TEXT=Email Me!
- [email protected]
- EMAIL_ALT_TEXT=Email me!
- SOUND_CLOUD=https://soundcloud.com
- FIGMA=https://figma.com
- TELEGRAM=https://telegram.org/
- TUMBLR=https://www.tumblr.com/
- STEAM=https://steamcommunity.com/
- VIMEO=https://vimeo.com/
- WORDPRESS=https://wordpress.com/
- GOODREADS=https://www.goodreads.com/
- SKOOB=https://www.skoob.com.br/
- LETTERBOXD=https://letterboxd.com/
- MASTODON=https://mastodon.social/
- MICRO_BLOG=https://micro.blog/
- WHATSAPP=https://www.whatsapp.com/
- STRAVA=https://www.strava.com/
- BUYMEACOFFEE=https://www.buymeacoffee.com/
- GITLAB=https://www.gitlab.com/
- PATREON=https://www.patreon.com/technotim
- DEVTO=https://dev.to/
- UMAMI_WEBSITE_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
- UMAMI_APP_URL=https://your-umami-app.com
- BUTTON_ORDER=YOUTUBE,TWITCH,TWITTER,GITHUB,INSTAGRAM,DISCORD,FACEBOOK,TIKTOK,KIT,PATREON # use ENV variable names for order, listed buttons will be boosted to the top
- PAYPAL=https://www.paypal.me/user
- SLACK=https://slack.com/
ports:
- 8480:3000
restart: unless-stopped
security_opt:
- no-new-privileges:true
Or deploy it directly from the source:
git clone https://github.com/xneo1/portainer_templates
cd portainer_templates
docker compose -f Template/Stack/littlelink.yml up -dMore install options in our documentation, or see techno-tim/littlelink-server for app-specific guidance.
🔗 LittleLink-Server
LittleLink-Server is a lightweight, self-hosted link page for publishing a profile, avatar, social links, custom buttons, metadata, analytics, and health checks from environment variables.It is inspired by LittleLink and built with Next.js, React, and TypeScript. The container image uses Next.js standalone output so the production runtime stays small and only includes the files needed to serve the app.

👇 What is LittleLink-Server?
LittleLink-Server takes the same simple approach as LittleLink and packages it as a configurable Node.js application. Pass environment variables to control page metadata, theme, profile content, social links, custom buttons, analytics providers, and health check behavior.Configuration is evaluated at request time. Rebuilds are not required when environment values change, but containers should be restarted so the running process receives the new values.
Developer Setup
Prerequisites
- Node.js 24 or later
- Yarn Classic 1.22.x
Commands
# Install dependencies
yarn install
# Start development server with hot reload
yarn dev
# Run type checking
yarn typecheck
# Run tests
yarn test
# Run lint, style, markdown, type, and unit test checks
yarn ci
# Build for production
yarn build
# Start production server
yarn start
# Run Playwright e2e tests
yarn test:e2eFile conventions
This project uses TypeScript. The file extension tells you what the file contains:.tsfor code without JSX (server, configuration, utilities).tsxfor React components and tests that contain JSX
If you use VS Code, set the workspace TypeScript version:
- Open any
.tsor.tsxfile. - Click the TypeScript version in the bottom-right status bar.
- Select Use Workspace Version (the one listed next to
node_modules/typescript).
For contribution workflow, validation, and button guidance, see CONTRIBUTING.md.
Runtime configuration
Environment values are always strings and are read at request time, not at build time. NoNEXT_PUBLIC_ prefix or env block is needed. Changes take effect after a container restart without rebuilding the image.Sitemap
LittleLink-Server exposes/sitemap.xml when OG_URL is configured and META_INDEX_STATUS allows indexing. The sitemap contains the single public profile URL and is generated at request time from environment variables.OG_URL=https://links.example.com
META_INDEX_STATUS=allIf
OG_URL is not set, or META_INDEX_STATUS contains noindex, /sitemap.xml returns 404.Robots
LittleLink-Server generates/robots.txt at request time. By default, META_INDEX_STATUS=all allows crawling and adds a sitemap link when OG_URL is configured. Missing or noindex metadata disallows crawling.META_INDEX_STATUS=all
OG_URL=https://links.example.comUse
ROBOTS_ADDITIONAL_RULES to append crawler-specific rules. Escaped \n sequences are converted to new lines, which works well in container environment variables.ROBOTS_ADDITIONAL_RULES=User-agent: GPTBot\nDisallow: /\n\nUser-agent: Googlebot\nDisallow: /Use
ROBOTS_TXT when you need to replace the generated file entirely.ROBOTS_TXT=User-agent: *\nDisallow: /privateDocker build
docker build -t littlelink-server .
docker run -p 8080:3000 littlelink-serverContributing
For local setup, validation, pull requests, and button contribution guidance, see CONTRIBUTING.md.License
LittleLink-Server is licensed under the MIT License.Customizing LittleLink-Server is as easy as passing in environment variables. For a walkthrough, see this video, or view a live example at links.technotim.com.
⭐ Features
- Over 60+ brand buttons with more able to be requested
- Customisable themes
- Analytics Support
- Health Check Support
- A fully customisable Docker Compose setup
🚀 Getting Started
Check the docker-compose.yml file for all supported buttons and configuration!The example below will generate a site exactly like
Using Docker-Compose
version: "3.0"
services:
littlelink-server:
image: ghcr.io/timothystewart6/littlelink-server:latest
# dockerhub is also supported timothystewart6/littlelink-server
# image: timothystewart6/littlelink-server:latest
container_name: littlelink-server
environment:
- META_TITLE=Techno Tim
- META_DESCRIPTION=Software Engineer | Gamer | Twitch Streamer | Content Creator on YouTube | Homelab | 🇺🇸 🇯🇵 | Full Nerd
- META_AUTHOR=Techno Tim
- META_KEYWORDS=HomeLab, HTML, CSS, Engineering
- LANG=en
- META_INDEX_STATUS=all
- OG_SITE_NAME=Techno Tim
- OG_TITLE=Techno Tim
- OG_DESCRIPTION=The home of Techno Tim
- OG_URL=https://technotim.com
- OG_IMAGE=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_400x400.jpg
- OG_IMAGE_WIDTH=400
- OG_IMAGE_HEIGHT=400
- GA_TRACKING_ID=G-XXXXXXXXXX
- THEME=Dark
- FAVICON_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_200x200.jpg
- AVATAR_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_200x200.jpg
- AVATAR_2X_URL=https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_400x400.jpg
- AVATAR_ALT=Techno Tim Profile Pic
- NAME=TechnoTim
- BIO=Software Engineer | Gamer | Twitch Streamer | Content Creator on YouTube | Homelab | 🇺🇸 🇯🇵 | Full Nerd
# use ENV variable names for order, listed buttons will be boosted to the top
- BUTTON_ORDER=YOUTUBE,TWITCH,TWITTER,GITHUB,INSTAGRAM,LINKED_IN,DISCORD,FACEBOOK,TIKTOK,PATREON,GEAR,DOCUMENTATION
# you can render an unlimited amount of custom buttons by adding
# the CUSTOM_BUTTON_* variables and by using a comma as a separator.
- CUSTOM_BUTTON_TEXT=Documentation,Recommended Gear
- CUSTOM_BUTTON_URL=https://l.technotim.com/docs,https://l.technotim.com/gear
- CUSTOM_BUTTON_COLOR=#000000,#000000
- CUSTOM_BUTTON_TEXT_COLOR=#ffffff,#ffffff
- CUSTOM_BUTTON_ALT_TEXT=Tech documentation site for my videos and more,Recommended Gear
- CUSTOM_BUTTON_NAME=DOCUMENTATION,GEAR
- CUSTOM_BUTTON_ICON=fas file-lines,fas gear
- GITHUB=https://l.technotim.com/github
- TWITTER=https://l.technotim.com/twitter
- INSTAGRAM=https://l.technotim.com/instagram
- LINKED_IN=https://l.technotim.com/linkedin
- YOUTUBE=https://l.technotim.com/subscribe
- TWITCH=https://l.technotim.com/twitch
- DISCORD=https://l.technotim.com/discord
- TIKTOK=https://l.technotim.com/tiktok
- FACEBOOK=https://l.technotim.com/facebook
- PATREON=https://l.technotim.com/patreon
- FOOTER=Techno Tim © 2022
ports:
- 8080:3000
restart: unless-stopped
security_opt:
- no-new-privileges:trueUsing Docker
docker run -d \
--name=littlelink-server \
-p 8080:3000 \
-e META_TITLE='Techno Tim' \
-e META_DESCRIPTION='Techno Tim Link page' \
-e META_AUTHOR='Techno Tim' \
-e META_KEYWORDS='HomeLab, HTML, CSS, Engineering' \
-e LANG=en \
-e META_INDEX_STATUS='noindex' \
-e THEME='Dark' \
-e FAVICON_URL='https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_200x200.jpg' \
-e AVATAR_URL='https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_200x200.jpg' \
-e AVATAR_2X_URL='https://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_400x400.jpg' \
-e AVATAR_ALT='Techno Tim Profile Pic' \
-e NAME='TechnoTim' \
-e BIO='Software Engineer | Gamer | Twitch Streamer | Content Creator on YouTube | Homelab | 🇺🇸 🇯🇵 | Full Nerd' \
-e GITHUB='https://l.technotim.com/github' \
-e TWITTER='https://l.technotim.com/twitter' \
-e INSTAGRAM='https://www.instagram.com/techno.tim' \
-e LINKED_IN='https://l.technotim.com/linkedin' \
-e YOUTUBE='https://l.technotim.com/subscribe' \
-e TWITCH='https://l.technotim.com/twitch' \
-e DISCORD='https://l.technotim.com/discord' \
-e TIKTOK='https://l.technotim.com/discord' \
-e KIT='https://l.technotim.com/gear' \
-e FOOTER=Techno Tim © 2022 \
--restart unless-stopped \
ghcr.io/timothystewart6/littlelink-server:latestUsing Kubernetes
Unofficial helm chart provided by k8s-at-homehelm repo add k8s-at-home https://k8s-at-home.com/charts/
helm repo update
helm install littlelink-server \
--set env.TZ="America/New York" \
--set env.META_TITLE="TechnoTim"
k8s-at-home/littlelink-serverOr use a values.yaml file:
helm install littlelink-server k8s-at-home/littlelink-server -f values.yaml🔧 Configuration
See docs/analytics.md for analytics setup instructions and docs/healthcheck.md for health check configuration.Environment variables are read at request time, so changes take effect after a container restart without rebuilding the image.
Serve Littlelink Server on your own domain behind Caddy, Nginx or Traefik. Fill in your domain and copy the result. It's a starting point, some apps need their own base URL or extra headers set too.
Proxying littlelink-server.example.com to http://littlelink-server:3000
Add this to your Caddyfile
littlelink-server.example.com {
reverse_proxy http://littlelink-server:3000
}Check the logs first
Nine times out of ten the logs tell you exactly what went wrong.
- In Portainer, go to Containers, click the container, then Logs. Or run
docker logs <container> - Exit codes help too:
137means killed, usually out of memory.126or127means the command inside the image is broken.
Port already in use
If deployment fails with "Bind for 0.0.0.0:8480 failed: port is already allocated", something else on your server is using that port.
- Find what's using it:
sudo ss -tlnp | grep :8480 - Stop the other service, or pick a different host port. In
8480:3000only the left number is yours to change, the right one belongs to the app.
Running but the page won't load
The container is up but nothing appears in your browser.
- Use your server's real IP:
http://your-server-ip:8480. The 0.0.0.0 link Portainer shows isn't a real address. - Give it a minute after first deploy, littlelink-server can take a while to initialise.
- Make sure your firewall allows the port, e.g.
sudo ufw allow 8480
Image won't pull
Test the pull directly on the host: docker pull ghcr.io/techno-tim/littlelink-server:latest
- "manifest unknown" means the tag no longer exists. This template uses
latest, so try pinning a specific version instead. - "toomanyrequests" is the Docker Hub rate limit. Log in with
docker loginto raise it. - "no space left on device" means a full disk. Reclaim space with
docker system prune
"exec format error"
This means the image was built for a different CPU architecture than your server.
- This image supports:
amd64, arm64 - Check yours with
uname -m: x86_64 is amd64, aarch64 is arm64. Raspberry Pi and other ARM boards are the usual culprits.
Container keeps restarting
The unless-stopped restart policy relaunches the app after every crash, so the real error can scroll past.
- Check the logs right after a restart, the last few lines before it died are the useful ones.
- Get the exit code with
docker inspect <container> --format '{{.State.ExitCode}}' - Still stuck? Redeploy once with the restart policy set to
noso the failure stays visible.
Stack won't deploy
Compose stacks fail fast on small mistakes, and Portainer shows the reason just above the editor.
- YAML only accepts spaces for indentation, a single tab breaks the whole file.
Raise an issue
Found something which isn't working as it should? Here's how to report it.
- Bug within the app: Open an issue on techno-tim/littlelink-server
- Template not working: Open an issue on xneo1/portainer_templates
- This website not working: Open an issue on lissy93/portainer-templates
A Compose stack
Littlelink Server is a Compose stack, a set of containers defined in one file and brought up together by Portainer, then started and stopped as a single app.
The app image
An image is the app packed up ready to go, everything Littlelink Server needs bundled into one download. This template pulls ghcr.io/techno-tim/littlelink-server:latest, which Docker fetches once (about 53 MB) and then starts your own copy from.
Where the image comes from
Docker pulls its images from registries, public libraries of ready-built apps. Littlelink Server's comes from the GitHub Container Registry, published by techno-tim.
Version tags
The bit after the colon in the image name is the version tag. Here it's latest, which always points at the newest build, so a redeploy can bump you to a newer release without you asking. Pin a specific tag if you would rather stay on one version.
Which machines it runs on
Every image is built for particular CPU types. This one ships for amd64, arm64, so it runs on both regular x86 servers and ARM boards like a Raspberry Pi.
Ports
A port is the door the app answers on. A mapping like 8480:3000 means it's reachable on port 8480 of your server, where the left number is yours to change and the right one belongs to the app. Once it's running, open http://your-server-ip:8480 in a browser. It opens:
8480:3000, likely the web interface
No stored data
This template doesn't mount any storage, so whatever Littlelink Server writes stays inside the container and is wiped if it's recreated or updated. That's fine for something stateless, but add a volume before trusting it with anything you want to keep.
Environment variables
Environment variables are the settings you hand over when you deploy, things like a password or a timezone. Littlelink Server takes 58 of them, all with defaults you can leave alone or tweak:
META_TITLE, defaults toPUTYOURNAMEHEREMETA_DESCRIPTION, defaults toNAME pageMETA_AUTHOR, defaults toPUTYOURNAMEHERELANG, defaults toenMETA_INDEX_STATUS, defaults toallGA_TRACKING_ID, defaults toG-XXXXXXXXXXTHEME, defaults toDarkFAVICON_URL, defaults tohttps://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_200x200.jpgAVATAR_URL, defaults tohttps://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_200x200.jpgAVATAR_2X_URL, defaults tohttps://pbs.twimg.com/profile_images/1286144221217316864/qIAsKOpB_400x400.jpgAVATAR_ALT, defaults toPUTYOURNAMEHERE Profile PicNAME, defaults toPUTYOURNAMEHEREBIO, defaults toHey! Just a place where you can connect with me!FOOTER, defaults toThanks for stopping by!GITHUB, defaults tohttps://github.com/TWITTER, defaults tohttps://twitter.com/INSTAGRAM, defaults tohttps://www.instagram.com/YOUTUBE, defaults tohttps://www.youtube.com/TWITCH, defaults tohttps://www.twitch.tvDISCORD, defaults tohttps://discord.gg/TIKTOK, defaults tohttps://www.tiktok.com/KIT, defaults tohttps://kit.co/FACEBOOK, defaults tohttps://facebook.comFACEBOOK_MESSENGER, defaults tohttps://facebook.comLINKED_IN, defaults tohttps://linkedin.comPRODUCT_HUNT, defaults tohttps://www.producthunt.com/SNAPCHAT, defaults tohttps://www.snapchat.com/SPOTIFY, defaults tohttps://www.spotify.com/REDDIT, defaults tohttps://www.reddit.com/MEDIUM, defaults tohttps://medium.comPINTEREST, defaults tohttps://www.pinterest.com/EMAIL, defaults to[email protected]EMAIL_TEXT, defaults toEmail Me!EMAIL_ALT, defaults to[email protected]EMAIL_ALT_TEXT, defaults toEmail me!SOUND_CLOUD, defaults tohttps://soundcloud.comFIGMA, defaults tohttps://figma.comTELEGRAM, defaults tohttps://telegram.org/TUMBLR, defaults tohttps://www.tumblr.com/STEAM, defaults tohttps://steamcommunity.com/VIMEO, defaults tohttps://vimeo.com/WORDPRESS, defaults tohttps://wordpress.com/GOODREADS, defaults tohttps://www.goodreads.com/SKOOB, defaults tohttps://www.skoob.com.br/LETTERBOXD, defaults tohttps://letterboxd.com/MASTODON, defaults tohttps://mastodon.social/MICRO_BLOG, defaults tohttps://micro.blog/WHATSAPP, defaults tohttps://www.whatsapp.com/STRAVA, defaults tohttps://www.strava.com/BUYMEACOFFEE, defaults tohttps://www.buymeacoffee.com/GITLAB, defaults tohttps://www.gitlab.com/PATREON, defaults tohttps://www.patreon.com/technotimDEVTO, defaults tohttps://dev.to/UMAMI_WEBSITE_ID, defaults toxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxUMAMI_APP_URL, defaults tohttps://your-umami-app.comBUTTON_ORDER, defaults toYOUTUBE,TWITCH,TWITTER,GITHUB,INSTAGRAM,DISCORD,FACEBOOK,TIKTOK,KIT,PATREONPAYPAL, defaults tohttps://www.paypal.me/userSLACK, defaults tohttps://slack.com/
Restart policy
The restart policy here is unless-stopped, so Docker restarts Littlelink Server after a crash or reboot, but leaves it off when you stop it on purpose. You can change this on the deploy screen. The choices are no (never restart), on-failure (only after a crash), unless-stopped (restart unless you stop it), and always (bring it back no matter what).
Networking
Nothing custom is set, so Littlelink Server sits on Docker's default bridge network: its own private space that reaches the outside world only through the ports it publishes.
Container name
Once it's deployed, Portainer names the container littlelink-server. That's what you'll spot in the containers list and use in commands like docker logs littlelink-server.
Platform
The platform is linux, the kind of system the container is built to run on. Docker and Portainer handle this on a normal Linux server.
Open source license
Littlelink Server is open source, released under the MIT license. In plain terms the code is out in the open, so you're free to run it and change it to fit what you need.
Portainer app templates
Zooming out, this whole page comes from a Portainer app template: a short recipe telling Portainer how to set Littlelink Server up. Add the template list to Portainer once, then deploying Littlelink Server is a click rather than a wall of config.