{"id":46106947,"url":"https://github.com/rackandhost/getmando","last_synced_at":"2026-03-01T21:15:13.598Z","repository":{"id":320706122,"uuid":"1069822545","full_name":"rackandhost/getmando","owner":"rackandhost","description":"A beautiful and simply dashboard","archived":false,"fork":false,"pushed_at":"2026-02-28T19:26:28.000Z","size":6746,"stargazers_count":14,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-28T22:48:19.469Z","etag":null,"topics":["angular","dashboard","homelab","self-hosted","selfhosted"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rackandhost.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-10-04T17:31:17.000Z","updated_at":"2026-02-28T21:30:55.000Z","dependencies_parsed_at":"2025-10-25T12:07:11.075Z","dependency_job_id":"895e2029-c174-4aab-a8ca-e0c349494c1e","html_url":"https://github.com/rackandhost/getmando","commit_stats":null,"previous_names":["omar-sv88/getmando","rackandhost/getmando"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/rackandhost/getmando","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackandhost%2Fgetmando","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackandhost%2Fgetmando/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackandhost%2Fgetmando/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackandhost%2Fgetmando/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rackandhost","download_url":"https://codeload.github.com/rackandhost/getmando/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rackandhost%2Fgetmando/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29984715,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T21:06:37.093Z","status":"ssl_error","status_checked_at":"2026-03-01T21:05:45.052Z","response_time":124,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["angular","dashboard","homelab","self-hosted","selfhosted"],"created_at":"2026-03-01T21:15:13.125Z","updated_at":"2026-03-01T21:15:13.584Z","avatar_url":"https://github.com/rackandhost.png","language":"TypeScript","readme":"\u003cp align=\"center\"\u003e\n  \u003cimg alt=\"getMando\" width=\"160\" src=\"public/img/mando.png\" /\u003e\n  \u003cbr\u003e\n  \u003cem\u003eMando\u003c/em\u003e\n  \u003cbr\u003e\n  \u003cem\u003eA simply and beautiful dashboard\u003c/em\u003e\n\u003c/p\u003e\n\n![Version](https://img.shields.io/badge/version-0.2.0--beta-orange)\n![Angular](https://img.shields.io/badge/Angular-21.1.0-red)\n![TypeScript](https://img.shields.io/badge/TypeScript-5.9-blue)\n![License](https://img.shields.io/badge/license-MIT-green)\n\n\u003e **⚠️ BETA RELEASE WARNING**  \n\u003e This project is currently in **beta testing** (v0.2.0-beta). Features may change, bugs are expected, and the API could evolve. Use at your own risk in production environments. Feedback and bug reports are highly appreciated!\n\n---\n\n\u003cimg alt=\"Dashboard\" width=\"1024\" src=\"screenshots/dashboard.png\" /\u003e\n\n\u003cimg alt=\"Dashboard Light\" width=\"1024\" src=\"screenshots/dashboard_light.png\" /\u003e\n\n## 📖 Overview\n\n**Mando** is a beautiful and simply dashboard (not pretend to add too many features such a widgets, weather, etc...) for your self-hosted applications. Built with modern web technologies, it provides an elegant glassmorphism UI to organize and access all your homelab services from a single place. \n\n### ✨ Key Features\n\n- **🎨 Inspiring Design** - Minimalist interface with glassmorphism effects\n- **⚡ Fast \u0026 Lightweight** - Built with Angular 21 and TailwindCSS 4 for optimal performance\n- **🔍 Real-time Search** - Instant search through your applications\n- **🏷️ Categories** - Organize your apps into customizable categories\n- **🔗 Web Search Integration** - Built-in support for Google, DuckDuckGo, Startpage, and YouTube\n- **📱 Fully Responsive** - Optimized for mobile, tablet, and desktop\n- **♿ Accessible** - WCAG AA compliant with keyboard navigation\n- **🐳 Docker Ready** - Easy deployment with pre-built containers\n- **⚙️ YAML Configuration** - Simple, declarative configuration file\n\n---\n\n## 🚀 Quick Start (Docker)\n\n### Using Docker Compose (Recommended)\n\n1. **Create and customize the `dashboard.yaml`** file with all your data and settings.\n```yaml\nmetadata:\n  title: 'My dashboard'\n  description: 'Simply and lovelly'\n\ncategories:\n  - id: 'media'\n    name: 'Media'\n\n  - id: 'productivity'\n    name: 'Productivity'\n\n  - id: 'home-automation'\n    name: 'Home Automation'\n\n  - id: 'networking'\n    name: 'Networking'\n\napplications:\n  - id: 'plex'\n    name: 'Plex'\n    description: 'Media server for movies, TV shows, and music'\n    url: 'https://plex.example.com'\n    icon:\n      type: 'name'\n      value: 'plex'\n    category: 'media'\n    openNewTab: true\n    tags:\n      - media\n      - streaming\n\n  - id: 'jellyfin'\n    name: 'Jellyfin'\n    description: 'Free software media system'\n    url: 'https://jellyfin.example.com'\n    icon:\n      type: 'name'\n      value: 'jellyfin'\n    category: 'media'\n    openNewTab: true\n    tags:\n      - media\n      - open-source\n\n  - id: 'ombi'\n    name: 'Ombi'\n    description: 'Request media for your Plex/Jellyfin server'\n    url: 'https://ombi.example.com'\n    icon:\n      type: 'name'\n      value: 'ombi'\n    category: 'media'\n    openNewTab: true\n    tags:\n      - requests\n      - media\n\n  - id: 'nextcloud'\n    name: 'Nextcloud'\n    description: 'Productivity platform for file storage and collaboration'\n    url: 'https://nextcloud.example.com'\n    icon:\n      type: 'name'\n      value: 'nextcloud'\n    category: 'productivity'\n    openNewTab: true\n    tags:\n      - cloud\n      - files\n\n  - id: 'paperless-ngx'\n    name: 'Paperless-ngx'\n    description: 'Document management system'\n    url: 'https://paperless.example.com'\n    icon:\n      type: 'name'\n      value: 'paperless-ngx'\n    category: 'productivity'\n    openNewTab: true\n    tags:\n      - documents\n      - scanning\n\n  - id: 'home-assistant'\n    name: 'Home Assistant'\n    description: 'Open source home automation platform'\n    url: 'https://homeassistant.example.com'\n    icon:\n      type: 'name'\n      value: 'home-assistant'\n    category: 'home-automation'\n    openNewTab: true\n    tags:\n      - smart-home\n      - automation\n\n  - id: 'mosquitto'\n    name: 'Mosquitto'\n    description: 'MQTT message broker'\n    url: 'https://mosquitto.example.com'\n    icon:\n      type: 'name'\n      value: 'mosquitto'\n    category: 'home-automation'\n    openNewTab: true\n    tags:\n      - iot\n      - mqtt\n\n  - id: 'portainer'\n    name: 'Portainer'\n    description: 'Docker management UI'\n    url: 'https://portainer.example.com'\n    icon:\n      type: 'name'\n      value: 'portainer'\n    category: 'networking'\n    openNewTab: true\n    tags:\n      - docker\n      - containers\n\n  - id: 'pihole'\n    name: 'Pi-hole'\n    description: 'Network-wide ad blocking'\n    url: 'https://pihole.example.com'\n    icon:\n      type: 'name'\n      value: 'pi-hole'\n    category: 'networking'\n    openNewTab: true\n    tags:\n      - dns\n      - adblock\n\n  - id: 'uptime-kuma'\n    name: 'Uptime Kuma'\n    description: 'Self-hosted monitoring tool'\n    url: 'https://uptime.example.com'\n    icon:\n      type: 'name'\n      value: 'uptime-kuma'\n    category: 'networking'\n    openNewTab: true\n    tags:\n      - monitoring\n      - uptime\n\nbookmarks:\n  - id: 'google'\n    name: 'Google'\n    description: 'The google web'\n    url: 'https://google.com'\n    openNewTab: true\n    icon:\n      type: 'name'\n      value: 'google'\n    tags:\n      - web\n\nsettings:\n  theme: 'auto'\n  dateFormat: 'd MMMM yyyy'\n  datePosition: 'bottom'\n  showSeconds: false\n  showDate: true\n  itemsPerRow: 5\n  allowBookmarks: true\n  showAllCategory: true\n  showDescriptions: true\n  showLabels: true\n  searchEngines:\n    - 'google'\n    - 'duckduckgo'\n    - 'startpage'\n    - 'youtube'\n\n```\n\n2. **Create the `docker-compose.yaml` file:**\n ```yaml\nservices:\n  dashboard:\n    image: ghcr.io/rackandhost/getmando:latest\n    container_name: getmando-dashboard\n    ports:\n      - '8080:80'\n    volumes:\n      # Mount your local dashboard.yaml config\n      - ./config/dashboard.yaml:/app/config/dashboard.yaml:ro\n      - ./my-custom-image.jpg:/app/img/my-custom-image.jpg:ro # Use this if you want to set a custom background\n    restart: unless-stopped\n    environment:\n      - NODE_ENV=production\n    healthcheck:\n      test: ['CMD', 'curl', '-f', 'http://localhost/health']\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 5s\n    networks:\n      - dashboard-network\n\nnetworks:\n  dashboard-network:\n    driver: bridge\n\n ```\n3. **Run `docker compose up -d`**\n\n4. **Access your dashboard:**\n   Open your browser and navigate to `http://localhost:8080`\n\n### Using Docker CLI\n\n```bash\ndocker run -d \\\n  --name getmando-dashboard \\\n  -p 8080:80 \\\n  -v $(pwd)/config/dashboard.yaml:/app/config/dashboard.yaml:ro \\\n  --restart unless-stopped \\\n  ghcr.io/rackandhost/getmando:latest\n```\n\n---\n\n## ⚙️ Configuration\n\nThe dashboard is configured via a single `dashboard.yaml` file. This file is automatically loaded when the application starts.\n\n### YAML Structure Overview\n\n```yaml\nmetadata:           # Dashboard metadata\ncategories:         # Your app categories\napplications:       # Your self-hosted applications\nbookmarks:          # Quick-access bookmarks\nsettings:           # Dashboard settings\n```\n\n---\n\n### 📋 Configuration Reference\n\n#### `metadata` - Dashboard Information\n\n| Field | Type | Required | Default | Description |\n|-------|------|----------|---------|-------------|\n| `title` | `string` | ✅ Yes | - | Dashboard title displayed in header |\n| `description` | `string` | ✅ Yes | - | Short description or tagline |\n\n**Example:**\n```yaml\nmetadata:\n  title: 'My Homelab'\n  description: 'All my self-hosted services'\n```\n\n---\n\n#### `categories` - App Categories\n\nEach category needs:\n| Field | Type | Required | Default | Description |\n|-------|------|----------|---------|-------------|\n| `id` | `string` | ✅ Yes | - | Unique identifier (used by apps) |\n| `name` | `string` | ✅ Yes | - | Display name |\n\n**Example:**\n```yaml\ncategories:\n  - id: 'media'\n    name: 'Media'\n  - id: 'productivity'\n    name: 'Productivity'\n  - id: 'home-automation'\n    name: 'Home Automation'\n  - id: 'networking'\n    name: 'Networking'\n```\n\n---\n\n#### `applications` - Your Self-Hosted Apps\n\nEach application supports:\n\n| Field | Type | Required | Default | Description |\n|-------|------|----------|---------|-------------|\n| `id` | `string` | ✅ Yes | - | Unique identifier |\n| `name` | `string` | ✅ Yes | - | App display name (max 100 chars) |\n| `description` | `string` | ✅ Yes | - | Short description (max 255 chars) |\n| `url` | `string` (URL) | ✅ Yes | - | Full URL to the application |\n| `icon` | `object` | ✅ Yes | - | Icon configuration (see below) |\n| `category` | `string` | ✅ Yes | - | Category ID to belong to |\n| `openNewTab` | `boolean` | No | `true` | Open in new tab or same window |\n| `tags` | `array[string]` | No | `[]` | Searchable tags |\n\n**Icon Configuration:**\n\nThe `icon` object supports three types:\n\n| Type | Value | Description |\n|------|-------|-------------|\n| `name` | `{ type: 'name', value: 'plex' }` | Use icon by name (see [haroeris01/walkxcode-dashboard-icons](https://github.com/haroeris01/walkxcode-dashboard-icons/blob/main/ICONS.md)) |\n| `url` | `{ type: 'url', value: 'https://...' }` | Use custom URL for icon |\n| `initials` | `{ type: 'initials', value: 'AB' }` | Generate icon from initials |\n\n**Example:**\n```yaml\napplications:\n  - id: 'plex'\n    name: 'Plex'\n    description: 'Media server for movies, TV shows, and music'\n    url: 'https://plex.example.com'\n    icon:\n      type: 'name'\n      value: 'plex'\n    category: 'media'\n    openNewTab: true\n    tags:\n      - media\n      - streaming\n\n  - id: 'nextcloud'\n    name: 'Nextcloud'\n    description: 'Productivity platform for file storage and collaboration'\n    url: 'https://nextcloud.example.com'\n    icon:\n      type: 'name'\n      value: 'nextcloud'\n    category: 'productivity'\n    openNewTab: true\n    tags:\n      - cloud\n      - files\n\n  - id: 'custom-app'\n    name: 'Custom App'\n    description: 'App with custom icon'\n    url: 'https://custom.example.com'\n    icon:\n      type: 'url'\n      value: 'https://example.com/icon.png'\n    category: 'networking'\n    openNewTab: true\n    tags:\n      - custom\n```\n\n---\n\n#### `bookmarks` - Quick Access Bookmarks\n\nBookmarks work exactly like applications but don't require a category.\n\n| Field | Type | Required | Default | Description |\n|-------|------|----------|---------|-------------|\n| `id` | `string` | ✅ Yes | - | Unique identifier |\n| `name` | `string` | ✅ Yes | - | Bookmark name (max 100 chars) |\n| `description` | `string` | ✅ Yes | - | Short description (max 255 chars) |\n| `url` | `string` (URL) | ✅ Yes | - | Full URL |\n| `icon` | `object` | ✅ Yes | - | Icon configuration (same as apps) |\n| `openNewTab` | `boolean` | No | `true` | Open in new tab |\n| `tags` | `array[string]` | No | `[]` | Searchable tags |\n\n**Example:**\n```yaml\nbookmarks:\n  - id: 'google'\n    name: 'Google'\n    description: 'The search engine'\n    url: 'https://google.com'\n    openNewTab: true\n    icon:\n      type: 'name'\n      value: 'google'\n    tags:\n      - web\n```\n\n---\n\n#### `settings` - Dashboard Settings\n\n| Field                  | Type            | Default          | Options                 | Description                                   |\n|------------------------|-----------------|------------------|-------------------------|-----------------------------------------------|\n| `theme`                | `string`        | `auto`           | `auto`, `light`, `dark` | Set dark and light mode                       |\n| `dateFormat`           | `string`        | `dd-MM-yyyy`     | Any format              | Date format for clock display                 |\n| `datePosition`         | `string`        | `top`            | `top`, `bottom`         | Clock date position                           |\n| `showSeconds`          | `boolean`       | `false`          | -                       | Show seconds in clock                         |\n| `showDate`             | `boolean`       | `false`          | -                       | Show date in clock                            |\n| `itemsPerRow`          | `number`        | `4`              | `1-12`                  | Number of apps per row on desktop             |\n| `allowBookmarks`       | `boolean`       | `false`          | -                       | Enable bookmarks section                      |\n| `showAllCategory`      | `boolean`       | `true`           | -                       | Show \"All\" category filter                    |\n| `showDescriptions`     | `boolean`       | `true`           | -                       | Show app descriptions in cards                |\n| `showLabels`           | `boolean`       | `true`           | -                       | Show app tags as labels                       |\n| `searchEngines`        | `array[string]` | `[]`             | See below               | Available search engines                      |\n| `lightBackgroundImage` | `string`        | `background.jpg` | -                       | Custom image or url as light theme background |\n| `darkBackgroundImage`  | `string`        | `background.jpg` | -                       | Custom image or url as dark theme background  |\n\n**Search Engine Options:**\n- `google` - Google Search\n- `duckduckgo` - DuckDuckGo\n- `startpage` - Startpage\n- `youtube` - YouTube\n\n**Example:**\n```yaml\nsettings:\n  theme: 'auto'\n  dateFormat: 'd MMMM yyyy'\n  datePosition: 'bottom'\n  showSeconds: false\n  showDate: true\n  itemsPerRow: 5\n  allowBookmarks: true\n  showAllCategory: true\n  showDescriptions: true\n  showLabels: true\n  lightBackgroundImage: 'my-custom-background.jpg' # Or 'https://domain.tld/my-custom-image.jpg'\n  darkBackgroundImage: 'my-custom-background.jpg' # Or 'https://domain.tld/my-custom-image.jpg'\n  searchEngines:\n    - 'google'\n    - 'duckduckgo'\n    - 'youtube'\n```\n\n---\n\n### Environment Variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `NODE_ENV` | `production` | Environment mode |\n\n---\n\n## 🔧 Development\n\n### Prerequisites\n\n- Node.js 20+\n- npm 11+\n\n### Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/rackandhost/getmando.git\ncd getmando\n\n# Install dependencies\nnpm install\n\n# Start development server\nnpm start\n\n# Build for production\nnpm run build\n\n# Run tests\nnpm test\n```\n\n### Development Server\n\nThe dev server runs on `http://localhost:4200` with hot-reload enabled.\n\n### Building for Production\n\n```bash\nnpm run build\n```\n\nBuild artifacts are created in the `dist/` directory.\n\n---\n\n## 🐳 Docker Image Details\n\n### Container Features\n\n- ✅ Optimized image size\n- ✅ Security headers enabled\n- ✅ Gzip compression\n- ✅ Long-term caching for static assets\n- ✅ Mountable config volume\n- ✅ Health checks\n\n---\n\n## 📊 Performance\n\n| Metric | Value |\n|--------|-------|\n| Initial Load | \u003c2s |\n| Search Latency | \u003c50ms |\n| Bundle Size (gzipped) | \u003c500KB |\n| Lighthouse Score | \u003e85 |\n| WCAG Compliance | AA |\n\n---\n\n## 🗺️ Roadmap\n\n### Current Beta (v0.2.0-beta)\n- ✅ Core dashboard functionality\n- ✅ YAML configuration\n- ✅ Search and filtering\n- ✅ Search engines\n- ✅ Docker deployment\n- ✅ Custom background image\n- ✅ Dark/light mode\n- ✅ Different images for Dark/light mode\n\n### Planned Features\n- [ ] Add DB feature to allow user be able to choose between .yaml configuration or DB\n- [ ] Statistics/analytics when DB feature are available\n- [ ] Backup/restore configurations\n- [ ] Wiki\n\n---\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit issues or pull requests.\n\n### Development Guidelines\n\n- Follow Angular best practices\n- Use TypeScript strict mode\n- Write tests for new features\n- Ensure accessibility (WCAG AA)\n- Keep components small and focused\n\n---\n\n## 📝 License\n\nThis project is licensed under the MIT License - see the LICENSE file for details.\n\n---\n\n## 🙏 Acknowledgments\n\n- Built with [Angular](https://angular.dev/)\n- Styled with [TailwindCSS](https://tailwindcss.com/)\n- Icons from [ng-icons](https://ng-icons.github.io/ng-icons/)\n- App Icons from [haroeris01/walkxcode-dashboard-icons](https://github.com/haroeris01/walkxcode-dashboard-icons)\n\n---\n\n## 📮 Support\n\n- 🐛 **Bug Reports:** [GitHub Issues](https://github.com/rackandhost/getmando/issues)\n- 💡 **Feature Requests:** [GitHub Discussions](https://github.com/rackandhost/getmando/discussions)\n\n---\n\n**⚠️ Remember: This is a BETA release. Things may break, features may change. Please report any issues you encounter!**\n\n---\n\n\u003cdiv align=\"center\"\u003e\n  Built with ❤️ for the homelab community\n\u003c/div\u003e\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frackandhost%2Fgetmando","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frackandhost%2Fgetmando","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frackandhost%2Fgetmando/lists"}