15 Commits
v3.7.0 ... main

Author SHA1 Message Date
dd531c3edd Dateien nach "images" hochladen 2026-01-15 23:05:39 +00:00
e3af6bf4ba shortened to needed links; added link to gitea 2026-01-15 23:32:58 +01:00
530f660fd3 added style definition for Gitea-Button 2026-01-15 23:32:22 +01:00
deba1fb661 no larger avatar available 2026-01-15 23:15:51 +01:00
15cd5b73db remove docker; published on IPFS only 2026-01-15 22:45:17 +01:00
88d81c2761 images/icons/gitea.svg aktualisiert 2026-01-15 21:36:36 +00:00
fa6b5bbca6 Gitea-Logo 2026-01-15 21:35:10 +00:00
3420b21af2 index.html aktualisiert 2026-01-15 21:26:15 +00:00
eadefb4a18 index.html aktualisiert 2026-01-15 21:25:54 +00:00
c5e3f4f405 privacy.html gelöscht
Keine Datenschutzinformationen benötigt, da die Linksammlung über IPFS veröffentlicht wird.
2026-01-15 21:24:15 +00:00
Seth Cottle
de91cb0529 Merge pull request #161 from majal/main
Remove executable bit from unsplash.svg
2025-07-25 12:54:51 -04:00
majal
843e447c19 chmod -x unsplash.svg 2025-07-17 20:57:44 +08:00
Seth Cottle
18aa49a2a3 Merge pull request #158 from luclis/lint
Lint
2025-06-29 21:20:14 -04:00
Lucas FILIPPI
40d31c7e9c Lint with pre-commit. 2025-05-30 23:53:35 +02:00
Lucas FILIPPI
504bb49748 Add pre-commit. 2025-05-30 23:53:35 +02:00
20 changed files with 132 additions and 802 deletions

2
.github/FUNDING.yml vendored
View File

@@ -3,4 +3,4 @@
github: sethcottle github: sethcottle
patreon: sethcottle patreon: sethcottle
ko_fi: sethcottle ko_fi: sethcottle
custom: [https://buymeacoffee.com/seth, https://paypal.me/sethcottle] custom: ["https://buymeacoffee.com/seth", "https://paypal.me/sethcottle"]

View File

@@ -39,4 +39,4 @@ Please confirm that you've met the following criteria before submitting your con
--- ---
## 🚀 Additional Notes ## 🚀 Additional Notes
<!-- Add any other information that might help the reviewer understand the changes better (e.g., source of logo, special handling, etc.). --> <!-- Add any other information that might help the reviewer understand the changes better (e.g., source of logo, special handling, etc.). -->

View File

@@ -13,36 +13,36 @@ jobs:
uses: actions/checkout@v3 uses: actions/checkout@v3
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Setup for PR comparison - name: Setup for PR comparison
run: | run: |
echo "Fetching base branch for comparison" echo "Fetching base branch for comparison"
git fetch origin ${{ github.base_ref }} git fetch origin ${{ github.base_ref }}
- name: Contrast Check (Review Me) - name: Contrast Check (Review Me)
run: | run: |
cat > contrast-check.sh << 'EOF' cat > contrast-check.sh << 'EOF'
#!/bin/bash #!/bin/bash
# WCAG Minimum Contrast Ratio # WCAG Minimum Contrast Ratio
MIN_CONTRAST=4.5 MIN_CONTRAST=4.5
FAILED=0 FAILED=0
ALL_RESOLVED=1 ALL_RESOLVED=1
NEEDS_MANUAL_REVIEW=0 NEEDS_MANUAL_REVIEW=0
# Only get buttons that were modified in the PR # Only get buttons that were modified in the PR
echo "Finding changed button styles..." echo "Finding changed button styles..."
BUTTON_CLASSES=$(git diff origin/$GITHUB_BASE_REF -- css/brands.css | grep -E "^\+.*\.button-[a-zA-Z0-9]+" | sed -E 's/.*\.button-([a-zA-Z0-9]+).*/\1/' | sort -u) BUTTON_CLASSES=$(git diff origin/$GITHUB_BASE_REF -- css/brands.css | grep -E "^\+.*\.button-[a-zA-Z0-9]+" | sed -E 's/.*\.button-([a-zA-Z0-9]+).*/\1/' | sort -u)
if [[ -z "$BUTTON_CLASSES" ]]; then if [[ -z "$BUTTON_CLASSES" ]]; then
echo "✅ No button changes to check." echo "✅ No button changes to check."
exit 0 exit 0
fi fi
echo "Found button classes to check: $BUTTON_CLASSES" echo "Found button classes to check: $BUTTON_CLASSES"
echo "🔍 Auditing CSS for contrast issues..." echo "🔍 Auditing CSS for contrast issues..."
# Function to normalize hex colors to lowercase # Function to normalize hex colors to lowercase
normalize_color() { normalize_color() {
local color="$1" local color="$1"
@@ -52,56 +52,56 @@ jobs:
echo "" echo ""
fi fi
} }
# Function to calculate luminance # Function to calculate luminance
get_luminance() { get_luminance() {
local color="$1" local color="$1"
if [[ -z "$color" || "$color" == "#" ]]; then if [[ -z "$color" || "$color" == "#" ]]; then
echo 0 echo 0
return return
fi fi
color="${color#'#'}" color="${color#'#'}"
if [[ ${#color} -ne 6 ]]; then if [[ ${#color} -ne 6 ]]; then
echo 0 echo 0
return return
fi fi
r=$(printf "%d" 0x${color:0:2} 2>/dev/null || echo 0) r=$(printf "%d" 0x${color:0:2} 2>/dev/null || echo 0)
g=$(printf "%d" 0x${color:2:2} 2>/dev/null || echo 0) g=$(printf "%d" 0x${color:2:2} 2>/dev/null || echo 0)
b=$(printf "%d" 0x${color:4:2} 2>/dev/null || echo 0) b=$(printf "%d" 0x${color:4:2} 2>/dev/null || echo 0)
r=$(awk "BEGIN { print ($r/255 <= 0.03928) ? ($r/255)/12.92 : ((($r/255) + 0.055)/1.055) ^ 2.4 }") r=$(awk "BEGIN { print ($r/255 <= 0.03928) ? ($r/255)/12.92 : ((($r/255) + 0.055)/1.055) ^ 2.4 }")
g=$(awk "BEGIN { print ($g/255 <= 0.03928) ? ($g/255)/12.92 : ((($g/255) + 0.055)/1.055) ^ 2.4 }") g=$(awk "BEGIN { print ($g/255 <= 0.03928) ? ($g/255)/12.92 : ((($g/255) + 0.055)/1.055) ^ 2.4 }")
b=$(awk "BEGIN { print ($b/255 <= 0.03928) ? ($b/255)/12.92 : ((($b/255) + 0.055)/1.055) ^ 2.4 }") b=$(awk "BEGIN { print ($b/255 <= 0.03928) ? ($b/255)/12.92 : ((($b/255) + 0.055)/1.055) ^ 2.4 }")
echo $(awk "BEGIN { print (0.2126 * $r) + (0.7152 * $g) + (0.0722 * $b) }") echo $(awk "BEGIN { print (0.2126 * $r) + (0.7152 * $g) + (0.0722 * $b) }")
} }
# Function to calculate contrast ratio # Function to calculate contrast ratio
get_contrast_ratio() { get_contrast_ratio() {
local lum1=$(get_luminance "$1") local lum1=$(get_luminance "$1")
local lum2=$(get_luminance "$2") local lum2=$(get_luminance "$2")
if [[ -z "$lum1" || -z "$lum2" ]]; then if [[ -z "$lum1" || -z "$lum2" ]]; then
echo 0 echo 0
return return
fi fi
if (( $(awk "BEGIN { print ($lum1 > $lum2) ? 1 : 0 }") )); then if (( $(awk "BEGIN { print ($lum1 > $lum2) ? 1 : 0 }") )); then
awk "BEGIN { printf \"%.5f\", ($lum1 + 0.05) / ($lum2 + 0.05) }" awk "BEGIN { printf \"%.5f\", ($lum1 + 0.05) / ($lum2 + 0.05) }"
else else
awk "BEGIN { printf \"%.5f\", ($lum2 + 0.05) / ($lum1 + 0.05) }" awk "BEGIN { printf \"%.5f\", ($lum2 + 0.05) / ($lum1 + 0.05) }"
fi fi
} }
# Function to extract hex color # Function to extract hex color
extract_color() { extract_color() {
local input="$1" local input="$1"
local color="" local color=""
if [[ "$input" =~ "#[0-9a-fA-F]{6}" ]]; then if [[ "$input" =~ "#[0-9a-fA-F]{6}" ]]; then
color=$(echo "$input" | grep -o "#[0-9a-fA-F]\{6\}") color=$(echo "$input" | grep -o "#[0-9a-fA-F]\{6\}")
elif [[ "$input" =~ "1px solid #" ]]; then elif [[ "$input" =~ "1px solid #" ]]; then
@@ -111,11 +111,11 @@ jobs:
elif [[ "$input" =~ "#" ]]; then elif [[ "$input" =~ "#" ]]; then
color=$(echo "$input" | grep -o "#[0-9a-fA-F]*" | head -1) color=$(echo "$input" | grep -o "#[0-9a-fA-F]*" | head -1)
fi fi
# Return normalized (lowercase) hex color # Return normalized (lowercase) hex color
normalize_color "$color" normalize_color "$color"
} }
# Check contrast # Check contrast
check_contrast() { check_contrast() {
local text_color="$1" local text_color="$1"
@@ -126,25 +126,25 @@ jobs:
local is_background_check="$6" local is_background_check="$6"
local button_name="$7" local button_name="$7"
local check_failed=0 local check_failed=0
# Normalize all colors to lowercase for comparison # Normalize all colors to lowercase for comparison
text_color=$(normalize_color "$text_color") text_color=$(normalize_color "$text_color")
background_color=$(normalize_color "$background_color") background_color=$(normalize_color "$background_color")
border_color=$(normalize_color "$border_color") border_color=$(normalize_color "$border_color")
recommend_stroke=$(normalize_color "$recommend_stroke") recommend_stroke=$(normalize_color "$recommend_stroke")
if [[ -z "$text_color" || -z "$background_color" ]]; then if [[ -z "$text_color" || -z "$background_color" ]]; then
return 0 return 0
fi fi
local contrast_ratio=$(get_contrast_ratio "$text_color" "$background_color") local contrast_ratio=$(get_contrast_ratio "$text_color" "$background_color")
if [[ -z "$contrast_ratio" ]]; then if [[ -z "$contrast_ratio" ]]; then
contrast_ratio=0 contrast_ratio=0
fi fi
contrast_ratio=$(printf "%.2f" "$contrast_ratio") contrast_ratio=$(printf "%.2f" "$contrast_ratio")
# Case-insensitive comparison for hex colors # Case-insensitive comparison for hex colors
if (( $(awk "BEGIN { print ($contrast_ratio < $MIN_CONTRAST) ? 1 : 0 }") )); then if (( $(awk "BEGIN { print ($contrast_ratio < $MIN_CONTRAST) ? 1 : 0 }") )); then
if [[ -n "$border_color" && "$border_color" == "$recommend_stroke" && "$is_background_check" -eq 1 ]]; then if [[ -n "$border_color" && "$border_color" == "$recommend_stroke" && "$is_background_check" -eq 1 ]]; then
@@ -159,70 +159,70 @@ jobs:
echo "✅ [$context → $button_name] Contrast ratio $contrast_ratio passes WCAG" echo "✅ [$context → $button_name] Contrast ratio $contrast_ratio passes WCAG"
check_failed=0 check_failed=0
fi fi
return $check_failed return $check_failed
} }
# For each button class, check its properties # For each button class, check its properties
for button_class in $BUTTON_CLASSES; do for button_class in $BUTTON_CLASSES; do
echo "Checking button: $button_class" echo "Checking button: $button_class"
# Extract button section # Extract button section
# Avoid partial matches # Avoid partial matches
button_start=$(grep -n "\.button-$button_class\( \|{\)" css/brands.css | cut -d: -f1) button_start=$(grep -n "\.button-$button_class\( \|{\)" css/brands.css | cut -d: -f1)
if [[ -z "$button_start" ]]; then if [[ -z "$button_start" ]]; then
button_start=$(grep -n "\.button-$button_class$" css/brands.css | cut -d: -f1) button_start=$(grep -n "\.button-$button_class$" css/brands.css | cut -d: -f1)
fi fi
if [[ -z "$button_start" ]]; then if [[ -z "$button_start" ]]; then
echo "Could not find button-$button_class in css/brands.css" echo "Could not find button-$button_class in css/brands.css"
continue continue
fi fi
# Look for the next closing bracket # Look for the next closing bracket
button_end=$(tail -n +$button_start css/brands.css | grep -n "}" | head -1 | cut -d: -f1) button_end=$(tail -n +$button_start css/brands.css | grep -n "}" | head -1 | cut -d: -f1)
if [[ -z "$button_end" ]]; then if [[ -z "$button_end" ]]; then
button_end=10 button_end=10
fi fi
button_section=$(tail -n +$button_start css/brands.css | head -n $button_end) button_section=$(tail -n +$button_start css/brands.css | head -n $button_end)
# Check for gradient # Check for gradient
if echo "$button_section" | grep -q "background-image"; then if echo "$button_section" | grep -q "background-image"; then
echo "🚩 [./css/brands.css → $button_class] Detected gradient background → Flagging for manual review." echo "🚩 [./css/brands.css → $button_class] Detected gradient background → Flagging for manual review."
NEEDS_MANUAL_REVIEW=1 NEEDS_MANUAL_REVIEW=1
continue continue
fi fi
# Extract colors # Extract colors
text_color=$(echo "$button_section" | grep "button-text" | grep -o "#[0-9A-Fa-f]*") text_color=$(echo "$button_section" | grep "button-text" | grep -o "#[0-9A-Fa-f]*")
bg_color=$(echo "$button_section" | grep "button-background" | grep -o "#[0-9A-Fa-f]*") bg_color=$(echo "$button_section" | grep "button-background" | grep -o "#[0-9A-Fa-f]*")
border_color=$(extract_color "$(echo "$button_section" | grep "button-border")") border_color=$(extract_color "$(echo "$button_section" | grep "button-border")")
button_failed=0 button_failed=0
# Check text vs background # Check text vs background
if [[ -n "$text_color" && -n "$bg_color" ]]; then if [[ -n "$text_color" && -n "$bg_color" ]]; then
check_contrast "$text_color" "$bg_color" "TEXT vs BUTTON" "$border_color" "" 0 "$button_class" check_contrast "$text_color" "$bg_color" "TEXT vs BUTTON" "$border_color" "" 0 "$button_class"
button_failed=$((button_failed | $?)) button_failed=$((button_failed | $?))
fi fi
# Check button vs light theme # Check button vs light theme
if [[ -n "$bg_color" ]]; then if [[ -n "$bg_color" ]]; then
check_contrast "#ffffff" "$bg_color" "BUTTON vs LIGHT THEME" "$border_color" "#000000" 1 "$button_class" check_contrast "#ffffff" "$bg_color" "BUTTON vs LIGHT THEME" "$border_color" "#000000" 1 "$button_class"
button_failed=$((button_failed | $?)) button_failed=$((button_failed | $?))
# Check button vs dark theme # Check button vs dark theme
check_contrast "#121212" "$bg_color" "BUTTON vs DARK THEME" "$border_color" "#ffffff" 1 "$button_class" check_contrast "#121212" "$bg_color" "BUTTON vs DARK THEME" "$border_color" "#ffffff" 1 "$button_class"
button_failed=$((button_failed | $?)) button_failed=$((button_failed | $?))
fi fi
if [[ $button_failed -eq 1 ]]; then if [[ $button_failed -eq 1 ]]; then
FAILED=1 FAILED=1
ALL_RESOLVED=0 ALL_RESOLVED=0
fi fi
done done
# Final report # Final report
if [[ "$NEEDS_MANUAL_REVIEW" -eq 1 ]]; then if [[ "$NEEDS_MANUAL_REVIEW" -eq 1 ]]; then
echo "⚠️ Manual review required for gradients!" echo "⚠️ Manual review required for gradients!"
@@ -235,7 +235,7 @@ jobs:
exit 1 exit 1
fi fi
EOF EOF
chmod +x contrast-check.sh chmod +x contrast-check.sh
./contrast-check.sh ./contrast-check.sh
env: env:

2
.gitignore vendored
View File

@@ -1,3 +1,3 @@
.DS_Store .DS_Store
.idea .idea
.devcontainer .devcontainer

20
.pre-commit-config.yaml Normal file
View File

@@ -0,0 +1,20 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
hooks:
- id: trailing-whitespace
args: ["--markdown-linebreak-ext=md,markdown"]
exclude: \.svg$
- id: end-of-file-fixer
exclude: \.svg$
- id: check-yaml
- id: double-quote-string-fixer
exclude: \.svg$
- repo: https://github.com/gitleaks/gitleaks
rev: v8.26.0
hooks:
- id: gitleaks
- repo: https://github.com/thoughtworks/talisman
rev: v1.37.0
hooks:
- id: talisman-commit

View File

@@ -1,7 +1,7 @@
![Logo](https://cdn.cottle.cloud/GitHub/LittleLink/littlelink.gif) ![Logo](https://cdn.cottle.cloud/GitHub/LittleLink/littlelink.gif)
# LittleLink # LittleLink
The DIY self-hosted LinkTree alternative. LittleLink has more than 100 branded button styles you can easily use, with more regularly added by our community in this repo and in [LittleLink Extended](https://github.com/sethcottle/littlelink-extended). The DIY self-hosted LinkTree alternative. LittleLink has more than 100 branded button styles you can easily use, with more regularly added by our community in this repo and in [LittleLink Extended](https://github.com/sethcottle/littlelink-extended).
--- ---
### 🆕 LittleLink Button Builder ### 🆕 LittleLink Button Builder

View File

@@ -16,7 +16,7 @@
### v3.4.0 - 3/04/2025 ### v3.4.0 - 3/04/2025
- Added Matrix - Added Matrix
### v3.3.0 - 03/01/2025 ### v3.3.0 - 03/01/2025
- Updated Facebook Logo - Updated Facebook Logo
- Updated Messenger Logo - Updated Messenger Logo
@@ -28,7 +28,7 @@
### v3.1.1 - 1/28/2025 ### v3.1.1 - 1/28/2025
- Fixed the alt text for Obsidian (`PR #138` / `@timtjtim`) - Fixed the alt text for Obsidian (`PR #138` / `@timtjtim`)
### v3.1.0 - 1/20/2025 ### v3.1.0 - 1/20/2025
- Added alternate YouTube button (`PR #138` / `@Omikorin`) - Added alternate YouTube button (`PR #138` / `@Omikorin`)
- Fixed `index.html` accessibilty issues (`PR #137` / `@rosahaj`) - Fixed `index.html` accessibilty issues (`PR #137` / `@rosahaj`)

View File

@@ -227,6 +227,12 @@
--button-background:#6151b2; --button-background:#6151b2;
} }
/* Gitea */
.button-gitea {
--button-text:#ffffff;
--button-background:#609926;
}
/* GoFundMe */ /* GoFundMe */
.button-gofundme { .button-gofundme {
--button-text:#ffffff; --button-text:#ffffff;
@@ -630,4 +636,4 @@
--button-text:#ffffff; --button-text:#ffffff;
--button-background:#0B5CFF; --button-background:#0B5CFF;
--button-border:1px solid #FFFFFF; --button-border:1px solid #FFFFFF;
} }

View File

@@ -88,4 +88,4 @@ select {
/* Remove touch callout on iOS */ /* Remove touch callout on iOS */
a { a {
-webkit-touch-callout: none; -webkit-touch-callout: none;
} }

View File

@@ -100,7 +100,7 @@
--scale-3:1.953rem; /* 31px */ --scale-3:1.953rem; /* 31px */
--scale-4:2.441rem; /* 39px */ --scale-4:2.441rem; /* 39px */
--scale-5:3.052rem; /* 49px */ --scale-5:3.052rem; /* 49px */
/* Spacing units */ /* Spacing units */
--spacing-xs:0.5rem; /* 8px */ --spacing-xs:0.5rem; /* 8px */
--spacing-s:1rem; /* 16px */ --spacing-s:1rem; /* 16px */
@@ -237,7 +237,7 @@ a:hover {
.avatar--rounded { .avatar--rounded {
border-radius: 50%; border-radius: 50%;
} }
/* Modifier for slightly rounded corners */ /* Modifier for slightly rounded corners */
.avatar--soft { .avatar--soft {
border-radius: 0.5rem; /* 8px rounded corners */ border-radius: 0.5rem; /* 8px rounded corners */
@@ -246,7 +246,7 @@ a:hover {
/* Theme System /* Theme System
*/ */
/* Light theme is default above */ /* Light theme is default above */
/* Dark theme */ /* Dark theme */
:root.theme-dark { :root.theme-dark {
color-scheme:dark; color-scheme:dark;

View File

@@ -1,46 +0,0 @@
# Include any files or directories that you don't want to be copied to your
# container here (e.g., local build artifacts, temporary files, etc.).
#
# For more help, visit the .dockerignore file reference guide at
# https://docs.docker.com/go/build-context-dockerignore/
# Git
.git
.github
.gitignore
# Docker
.dockerignore
docker-compose*
compose.yaml
# Logs
*.log
# Editor directories and files
.idea
.vscode
**/.DS_Store
# Documentation files
README*
LICENSE*
VERSION*
CONTRIBUTING*
# Exclude unnecessary files
**/__pycache__
**/.venv
**/bin
**/obj
**/charts
**/.env
**/secrets.dev.yaml
**/values.dev.yaml
# Keep only essential files for the static website
!index.html
!privacy.html
!css/
!images/
!fonts/

View File

@@ -1,35 +0,0 @@
FROM nginx:alpine
# Copy static website files
COPY . /usr/share/nginx/html/
# Configure nginx with basic optimization and logging to stdout/stderr
RUN echo 'server { \
listen 80; \
server_name localhost; \
root /usr/share/nginx/html; \
index index.html index.htm; \
\
# Enable access logging to stdout \
access_log /dev/stdout; \
error_log /dev/stderr; \
\
# Enable gzip compression \
gzip on; \
gzip_vary on; \
gzip_types text/plain text/css application/json application/javascript; \
\
# Basic cache settings \
location ~* \\.(?:css|js|jpg|jpeg|gif|png|ico|svg)$ { \
expires 7d; \
add_header Cache-Control "public"; \
} \
}' > /etc/nginx/conf.d/default.conf
# Forward nginx logs to Docker log collector
RUN ln -sf /dev/stdout /var/log/nginx/access.log && \
ln -sf /dev/stderr /var/log/nginx/error.log
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

View File

@@ -1,231 +0,0 @@
# Docker for LittleLink
Docker configuration to run LittleLink in a container.
## File Structure
- `Dockerfile`: Defines how the image is built using nginx:alpine
- `compose.yaml`: Configuration for Docker Compose with volumes for development
- `.dockerignore`: Excludes unnecessary files from the image
## Technical Details
### Base Image
- Uses `nginx:alpine` for minimal image size (~20MB)
- Includes gzip compression for static files
- Optimized cache configuration for CSS, JavaScript, and images
- Configured to forward nginx logs to Docker log collector
### Volumes and Ports
- Mounts the project root directory as a volume for live development
- Exposes port 80 in the container, mapped to 8080 on the host
## Common Use Cases
### Creating Personal Link Pages for Different People
One of the main advantages of this Docker setup is how easily you can create multiple personalized instances of LittleLink:
```bash
# Clone the repository
git clone https://github.com/sethcottle/littlelink.git littlelink-john
# Customize the content for John
cd littlelink-john
# Edit index.html with John's links, customize images, etc.
# Build a Docker image for John's page
docker build -f docker/Dockerfile -t littlelink-john .
# Run John's page on port 8080
docker run -d --name john-links -p 8080:80 littlelink-john
```
For additional pages:
```bash
# Similarly for another person
git clone https://github.com/sethcottle/littlelink.git littlelink-jane
cd littlelink-jane
# Customize for Jane...
# Build and run on a different port
docker build -f docker/Dockerfile -t littlelink-jane .
docker run -d --name jane-links -p 8081:80 littlelink-jane
```
This approach allows you to:
- Maintain separate customized sites for different people
- Run multiple instances on different ports
- Update each site independently
- Easily deploy to various environments
## Development vs. Production
There are two main ways to use Docker with LittleLink:
### Development Workflow
In development, we use Docker Compose with mounted volumes to allow for live editing:
```bash
# Start development environment
docker compose -f docker/compose.yaml up
```
This configuration:
- Mounts local files as a volume, so changes are reflected immediately
- Requires manual browser refresh to see changes
- Is ideal for testing and development
### Production Workflow
For production, you have two options:
#### Option 1: Production with Docker Compose
Create a production-specific docker-compose file:
```yaml
# docker/compose.prod.yaml
services:
web:
image: yourname/littlelink:latest
restart: always
ports:
- "8080:80"
# Optional volume for customizable content
volumes:
- /path/on/server/custom-content:/usr/share/nginx/html
```
Deploy using:
```bash
# Build and tag the image
docker build -f docker/Dockerfile -t yourname/littlelink:latest .
# Run in production with compose
docker compose -f docker/compose.prod.yaml up -d
```
#### Option 2: Production with Docker Run
```bash
# Build a production image
docker build -f docker/Dockerfile -t yourname/littlelink:latest .
# Run in production (no volumes mounted)
docker run -d --name littlelink -p 80:80 --restart always yourname/littlelink:latest
```
## Using Volumes in Production
You can customize the content in production by mounting a local directory:
```bash
# Prepare a directory with your custom content
mkdir -p /path/on/server/custom-content
cp -r index.html css/ images/ /path/on/server/custom-content/
# Run with the custom content mounted
docker run -d --name littlelink -p 80:80 \
-v /path/on/server/custom-content:/usr/share/nginx/html \
yourname/littlelink:latest
```
With Docker Compose:
```yaml
services:
web:
image: yourname/littlelink:latest
ports:
- "80:80"
volumes:
- /path/on/server/custom-content:/usr/share/nginx/html
```
This approach:
- Allows content customization without rebuilding the image
- Makes it easy to update content independently of the container
## Docker Commands Reference
### Development Commands
```bash
# Start in development mode
docker compose -f docker/compose.yaml up
# Start in background
docker compose -f docker/compose.yaml up -d
# Stop container
docker compose -f docker/compose.yaml down
# View logs (including HTTP request logs)
docker compose -f docker/compose.yaml logs -f
```
### Production Commands
```bash
# Build production image
docker build -f docker/Dockerfile -t yourname/littlelink:latest .
# Run production container
docker run -d --name littlelink -p 80:80 yourname/littlelink:latest
# View logs for the running container
docker logs -f littlelink
```
## Customization
### Change Port
Edit `docker/compose.yaml` for development:
```yaml
ports:
- "8081:80" # Change 8080 to desired port
```
Or specify port when running production container:
```bash
docker run -p 8081:80 yourname/littlelink:latest
```
### Additional nginx Configuration
To modify the nginx configuration, you can edit the `Dockerfile` and add your own configuration:
```dockerfile
# Example: add custom configuration
COPY docker/nginx.conf /etc/nginx/conf.d/default.conf
```
## Deploying to Production
### Docker on VPS
```bash
# Pull image
docker pull yourname/littlelink:latest
# Run container
docker run -d --name littlelink -p 80:80 yourname/littlelink:latest
# With restart policy for auto-recovery
docker run -d --name littlelink --restart unless-stopped -p 80:80 yourname/littlelink:latest
```
### Multiple Sites on One Server
You can run multiple LittleLink instances on the same server:
```bash
# Run first site on port 8080
docker run -d --name site1 -p 8080:80 littlelink-site1
# Run second site on port 8081
docker run -d --name site2 -p 8081:80 littlelink-site2
```

View File

@@ -1,10 +0,0 @@
services:
web:
build:
context: ..
dockerfile: docker/Dockerfile
ports:
- "8080:80"
volumes:
- ..:/usr/share/nginx/html
restart: unless-stopped

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 238 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

1
images/icons/gitea.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" viewBox="0 0 640 640" width="32" height="32"><path d="m395.9 484.2-126.9-61c-12.5-6-17.9-21.2-11.8-33.8l61-126.9c6-12.5 21.2-17.9 33.8-11.8 17.2 8.3 27.1 13 27.1 13l-.1-109.2 16.7-.1.1 117.1s57.4 24.2 83.1 40.1c3.7 2.3 10.2 6.8 12.9 14.4 2.1 6.1 2 13.1-1 19.3l-61 126.9c-6.2 12.7-21.4 18.1-33.9 12" style="fill:#fff"/><path d="M622.7 149.8c-4.1-4.1-9.6-4-9.6-4s-117.2 6.6-177.9 8c-13.3.3-26.5.6-39.6.7v117.2c-5.5-2.6-11.1-5.3-16.6-7.9 0-36.4-.1-109.2-.1-109.2-29 .4-89.2-2.2-89.2-2.2s-141.4-7.1-156.8-8.5c-9.8-.6-22.5-2.1-39 1.5-8.7 1.8-33.5 7.4-53.8 26.9C-4.9 212.4 6.6 276.2 8 285.8c1.7 11.7 6.9 44.2 31.7 72.5 45.8 56.1 144.4 54.8 144.4 54.8s12.1 28.9 30.6 55.5c25 33.1 50.7 58.9 75.7 62 63 0 188.9-.1 188.9-.1s12 .1 28.3-10.3c14-8.5 26.5-23.4 26.5-23.4S547 483 565 451.5c5.5-9.7 10.1-19.1 14.1-28 0 0 55.2-117.1 55.2-231.1-1.1-34.5-9.6-40.6-11.6-42.6M125.6 353.9c-25.9-8.5-36.9-18.7-36.9-18.7S69.6 321.8 60 295.4c-16.5-44.2-1.4-71.2-1.4-71.2s8.4-22.5 38.5-30c13.8-3.7 31-3.1 31-3.1s7.1 59.4 15.7 94.2c7.2 29.2 24.8 77.7 24.8 77.7s-26.1-3.1-43-9.1m300.3 107.6s-6.1 14.5-19.6 15.4c-5.8.4-10.3-1.2-10.3-1.2s-.3-.1-5.3-2.1l-112.9-55s-10.9-5.7-12.8-15.6c-2.2-8.1 2.7-18.1 2.7-18.1L322 273s4.8-9.7 12.2-13c.6-.3 2.3-1 4.5-1.5 8.1-2.1 18 2.8 18 2.8L467.4 315s12.6 5.7 15.3 16.2c1.9 7.4-.5 14-1.8 17.2-6.3 15.4-55 113.1-55 113.1" style="fill:#609926"/><path d="M326.8 380.1c-8.2.1-15.4 5.8-17.3 13.8s2 16.3 9.1 20c7.7 4 17.5 1.8 22.7-5.4 5.1-7.1 4.3-16.9-1.8-23.1l24-49.1c1.5.1 3.7.2 6.2-.5 4.1-.9 7.1-3.6 7.1-3.6 4.2 1.8 8.6 3.8 13.2 6.1 4.8 2.4 9.3 4.9 13.4 7.3.9.5 1.8 1.1 2.8 1.9 1.6 1.3 3.4 3.1 4.7 5.5 1.9 5.5-1.9 14.9-1.9 14.9-2.3 7.6-18.4 40.6-18.4 40.6-8.1-.2-15.3 5-17.7 12.5-2.6 8.1 1.1 17.3 8.9 21.3s17.4 1.7 22.5-5.3c5-6.8 4.6-16.3-1.1-22.6 1.9-3.7 3.7-7.4 5.6-11.3 5-10.4 13.5-30.4 13.5-30.4.9-1.7 5.7-10.3 2.7-21.3-2.5-11.4-12.6-16.7-12.6-16.7-12.2-7.9-29.2-15.2-29.2-15.2s0-4.1-1.1-7.1c-1.1-3.1-2.8-5.1-3.9-6.3 4.7-9.7 9.4-19.3 14.1-29-4.1-2-8.1-4-12.2-6.1-4.8 9.8-9.7 19.7-14.5 29.5-6.7-.1-12.9 3.5-16.1 9.4-3.4 6.3-2.7 14.1 1.9 19.8z" style="fill:#609926"/></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

0
images/icons/unsplash.svg Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 311 B

After

Width:  |  Height:  |  Size: 311 B

View File

@@ -1,43 +1,35 @@
<!DOCTYPE html> <!DOCTYPE html>
<!-- <!--
To change the theme, change the class on the html tag below to one of: To change the theme, change the class on the html tag below to one of:
- theme-auto: Automatically switches based on user's system preferences - theme-auto: Automatically switches based on user's system preferences
- theme-light: Forces light theme - theme-light: Forces light theme
- theme-dark: Forces dark theme - theme-dark: Forces dark theme
--> -->
<html class="theme-auto" lang="en"> <!-- Update`class="theme-auto" with your preference --> <html class="theme-auto" lang="de"> <!-- Update`class="theme-auto" with your preference -->
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Page Title - Change this to your name/brand (50-60 characters recommended) --> <title>SCHAUAUS Modellbau Linksammlung</title>
<title>LittleLink</title> <link rel="icon" type="image/x-icon" href="/images/avatar.png">
<link rel="icon" type="image/x-icon" href="/images/avatar.png"> <!-- Update this with your own favicon -->
<meta name="description" content="Linksammlung von der Modellbauabteilung der SCHAUAUS GmbH.">
<!-- Meta Description - Write a description (150-160 characters recommended) -->
<meta name="description" content="Replace this with your own, this appears in search results and when sharing."> <meta name="keywords" content="SCHAUAUS Modellbau, Modellbau, Elektronik, DIY, Selbstbau, Modellbahn, Modellautos, Steuerung">
<!-- Keywords -->
<meta name="keywords" content="your name, industry, and specialties">
<!-- Canonical URL - Helps prevent duplicate content issues --> <!-- Canonical URL - Helps prevent duplicate content issues -->
<meta rel="canonical" href="https://yourwebsite.com"> <meta rel="canonical" href="https://ipfs.schauaus.at/ipns/links.schauaus.at/">
<!-- Author Information --> <meta name="author" content="SCHAUAUS GmbH">
<meta name="author" content="Your Name">
<!-- Stylesheets --> <!-- Stylesheets -->
<link rel="stylesheet" href="css/reset.css"> <link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/style.css"> <link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/brands.css"> <link rel="stylesheet" href="css/brands.css">
<!-- LittleLink Extended Stylesheet (Optional) -->
<!-- <link rel="stylesheet" href="css/brands-extended.css"> -->
<!-- Learn more at https://github.com/sethcottle/littlelink-extended.
Remove comments if you've added LittleLink Extended dependencies -->
</head> </head>
@@ -46,7 +38,7 @@
<div class="container"> <div class="container">
<div class="column"> <div class="column">
<!-- <!--
By default, the Avatar is rounded. Use the following: By default, the Avatar is rounded. Use the following:
- avatar--rounded: Automatically rounds the image - avatar--rounded: Automatically rounds the image
- avatar--soft: Slightly rounds the image - avatar--soft: Slightly rounds the image
@@ -54,356 +46,73 @@
Be sure to replace the src with your own image path and update the alt text Be sure to replace the src with your own image path and update the alt text
--> -->
<img class="avatar avatar--rounded" src="images/avatar.png" srcset="images/avatar@2x.png 2x" alt="LittleLink"> <img class="avatar avatar--rounded" src="images/avatar.png" alt="SCHAUAUS Modellbau Avatar">
<!-- Replace with your name or brand --> <!-- Replace with your name or brand -->
<h1> <h1>
<div>LittleLink</div> <div>SCHAUAUS Modellbau</div>
</h1> </h1>
<!-- Add a short description about yourself or your brand --> <!-- Add a short description about yourself or your brand -->
<p>An open source DIY Linktree alternative.</p> <p>Hier sammeln wir alle Links zu unseren Projekten sowie Social Media Accounts.</p>
<!-- All your buttons go here --> <!-- All your buttons go here -->
<div class="button-stack" role="navigation"> <div class="button-stack" role="navigation">
<!-- Default LittleLink -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/littlelink.svg" alt="LittleLink Logo">LittleLink</a>
<!-- Amazon -->
<a class="button button-amazon" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/amazon.svg" alt="Amazon Wishlist Logo">Amazon Wishlist</a>
<!-- Amazon Music -->
<a class="button button-amazon-music" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/amazon-music.svg" alt="Amazon Music Logo">Listen on Amazon Music</a>
<!-- Apple App Store -->
<a class="button button-appstore" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/apple.svg" alt="Apple Logo">Apple App Store</a>
<!-- Apple Invites -->
<a class="button button-invites" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/apple-invites.svg" alt="Apple Invites Logo">Apple Invites</a>
<!-- Apple Music -->
<a class="button button-apple-music" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/apple-music.svg" alt="Apple Music Logo">Listen on Apple Music</a>
<!-- Apple Music Alternate -->
<a class="button button-apple-music-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/apple-music-alt.svg" alt="Apple Music Logo">Listen on Apple Music</a>
<!-- Apple Podcasts -->
<a class="button button-apple-podcasts" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/apple-podcasts.svg" alt="Apple Podcasts Logo">Listen on Apple Podcasts</a>
<!-- Apple Podcasts Alternate -->
<a class="button button-apple-podcasts-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/apple-podcasts-alt.svg" alt="Apple Podcasts Logo">Listen on Apple Podcasts</a>
<!-- Bandcamp -->
<a class="button button-bandcamp" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/bandcamp.svg" alt="Bandcamp Logo">Bandcamp</a>
<!-- Behance -->
<a class="button button-behance" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/behance.svg" alt="Behance Logo">Behance</a>
<!-- Bluesky -->
<a class="button button-bluesky" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/bluesky.svg" alt="Bluesky Logo">Bluesky</a>
<!-- Bluesky Alt -->
<a class="button button-bluesky-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/bluesky-alt.svg" alt="Bluesky Logo">Bluesky</a>
<!-- Buy Me A Coffee -->
<a class="button button-coffee" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/buy-me-a-coffee.svg" alt="Buy Me A Coffee Logo">Buy Me A Coffee</a>
<!-- Cal.com -->
<a class="button button-cal" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/cal.svg" alt="Cal.com Logo">Schedule with Cal.com</a>
<!-- Calendly -->
<a class="button button-calendly" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/calendly.svg" alt="Calendly Logo">Schedule with Calendly</a>
<!-- Cash App -->
<a class="button button-cash-app" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/cash-app-dollar.svg" alt="Cash App Logo">Cash App</a>
<!-- Dev.to -->
<a class="button button-dev-to" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/dev-to.svg" alt="Dev.to Logo">Dev.to</a>
<!-- Discogs -->
<a class="button button-discogs" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/discogs.svg" alt="Discogs Logo">Discogs</a>
<!-- Discogs Alt -->
<a class="button button-discogs-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/discogs-alt.svg" alt="Discogs Logo">Discogs</a>
<!-- Discord -->
<a class="button button-discord" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/discord.svg" alt="Discord Logo">Discord</a>
<!-- Dribbble -->
<a class="button button-dribbble" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/dribbble.svg" alt="Dribbble Logo">Dribbble</a>
<!-- Etsy -->
<a class="button button-etsy" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/etsy.svg" alt="Etsy Logo">Shop on Etsy</a>
<!-- Facebook -->
<a class="button button-faceb" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/facebook.svg" alt="Facebook Logo">Find us on Facebook</a>
<!-- Facebook Messenger -->
<a class="button button-messenger" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/messenger.svg" alt="Messenger Logo">Chat on Messenger</a>
<!-- Figma -->
<a class="button button-figma" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/figma.svg" alt="Figma Logo">Figma Community</a>
<!-- Fiverr -->
<a class="button button-fiverr" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/fiverr.svg" alt="Fiverr Logo">Fiverr Gig</a>
<!-- Flickr -->
<a class="button button-flickr" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/flickr.svg" alt="Flickr Logo">Flickr</a>
<!-- GitHub -->
<a class="button button-github" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/github.svg" alt="GitHub Logo">GitHub</a>
<!-- GitLab -->
<a class="button button-gitlab" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/gitlab.svg" alt="GitLab Logo">GitLab</a>
<!-- GoFundMe -->
<a class="button button-gofundme" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/gofundme.svg" alt="GoFundMe Logo">GoFundMe</a>
<!-- Goodreads -->
<a class="button button-goodreads" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/goodreads.svg" alt="Goodreads Logo">Goodreads</a>
<!-- Google Drive -->
<a class="button button-google-black" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/google-drive.svg" alt="Google Drive Logo">View in Google Drive</a>
<!-- Google Play Store -->
<a class="button button-playstore" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/google-play.svg" alt="Google Play Store Logo">Google Play Store</a>
<!-- Google Scholar -->
<a class="button button-google-scholar" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/google-scholar.svg" alt="Google Scholar Logo">Google Scholar</a>
<!-- Hashnode -->
<a class="button button-hashnode" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/hashnode.svg" alt="Hashnode Logo">Hashnode</a>
<!-- Instagram -->
<a class="button button-instagram" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/instagram.svg" alt="Instagram Logo">Instagram</a>
<!-- Kick -->
<a class="button button-kick" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/kick.svg" alt="Kick Logo">Kick</a>
<!-- Kick Alt -->
<a class="button button-kick-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/kick-alt.svg" alt="Kick Logo">Kick</a>
<!-- Kickstarter -->
<a class="button button-kickstarter" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/kickstarter.svg" alt="Kickstarter Logo">Kickstarter</a>
<!-- Kit -->
<a class="button button-kit" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/kit.svg" alt="Kit Logo">Kit</a>
<!-- Ko-fi -->
<a class="button button-ko-fi" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/ko-fi.svg" alt="Ko-fi Logo">Support me on Ko-fi</a>
<!-- Last.fm -->
<a class="button button-last-fm" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/last-fm.svg" alt="">Last.fm</a>
<!-- Letterboxd -->
<a class="button button-letterboxd" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/letterboxd.svg" alt="">Letterboxd</a>
<!-- Line -->
<a class="button button-line" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/line.svg" alt="Line Logo">Line</a>
<!-- LinkedIn -->
<a class="button button-linked" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/linkedin.svg" alt="LinkedIn Logo">LinkedIn</a>
<!-- Mailchimp -->
<a class="button button-mailchimp" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/mailchimp.svg" alt="Mailchimp Logo">Mailchimp</a>
<!-- Mastodon --> <!-- Mastodon -->
<a class="button button-mastodon" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/mastodon.svg" alt="Mastodon Logo">Mastodon</a> <a class="button button-mastodon" href="https://social.schauaus.at/@modellbau" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/mastodon.svg" alt="Mastodon Logo">Mastodon (GotoSocial)</a>
<!-- Matrix --> <!-- Matrix -->
<a class="button button-matrix" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/matrix.svg" alt="Matrix Logo">Matrix</a> <!-- <a class="button button-matrix" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/matrix.svg" alt="Matrix Logo">Matrix</a> -->
<!-- Medium -->
<a class="button button-medium" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/medium.svg" alt="Medium Logo">Medium</a>
<!-- Meetup -->
<a class="button button-meetup" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/meetup.svg" alt="Meetup Logo">Meetup</a>
<!-- Meetup Alt -->
<a class="button button-meetup-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/meetup-alt.svg" alt="Meetup Logo">Meetup</a>
<!-- Microsoft Store -->
<a class="button button-microsoft" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/microsoft.svg" alt="Microsoft Logo">Get it from Microsoft</a>
<!-- Notion -->
<a class="button button-notion" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/notion.svg" alt="Notion Logo">Notion</a>
<!-- Obsidian -->
<a class="button button-obsidian" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/obsidian.svg" alt="Obsidian Logo">Obsidian</a>
<!-- OnlyFans -->
<a class="button button-onlyfans" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/onlyfans.svg" alt="OnlyFans Logo">OnlyFans (18+)</a>
<!-- Patreon -->
<a class="button button-patreon" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/patreon.svg" alt="Patreon Logo">Patreon</a>
<!-- PayPal -->
<a class="button button-paypal" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/paypal.svg" alt="PayPal Logo">PayPal</a>
<!-- Pinterest -->
<a class="button button-pinterest" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/pinterest.svg" alt="Pinterest Logo">Pinterest</a>
<!-- Product Hunt -->
<a class="button button-product-hunt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/product-hunt.svg" alt="Product Hunt Logo">Product Hunt</a>
<!-- Reddit -->
<a class="button button-reddit" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/reddit.svg" alt="Reddit Logo">Reddit</a>
<!-- Shop -->
<a class="button button-shop" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/shop.svg" alt="Shop Logo">Buy with Shop</a>
<!-- Signal --> <!-- Signal -->
<a class="button button-signal" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/signal.svg" alt="Signal Logo">Signal</a> <!-- <a class="button button-signal" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/signal.svg" alt="Signal Logo">Signal</a> -->
<!-- Signal Alt --> <!-- Signal Alt -->
<a class="button button-signal-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/signal-alt.svg" alt="Signal Logo">Signal</a> <!-- <a class="button button-signal-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/signal-alt.svg" alt="Signal Logo">Signal</a> -->
<!-- Slack -->
<a class="button button-slack" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/slack.svg" alt="Slack Logo">Join Slack</a>
<!-- Snapchat -->
<a class="button button-snapchat" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/snapchat.svg" alt="Snapchat Logo">Snapchat</a>
<!-- SoundCloud -->
<a class="button button-soundcloud" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/soundcloud.svg" alt="SoundCloud Logo">SoundCloud</a>
<!-- Spotify -->
<a class="button button-spotify" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/spotify.svg" alt="Spotify Logo">Listen on Spotify</a>
<!-- Spotify Alt -->
<a class="button button-spotify-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/spotify-alt.svg" alt="Spotify Logo">Listen on Spotify</a>
<!-- Square -->
<a class="button button-square" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/square.svg" alt="Square Logo">Buy with Square</a>
<!-- Stack Overflow -->
<a class="button button-stack-overflow" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/stack-overflow.svg" alt="Stack Overflow Logo">Stack Overflow</a>
<!-- Steam -->
<a class="button button-steam" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/steam.svg" alt="Steam Logo">Steam</a>
<!-- Steam Alt -->
<a class="button button-steam-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/steam.svg" alt="Steam Logo">Steam</a>
<!-- Strava -->
<a class="button button-strava" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/strava.svg" alt="Strava Logo">Strava</a>
<!-- Substack -->
<a class="button button-substack" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/substack.svg" alt="Substack Logo">Substack</a>
<!-- Telegram -->
<a class="button button-telegram" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/telegram.svg" alt="Telegram Logo">Telegram</a>
<!-- Threads -->
<a class="button button-threads" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/threads.svg" alt="Threads Logo">Threads</a>
<!-- Threema -->
<a class="button button-threema" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/threema.svg" alt="Threema Logo">Threema</a>
<!-- TikTok -->
<a class="button button-tiktok" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/tiktok.svg" alt="TikTok Logo">TikTok</a>
<!-- Trello -->
<a class="button button-trello" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/trello.svg" alt="Trello Logo">Trello</a>
<!-- Tumblr -->
<a class="button button-tumb" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/tumblr.svg" alt="Tumblr Logo">Tumblr</a>
<!-- Twitch -->
<a class="button button-twitch" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/twitch.svg" alt="Twitch Logo">Twitch</a>
<!-- Unsplash -->
<a class="button button-unsplash" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/unsplash.svg" alt="Unsplash Logo">Unsplash</a>
<!-- Venmo -->
<a class="button button-venmo" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/venmo.svg" alt="Venmo Logo">Venmo</a>
<!-- Vimeo -->
<a class="button button-vimeo" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/vimeo.svg" alt="Vimeo Logo">Vimeo</a>
<!-- VSCO -->
<a class="button button-vsco" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/vsco.svg" alt="VSCO Logo">VSCO</a>
<!-- WhatsApp -->
<a class="button button-whatsapp" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/whatsapp.svg" alt="WhatsApp Logo">WhatsApp</a>
<!-- WordPress -->
<a class="button button-wordpress" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/wordpress.svg" alt="WordPress Logo">WordPress</a>
<!-- X -->
<a class="button button-x" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/x.svg" alt="X Logo">Follow on X</a>
<!-- YouTube -->
<a class="button button-yt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/youtube.svg" alt="YouTube Logo">YouTube</a>
<!-- YouTube Alt -->
<a class="button button-yt-alt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/youtube-alt.svg" alt="YouTube Logo">YouTube</a>
<!-- YouTube Music -->
<a class="button button-yt" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/youtube-music.svg" alt="YouTube Music Logo">Listen on YouTube Music</a>
<!-- Zoom -->
<a class="button button-zoom" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/zoom.svg" alt="Zoom Logo">Join Zoom Webinar</a>
<!-- Generic Blog --> <!-- Generic Blog -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-blog.svg" alt="Blog Icon">Read our blog</a> <a class="button button-default" href="https://blog.schauaus.at/modellbau" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-blog.svg" alt="Blog Icon">unser Blog</a>
<!-- Generic Calendar -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-calendar.svg" alt="Calendar Icon">Event RSVP</a>
<!-- Generic Cloud -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-cloud.svg" alt="Cloud Icon">Download File</a>
<!-- Generic Code -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-code.svg" alt="Code Icon">View the code</a>
<!-- Generic Computer -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-computer.svg" alt="Computer Icon">Homelab Setup</a>
<!-- Generic Email -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-email.svg" alt="Email Icon">Email Us</a>
<!-- Generic Email Alt -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-email-alt.svg" alt="Email Icon">Email Us</a>
<!-- Generic Homepage -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-homepage.svg" alt="Homepage Icon">Visit Homepage</a>
<!-- Generic Map -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-map.svg" alt="Map Icon">Get Directions</a>
<!-- Generic Phone -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-phone.svg" alt="Phone Icon">Call Us</a>
<!-- Generic Review -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-review.svg" alt="Review Icon">Leave us a review</a>
<!-- Generic RSS --> <!-- Generic RSS -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-rss.svg" alt="RSS Icon">RSS Subscribe</a> <a class="button button-default" href="https://blog.schauaus.at/modellbau/feed/" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-rss.svg" alt="RSS Icon">RSS-Feed unseres Blogs</a>
<!-- Gitea -->
<a class="button button-gitea" href="https://git.schauaus.at" target="_blank" rel="noopener"><img class="icon" aria-hidden="true" src="images/icons/gitea.svg" alt="Gitea Icon">unser Datenserver</a>
<!-- Generic Calendar -->
<!-- <a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-calendar.svg" alt="Calendar Icon">Event RSVP</a> -->
<!-- Generic Email -->
<a class="button button-default" href="mailto:social@schauaus.at" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-email.svg" alt="Email Icon">kontaktiere uns per Email</a>
<!-- Generic Email Alt -->
<a class="button button-default" href="mailto:social@schauaus.at" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-email-alt.svg" alt="Email Icon">kontaktiere uns per Email</a>
<!-- Generic Homepage -->
<a class="button button-default" href="https://www.schauaus.at/cms" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-homepage.svg" alt="Homepage Icon">die Webpräsenz der SCHAUAUS GmbH</a>
<!-- Generic Map -->
<-- <a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-map.svg" alt="Map Icon">Get Directions</a> -->
<!-- Generic Shopping Bag --> <!-- Generic Shopping Bag -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-shopping-bag.svg" alt="Shopping Bag Icon">Visit Our Shop</a> <-- <a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-shopping-bag.svg" alt="Shopping Bag Icon">Visit Our Shop</a> -->
<!-- Generic Shopping Tag -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-shopping-tag.svg" alt="Shopping Tag Icon">10% Discount</a>
<!-- Generic SMS --> <!-- Generic Shopping Tag -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-sms.svg" alt="SMS Icon">Send us a message</a> <-- <a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-shopping-tag.svg" alt="Shopping Tag Icon">10% Discount</a> -->
<!-- Generic Website --> <!-- Generic Website -->
<a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-website.svg" alt="Website Icon">Visit Website</a> <-- <a class="button button-default" href="#" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/generic-website.svg" alt="Website Icon">Visit Website</a> -->
<!-- LittleLink Extended --> <!-- Default LittleLink -->
<a class="button button-default" href="https://github.com/sethcottle/littlelink-extended" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/littlelink.svg" alt="LittleLink Logo">LittleLink Extended</a> <a class="button button-default" href="https://littlelink.io" target="_blank" rel="noopener" role="button"><img class="icon" aria-hidden="true" src="images/icons/littlelink.svg" alt="LittleLink Logo">LittleLink</a>
</div> </div>
<!-- Feel free to add your own footer information, including updating `privacy.html` to reflect how your LittleLink fork is set up --> <!-- Feel free to add your own footer information, including updating `privacy.html` to reflect how your LittleLink fork is set up -->
<footer> <footer>
<a href="privacy.html">Privacy Policy</a> | Build your own by forking <a href="https://littlelink.io" target="_blank" rel="noopener">LittleLink</a> <a href="http://www.schauaus.at/cms" target="_blank" rel="noopener">SCHAUAUS Gesellschaft m. b. H.
</footer> </footer>
</div> </div>
</div> </div>

View File

@@ -1,84 +0,0 @@
<!DOCTYPE html>
<!--
To change the theme, change the class on the html tag below to one of:
- theme-auto: Automatically switches based on user's system preferences
- theme-light: Forces light theme
- theme-dark: Forces dark theme
-->
<html class="theme-auto" lang="en"> <!-- Update `class="theme-auto"` with your preference -->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Page Title - Change this to your name/brand (50-60 characters recommended) -->
<title>Privacy Policy | LittleLink</title>
<link rel="icon" type="image/x-icon" href="/images/avatar.png"> <!-- Update this with your own favicon -->
<!-- Meta Description - Write a description (150-160 characters recommended) -->
<meta name="description" content="Privacy policy and data collection information for LittleLink">
<meta name="robots" content="noindex"> <!-- Since this is a utility page -->
<!-- Stylesheets -->
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/brands.css">
</head>
<body>
<div class="container-left" role="main">
<div class="column">
<nav role="navigation">
<a href="index.html" aria-label="Back to homepage">← Back to main page</a>
</nav>
<h1>Privacy Overview</h1>
<section aria-labelledby="analytics-heading">
<h2 id="analytics-heading">Analytics</h2>
<p>The services contained in this section enable the Owner to monitor and analyze web traffic and can be used to keep track of User behavior.</p>
<h3>Example LLC</h3>
<ul role="list">
<li>Personal Data: various types of Data as specified in the privacy policy of the service</li>
<li><a href="https://example.com/privacy/" target="_blank" rel="noopener">Privacy Policy</a></li>
</ul>
</section>
<section aria-labelledby="external-content-heading">
<h2 id="external-content-heading">External Content</h2>
<p>This type of service allows you to view content hosted on external platforms directly from the pages of this website and interact with them.</p>
<p>This type of service might still collect web traffic data for the pages where the service is installed, even when Users do not use it.</p>
<h3>Example LLC</h3>
<ul role="list">
<li>Personal Data: Usage Data; various types of Data as specified in the privacy policy of the service</li>
<li><a href="https://example.com/privacy/" target="_blank" rel="noopener">Privacy Policy</a></li>
</ul>
</section>
<section aria-labelledby="hosting-heading">
<h2 id="hosting-heading">Hosting and Infrastructure</h2>
<p>This type of service has the purpose of hosting Data and files that enable this website to exist.</p>
<p>Some services among those listed below, if any, may work through geographically distributed servers, making it difficult to determine the actual location where the Personal Data are stored.</p>
<h3>Example LLC</h3>
<ul role="list">
<li>Personal Data: various types of Data as specified in the privacy policy of the service</li>
<li><a href="https://example.com/privacy" target="_blank" rel="noopener">Privacy Policy</a></li>
</ul>
</section>
<footer>
<p>Build your own by forking <a href="https://littlelink.io" target="_blank" rel="noopener">LittleLink.</a></p>
</footer>
</div>
</div>
</body>
</html>