A very minimal, lightweight responsive dashboard for your homelab, or anywhere else really. Lander is essentially a page with a few links that can be customized in different ways, with various themes. That's all it is. It doesn't have deep integrations with any self-hosted services. It can show them, it can ping them, and it can visually tell you if they can't be pinged—that's all.
I'm a big fan of self-hosted dashboard projects like Homepage, Homer, and Heimdall. I love them and have used them in the past. But they have a few too many integrations in some cases, or too many restrictions on what I can achieve with them. It's not the same for everyone, but I believe I'm not the only one who has faced that issue. So I made something the way I wanted it, and it might also be what you're looking for. See the roadmap section to see what I have planned for the future.
- Clean, Modern Interface: Responsive design that works on desktop and mobile
- Multiple Themes: Choose from various color schemes including dark and light modes
- Flexible Display Modes: Default cards, compact view, or icon-only layouts
- Icon Integration: Automatic icons from selfhst/icons with Lucide fallbacks
- YAML Configuration: Simple, human-readable configuration files
- Docker Ready: Easy deployment with volume mounting for configurations
- Health Monitoring: Built-in service status indicators
# Create a config directory
mkdir -p ./lander_config
# Run Lander
docker run -d \
--name lander \
-p 3000:3000 \
-v ./lander_config:/app/dist/config \
ghcr.io/oritromax/lander:latestCreate a docker-compose.yml file:
services:
lander:
image: ghcr.io/oritromax/lander:latest
container_name: lander
ports:
- "3000:3000"
volumes:
- ./lander_config:/app/dist/config
environment:
- NODE_ENV=production
- PORT=3000
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000"]
interval: 30s
timeout: 3s
retries: 3
start_period: 10sThen run:
docker-compose up -dLander uses YAML files for configuration. On first run, default configuration files will be created in your mounted volume.
lander_config/
├── config.yaml # Main dashboard settings
└── services.yaml # Your services and applications
# Theme Configuration
# Options: "default", "forest", "nether", "summer", or "neon"
theme: "neon"
# Card Display Configuration
# Options: "default", "compact", or "icon"
# default: Full cards with icon, title, description, and status indicator
# compact: Medium cards with icon, title, and status indicator (no description)
# icon: Minimal cards showing only icon and status indicator (fits more on screen)
card-display: "compact"
# Icon Size Configuration
# Options: "default" or "full"
# default: Normal sized icons with padding/borders
# full: Icons extend full height and to left edge of card for prominent display
icon-size: "full"
# View Configuration
# Options: "grid" or "category"
# grid: Shows all services in a grid with category filter at the top
# category: Groups services by category with headings, no filter needed
view: "category"
# Order Configuration
# Options: "ascending" or "descending"
# grid: Controls the order of all services
# category: Controls the order of categories (not individual services)
order: "ascending"Configuration Options:
theme: Available themes:default,forest,nether,summer,neoncard-display: Card size:default,compact,iconicon-size: Icon display:default,fullview: Layout:grid,categoryorder: Sorting:ascending,descending
services:
- name: "Portainer"
description: "Docker container management interface"
url: "https://portainer.example.com"
icon: "portainer"
category: "Infrastructure"
- name: "Plex"
description: "Media server and streaming platform"
url: "https://plex.example.com"
icon: "plex"
category: "Media"
- name: "Nextcloud"
description: "Personal cloud storage and collaboration"
url: "https://nextcloud.example.com"
icon: "nextcloud"
category: "Storage"Service Properties:
name: Service name for displaydescription: Brief service descriptionurl: Service URLicon: Icon identifier (from selfhst/icons)category: Category for grouping services
Lander includes 5 built-in themes:
- default: Clean blue and gray color scheme
- forest: Warm earthy color palette with bone, tomato, and onyx colors
- nether: Bold contrast theme with deep reds, blues, and cream tones, inspired by Minecraft
- summer: Soft, natural palette with warm greens, beiges, and creamy tones
- neon: Electric cyberpunk theme with bright pinks, turquoise, and neon accents
- Node.js 18+
- npm or yarn
# Clone the repository
git clone https://github.com/oritromax/lander.git
cd lander
# Install dependencies
npm install
# Start development server
npm run devnpm run dev- Start development server with config setupnpm run build- Build for productionnpm run lint- Run ESLintnpm run preview- Preview production build
# Build the image
docker build -t lander:local .
# Run locally built image
docker run -d -p 3000:3000 -v ./lander_config:/app/dist/config lander:localWe welcome contributions! Here's how you can help:
- Check existing issues to avoid duplicates
- Use the issue template when creating new issues
- Include relevant details: browser, Docker version, configuration
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes
- Run tests and linting:
npm run lint - Commit your changes:
git commit -m 'Add amazing feature' - Push to your branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow the existing code style
- Add appropriate TypeScript types
- Test your changes thoroughly
- Update documentation as needed
- Keep commits focused and descriptive
- Create a new CSS file in
src/styles/themes/ - Add your theme following the existing structure
- Test with different display modes
- Submit a PR with screenshots
- Discuss major changes in an issue first
- Ensure backward compatibility with existing configs
- Add appropriate error handling
- Document new configuration options
- Weather widget
- Hot-reloading configurations
- Offline icon pack
- No-icon configuration
- Ping using Docker internal network
- Environment variable overrides
- Custom CSS injection
- Multi-language support
- Documentation: Check this README and inline code comments
- Issues: GitHub Issues
This project is licensed under the MIT License. See the LICENSE file for details.
- Icons provided by selfhst/icons
- Fallback icons from Lucide React
- Inspired by Homepage
Made with ❤️ for the self-hosting community
