Ctrl K
ComunidadGuías…

package.json

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
{
  "$schema": "https://www.raycast.com/schemas/extension.json",
  "name": "homelab",
  "title": "Homelab",
  "platforms": [
    "macOS",
    "Windows"
  ],
  "description": "Your whole homelab in Raycast: stats, downloads, media requests, monitors, music, photos, books, documents, services, jobs, DNS, backups and money \u2014 one hub, every service optional.",
  "icon": "icon.png",
  "author": "aleksandar",
  "license": "MIT",
  "commands": [
    {
      "name": "home",
      "title": "Homelab Home",
      "subtitle": "Homelab",
      "description": "One place for everything: live status, commands, quick links",
      "mode": "view",
      "keywords": [
        "homelab",
        "dashboard",
        "hub"
      ]
    },
    {
      "name": "stats",
      "title": "Homelab Stats",
      "subtitle": "Homelab",
      "description": "Server and NAS stats at a glance",
      "mode": "view"
    },
    {
      "name": "menubar",
      "title": "Homelab Menu Bar",
      "subtitle": "Homelab",
      "description": "CPU load and temperature in the menu bar",
      "mode": "menu-bar",
      "interval": "30s"
    },
    {
      "name": "downloads",
      "title": "Homelab Downloads",
      "subtitle": "Homelab",
      "description": "qBittorrent, SABnzbd, NZBget and slskd activity in one place",
      "mode": "view"
    },
    {
      "name": "request",
      "title": "Discover Media",
      "subtitle": "Homelab",
      "description": "Browse trending/popular or search, and request movies & shows",
      "mode": "view",
      "keywords": [
        "jellyseerr",
        "request",
        "movie",
        "show",
        "search"
      ]
    },
    {
      "name": "requests",
      "title": "Request History",
      "subtitle": "Homelab",
      "description": "Past and pending Jellyseerr requests \u2014 approve, decline, retry, delete",
      "mode": "view",
      "keywords": [
        "jellyseerr",
        "pending",
        "approve",
        "decline"
      ]
    },
    {
      "name": "transaction",
      "title": "Add Transaction",
      "subtitle": "Homelab",
      "description": "Firefly Pico assistant: template + amount + description, or one-tap templates",
      "mode": "view",
      "keywords": [
        "firefly",
        "pico",
        "money",
        "expense",
        "spend"
      ]
    },
    {
      "name": "monitors",
      "title": "Homelab Monitors",
      "subtitle": "Homelab",
      "description": "Uptime Kuma monitor status \u2014 what's down right now",
      "mode": "view",
      "keywords": [
        "kuma",
        "uptime",
        "down",
        "status"
      ]
    },
    {
      "name": "music",
      "title": "Music Library",
      "subtitle": "Homelab",
      "description": "Browse and search the Navidrome library with cover art",
      "mode": "view",
      "keywords": [
        "navidrome",
        "music",
        "album",
        "artist"
      ]
    },
    {
      "name": "notifications",
      "title": "Notifications",
      "subtitle": "Homelab",
      "description": "ntfy alerts and download notifications from the last 7 days",
      "mode": "view",
      "keywords": [
        "ntfy",
        "alerts",
        "notifications"
      ]
    },
    {
      "name": "photos",
      "title": "Photos",
      "subtitle": "Homelab",
      "description": "Browse and smart-search the Immich library",
      "mode": "view",
      "keywords": [
        "immich",
        "photos",
        "pictures",
        "gallery"
      ]
    },
    {
      "name": "audiobooks",
      "title": "Audiobooks",
      "subtitle": "Homelab",
      "description": "Audiobookshelf: continue listening, browse and search",
      "mode": "view",
      "keywords": [
        "abs",
        "audiobookshelf",
        "audiobook",
        "podcast"
      ]
    },
    {
      "name": "calendar",
      "title": "Media Calendar",
      "subtitle": "Homelab",
      "description": "Upcoming movies/episodes/albums and stuck arr queues",
      "mode": "view",
      "keywords": [
        "radarr",
        "sonarr",
        "lidarr",
        "upcoming",
        "releases"
      ]
    },
    {
      "name": "containers",
      "title": "Containers",
      "subtitle": "Homelab",
      "description": "Komodo stacks: state and restart/start/stop",
      "mode": "view",
      "keywords": [
        "komodo",
        "docker",
        "stack",
        "restart"
      ]
    },
    {
      "name": "services",
      "title": "Services & Jobs",
      "subtitle": "Homelab",
      "description": "Native systemd services and scheduled jobs over SSH: state, last result, next run and logs",
      "mode": "view",
      "keywords": [
        "systemd",
        "services",
        "timers",
        "jobs",
        "ssh",
        "logs"
      ]
    },
    {
      "name": "metube",
      "title": "Send to MeTube",
      "subtitle": "Homelab",
      "description": "Queue a video or audio download from a URL",
      "mode": "view",
      "keywords": [
        "metube",
        "youtube",
        "download",
        "yt-dlp"
      ]
    },
    {
      "name": "disks",
      "title": "Disk Health",
      "subtitle": "Homelab",
      "description": "Scrutiny SMART status for every server and NAS disk",
      "mode": "view",
      "keywords": [
        "scrutiny",
        "smart",
        "disk",
        "hdd",
        "ssd"
      ]
    },
    {
      "name": "backups",
      "title": "Backup Health",
      "subtitle": "Homelab",
      "description": "Backup freshness, integrity checks, repository sizes and disk/cloud usage across backup copies",
      "mode": "view",
      "keywords": [
        "backrest",
        "restic",
        "backup",
        "storage",
        "disk",
        "cloud",
        "verification"
      ]
    },
    {
      "name": "jellyfin",
      "title": "Continue Watching",
      "subtitle": "Homelab",
      "description": "Jellyfin: now playing, resume, next up",
      "mode": "view",
      "keywords": [
        "jellyfin",
        "watch",
        "resume",
        "playing"
      ]
    },
    {
      "name": "subtitles",
      "title": "Subtitles",
      "subtitle": "Homelab",
      "description": "Subtitle sync queue and Bazarr wanted list",
      "mode": "view",
      "keywords": [
        "bazarr",
        "subsync",
        "subtitles"
      ]
    },
    {
      "name": "bills",
      "title": "Upcoming Bills",
      "subtitle": "Homelab",
      "description": "Firefly month spend and upcoming subscriptions",
      "mode": "view",
      "keywords": [
        "firefly",
        "subscriptions",
        "money",
        "bills"
      ]
    },
    {
      "name": "indexers",
      "title": "Search Indexers",
      "subtitle": "Homelab",
      "description": "Prowlarr: search every indexer and grab releases",
      "mode": "view",
      "keywords": [
        "prowlarr",
        "torrent",
        "usenet",
        "grab",
        "search"
      ]
    },
    {
      "name": "adguard",
      "title": "AdGuard Home",
      "subtitle": "Homelab",
      "description": "DNS dashboard: protection toggle, stats, top blocked, recent log, blocklists",
      "mode": "view",
      "keywords": [
        "adguard",
        "dns",
        "blocklist",
        "ads"
      ]
    },
    {
      "name": "books",
      "title": "Ebooks",
      "subtitle": "Homelab",
      "description": "Calibre-Web: search the library, send to Kindle, download",
      "mode": "view",
      "keywords": [
        "calibre",
        "ebook",
        "kindle",
        "book",
        "epub"
      ]
    },
    {
      "name": "paperless",
      "title": "Paperless Search",
      "subtitle": "Homelab",
      "description": "Search document contents in Paperless-ngx, preview and download",
      "mode": "view",
      "keywords": [
        "paperless",
        "documents",
        "ocr",
        "receipts",
        "invoices"
      ]
    },
    {
      "name": "nudge",
      "title": "Nudge Subtitles",
      "subtitle": "Homelab",
      "description": "Shift a subtitle file by \u00b1ms (pins it against the nightly sync), undo, unpin",
      "mode": "view",
      "keywords": [
        "subtitle",
        "nudge",
        "sync",
        "offset",
        "srt"
      ]
    },
    {
      "name": "nextcloud",
      "title": "Nextcloud Files and Sharing",
      "subtitle": "Homelab",
      "description": "Browse, download and share files; search document contents and OCR with Elasticsearch",
      "mode": "view",
      "keywords": [
        "nextcloud",
        "files",
        "download",
        "share",
        "elasticsearch",
        "ocr"
      ]
    },
    {
      "name": "vehicle",
      "title": "Vehicle Expenses",
      "subtitle": "Homelab",
      "description": "LubeLogger \u2014 fuel, service, repairs and car expenses; log a new record",
      "mode": "view",
      "keywords": [
        "lubelogger",
        "car",
        "vehicle",
        "fuel",
        "mileage",
        "service",
        "repair",
        "expense",
        "auto"
      ]
    }
  ],
  "preferences": [
    {
      "name": "configFile",
      "title": "Env File",
      "description": "Optional dotenv file that supplies any setting left empty here. Keys are UPPER_SNAKE (JELLYFIN_URL, JELLYFIN_API_KEY\u2026). See .env.example.",
      "type": "textfield",
      "required": false,
      "placeholder": "~/.config/raycast-homelab/.env",
      "default": "~/.config/raycast-homelab/.env"
    },
    {
      "name": "glancesUrl",
      "title": "Glances URL",
      "description": "Base URL of your Glances instance. Leave empty to hide Glances features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://glances.example.com"
    },
    {
      "name": "storageMount",
      "title": "Extra Mount Point",
      "description": "A second filesystem from Glances to show next to / (e.g. a data SSD). Leave empty to show only the root filesystem.",
      "type": "textfield",
      "required": false,
      "placeholder": "/mnt/storage"
    },
    {
      "name": "tempsUrl",
      "title": "Temperatures JSON URL",
      "description": "Optional URL of a temps.json published by the companion temps-publish script (server CPU/disk + NAS disk temps).",
      "type": "textfield",
      "required": false,
      "placeholder": "https://home.example.com/images/temps.json"
    },
    {
      "name": "homepageUrl",
      "title": "Dashboard URL",
      "description": "Optional link to your dashboard (Homepage, Dashy\u2026) shown in the menu bar and Home links.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://home.example.com"
    },
    {
      "name": "truenasUrl",
      "title": "TrueNAS URL",
      "description": "Base URL of your TrueNAS instance. Leave empty to hide TrueNAS features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://nas.example.com"
    },
    {
      "name": "truenasApiKey",
      "title": "TrueNAS API Key",
      "description": "Read-only key is enough (pool capacity + health). Leave empty to hide the NAS row.",
      "type": "password",
      "required": false
    },
    {
      "name": "qbitUrl",
      "title": "qBittorrent URL",
      "description": "Base URL of your qBittorrent instance. Leave empty to hide qBittorrent features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://qbit.example.com"
    },
    {
      "name": "qbitUsername",
      "title": "qBittorrent Username",
      "description": "Web UI username.",
      "type": "textfield",
      "required": false,
      "placeholder": "admin"
    },
    {
      "name": "qbitPassword",
      "title": "qBittorrent Password",
      "description": "Web UI password. Never attempted while empty (qBittorrent IP-bans after 5 failures).",
      "type": "password",
      "required": false
    },
    {
      "name": "sabnzbdUrl",
      "title": "SABnzbd URL",
      "description": "Base URL of your SABnzbd instance. Leave empty to hide SABnzbd features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://sabnzbd.example.com"
    },
    {
      "name": "sabnzbdApiKey",
      "title": "SABnzbd API Key",
      "description": "Config \u2192 General \u2192 API Key.",
      "type": "password",
      "required": false
    },
    {
      "name": "nzbgetUrl",
      "title": "NZBget URL",
      "description": "Base URL of your NZBget instance. Leave empty to hide NZBget features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://nzbget.example.com"
    },
    {
      "name": "nzbgetUsername",
      "title": "NZBget Username",
      "description": "Settings \u2192 Security \u2192 ControlUsername.",
      "type": "textfield",
      "required": false,
      "placeholder": "nzbget"
    },
    {
      "name": "nzbgetPassword",
      "title": "NZBget Password",
      "description": "Settings \u2192 Security \u2192 ControlPassword.",
      "type": "password",
      "required": false
    },
    {
      "name": "slskdUrl",
      "title": "slskd URL",
      "description": "Base URL of your slskd instance. Leave empty to hide slskd features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://slskd.example.com"
    },
    {
      "name": "slskdApiKey",
      "title": "slskd API Key",
      "description": "Options \u2192 Web \u2192 Authentication \u2192 API keys.",
      "type": "password",
      "required": false
    },
    {
      "name": "jellyfinUrl",
      "title": "Jellyfin URL",
      "description": "Base URL of your Jellyfin instance. Leave empty to hide Jellyfin features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://jellyfin.example.com"
    },
    {
      "name": "jellyfinApiKey",
      "title": "Jellyfin API Key",
      "description": "Dashboard \u2192 API Keys.",
      "type": "password",
      "required": false
    },
    {
      "name": "jellyfinUserId",
      "title": "Jellyfin User ID",
      "description": "Optional. Whose Continue Watching / Next Up to show; defaults to the first administrator.",
      "type": "textfield",
      "required": false,
      "placeholder": "e.g. 3f1c\u2026"
    },
    {
      "name": "jellyseerrUrl",
      "title": "Jellyseerr URL",
      "description": "Base URL of your Jellyseerr instance. Leave empty to hide Jellyseerr features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://requests.example.com"
    },
    {
      "name": "jellyseerrApiKey",
      "title": "Jellyseerr API Key",
      "description": "Settings \u2192 General \u2192 API Key (admin).",
      "type": "password",
      "required": false
    },
    {
      "name": "radarrUrl",
      "title": "Radarr URL",
      "description": "Base URL of your Radarr instance. Leave empty to hide Radarr features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://radarr.example.com"
    },
    {
      "name": "radarrApiKey",
      "title": "Radarr API Key",
      "description": "Settings \u2192 General.",
      "type": "password",
      "required": false
    },
    {
      "name": "sonarrUrl",
      "title": "Sonarr URL",
      "description": "Base URL of your Sonarr instance. Leave empty to hide Sonarr features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://sonarr.example.com"
    },
    {
      "name": "sonarrApiKey",
      "title": "Sonarr API Key",
      "description": "Settings \u2192 General.",
      "type": "password",
      "required": false
    },
    {
      "name": "lidarrUrl",
      "title": "Lidarr URL",
      "description": "Base URL of your Lidarr instance. Leave empty to hide Lidarr features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://lidarr.example.com"
    },
    {
      "name": "lidarrApiKey",
      "title": "Lidarr API Key",
      "description": "Settings \u2192 General.",
      "type": "password",
      "required": false
    },
    {
      "name": "chaptarrUrl",
      "title": "Chaptarr / Readarr URL",
      "description": "Base URL of your Chaptarr / Readarr instance. Leave empty to hide Chaptarr / Readarr features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://chaptarr.example.com"
    },
    {
      "name": "chaptarrApiKey",
      "title": "Chaptarr / Readarr API Key",
      "description": "Settings \u2192 General (any Readarr-compatible fork).",
      "type": "password",
      "required": false
    },
    {
      "name": "prowlarrUrl",
      "title": "Prowlarr URL",
      "description": "Base URL of your Prowlarr instance. Leave empty to hide Prowlarr features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://prowlarr.example.com"
    },
    {
      "name": "prowlarrApiKey",
      "title": "Prowlarr API Key",
      "description": "Settings \u2192 General.",
      "type": "password",
      "required": false
    },
    {
      "name": "bazarrUrl",
      "title": "Bazarr URL",
      "description": "Base URL of your Bazarr instance. Leave empty to hide Bazarr features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://bazarr.example.com"
    },
    {
      "name": "bazarrApiKey",
      "title": "Bazarr API Key",
      "description": "Settings \u2192 General.",
      "type": "password",
      "required": false
    },
    {
      "name": "subsyncUrl",
      "title": "Subtitle Sync Server URL",
      "description": "Base URL of your Subtitle Sync Server instance. Leave empty to hide Subtitle Sync Server features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://subtitles.example.com"
    },
    {
      "name": "absUrl",
      "title": "Audiobookshelf URL",
      "description": "Base URL of your Audiobookshelf instance. Leave empty to hide Audiobookshelf features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://audiobooks.example.com"
    },
    {
      "name": "absToken",
      "title": "Audiobookshelf API Token",
      "description": "Settings \u2192 Users \u2192 your user \u2192 API token.",
      "type": "password",
      "required": false
    },
    {
      "name": "navidromeUrl",
      "title": "Navidrome URL",
      "description": "Base URL of your Navidrome instance. Leave empty to hide Navidrome features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://music.example.com"
    },
    {
      "name": "navidromeUser",
      "title": "Navidrome Username",
      "description": "Any user; Subsonic token auth is used.",
      "type": "textfield",
      "required": false,
      "placeholder": "admin"
    },
    {
      "name": "navidromePassword",
      "title": "Navidrome Password",
      "description": "Password of that user.",
      "type": "password",
      "required": false
    },
    {
      "name": "immichUrl",
      "title": "Immich URL",
      "description": "Base URL of your Immich instance. Leave empty to hide Immich features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://immich.example.com"
    },
    {
      "name": "immichApiKey",
      "title": "Immich API Key",
      "description": "Account Settings \u2192 API Keys.",
      "type": "password",
      "required": false
    },
    {
      "name": "calibreUrl",
      "title": "Calibre-Web URL",
      "description": "Base URL of your Calibre-Web instance. Leave empty to hide Calibre-Web features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://reader.example.com"
    },
    {
      "name": "calibreUser",
      "title": "Calibre-Web Username",
      "description": "Used for OPDS + Send-to-Kindle.",
      "type": "textfield",
      "required": false,
      "placeholder": "admin"
    },
    {
      "name": "calibrePassword",
      "title": "Calibre-Web Password",
      "description": "Password of that user.",
      "type": "password",
      "required": false
    },
    {
      "name": "paperlessUrl",
      "title": "Paperless URL",
      "description": "Base URL of your Paperless-ngx instance. Leave empty to hide Paperless features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://paperless.example.com"
    },
    {
      "name": "paperlessToken",
      "title": "Paperless API Token",
      "description": "Your Paperless profile \u2192 API Auth Token. Documents must be visible to this user.",
      "type": "password",
      "required": false
    },
    {
      "name": "metubeUrl",
      "title": "MeTube URL",
      "description": "Base URL of your MeTube instance. Leave empty to hide MeTube features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://metube.example.com"
    },
    {
      "name": "metubeFolders",
      "title": "MeTube Destinations",
      "description": "Comma-separated extra folders as folder|Label[|video]. Add |video to download video instead of opus audio. Example: music|Music,clips|Clips|video",
      "type": "textfield",
      "required": false,
      "placeholder": "music|Music,clips|Clips|video"
    },
    {
      "name": "kumaUrl",
      "title": "Uptime Kuma URL",
      "description": "Base URL of your Uptime Kuma instance. Leave empty to hide Uptime Kuma features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://kuma.example.com"
    },
    {
      "name": "kumaStatusSlug",
      "title": "Uptime Kuma Status Page Slug",
      "description": "Slug of a public status page (used when no API key is set).",
      "type": "textfield",
      "required": false,
      "placeholder": "home"
    },
    {
      "name": "kumaApiKey",
      "title": "Uptime Kuma API Key",
      "description": "Settings \u2192 API Keys. With a key every monitor is read from /metrics, not just the status page.",
      "type": "password",
      "required": false
    },
    {
      "name": "ntfyUrl",
      "title": "ntfy URL",
      "description": "Base URL of your ntfy instance. Leave empty to hide ntfy features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://ntfy.example.com"
    },
    {
      "name": "ntfyTopics",
      "title": "ntfy Topics",
      "description": "Comma-separated topics to read.",
      "type": "textfield",
      "required": false,
      "placeholder": "alerts,downloads"
    },
    {
      "name": "adguardUrl",
      "title": "AdGuard Home URL",
      "description": "Base URL of your AdGuard Home instance. Leave empty to hide AdGuard Home features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://dns.example.com"
    },
    {
      "name": "adguardUsername",
      "title": "AdGuard Home Username",
      "description": "Web UI username.",
      "type": "textfield",
      "required": false,
      "placeholder": "admin"
    },
    {
      "name": "adguardPassword",
      "title": "AdGuard Home Password",
      "description": "Web UI password.",
      "type": "password",
      "required": false
    },
    {
      "name": "komodoUrl",
      "title": "Komodo URL",
      "description": "Base URL of your Komodo instance. Leave empty to hide Komodo features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://komodo.example.com"
    },
    {
      "name": "komodoApiKey",
      "title": "Komodo API Key",
      "description": "Settings \u2192 Profile \u2192 API keys.",
      "type": "password",
      "required": false
    },
    {
      "name": "komodoApiSecret",
      "title": "Komodo API Secret",
      "description": "Shown once when the key is created.",
      "type": "password",
      "required": false
    },
    {
      "name": "servicesSshHost",
      "title": "Services SSH Host",
      "description": "SSH destination for Services & Jobs: user@host or an alias from ~/.ssh/config. Uses noninteractive key or agent authentication and a previously trusted host key. Leave empty to disable.",
      "type": "textfield",
      "required": false,
      "placeholder": "user@server.example.com"
    },
    {
      "name": "servicesSshPort",
      "title": "Services SSH Port",
      "description": "Optional SSH port (1\u201365535). Leave empty to use your SSH configuration or port 22.",
      "type": "textfield",
      "required": false,
      "placeholder": "22"
    },
    {
      "name": "servicesSshIdentityFile",
      "title": "Services SSH Identity File",
      "description": "Optional path to your local SSH private key; ~/ is supported. Leave empty to use your SSH configuration or agent. Enter a file path, never the key itself.",
      "type": "textfield",
      "required": false,
      "placeholder": "~/.ssh/id_ed25519"
    },
    {
      "name": "backrestUrl",
      "title": "Backrest URL",
      "description": "Base URL of your Backrest instance. Leave empty to hide Backrest features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://backrest.example.com"
    },
    {
      "name": "backrestUsername",
      "title": "Backrest Username",
      "description": "Web UI username.",
      "type": "textfield",
      "required": false,
      "placeholder": "admin"
    },
    {
      "name": "backrestPassword",
      "title": "Backrest Password",
      "description": "Web UI password.",
      "type": "password",
      "required": false
    },
    {
      "name": "backrestGraceHours",
      "title": "Backup Freshness Grace (Hours)",
      "description": "Extra time beyond each backup/check schedule before it is overdue. Defaults to 2 hours. Manual plans have no deadline.",
      "type": "textfield",
      "required": false,
      "placeholder": "2"
    },
    {
      "name": "scrutinyUrl",
      "title": "Scrutiny URL",
      "description": "Base URL of your Scrutiny instance. Leave empty to hide Scrutiny features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://scrutiny.example.com"
    },
    {
      "name": "speedtestUrl",
      "title": "Speedtest Tracker URL",
      "description": "Base URL of your Speedtest Tracker instance. Leave empty to hide Speedtest Tracker features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://speedtest.example.com"
    },
    {
      "name": "fireflyUrl",
      "title": "Firefly III URL",
      "description": "Base URL of your Firefly III instance. Leave empty to hide Firefly III features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://firefly.example.com"
    },
    {
      "name": "fireflyToken",
      "title": "Firefly III Personal Access Token",
      "description": "Options \u2192 Profile \u2192 OAuth \u2192 Personal Access Tokens.",
      "type": "password",
      "required": false
    },
    {
      "name": "picoUrl",
      "title": "Firefly Pico URL",
      "description": "Base URL of your Firefly Pico instance. Leave empty to hide Firefly Pico features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://pico.example.com"
    },
    {
      "name": "subscriptionsUrl",
      "title": "Subscriptions JSON URL",
      "description": "Optional URL of a subscriptions.json published by the companion firefly-sub-publish script (upcoming bills summary).",
      "type": "textfield",
      "required": false,
      "placeholder": "https://home.example.com/images/subscriptions.json"
    },
    {
      "name": "forgejoUrl",
      "title": "Forgejo / Gitea URL",
      "description": "Base URL of your Forgejo / Gitea instance. Leave empty to hide Forgejo / Gitea features.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://git.example.com"
    },
    {
      "name": "forgejoToken",
      "title": "Forgejo / Gitea Access Token",
      "description": "Settings → Applications → Generate token, with read/write on repository, issue and notification. Unlocks the Code screen (repos, pull requests, reviews, Actions).",
      "type": "password",
      "required": false
    },
    {
      "name": "nextcloudUrl",
      "title": "Nextcloud URL",
      "description": "Base URL of Nextcloud, including its subpath if any.",
      "type": "textfield",
      "required": false
    },
    {
      "name": "nextcloudUsername",
      "title": "Nextcloud Username",
      "description": "Your Nextcloud user ID (not display name).",
      "type": "textfield",
      "required": false
    },
    {
      "name": "nextcloudAppPassword",
      "title": "Nextcloud App Password",
      "description": "Create an app password in Nextcloud \u2192 Personal settings \u2192 Security.",
      "type": "password",
      "required": false
    },
    {
      "name": "lubeloggerUrl",
      "type": "textfield",
      "required": false,
      "title": "LubeLogger URL",
      "description": "Base URL of your LubeLogger instance, e.g. https://lubelogger.example.org",
      "placeholder": "https://lubelogger.example.org"
    },
    {
      "name": "lubeloggerUsername",
      "type": "textfield",
      "required": false,
      "title": "LubeLogger Username",
      "description": "Only needed if your LubeLogger requires a login (basic auth)",
      "placeholder": "leave empty when LubeLogger has no account"
    },
    {
      "name": "lubeloggerPassword",
      "type": "password",
      "required": false,
      "title": "LubeLogger Password",
      "description": "Only needed if your LubeLogger requires a login (basic auth)",
      "placeholder": "leave empty when LubeLogger has no account"
    },
    {
      "name": "lubeloggerCurrency",
      "type": "textfield",
      "required": false,
      "title": "Vehicle Currency Label",
      "description": "Shown next to costs, e.g. KM or EUR. LubeLogger's API does not report one.",
      "placeholder": "KM"
    },
    {
      "name": "lubeloggerDistanceUnit",
      "type": "textfield",
      "required": false,
      "title": "Distance Unit Label",
      "description": "Defaults to km",
      "placeholder": "km"
    },
    {
      "name": "lubeloggerVolumeUnit",
      "type": "textfield",
      "required": false,
      "title": "Fuel Volume Unit Label",
      "description": "Defaults to L",
      "placeholder": "L"
    },
    {
      "name": "lubeloggerVehicleId",
      "type": "textfield",
      "required": false,
      "title": "Default Vehicle ID",
      "description": "Which vehicle the Home row summarises when you have several",
      "placeholder": "first vehicle"
    },
    {
      "name": "lubeloggerDecimal",
      "type": "dropdown",
      "required": false,
      "title": "LubeLogger Decimal Separator",
      "description": "How LubeLogger's server locale parses numbers. Auto-detects from its own data.",
      "default": "auto",
      "data": [
        {
          "title": "Auto-detect",
          "value": "auto"
        },
        {
          "title": "Comma (1234,56)",
          "value": ","
        },
        {
          "title": "Dot (1234.56)",
          "value": "."
        }
      ]
    },
    {
      "name": "searxngUrl",
      "title": "SearXNG URL",
      "description": "Base URL of your SearXNG instance (JSON API enabled). Leave empty to hide web search.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://search.example.com"
    },
    {
      "name": "jellystatUrl",
      "title": "Jellystat URL",
      "description": "Base URL of your Jellystat instance. Leave empty to hide watch statistics.",
      "type": "textfield",
      "required": false,
      "placeholder": "https://jellystat.example.com"
    },
    {
      "name": "jellystatApiKey",
      "title": "Jellystat API Key",
      "description": "Jellystat → Settings → API Keys.",
      "type": "password",
      "required": false
    }
  ],
  "dependencies": {
    "@raycast/api": "^1.88.4",
    "@raycast/utils": "^1.18.1",
    "cron-parser": "^5.10.0",
    "fast-xml-parser": "^5.11.1"
  },
  "devDependencies": {
    "@raycast/eslint-config": "^2.2.0",
    "@types/node": "^22.9.0",
    "@types/react": "^19.2.18",
    "eslint": "^10.9.1",
    "typescript": "^5.6.3"
  },
  "scripts": {
    "dev": "ray develop",
    "build": "ray build -e dist",
    "typecheck": "tsc --noEmit",
    "test:paperless": "node --test scripts/paperless-api.test.cjs",
    "lint": "ray lint",
    "lint:local": "eslint src",
    "fix-lint": "ray lint --fix",
    "gen:env": "node scripts/gen-env-example.mjs",
    "test:nextcloud": "node --test scripts/nextcloud-api.test.cjs",
    "test:services": "node --test scripts/services-api.test.cjs && python3 scripts/services-jobs.test.py",
    "test:backups": "node --test scripts/backups-api.test.cjs scripts/backup-storage-api.test.cjs && python3 scripts/backup-storage.test.py"
  },
  "categories": [
    "Developer Tools",
    "Media",
    "Productivity"
  ],
  "keywords": [
    "raycast",
    "raycast-extension",
    "homelab",
    "self-hosted",
    "jellyfin",
    "jellyseerr",
    "sonarr",
    "radarr",
    "lidarr",
    "audiobookshelf",
    "immich",
    "paperless-ngx",
    "uptime-kuma",
    "firefly-iii"
  ],
  "repository": {
    "type": "git",
    "url": "https://github.com/abjelosevic88/raycast-homelab.git"
  },
  "homepage": "https://github.com/abjelosevic88/raycast-homelab#readme"
}