Compare commits

..

79 Commits

Author SHA1 Message Date
Kaloyan Danchev
1f92f0593f Fix TypeScript build errors and configure Traefik deployment
Some checks failed
Master CI / yarn_install_and_build (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
Fix type mismatches across Unraid UI pages (SystemInfo, ServerVars,
Notification properties), replace unavailable Mantine components
(ScrollArea.Autosize, IconHardDrive), correct Orchis theme types,
add missing tRPC endpoints (users, syslog, notification actions),
and configure docker-compose for Traefik reverse proxy on dockerproxy
network with unmarr.xtrm-lab.org routing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-06 23:55:31 +02:00
Kaloyan Danchev
783a12b444 Fix ESLint configuration for Docker build
Some checks failed
Master CI / yarn_install_and_build (push) Has been cancelled
Mark stale issues and pull requests / stale (push) Has been cancelled
- Remove ignoreDuringBuilds from eslintConfig in package.json (invalid)
- Add eslint.ignoreDuringBuilds to next.config.js (correct location)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 09:58:47 +02:00
Kaloyan Danchev
a48a06e680 Add Docker deployment for Unraid
Some checks failed
Master CI / yarn_install_and_build (push) Has been cancelled
- Add Dockerfile.unraid with multi-stage build (builds inside container)
- Add docker-compose.unraid.yml for easy deployment
- Add build-and-push.sh script for building and pushing to Gitea registry
- Update root redirect to /unraid dashboard

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 09:48:30 +02:00
Kaloyan Danchev
9a2c56a5dc Phase 4: Add Unraid management pages with sidebar layout
Some checks failed
Master CI / yarn_install_and_build (push) Has been cancelled
- Add UnraidLayout component with full sidebar navigation
- Add Array management page with disk tables and parity check controls
- Add Docker management page with container cards and filtering
- Add VMs management page with power controls (start/stop/pause/resume/reboot)
- Add Shares page with security levels and storage usage
- Add Users page with admin/user roles display
- Add Settings index with links to all settings pages
- Add Identification settings page with system info
- Add Notifications settings page with notification history
- Add Tools index with links to all tools
- Add Syslog page with live log viewing and filtering
- Add Diagnostics page with system health checks
- Update dashboard to use UnraidLayout

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 09:32:52 +02:00
Kaloyan Danchev
83a8546521 Add Unraid API integration and Orchis theme
Some checks failed
Master CI / yarn_install_and_build (push) Has been cancelled
Phase 1: Foundation Setup
- Create Unraid GraphQL client with type-safe queries/mutations
- Add comprehensive TypeScript types for all Unraid data models
- Implement tRPC router with 30+ endpoints for Unraid management
- Add environment variables for Unraid connection

Phase 2: Core Dashboard
- Create SystemInfoCard component (CPU, RAM, OS, motherboard)
- Create ArrayCard component (disks, parity, cache pools)
- Create DockerCard component with start/stop controls
- Create VmsCard component with power management
- Add main Unraid dashboard page with real-time updates

Phase 3: Orchis Theme Integration
- Create Mantine theme override with Orchis design tokens
- Add CSS custom properties for light/dark modes
- Configure shadows, spacing, radius from Orchis specs
- Style all Mantine components with Orchis patterns

Files added:
- src/lib/unraid/* (GraphQL client, types, queries)
- src/server/api/routers/unraid/* (tRPC router)
- src/components/Unraid/* (Dashboard components)
- src/pages/unraid/* (Dashboard page)
- src/styles/orchis/* (Theme configuration)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 09:19:21 +02:00
Kaloyan Danchev
e881ec6cb5 Add Unraid UI project documentation and research
Some checks failed
Master CI / yarn_install_and_build (push) Has been cancelled
- Complete Unraid WebGUI inventory (~100 pages documented)
- Unraid GraphQL API research and documentation
- Homarr architecture documentation
- Orchis GTK theme design tokens (TypeScript)
- Project README with implementation plan

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 07:44:52 +02:00
Meier Lukas
ce336311b1 Merge pull request #2321 from ajnart/dev 2025-08-02 19:24:28 +02:00
Meier Lukas
da138c5b54 chore(release): update version in package-json 2025-08-02 18:36:31 +02:00
Manuel
69f5cd47ad feat: prompt 1.0 migration (#2320)
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2025-08-02 18:35:04 +02:00
Thomas Camlong
638885466e New Crowdin updates (#2231) 2025-08-02 18:04:19 +02:00
Jan Tesař
523fe30452 Updates the installation link (#2318) 2025-08-02 18:00:43 +02:00
Thomas Camlong
cd78714da9 Update greetings.yml 2025-05-30 17:20:31 +02:00
Thomas Camlong
2982c146a4 Update feature-request.yml 2025-05-30 17:18:56 +02:00
Meier Lukas
989cc7de58 Revert "Update PiHole authentication. (PiHole v6)" (#2287) 2025-03-21 20:13:44 +01:00
Thomas Camlong
677224f8de Update README.md 2025-03-21 20:06:12 +01:00
Thomas Camlong
8da6d33c61 Merge pull request #2278 from DR-Blogs/PiHole-v6-API-reintegration
Update PiHole authentication. (PiHole v6)
2025-03-21 20:04:03 +01:00
DR
9be9e3963a Update PiHole authentication. https://docs.pi-hole.net/api/auth/#__tabbed_1_1 2025-02-20 22:27:48 -05:00
Jonathan Chemla
1d3a4af259 docs: Add links to all banners of readme (#2276)
Co-authored-by: Meier Lukas <meierschlumpf@gmail.com>
2025-02-19 21:12:31 +01:00
xmarkurion
1251a89a9b docs: update readme with correct link for getting started. (#2271) 2025-02-19 21:11:14 +01:00
Meier Lukas
274eaa9208 docs: add note about moved repository and migration to 1.0 2025-01-27 18:05:32 +01:00
Meier Lukas
3236402d2b chore(issue-template): add warning alert to issue templates for 1.0 (#2269) 2025-01-27 17:46:21 +01:00
Meier Lukas
c86c69158a Merge pull request #2227 from ajnart/dev 2024-12-17 21:47:24 +01:00
Thomas Camlong
ed3d143b8a New Crowdin updates (#2226) 2024-12-17 21:43:24 +01:00
Meier Lukas
136032f920 Merge branch 'master' into dev 2024-12-17 21:20:54 +01:00
Meier Lukas
150e9bf53f chore: update version in package-json to 0.15.10 2024-12-17 21:17:56 +01:00
Thomas Camlong
a3d92d6a73 chore(translations): new crowdin updates (#2225) 2024-12-17 19:03:12 +01:00
Thomas Camlong
d3a48ae0e0 New Crowdin updates (#2190) 2024-12-17 18:40:51 +01:00
Marek Tancak
4aa7e7602b fix: unable to delete boards with capitalised name 'Default' (#2223) 2024-12-17 18:40:32 +01:00
Meier Lukas
d63c610cf5 feat: add 1.0 migration page (#2224) 2024-12-17 18:39:57 +01:00
Manuel
0a31b0fc1c Version 0.15.9 (#2220)
* fix: iframes javascript content (#2218)

* config: update version (#2219)
2024-12-08 21:59:34 +01:00
Manuel
3737543766 config: update version (#2219) 2024-12-08 20:53:35 +01:00
Manuel
85547277d1 fix: iframes javascript content (#2218) 2024-12-08 20:06:15 +01:00
Meier Lukas
8e962abc16 Merge pull request #2216 from ajnart/dev 2024-12-07 22:37:59 +01:00
Meier Lukas
31a7559b86 fix: two issues with board rename and iframes (#2215) 2024-12-07 22:21:40 +01:00
TyxTang
b59921b843 fix: Fix Jellyseerr Avatar Loading Issue (#2197)
fix: Fix Jellyseerr Avatar Loading Issue
feat: Add Fallback Image.
2024-11-27 22:17:48 +01:00
Marius Starke
95c126f2c6 fix: remove several occurrences of translation file prefix (#2188)
Co-authored-by: BuildTools <unconfigured@null.spigotmc.org>
2024-11-05 09:54:27 +01:00
Meier Lukas
c8425acd34 Merge pull request #2178 from ajnart/dev
Version 0.15.7
2024-11-02 17:44:55 +01:00
Meier Lukas
7ea9c00c18 chore: update package-json version to 0.15.7 (#2184) 2024-11-02 17:39:42 +01:00
Thomas Camlong
3651585271 chore: new Crowdin updates (#2169)
* New translations common.json (Ukrainian)

* New translations date.json (Ukrainian)

* New translations weather.json (Ukrainian)

* New translations page-appearance.json (Ukrainian)

* New translations common.json (Ukrainian)

* New translations page-appearance.json (Ukrainian)

* New translations login.json (Ukrainian)

* New translations selector.json (Ukrainian)

* New translations add-app.json (Ukrainian)

* New translations about.json (Ukrainian)

* New translations torrents-status.json (Ukrainian)

* New translations manage.json (Ukrainian)

* New translations boards.json (Ukrainian)

* New translations users.json (Ukrainian)

* New translations docker.json (Ukrainian)

* New translations entity-state.json (Ukrainian)

* New translations edit.json (Ukrainian)

* New translations trigger-automation.json (Ukrainian)

* New translations indexer-manager.json (Ukrainian)

* New translations health-monitoring.json (Ukrainian)

* New translations media-transcoding.json (Ukrainian)
2024-11-01 10:04:23 +01:00
Meier Lukas
22732e33e5 fix: credentials login behind proxy no longer works (#2177) 2024-11-01 10:03:45 +01:00
Lollyde
9caf72aae7 fix: documentation link (#2163)
seems like this was missed a while back.
2024-10-31 13:55:38 +01:00
Meier Lukas
5a73166d70 Merge pull request #2162 from ajnart/dev
v0.15.6
2024-10-18 20:54:33 +02:00
Meier Lukas
5b23f7d13a fix: db migration not working (#2161) 2024-10-18 20:50:56 +02:00
Meier Lukas
26ae001b5a Merge pull request #2157 from ajnart/dev
* fix: app ping retry interval

* Bugfix for dynamic urls not properly replaces on Search (#2124)

* Bugfix for search items

* Fixing server side rendering issues

* Add rel="noreferrer" to link AppTile.tsx (#2126)

reference: 
Issue: https://github.com/ajnart/homarr/issues/1933
PR comment: https://github.com/ajnart/homarr/pull/2048#issuecomment-2113238216

* fix: Make timer button show only to admins (#2143)

* fix: wrong redirect url for oidc requests #1909 (#2149)

* fix: wrong redirect url for oidc requests #1909

* fix: login not working with https

* chore: New Crowdin updates (#2123)

* New translations health-monitoring.json (Greek)

* New translations login.json (French)

* New translations customize.json (French)

---------

Co-authored-by: Manuel <30572287+manuel-rw@users.noreply.github.com>
Co-authored-by: Jelte Lagendijk <j3lte@users.noreply.github.com>
Co-authored-by: Boyd <bebsworthy@gmail.com>
Co-authored-by: SeDemal <Tagaishi@hotmail.ch>
Co-authored-by: Thomas Camlong <thomas@ajnart.fr>
2024-10-18 18:55:22 +02:00
Meier Lukas
59e5c0306f chore: update package-json version (#2158) 2024-10-18 18:50:42 +02:00
Thomas Camlong
baedc001d9 chore: New Crowdin updates (#2123)
* New translations health-monitoring.json (Greek)

* New translations login.json (French)

* New translations customize.json (French)
2024-10-18 18:41:53 +02:00
Meier Lukas
6469aa2350 fix: wrong redirect url for oidc requests #1909 (#2149)
* fix: wrong redirect url for oidc requests #1909

* fix: login not working with https
2024-10-16 16:47:21 +02:00
SeDemal
d4765c1e7f fix: Make timer button show only to admins (#2143) 2024-09-29 22:24:21 +02:00
Manuel
4bba516fdf Merge pull request #2122 from ajnart/fix/app-ping-retry-interval 2024-09-29 20:27:22 +02:00
Boyd
ddde9992c5 Add rel="noreferrer" to link AppTile.tsx (#2126)
reference: 
Issue: https://github.com/ajnart/homarr/issues/1933
PR comment: https://github.com/ajnart/homarr/pull/2048#issuecomment-2113238216
2024-09-16 01:09:06 +02:00
Jelte Lagendijk
c81612e39b Bugfix for dynamic urls not properly replaces on Search (#2124)
* Bugfix for search items

* Fixing server side rendering issues
2024-09-11 23:53:55 +02:00
Manuel
993739ab8e fix: app ping retry interval 2024-09-04 20:48:05 +02:00
Manuel
20a84da5dc chore: merge 0.15.4 from ajnart/dev 2024-09-01 20:27:05 +02:00
Manuel
6a7532b5b7 chore: increase package.json version 2024-09-01 20:18:43 +02:00
Thomas Camlong
714936a2e9 chore: new Crowdin updates (#2117) 2024-09-01 20:16:15 +02:00
Meier Lukas
d2a40ddf33 fix: revert pgid puid docker changes (#2119) 2024-09-01 20:15:53 +02:00
José Roberto Sánchez
eba30108f6 fix: notebook widget overflow on mobile (#2112) 2024-08-30 20:24:21 +02:00
Meier Lukas
995c8a481e fix: dev docker issues (#2118) 2024-08-30 20:23:35 +02:00
Manuel
5b5121a609 config: fix arm64 build 2024-08-24 14:54:53 +02:00
Thomas Camlong
c008cc92c2 New Crowdin updates (#2059) 2024-08-24 14:39:51 +02:00
renovate[bot]
858ccd72de ⬆️ Update dependency axios to v1.7.4 [SECURITY] (#2106)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-08-24 14:39:23 +02:00
Meier Lukas
a87935875d feat: add download functionality for board configuration files (#2111) 2024-08-24 14:39:13 +02:00
cospeedster
cc240f4f87 docs: update README.md (#2104) 2024-08-12 07:42:54 +02:00
Meier Lukas
47c401145d fix: removing a category hides items from the wrapper below (#2103)
* fix: removing a category hides items from the wrapper below

* refactor: improve variable names
2024-08-08 20:59:55 +02:00
Meier Lukas
76d46ec1ba refactor: improve variable names 2024-08-08 20:53:35 +02:00
Manuel
fbc099d198 fix: #1707 refech interval app pings (#2097) 2024-08-04 17:47:31 +02:00
Manuel
3de04bdb22 fix: #2086 enforce password requirements for admin user (#2098) 2024-08-04 17:47:05 +02:00
Jason B.
c042c245a3 feat: add Proxmox Uptime View (#2092)
* feat: add Proxmox Uptime View

* fix: Proxmox Uptime

* fix: Proxmox Uptime

* fix: add env.example, make formattedUptime a constant

* fix: Uptime

* fix: Implement dayjs

* fix: removed unused import

* fix: Uptime
2024-08-01 19:58:47 +02:00
Yossi Hillali
68ff84c85a feat: add indexers site hyperlink (#2061)
* Feature: add indexers site hyperlink

* Fix: add an option taget on settings, change color to grey
2024-05-25 12:42:49 +02:00
Thomas Camlong
dfe7b0d60b chore: new crowdin updates (#2038) 2024-05-23 18:18:28 +02:00
Yossi Hillali
afdca50bd2 feat: add dns disable timer (#2029) 2024-05-23 18:18:06 +02:00
Fernando OK
cb2b28ca4b feat: add environment variable puid and pgid #2011 2024-05-23 18:17:02 +02:00
HAMAD ABDULLA
b7fb086476 Add New Language Arabic (#2051) 2024-05-18 16:50:36 +02:00
Thomas Camlong
2bf423132d Merge pull request #2052 from ajnart/1676-custom-favicon-does-not-rednder 2024-05-16 15:17:49 +02:00
ajnart
84f57bb0a1 chore: add test:docker script for local development 2024-05-15 22:16:00 +02:00
ajnart
5043b9cd30 Refactor favicon links in Meta components 2024-05-15 22:07:27 +02:00
ajnart
051f439434 Add key for custom favicon 2024-05-15 21:33:25 +02:00
Manuel
dbadcd8f7a chore: merge hotfix to master 2024-05-08 19:37:52 +02:00
Manuel
9b95ac3c91 chore: merge version 0.15.3 to master 2024-05-07 20:36:15 +02:00
556 changed files with 17988 additions and 2479 deletions

View File

@@ -4,11 +4,16 @@ DATABASE_URL="file:./database/db.sqlite"
# You can generate a new secret on the command line with:
# openssl rand -base64 32
# https://next-auth.js.org/configuration/options#secret
NEXTAUTH_URL="http://localhost:3000"
AUTH_TRUST_HOST="true"
NEXTAUTH_SECRET="anything"
# Disable analytics
NEXT_PUBLIC_DISABLE_ANALYTICS="true"
DEFAULT_COLOR_SCHEME="light"
DEFAULT_COLOR_SCHEME="light"
# Unraid API Configuration
UNRAID_HOST=192.168.10.20
UNRAID_API_KEY=your-api-key-here
UNRAID_USE_SSL=false
UNRAID_PORT=80

View File

@@ -3,6 +3,11 @@ description: Report something that's broken, or not working like intented!
title: '<title>'
labels: ['🐛 Bug']
body:
- type: markdown
attributes:
value: |
> [!WARNING]
> If you want to report a bug for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
- type: dropdown
id: environment
attributes:

View File

@@ -3,6 +3,11 @@ description: Request a feature to help improve Homarr!
title: '<title>'
labels: ['✨ Feature']
body:
- type: markdown
attributes:
value: |
> [!WARNING]
> If you want to request a feature for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
- type: textarea
id: feature
attributes:
@@ -22,3 +27,11 @@ body:
- High (App breaking feature)
validations:
required: true
- type: checkboxes
id: idiot-check
attributes:
label: Please tick the boxes
description: Before submitting, please ensure that
options:
- label: You are **NOT** using a version superior to v1. if that is the case, please fill this issue on the new repository.
required: true

View File

@@ -3,6 +3,11 @@ description: Tell us your idea! We may implement it.
title: '<title>'
labels: ['🤔 Idea']
body:
- type: markdown
attributes:
value: |
> [!WARNING]
> If you have an idea for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
- type: textarea
id: feature
attributes:

View File

@@ -2,6 +2,11 @@ name: 🏗️ Module request
description: Request for a module to be added / an integration with you favourite service !
title: '<title>'
body:
- type: markdown
attributes:
value: |
> [!WARNING]
> If you want to request a new integration for 1.0, please open it on the new [repository](https://github.com/homarr-labs/homarr/issues/new/choose).
- type: textarea
id: name
attributes:

View File

@@ -112,7 +112,7 @@ jobs:
if: github.event_name != 'pull_request'
uses: docker/build-push-action@v4
with:
platforms: linux/amd64,linux/arm64,linux/arm/v7
platforms: linux/amd64,linux/arm64
context: .
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}

View File

@@ -12,5 +12,5 @@ jobs:
- uses: actions/first-interaction@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
issue-message: "Hi 👋. Thank you for submitting your first issue to Homarr. Please ensure that you've provided all nessesary information. You can use the three dots > Edit button to update your post with additional images and information. Depending on the current volume of requests, the team should get in conact with you shortly."
issue-message: "Hi 👋. Thank you for submitting your first issue to Homarr. Please ensure that you've opened this issue on the correct repository. Homarr v1 has been moved to github.com/homarr-labs/homarr "
pr-message: "Hi 👋. Thank you for making your first contribution to Homarr. Please ensure that you've completed all the points in the TODO checklist. We'll review your changes shortly."

View File

@@ -11,7 +11,7 @@
"layout.manage.navigation.**",
],
"editor.codeActionsOnSave": {
"source.organizeImports": true
"source.organizeImports": "explicit"
},
"typescript.tsdk": "node_modules/typescript/lib",
"explorer.fileNesting.patterns": {

View File

@@ -32,16 +32,14 @@ RUN apt update && apt install -y openssl wget
# Move node_modules to temp location to avoid overwriting
RUN mv node_modules _node_modules
RUN rm package.json
# Install dependencies for migration
RUN cp ./migrate/package.json ./package.json
RUN yarn
# Copy better_sqlite3 build for current platform
RUN cp /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/_node_modules/better-sqlite3/build/Release/better_sqlite3.node
# Copy node_modules for migration to migrate folder for migration script
RUN mv node_modules ./migrate/node_modules
# Copy temp node_modules of app to app folder
RUN mv _node_modules node_modules
@@ -54,7 +52,7 @@ EXPOSE $PORT
ENV PORT=${PORT}
ENV DATABASE_URL "file:/data/db.sqlite"
ENV NEXTAUTH_URL "http://localhost:7575"
ENV AUTH_TRUST_HOST="true"
ENV PORT 7575
ENV NEXTAUTH_SECRET NOT_IN_USE_BECAUSE_JWTS_ARE_UNUSED
@@ -63,4 +61,4 @@ HEALTHCHECK --interval=10s --timeout=5s --start-period=5s --retries=3 \
VOLUME [ "/app/data/configs" ]
VOLUME [ "/data" ]
ENTRYPOINT ["sh", "./scripts/run.sh"]
ENTRYPOINT ["sh", "./scripts/run.sh"]

105
Dockerfile.unraid Normal file
View File

@@ -0,0 +1,105 @@
# Multi-stage Dockerfile for Homarr Unraid UI
# Builds entirely inside Docker to avoid native module issues
# Build stage
FROM node:20.2.0-slim AS builder
WORKDIR /app
# Install build dependencies
RUN apt-get update && apt-get install -y \
python3 \
make \
g++ \
git \
openssl \
&& rm -rf /var/lib/apt/lists/*
# Copy package files
COPY package.json yarn.lock ./
COPY .yarnrc.yml ./
COPY .yarn ./.yarn
# Install dependencies
RUN yarn install --immutable
# Copy source code
COPY . .
# Build the application
ENV SKIP_ENV_VALIDATION=1
ENV NEXTAUTH_SECRET=build-time-secret
ENV DATABASE_URL=file:build.sqlite
RUN yarn build
# Production stage
FROM node:20.2.0-slim
WORKDIR /app
# Define node.js environment variables
ARG PORT=7575
ENV NEXT_TELEMETRY_DISABLED=1
ENV NODE_ENV=production
ENV NODE_OPTIONS='--no-experimental-fetch'
# Copy built application from builder
COPY --from=builder /app/next.config.js ./
COPY --from=builder /app/public ./public
COPY --from=builder /app/package.json ./temp_package.json
COPY --from=builder /app/yarn.lock ./temp_yarn.lock
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
COPY --from=builder /app/scripts/run.sh ./scripts/run.sh
COPY --from=builder /app/drizzle ./drizzle
COPY --from=builder /app/drizzle/migrate ./migrate
COPY --from=builder /app/tsconfig.json ./migrate/tsconfig.json
COPY --from=builder /app/cli ./cli
RUN chmod +x ./scripts/run.sh
RUN mkdir -p /data
# Install runtime dependencies
RUN apt-get update && apt-get install -y openssl wget && rm -rf /var/lib/apt/lists/*
# Move node_modules to temp location to avoid overwriting
RUN mv node_modules _node_modules
RUN rm package.json
# Install dependencies for migration
RUN cp ./migrate/package.json ./package.json
RUN yarn install --production=false
# Copy better_sqlite3 build for current platform
RUN cp /app/node_modules/better-sqlite3/build/Release/better_sqlite3.node /app/_node_modules/better-sqlite3/build/Release/better_sqlite3.node || true
# Copy node_modules for migration to migrate folder
RUN mv node_modules ./migrate/node_modules
# Restore app node_modules
RUN mv _node_modules node_modules
# Setup CLI
RUN echo '#!/bin/bash\nnode /app/cli/cli.js "$@"' > /usr/bin/homarr
RUN chmod +x /usr/bin/homarr
RUN cd /app/cli && yarn install --production || true
# Expose the default application port
EXPOSE $PORT
ENV PORT=${PORT}
# Environment defaults
ENV DATABASE_URL="file:/data/db.sqlite"
ENV AUTH_TRUST_HOST="true"
ENV PORT=7575
ENV NEXTAUTH_SECRET=NOT_IN_USE_BECAUSE_JWTS_ARE_UNUSED
# Health check
HEALTHCHECK --interval=10s --timeout=5s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:${PORT} || exit 1
VOLUME [ "/app/data/configs" ]
VOLUME [ "/data" ]
ENTRYPOINT ["sh", "./scripts/run.sh"]

View File

@@ -1,6 +1,5 @@
<!-- Project Title -->
![Banner](docs/banner.png)
[![Banner](docs/banner.png)](https://homarr.dev/)
<!-- Badges -->
<p align="center">
@@ -25,7 +24,7 @@
<strong>Demo ✨</strong>
</a>
<a href="https://homarr.dev/docs/getting-started/installation/">
<a href="https://homarr.dev/docs/getting-started/">
<strong>Install 💻</strong>
</a> •
<a href="https://translate.homarr.dev/">
@@ -41,7 +40,14 @@ Simplify the management of your server with Homarr - a sleek, modern dashboard t
<br/>
<br/>
![Features Section](docs/section-features.png)
> [!IMPORTANT]
> # The Homarr repository has been moved to [HomarrLabs](https://github.com/homarr-labs/homarr)
> # Please create issues related to 1.0 there. This repository will be archived once the 1.0 is fully polished.
> # 1.0 is a complete rewrite and to migrate you have to change your compose file. Please follow the [Migration Guide](https://homarr.dev/blog/2025/01/19/migration-guide-1.0) and read the [Breaking Changes](https://homarr.dev/blog/2024/09/23/version-1.0#breaking-changes)
[![Features Section](docs/section-features.png)](https://homarr.dev/)
- 🖌️ Highly customizable with an extensive drag and drop grid system
- ✨ Integrates seamlessly with your favorite self-hosted applications
@@ -57,7 +63,7 @@ Simplify the management of your server with Homarr - a sleek, modern dashboard t
<br/>
<br/>
![Widgets & Integrations Section](docs/section-widgets-and-integrations.png)
[![Widgets & Integrations Section](docs/section-widgets-and-integrations.png)](https://homarr.dev/docs/category/widgets)
Homarr has a [built-in collection of widgets and integrations](https://homarr.dev/docs/category/integrations), that connect to your applications and enable you to control them directly from the dashboard.
Each widget and integration has a comprehensive documentation
@@ -73,8 +79,8 @@ Homarr will integrate with the following applications:
- [NZBGet](https://homarr.dev/docs/integrations/usenet#nzbget)
📺 Media servers
- [Plex](https://homarr.dev/docs/integrations/usenet#nzbget)
- [Jellyfin](https://homarr.dev/docs/integrations/usenet#nzbget)
- [Plex](https://homarr.dev/docs/integrations/media-server/#plex)
- [Jellyfin](https://homarr.dev/docs/integrations/media-server#jellyfin-and-emby)
📚 Media collection managers
- [Sonarr](https://homarr.dev/docs/integrations/servarr#sonarr)
@@ -99,25 +105,25 @@ We're constantly adding new integrations and widgets, which will enhance your ex
<br/>
<br/>
![Preview Section](docs/section-preview.png)
[![Preview Section](docs/section-preview.png)](https://demo.homarr.dev/)
https://user-images.githubusercontent.com/30572287/217098893-5880e7de-13d0-42c5-b505-f7921593396f.mp4
<br/>
<br/>
![Installation Section](docs/section-installation.png)
[![Installation Section](docs/section-installation.png)](https://homarr.dev/docs/category/installation-1)
Since we are updating Homarr very frequently, we recommend reading our official installation guides:
<a href="https://homarr.dev/docs/getting-started/installation/">
<a href="https://homarr.dev/docs/category/installation-1">
<img src="docs/installation-button.png" width="200" />
</a>
<br/>
<br/>
![Contribute Section](docs/section-contribute.png)
[![Contribute Section](docs/section-contribute.png)](https://github.com/ajnart/homarr/blob/dev/CONTRIBUTING.md)
Homarr is maintained by motivated developers in their free-time.
We work for fun and learning on this project.

View File

@@ -432,7 +432,7 @@
"type": "notebook",
"properties": {
"showToolbar": true,
"content": "<h2><strong>Welcome to Homarr 🚀👋</strong></h2><p>We're glad that you're here! Homarr is a <em>modern </em>and <em>easy to use</em> dashboard that helps you to <strong>organize and manage</strong> your home network from one place. Control is <strong>at your fingertips</strong>.</p><p>We recommend you to read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev/docs/introduction/after-the-installation\">getting started guide</a> first. To edit this board you must enter the edit mode - only administrators can do this. Adding an app is the first step you should take. You can do this by clicking the <code>Add tile</code> button at the top right and select <code>App</code>. After you provided an internal URL, external URL and selected an icon you can drag it around when holding down the left mouse button. Make it bigger or smaller using the drag icon at the bottom right. When you're happy with it's position, you <strong>must exit edit mode to save your board</strong>. Adding widgets works the same way but may require additional configuration - read the documentation for more information.</p><p>To remove this widget, you must log in to your administrator account and click on the menu to delete it.</p><p><strong><u>Your TODO list:</u></strong></p><ul data-type=\"taskList\"><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev\">documentation</a></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add your <em>first app</em></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p><em>Resize </em>and <em>drag</em> your app to a different position</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add the <em>clock widget</em> to your dashboard</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Create a <em>new user</em></p></div></li></ul>"
"content": "<h2><strong>Welcome to Homarr 🚀👋</strong></h2><p>We're glad that you're here! Homarr is a <em>modern </em>and <em>easy to use</em> dashboard that helps you to <strong>organize and manage</strong> your home network from one place. Control is <strong>at your fingertips</strong>.</p><p>We recommend you to read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev/docs/getting-started/after-the-installation\">getting started guide</a> first. To edit this board you must enter the edit mode - only administrators can do this. Adding an app is the first step you should take. You can do this by clicking the <code>Add tile</code> button at the top right and select <code>App</code>. After you provided an internal URL, external URL and selected an icon you can drag it around when holding down the left mouse button. Make it bigger or smaller using the drag icon at the bottom right. When you're happy with it's position, you <strong>must exit edit mode to save your board</strong>. Adding widgets works the same way but may require additional configuration - read the documentation for more information.</p><p>To remove this widget, you must log in to your administrator account and click on the menu to delete it.</p><p><strong><u>Your TODO list:</u></strong></p><ul data-type=\"taskList\"><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Read the <a target=\"_blank\" rel=\"noopener noreferrer nofollow\" href=\"https://homarr.dev\">documentation</a></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add your <em>first app</em></p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p><em>Resize </em>and <em>drag</em> your app to a different position</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Add the <em>clock widget</em> to your dashboard</p></div></li><li data-checked=\"false\" data-type=\"taskItem\"><label><input type=\"checkbox\"><span></span></label><div><p>Create a <em>new user</em></p></div></li></ul>"
},
"area": {
"type": "wrapper",
@@ -510,4 +510,4 @@
"allowGuests": false
}
}
}
}

42
docker-compose.unraid.yml Normal file
View File

@@ -0,0 +1,42 @@
version: "3.8"
services:
unmarr:
image: git.xtrm-lab.org/jazzymc/homarr:latest
container_name: unmarr
restart: unless-stopped
environment:
# Unraid API Configuration
- UNRAID_HOST=192.168.10.20
- UNRAID_API_KEY=${UNRAID_API_KEY}
- UNRAID_USE_SSL=false
- UNRAID_PORT=80
# App Configuration
- TZ=Europe/Sofia
- DATABASE_URL=file:/data/db.sqlite
- AUTH_TRUST_HOST=true
- NEXTAUTH_URL=https://unmarr.xtrm-lab.org
- NEXTAUTH_SECRET=${NEXTAUTH_SECRET:-changeme}
volumes:
- /mnt/user/appdata/unmarr/data:/data
- /mnt/user/appdata/unmarr/configs:/app/data/configs
networks:
dockerproxy:
ipv4_address: 172.18.0.5
labels:
# Traefik
- "traefik.enable=true"
- "traefik.constraint=valid"
- "traefik.http.routers.unmarr.rule=Host(`unmarr.xtrm-lab.org`)"
- "traefik.http.routers.unmarr.entrypoints=https"
- "traefik.http.routers.unmarr.tls=true"
- "traefik.http.routers.unmarr.tls.certresolver=cloudflare"
- "traefik.http.services.unmarr.loadbalancer.server.port=7575"
# Unraid
- "net.unraid.docker.managed=true"
- "net.unraid.docker.icon=https://homarr.dev/img/logo.png"
- "net.unraid.docker.webui=https://unmarr.xtrm-lab.org"
networks:
dockerproxy:
external: true

View File

@@ -0,0 +1,148 @@
# Unraid Custom UI Project
This project transforms the Homarr fork into a custom Unraid management UI with an Orchis GTK theme.
## Project Goals
1. **Step 1**: Recreate all current Unraid WebGUI pages using Homarr as a base, with data from the Unraid GraphQL API
2. **Step 2**: Apply a custom theme based on the Orchis GTK theme
## Project Resources
| Document | Description |
|----------|-------------|
| [WEBGUI-COMPLETE-INVENTORY.md](./WEBGUI-COMPLETE-INVENTORY.md) | Complete inventory of ~100 Unraid WebGUI pages |
| [unraid-api-research.md](./unraid-api-research.md) | Unraid GraphQL API documentation |
| [homarr-architecture.md](./homarr-architecture.md) | Homarr codebase architecture |
| [orchis-design-system.ts](./orchis-design-system.ts) | Orchis theme design tokens (TypeScript) |
## Unraid Server Connection
- **GraphQL Endpoint**: `http://192.168.10.20/graphql`
- **Auth**: `x-api-key` header
- **Socket**: `/var/run/unraid-api.sock`
## Implementation Plan
### Phase 1: Foundation Setup
- [ ] Create Unraid GraphQL client integration
- [ ] Set up API authentication layer
- [ ] Configure environment variables for Unraid connection
- [ ] Create base types for Unraid data models
### Phase 2: Core Pages (Priority Order)
1. **Dashboard** - System overview with real-time metrics
- System info, CPU/RAM usage, array status
- Docker/VM summaries, network, UPS
2. **Array Management** (Main)
- Array devices, pool devices, boot device
- Parity check, array operations
3. **Docker Management**
- Container list, start/stop/restart
- Container details, logs
4. **VM Management**
- VM list, power controls
- VM details, console access
5. **Shares**
- User shares, disk shares
- Share settings, SMB/NFS security
### Phase 3: Orchis Theme Integration
- [ ] Copy design tokens to `src/styles/`
- [ ] Create Mantine theme override with Orchis values
- [ ] Implement light/dark mode with Orchis palettes
- [ ] Replace default components with Orchis-styled versions
### Phase 4: Settings & Tools
- Settings pages (identification, disk, network, etc.)
- Tools pages (syslog, diagnostics, system devices)
- User management
- Notifications system
### Phase 5: Real-time Features
- GraphQL subscriptions for CPU/memory metrics
- Nchan integration for legacy real-time features
- WebSocket connections for live updates
## Key Technical Decisions
### Homarr Stack
- Next.js 13 (Pages Router in this version)
- Mantine UI v6
- tRPC for type-safe API
- Zustand for state management
- React Query for server state
### Data Sources
| Feature | Source |
|---------|--------|
| System info, array, shares | Unraid GraphQL API |
| Docker containers | Unraid GraphQL API |
| VMs | Unraid GraphQL API |
| Real-time CPU/RAM | GraphQL Subscriptions |
| Real-time disk I/O | Nchan WebSocket (`/sub/diskload`) |
| Legacy features | PHP endpoints where needed |
### API Gaps (Require Legacy Endpoints)
- Docker create/delete/restart/logs
- VM create/delete
- Share CRUD, User CRUD
- System reboot/shutdown
- Mover operations
## Directory Structure (New Files)
```
src/
├── lib/
│ └── unraid/
│ ├── client.ts # GraphQL client
│ ├── types.ts # TypeScript types
│ └── queries/ # GraphQL queries
├── pages/
│ └── unraid/
│ ├── dashboard.tsx # Dashboard page
│ ├── array/ # Array pages
│ ├── docker/ # Docker pages
│ ├── vms/ # VM pages
│ ├── shares/ # Share pages
│ ├── settings/ # Settings pages
│ └── tools/ # Tools pages
├── components/
│ └── unraid/
│ ├── Dashboard/ # Dashboard components
│ ├── Array/ # Array components
│ ├── Docker/ # Docker components
│ └── ...
└── styles/
└── orchis/
├── theme.ts # Mantine theme config
├── variables.css # CSS custom properties
└── components.css # Component overrides
```
## Getting Started
```bash
# Install dependencies
yarn install
# Set up environment
cp .env.example .env.local
# Edit .env.local with your Unraid API key
# Run development server
yarn dev
```
## Environment Variables
```env
UNRAID_HOST=192.168.10.20
UNRAID_API_KEY=your-api-key-here
UNRAID_USE_SSL=false
```

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,60 @@
# Homarr Architecture
## Tech Stack
- Next.js 13+ (App Router), React 18, TypeScript
- Mantine UI (component library)
- Zustand (client state), React Query (server state)
- Prisma ORM (SQLite default / PostgreSQL)
- Turbo monorepo, pnpm workspaces
## Project Structure
```
homarr/
├── apps/web/src/ # Main Next.js app
│ ├── app/ # App Router pages
│ ├── components/ # React components
│ ├── modules/ # Widgets & integrations
│ ├── stores/ # Zustand stores
│ └── styles/ # Themes & global CSS
├── packages/
│ ├── api-client/ # API client lib
│ ├── common/ # Shared types/utils
│ ├── definitions/ # Widget/integration defs
│ ├── auth/ # Auth logic
│ └── ui/ # Shared UI components
├── prisma/ # DB schema & migrations
└── turbo.json
```
## Widget System
Each widget in `apps/web/src/modules/`:
- `definition.ts` - Metadata + Zod config schema
- `component.tsx` - React component
- `settings.tsx` - Config panel
- `server-actions.ts` - Backend operations
- Registered in module index, auto-discovered
## Integration System
External service connectors with:
- API client abstraction, credential management
- URL/hostname config, SSL handling
- Error handling, retry, rate limiting, caching
## Theming
- CSS variables + Mantine theming + Tailwind
- Light/dark mode, custom color palettes, accent colors
- Wallpaper/background, font size, border radius customization
- Theme persisted in database
## Adding New Pages
1. Create in `apps/web/src/app/(group)/page-name/page.tsx`
2. Use Mantine UI components
3. Add API routes in `src/app/api/`
4. Create Zustand store or use React Query
5. Update navigation config
## Key Patterns
- Server Components by default, `'use client'` for interactive
- TRPC for type-safe RPC
- Zod schemas for validation
- Prisma for DB operations

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,81 @@
# Unraid API Research (Live from XTRM-Unraid v7.2.3)
## API: unraid-api v4.29.2 (NestJS + Apollo GraphQL)
### Connection
- HTTP: `http://192.168.10.20/graphql`
- WebSocket: `ws://192.168.10.20/graphql` (graphql-ws protocol)
- Unix socket: `/var/run/unraid-api.sock`
- Auth: `x-api-key` header
### GraphQL Queries
| Query | Description |
|-------|-------------|
| `info` | System info (cpu, memory, os, baseboard, devices, display, versions) |
| `array` | Array state, capacity, disks, parities, caches, parity check status |
| `disks` / `disk(id)` | Physical disks with SMART status, temp, serial |
| `docker` | Containers (id, names, state, status, image, ports, autoStart) + networks |
| `vms` | VMs (id, name, state) |
| `shares` | Shares (name, free, used, size, include, exclude, cache, color) |
| `notifications` | Notifications (title, subject, description, importance, type, timestamp) |
| `vars` | Server variables (version, name, timezone, network, SMB/NFS settings) |
| `services` | Running services (name, online, uptime, version) |
| `flash` | Flash drive (guid, vendor, product) |
| `registration` | License (type, state, keyFile, expiration) |
| `network` | Network info (accessUrls) |
| `server` | Server details (owner, guid, wanip, lanip, localurl, remoteurl) |
| `connect` | Connect status (dynamicRemoteAccess, settings) |
| `plugins` | Installed plugins (name, version) |
| `logFiles` / `logFile(path)` | Log file listing and content |
| `upsDevices` / `upsConfiguration` | UPS monitoring |
| `apiKeys` | API key management |
| `customization` | Theme + activation code |
| `me` / `owner` | Current user / server owner |
### GraphQL Mutations
| Mutation | Description |
|----------|-------------|
| `array.setState` | Start/stop array |
| `array.addDiskToArray` / `removeDiskFromArray` | Disk management |
| `array.mountArrayDisk` / `unmountArrayDisk` | Mount/unmount |
| `docker.start(id)` / `docker.stop(id)` | Container start/stop |
| `vm.start/stop/pause/resume/forceStop/reboot/reset(id)` | VM power management |
| `parityCheck.start/pause/resume/cancel` | Parity check control |
| `notification.create/delete/archive/unread` | Notification CRUD |
| `apiKey.create/update/delete` | API key management |
| `customization.setTheme` | Theme switching |
| `connectSignIn/SignOut` | Unraid Connect |
| `setupRemoteAccess` | Remote access config |
### GraphQL Subscriptions (Real-time)
- `systemMetricsCpu` / `systemMetricsCpuTelemetry` / `systemMetricsMemory`
- `arraySubscription` / `parityHistorySubscription`
- `notificationAdded` / `notificationsOverview`
- `logFile` (live log streaming)
- `upsUpdates`
- `ownerSubscription` / `serversSubscription`
### Enums
- ArrayState: STARTED, STOPPED, NEW_ARRAY, RECON_DISK, DISABLE_DISK, etc.
- ArrayDiskStatus: DISK_NP, DISK_OK, DISK_INVALID, DISK_WRONG, DISK_DSBL, etc.
- ArrayDiskType: DATA, PARITY, FLASH, CACHE
- ContainerState: RUNNING, EXITED
- VmState: NOSTATE, RUNNING, IDLE, PAUSED, SHUTDOWN, SHUTOFF, CRASHED, PMSUSPENDED
- DiskFsType: XFS, BTRFS, VFAT, ZFS, EXT4, NTFS
- DiskInterfaceType: SAS, SATA, USB, PCIE, UNKNOWN
- ThemeName: azure, black, gray, white
### Legacy PHP/Nchan Endpoints
- Nchan WebSocket channels: `/sub/var`, `/sub/docker`, `/sub/update1-3`, `/sub/diskload`, etc.
- PHP includes: DashboardApps.php, Control.php, SmartInfo.php, Syslog.php, etc.
- State INI files at `/var/local/emhttp/`: var.ini, disks.ini, shares.ini, etc.
- Legacy control: POST to `/update.htm` for commands
### NOT Available via GraphQL
- Docker create/delete/restart/logs
- VM create/delete
- Share CRUD, User CRUD
- Detailed SMART attributes
- Disk format/clear, spin up/down
- System reboot/shutdown
- Mover operations

View File

@@ -0,0 +1,10 @@
CREATE TABLE `migrate_token` (
`id` text PRIMARY KEY NOT NULL,
`token` text NOT NULL,
`boards` integer NOT NULL,
`users` integer NOT NULL,
`integrations` integer NOT NULL,
`expires` integer NOT NULL
);
--> statement-breakpoint
CREATE UNIQUE INDEX `migrate_token_token_unique` ON `migrate_token` (`token`);

View File

@@ -0,0 +1,527 @@
{
"version": "5",
"dialect": "sqlite",
"id": "9c8971c9-6d33-4d14-b318-b19ff9fbb88f",
"prevId": "32c1bc91-e69f-4e1d-b53c-9c43f2e6c9d3",
"tables": {
"account": {
"name": "account",
"columns": {
"userId": {
"name": "userId",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"type": {
"name": "type",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"provider": {
"name": "provider",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"providerAccountId": {
"name": "providerAccountId",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"refresh_token": {
"name": "refresh_token",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"access_token": {
"name": "access_token",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"expires_at": {
"name": "expires_at",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"token_type": {
"name": "token_type",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"scope": {
"name": "scope",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"id_token": {
"name": "id_token",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"session_state": {
"name": "session_state",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
}
},
"indexes": {
"userId_idx": {
"name": "userId_idx",
"columns": [
"userId"
],
"isUnique": false
}
},
"foreignKeys": {
"account_userId_user_id_fk": {
"name": "account_userId_user_id_fk",
"tableFrom": "account",
"tableTo": "user",
"columnsFrom": [
"userId"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {
"account_provider_providerAccountId_pk": {
"columns": [
"provider",
"providerAccountId"
]
}
},
"uniqueConstraints": {}
},
"invite": {
"name": "invite",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"token": {
"name": "token",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"expires": {
"name": "expires",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"created_by_id": {
"name": "created_by_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"invite_token_unique": {
"name": "invite_token_unique",
"columns": [
"token"
],
"isUnique": true
}
},
"foreignKeys": {
"invite_created_by_id_user_id_fk": {
"name": "invite_created_by_id_user_id_fk",
"tableFrom": "invite",
"tableTo": "user",
"columnsFrom": [
"created_by_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"migrate_token": {
"name": "migrate_token",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"token": {
"name": "token",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"boards": {
"name": "boards",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"users": {
"name": "users",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"integrations": {
"name": "integrations",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"expires": {
"name": "expires",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"migrate_token_token_unique": {
"name": "migrate_token_token_unique",
"columns": [
"token"
],
"isUnique": true
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"session": {
"name": "session",
"columns": {
"sessionToken": {
"name": "sessionToken",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"userId": {
"name": "userId",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"expires": {
"name": "expires",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {
"user_id_idx": {
"name": "user_id_idx",
"columns": [
"userId"
],
"isUnique": false
}
},
"foreignKeys": {
"session_userId_user_id_fk": {
"name": "session_userId_user_id_fk",
"tableFrom": "session",
"tableTo": "user",
"columnsFrom": [
"userId"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"user_setting": {
"name": "user_setting",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"user_id": {
"name": "user_id",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"color_scheme": {
"name": "color_scheme",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'environment'"
},
"language": {
"name": "language",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'en'"
},
"default_board": {
"name": "default_board",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'default'"
},
"first_day_of_week": {
"name": "first_day_of_week",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'monday'"
},
"search_template": {
"name": "search_template",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": "'https://google.com/search?q=%s'"
},
"open_search_in_new_tab": {
"name": "open_search_in_new_tab",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": true
},
"disable_ping_pulse": {
"name": "disable_ping_pulse",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"replace_ping_with_icons": {
"name": "replace_ping_with_icons",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"use_debug_language": {
"name": "use_debug_language",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"auto_focus_search": {
"name": "auto_focus_search",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
}
},
"indexes": {},
"foreignKeys": {
"user_setting_user_id_user_id_fk": {
"name": "user_setting_user_id_user_id_fk",
"tableFrom": "user_setting",
"tableTo": "user",
"columnsFrom": [
"user_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"user": {
"name": "user",
"columns": {
"id": {
"name": "id",
"type": "text",
"primaryKey": true,
"notNull": true,
"autoincrement": false
},
"name": {
"name": "name",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"email": {
"name": "email",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"emailVerified": {
"name": "emailVerified",
"type": "integer",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"image": {
"name": "image",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"password": {
"name": "password",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"salt": {
"name": "salt",
"type": "text",
"primaryKey": false,
"notNull": false,
"autoincrement": false
},
"is_admin": {
"name": "is_admin",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
},
"is_owner": {
"name": "is_owner",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false,
"default": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {}
},
"verificationToken": {
"name": "verificationToken",
"columns": {
"identifier": {
"name": "identifier",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"token": {
"name": "token",
"type": "text",
"primaryKey": false,
"notNull": true,
"autoincrement": false
},
"expires": {
"name": "expires",
"type": "integer",
"primaryKey": false,
"notNull": true,
"autoincrement": false
}
},
"indexes": {},
"foreignKeys": {},
"compositePrimaryKeys": {
"verificationToken_identifier_token_pk": {
"columns": [
"identifier",
"token"
]
}
},
"uniqueConstraints": {}
}
},
"enums": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
}
}

View File

@@ -8,6 +8,13 @@
"when": 1695874816934,
"tag": "0000_supreme_the_captain",
"breakpoints": true
},
{
"idx": 1,
"version": "5",
"when": 1730643218521,
"tag": "0001_brave_mimic",
"breakpoints": true
}
]
}

View File

@@ -1,14 +1,14 @@
// This file is used to migrate the database to the current version
// It is run when the docker container starts
import Database from 'better-sqlite3';
import dotenv from 'dotenv';
import { drizzle } from 'drizzle-orm/better-sqlite3';
import { migrate } from 'drizzle-orm/better-sqlite3/migrator';
const Database = require('better-sqlite3');
const path = require('path');
const dotenv = require('dotenv');
const { drizzle } = require('drizzle-orm/better-sqlite3');
const { migrate } = require('drizzle-orm/better-sqlite3/migrator');
const migrationsFolder = process.argv[2] ?? '../drizzle';
dotenv.config({ path: __dirname + '/../.env' });
dotenv.config({ path: path.join(__dirname, '/../.env') });
const sqlite = new Database(process.env.DATABASE_URL!.replace('file:', ''));
const db = drizzle(sqlite);

View File

@@ -2,14 +2,14 @@
"license": "MIT",
"description": "This package.json is used for the migration script the dependencies are only installed within the Dockerfile.",
"scripts": {
"db:migrate": "ts-node ./migrate.ts"
"db:migrate": "tsx ./migrate.ts"
},
"dependencies": {
"@types/better-sqlite3": "^7.6.7",
"better-sqlite3": "8.6.0",
"drizzle-orm": "^0.28.6",
"dotenv": "^16.3.1",
"ts-node": "^10.9.1",
"tsx": "4.19.1",
"typescript": "^5.2.2"
}
}

View File

@@ -5,6 +5,7 @@ module.exports = {
i18n: {
defaultLocale: 'en',
locales: [
'ar',
'cn',
'cr',
'cs',

View File

@@ -6,6 +6,9 @@ const withBundleAnalyzer = require('@next/bundle-analyzer')({
});
module.exports = withBundleAnalyzer({
eslint: {
ignoreDuringBuilds: true,
},
webpack: (config) => {
// for dynamic loading of auth providers
config.experiments = { ...config.experiments, topLevelAwait: true };
@@ -21,7 +24,7 @@ module.exports = withBundleAnalyzer({
redirects: async () => [
{
source: '/',
destination: '/board',
destination: '/unraid',
permanent: false,
},
],

View File

@@ -1,6 +1,6 @@
{
"name": "homarr",
"version": "0.15.3",
"version": "0.16.0",
"description": "Homarr - A homepage for your server.",
"license": "MIT",
"repository": {
@@ -11,7 +11,7 @@
"dev": "next dev",
"build": "NEXTAUTH_SECRET=WILL_BE_OVERWRITTEN next build",
"analyze": "ANALYZE=true next build",
"turbo": "DATABASE_URL=file:WILL_BE_OVERWRITTEN.sqlite NEXTAUTH_URL=http://WILL_BE_OVERWRITTEN turbo build",
"turbo": "DATABASE_URL=file:WILL_BE_OVERWRITTEN.sqlite turbo build",
"start": "next start",
"typecheck": "tsc --noEmit",
"export": "next build && next export",
@@ -19,12 +19,14 @@
"prettier:check": "prettier --check \"**/*.{ts,tsx}\"",
"prettier:write": "prettier --write \"**/*.{ts,tsx}\"",
"test": "SKIP_ENV_VALIDATION=1 vitest",
"test:docker": "yarn run turbo build && yarn test:run && docker build . -t homarr:local-dev && docker run -p 7575:7575 --name homarr-dev homarr:local-dev",
"test:ui": "SKIP_ENV_VALIDATION=1 vitest --ui",
"test:run": "SKIP_ENV_VALIDATION=1 vitest run",
"test:coverage": "SKIP_ENV_VALIDATION=1 vitest run --coverage",
"docker:build": "turbo build && docker build . -t homarr:local-dev",
"docker:start": "docker run -p 7575:7575 --name homarr-development homarr:local-dev",
"db:migrate": "dotenv ts-node drizzle/migrate/migrate.ts ./drizzle"
"db:migrate": "dotenv tsx drizzle/migrate/migrate.ts ./drizzle",
"db:add": "drizzle-kit generate:sqlite --config ./drizzle.config.ts"
},
"dependencies": {
"@ctrl/deluge": "^4.1.0",
@@ -71,6 +73,7 @@
"@trpc/server": "^10.37.1",
"@types/bcryptjs": "^2.4.2",
"@vitejs/plugin-react": "^4.0.0",
"adm-zip": "^0.5.15",
"axios": "^1.0.0",
"bcryptjs": "^2.4.3",
"better-sqlite3": "^8.6.0",
@@ -119,11 +122,12 @@
"@next/eslint-plugin-next": "^13.4.5",
"@testing-library/react": "^14.0.0",
"@trivago/prettier-plugin-sort-imports": "^4.2.0",
"@types/adm-zip": "^0.5.5",
"@types/better-sqlite3": "^7.6.5",
"@types/cookies": "^0.7.7",
"@types/dockerode": "^3.3.9",
"@types/ldapjs": "^3.0.2",
"@types/node": "18.17.8",
"@types/node": "^20.6.0",
"@types/prismjs": "^1.26.0",
"@types/react": "^18.2.11",
"@types/swagger-ui-react": "^4.18.3",
@@ -148,7 +152,7 @@
"node-mocks-http": "^1.12.2",
"prettier": "^3.0.0",
"sass": "^1.56.1",
"ts-node": "latest",
"tsx": "4.19.1",
"turbo": "^1.10.12",
"typescript": "5.1.6",
"video.js": "^8.0.3",
@@ -183,7 +187,6 @@
"importOrderSortSpecifiers": true
},
"eslintConfig": {
"ignoreDuringBuilds": true,
"extends": [
"next",
"eslint:recommended",
@@ -241,4 +244,4 @@
]
}
}
}
}

Binary file not shown.

BIN
public/imgs/2340450-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

View File

@@ -17,6 +17,7 @@
"disabled": "已禁用",
"enableAll": "全部启用",
"disableAll": "全部禁用",
"setTimer": "设置计时器",
"version": "版本",
"changePosition": "换位",
"remove": "删除",

View File

@@ -26,7 +26,8 @@
"title": "工具",
"items": {
"docker": "Docker",
"api": "API"
"api": "API",
"migrate": "迁移到 1.0"
}
},
"about": {

View File

@@ -31,7 +31,8 @@
},
"externalAddress": {
"label": "外部地址",
"description": "点击应用时打开的网址。"
"description": "点击应用时打开的网址。",
"tooltip": "您可以使用几个变量来创建动态地址:<br><br><b>[homarr_base]</b>: 不包括端口和路径的完整地址。<i>(例如:'https://subdomain.homarr.dev'</i><br><b>[homarr_hostname]</b>: 完整的基本网址,包括当前的子域。<i>(例如:'</i><b>subdomain</b>.homarr<i>.dev'</i><br><b>[homarr_domain]</b>: 域名,已过滤子域。<i>(例如:\"homarr.dev\"</i><br><b>[homarr_protocol]</b>:<i>http/https</i><br><br>这些变量都取决于当前网址。"
}
},
"behaviour": {

View File

@@ -0,0 +1,33 @@
{
"metaTitle": "迁移到 1.0",
"pageTitle": "迁移面板、组件和用户",
"description": "将您的面板和用户导出到 ZIP 压缩包,以便在 1.0.0 版本之后将其迁移到 Homarr",
"securityNote": {
"title": "安全说明",
"text": "导出用户和组件时,它还会打开一个带有加密密钥的窗口。此密钥是将数据导入 Homarr 所必需的。请妥善保管,不要与任何人分享。"
},
"form": {
"label": "选择要导出的所有内容",
"option": {
"boards": {
"label": "导出面板"
},
"integrations": {
"label": "导出组件",
"description": "这将包括用于组件的加密凭据。仅在导出面板时可用"
},
"users": {
"label": "导出用户",
"description": "这只会导出凭据用户,密码 hash 和 salt 已加密"
}
}
},
"action": {
"export": "导出数据"
},
"modal": {
"title": "加密密钥",
"description": "您的数据已导出。请妥善保管此密钥,不要与任何人共享。您需要此密钥才能将数据导入 Homarr。",
"copyDismiss": "复制并关闭"
}
}

View File

@@ -14,5 +14,12 @@
"text": "到DNS漏洞的连接有问题。请验证您的配置/集成设置。"
}
}
},
"durationModal": {
"title": "设置禁用时长",
"hours": "时",
"minutes": "分",
"unlimited": "留空表示无限制",
"set": "设置"
}
}

View File

@@ -86,7 +86,7 @@
},
"info": {
"uptime": "运行时间",
"uptimeFormat": "{{days}} 天, {{hours}} 小时",
"uptimeFormat": "{{days}} 天, {{hours}} 小时 {{minutes}} 分钟",
"updates": "可用更新",
"reboot": "重启"
},

View File

@@ -3,7 +3,10 @@
"name": "索引器管理状态",
"description": "有关索引器的状态",
"settings": {
"title": "索引器管理状态"
"title": "索引器管理状态",
"openIndexerSiteInNewTab": {
"label": "在新选项卡中打开索引器站点"
}
}
},
"indexersStatus": {

View File

@@ -7,8 +7,8 @@
}
},
"modal": {
"text": "",
"label": "您的错误",
"reportButton": "报告错误"
"text": "组件意外崩溃,请阅读文档并修改错误的输入。",
"label": "发生错误",
"reportButton": "在 GitHub 上报告错误"
}
}

View File

@@ -17,6 +17,7 @@
"disabled": "crwdns2885:0crwdne2885:0",
"enableAll": "crwdns2887:0crwdne2887:0",
"disableAll": "crwdns2889:0crwdne2889:0",
"setTimer": "crwdns4484:0crwdne4484:0",
"version": "crwdns2023:0crwdne2023:0",
"changePosition": "crwdns2025:0crwdne2025:0",
"remove": "crwdns2027:0crwdne2027:0",

View File

@@ -26,7 +26,8 @@
"title": "crwdns3525:0crwdne3525:0",
"items": {
"docker": "crwdns3527:0crwdne3527:0",
"api": "crwdns4172:0crwdne4172:0"
"api": "crwdns4172:0crwdne4172:0",
"migrate": "crwdns4536:0crwdne4536:0"
}
},
"about": {

View File

@@ -31,7 +31,8 @@
},
"externalAddress": {
"label": "crwdns2067:0crwdne2067:0",
"description": "crwdns2309:0crwdne2309:0"
"description": "crwdns2309:0crwdne2309:0",
"tooltip": "crwdns4482:0crwdne4482:0"
}
},
"behaviour": {

View File

@@ -0,0 +1,33 @@
{
"metaTitle": "crwdns4506:0crwdne4506:0",
"pageTitle": "crwdns4508:0crwdne4508:0",
"description": "crwdns4510:0crwdne4510:0",
"securityNote": {
"title": "crwdns4512:0crwdne4512:0",
"text": "crwdns4514:0crwdne4514:0"
},
"form": {
"label": "crwdns4516:0crwdne4516:0",
"option": {
"boards": {
"label": "crwdns4518:0crwdne4518:0"
},
"integrations": {
"label": "crwdns4520:0crwdne4520:0",
"description": "crwdns4522:0crwdne4522:0"
},
"users": {
"label": "crwdns4524:0crwdne4524:0",
"description": "crwdns4526:0crwdne4526:0"
}
}
},
"action": {
"export": "crwdns4528:0crwdne4528:0"
},
"modal": {
"title": "crwdns4530:0crwdne4530:0",
"description": "crwdns4532:0crwdne4532:0",
"copyDismiss": "crwdns4534:0crwdne4534:0"
}
}

View File

@@ -14,5 +14,12 @@
"text": "crwdns3862:0crwdne3862:0"
}
}
},
"durationModal": {
"title": "crwdns4486:0crwdne4486:0",
"hours": "crwdns4488:0crwdne4488:0",
"minutes": "crwdns4490:0crwdne4490:0",
"unlimited": "crwdns4492:0crwdne4492:0",
"set": "crwdns4494:0crwdne4494:0"
}
}

View File

@@ -86,7 +86,7 @@
},
"info": {
"uptime": "crwdns4226:0crwdne4226:0",
"uptimeFormat": "crwdns4310:0{{days}}crwdnd4310:0{{hours}}crwdne4310:0",
"uptimeFormat": "crwdns4498:0{{days}}crwdnd4498:0{{hours}}crwdnd4498:0{{minutes}}crwdne4498:0",
"updates": "crwdns4312:0crwdne4312:0",
"reboot": "crwdns4230:0crwdne4230:0"
},

View File

@@ -3,7 +3,10 @@
"name": "crwdns4188:0crwdne4188:0",
"description": "crwdns4190:0crwdne4190:0",
"settings": {
"title": "crwdns4192:0crwdne4192:0"
"title": "crwdns4192:0crwdne4192:0",
"openIndexerSiteInNewTab": {
"label": "crwdns4496:0crwdne4496:0"
}
}
},
"indexersStatus": {

View File

@@ -7,8 +7,8 @@
}
},
"modal": {
"text": "crwdns2949:0crwdne2949:0",
"label": "crwdns2741:0crwdne2741:0",
"reportButton": "crwdns2743:0crwdne2743:0"
"text": "crwdns4500:0crwdne4500:0",
"label": "crwdns4502:0crwdne4502:0",
"reportButton": "crwdns4504:0crwdne4504:0"
}
}

View File

@@ -17,6 +17,7 @@
"disabled": "Vypnuto",
"enableAll": "Aktivovat vše",
"disableAll": "Zakázat vše",
"setTimer": "Nastavit časovat",
"version": "Verze",
"changePosition": "Změnit pozici",
"remove": "Odstranit",

View File

@@ -26,7 +26,8 @@
"title": "Nástroje",
"items": {
"docker": "Docker",
"api": "API"
"api": "API",
"migrate": "Přechod na verzi 1.0"
}
},
"about": {

View File

@@ -31,7 +31,8 @@
},
"externalAddress": {
"label": "Veřejná adresa",
"description": "URL která bude otevřena po kliknutí na aplikaci."
"description": "URL která bude otevřena po kliknutí na aplikaci.",
"tooltip": "Můžete použít několik proměnných k vytvoření dynamických adres:<br><br><b>[homarr_base]</b> : plná adresa bez portu a cesty. <i>(Příklad: 'https://subdomain.homarr.dev')</i><br><b>[homarr_hostname]</b> : plná základní url včetně její aktuální subdomény. <i>(Příklad: 'subdomain.homarr.dev')</i><br><b>[homarr_domain]</b> : doména bez subdomény. <i>(Příklad: `homarr.dev')</i><br><b>[homarr_protocol]</b> : <i>http/https</i><br><br>Všechny tyto proměnné závisejí na aktuální url adrese."
}
},
"behaviour": {

View File

@@ -0,0 +1,33 @@
{
"metaTitle": "Přechod na verzi 1.0",
"pageTitle": "Migrace ploch, integrací a uživatelů",
"description": "Exportujete své plochy a uživatele do ZIP-Archivu, aby jste je mohli migrovat do Homarru po verzi 1.0.0",
"securityNote": {
"title": "Bezpečnostní poznámka",
"text": "Při exportování uživatelů a integrací se otevře okno s šifrovacím klíčem. Tento klíč je vyžadován pro následovný import dat do Homarru. Uchovejte jej na bezpečném místě a s nikým jej nesdílejte."
},
"form": {
"label": "Vyberte vše, co chcete exportovat",
"option": {
"boards": {
"label": "Exportovat plochy"
},
"integrations": {
"label": "Exportovat integrace",
"description": "Toto bude obsahovat pouze zašifrované údaje pro integrace. Tato možnost je dostupná pouze při exportování ploch"
},
"users": {
"label": "Exportovat uživatele",
"description": "Toto exportuje pouze údaje uživatelů, hesla, hash a salt jsou zašifrovány"
}
}
},
"action": {
"export": "Exportovat data"
},
"modal": {
"title": "Šifrovací klíč",
"description": "Vaše data byla exportována. Uchovejte tento klíč v bezpečí a s nikým jej nesdílejte. Tento klíč budete potřebovat pro import dat do Homarru.",
"copyDismiss": "Zkopírovat a zavřít"
}
}

View File

@@ -14,5 +14,12 @@
"text": "Došlo k problému s připojením k Vaší DNS Hole. Ověřte prosím svou konfiguraci."
}
}
},
"durationModal": {
"title": "Nastavit dobu trvání deaktivace",
"hours": "Hodin",
"minutes": "Minut",
"unlimited": "ponechte prázdne pro neomezenou dobu",
"set": "Nastavit"
}
}

View File

@@ -86,7 +86,7 @@
},
"info": {
"uptime": "Doba provozu",
"uptimeFormat": "{{days}} dny/ů, {{hours}} hodin/a/y",
"uptimeFormat": "{{days}} dní, {{hours}} hodin, {{minutes}} minut",
"updates": "Dostupné aktualizace",
"reboot": "Restartovat"
},

View File

@@ -3,7 +3,10 @@
"name": "Stav správce indexeru",
"description": "Stav Vašich indexerů",
"settings": {
"title": "Stav správce indexeru"
"title": "Stav správce indexeru",
"openIndexerSiteInNewTab": {
"label": "Otevírat stránku indexeru na nové kartě"
}
}
},
"indexersStatus": {

View File

@@ -7,8 +7,8 @@
}
},
"modal": {
"text": "",
"label": "Vaše chyba",
"reportButton": "Nahlásit tuto chybu"
"text": "Widget se nečekaně zhroutil. Přečtěte si prosím dokumentaci a opravte případné překlepy.",
"label": "Vyskytlá chyba",
"reportButton": "Nahlásit tuto chybu na GitHubu"
}
}

View File

@@ -17,6 +17,7 @@
"disabled": "Deaktiveret",
"enableAll": "Aktiver alle",
"disableAll": "Deaktiver alle",
"setTimer": "Sæt timer",
"version": "Version",
"changePosition": "Ændre placering",
"remove": "Fjern",

View File

@@ -26,7 +26,8 @@
"title": "Værktøjer",
"items": {
"docker": "Docker",
"api": "API"
"api": "API",
"migrate": "Migrer til 1.0"
}
},
"about": {

View File

@@ -31,7 +31,8 @@
},
"externalAddress": {
"label": "Ekstern adresse",
"description": "URL-adresse, der åbnes, når du klikker på appen."
"description": "URL-adresse, der åbnes, når du klikker på appen.",
"tooltip": "Du kan bruge nogle få variabler til at oprette dynamiske adresser:<br><br><b>[homarr_base]</b>: fuld adresse uden port og sti. <i>(Eksempel: 'https://subdomain.homarr.dev'</i>)<br><b>[homarr_hostname]</b>: fuld base-url inklusive det aktuelle subdomæne. (Eksempel: ' <i>subdomain.homarr.dev')</i><br><b>[homarr_domain]</b>: domæne med subdomæne filtreret ud. (Eksempel: <i>`homarr.dev</i>')<br><b>[homarr_protocol]</b>: <i>http/https</i><br><br>Disse variabler afhænger alle af den aktuelle url."
}
},
"behaviour": {

View File

@@ -0,0 +1,33 @@
{
"metaTitle": "Migrer til 1.0",
"pageTitle": "Migrér tavler, integrationer og brugere",
"description": "Eksporterer dine tavler og brugere til et ZIP-arkiv for at migrere dem til Homarr efter version 1.0.0",
"securityNote": {
"title": "Sikkerhedsnote",
"text": "Når du eksporterer brugere og integrationer, åbnes der også en modal med en krypteringsnøgle. Denne nøgle er nødvendig for at importere data til Homarr. Opbevar den sikkert, og del den ikke med nogen."
},
"form": {
"label": "Vælg alt, hvad du vil eksportere",
"option": {
"boards": {
"label": "Eksporter tavler"
},
"integrations": {
"label": "Eksporter integrationer",
"description": "Dette inkluderer krypterede legitimationsoplysninger til integrationer. Kun tilgængelig ved eksport af tavler"
},
"users": {
"label": "Eksporter brugere",
"description": "Dette vil kun eksportere brugere med legitimiation, adgangskoders hash og salt er krypteret"
}
}
},
"action": {
"export": "Eksport af data"
},
"modal": {
"title": "Krypteringsnøgle",
"description": "Dine data er blevet eksporteret. Opbevar denne nøgle sikkert, og del den ikke med nogen. Du skal bruge denne nøgle for at importere dataene til Homarr.",
"copyDismiss": "Kopiér og afvis"
}
}

View File

@@ -14,5 +14,12 @@
"text": "Der opstod et problem med at oprette forbindelse til dit/dine DNS-hul(ler). Bekræft venligst din(e) konfiguration(er)/integration(er)."
}
}
},
"durationModal": {
"title": "Indstil varighed af deaktivering",
"hours": "Timer",
"minutes": "Minutter",
"unlimited": "lad være tom for ubegrænset",
"set": "Indstil"
}
}

View File

@@ -86,7 +86,7 @@
},
"info": {
"uptime": "Oppetid",
"uptimeFormat": "{{days}} dage, {{hours}} timer",
"uptimeFormat": "{{days}} dage, {{hours}} timer, {{minutes}} minutter",
"updates": "Opdateringer tilgængelige",
"reboot": "Genstart"
},

View File

@@ -3,7 +3,10 @@
"name": "Indekserings manager status",
"description": "Status for dine indekser",
"settings": {
"title": "Indekserings manager status"
"title": "Indekserings manager status",
"openIndexerSiteInNewTab": {
"label": "Åbn Indekseringswebsted I Nyt Faneblad"
}
}
},
"indexersStatus": {

View File

@@ -7,8 +7,8 @@
}
},
"modal": {
"text": "",
"label": "Din fejl",
"reportButton": "Rapportér denne fejl"
"text": "Widgetten crashede uventet. Læs venligst dokumentationen og ret stavefejl.",
"label": "Opstod en fejl",
"reportButton": "Rapporter denne fejl på GitHub"
}
}

View File

@@ -17,6 +17,7 @@
"disabled": "Deaktiviert",
"enableAll": "Alle aktivieren",
"disableAll": "Alles deaktivieren",
"setTimer": "Timer festlegen",
"version": "Version",
"changePosition": "Position wechseln",
"remove": "Entfernen",

View File

@@ -26,7 +26,8 @@
"title": "Werkzeuge",
"items": {
"docker": "Docker",
"api": "API"
"api": "API",
"migrate": "Auf 1.0 migrieren"
}
},
"about": {

View File

@@ -8,7 +8,7 @@
"translators": "Übersetzer ({{count}})",
"translatorsDescription": "Dank dieser Leute ist Homarr in {{languages}} Sprachen verfügbar! Möchten Sie helfen, Homarr in Ihre Sprache zu übersetzen? Lesen Sie <a>hier</a>, wie das geht.",
"contributors": "Mitwirkende ({{count}})",
"contributorsDescription": "Diese Leute haben den Code erstellt, der Homarr zum Laufen bringt! Möchten Sie beim Aufbau von Homarr helfen? Lesen Sie <a>hier</a>wie das geht",
"contributorsDescription": "Diese Leute haben den Code entwickelt, der Homarr zum Laufen bringt! Möchten Sie beim Aufbau von Homarr helfen? Lesen Sie <a>hier</a>, wie Sie das tun können",
"actions": {
"toggleTheme": "Umschalten zwischen Hell- und Dunkelmodus",
"focusSearchBar": "Suchleiste fokussieren",

View File

@@ -31,7 +31,8 @@
},
"externalAddress": {
"label": "Externe Adresse",
"description": "URL, die beim Anklicken der App geöffnet wird."
"description": "URL, die beim Anklicken der App geöffnet wird.",
"tooltip": "Sie können einige Variablen verwenden, um dynamische Adressen zu erstellen:<br><br><b>[homarr_base]</b> : vollständige Adresse ohne Port und Pfad. <i>(Beispiel: „https://subdomain.homarr.dev“)</i><br><b>[homarr_hostname]</b> : vollständige Basis-URL einschließlich der aktuellen Subdomäne. <i>(Beispiel: „subdomain.homarr.dev“)</i><br><b>[homarr_domain]</b> : Domäne mit herausgefilterter Subdomäne. <i>(Beispiel: „homarr.dev“)</i><br><b>[homarr_protocol]</b> : <i>http/https</i><br><br>Diese Variablen hängen alle von der aktuellen URL ab."
}
},
"behaviour": {

View File

@@ -0,0 +1,33 @@
{
"metaTitle": "Auf 1.0 migrieren",
"pageTitle": "Boards, Integrationen und Benutzer migrieren",
"description": "Exportiert deine Boards und Benutzer in ein ZIP-Archiv, um sie nach Version 1.0.0 nach Homarr zu migrieren",
"securityNote": {
"title": "Sicherheitshinweis",
"text": "Beim Exportieren von Benutzern und Integrationen wird ein Modalfenster mit einem Verschlüsselungsschlüssel geöffnet. Dieser Schlüssel ist erforderlich, um Daten in Homarr zu importieren. Bewahren Sie ihn sicher auf und geben Sie ihn nicht an Dritte weiter."
},
"form": {
"label": "Wählen Sie alles aus, was Sie exportieren möchten",
"option": {
"boards": {
"label": "Boards exportieren"
},
"integrations": {
"label": "Integrationen exportieren",
"description": "Dies beinhaltet verschlüsselte Anmeldeinformationen für Integrationen. Nur verfügbar beim Exportieren von Boards"
},
"users": {
"label": "Benutzer exportieren",
"description": "Damit werden nur die Anmeldeinformationen der Benutzer exportiert, Hash und Salt der Passwörter werden verschlüsselt"
}
}
},
"action": {
"export": "Exportieren von Daten"
},
"modal": {
"title": "Verschlüsselungsschlüssel",
"description": "Ihre Daten wurden exportiert. Bewahren Sie diesen Schlüssel sicher auf und geben Sie ihn nicht an Dritte weiter. Sie benötigen diesen Schlüssel, um die Daten in Homarr zu importieren.",
"copyDismiss": "Kopieren & Verwerfen"
}
}

View File

@@ -14,5 +14,12 @@
"text": "Es gab ein Problem bei der Verbindung zu Ihrem DNS Hole(s). Bitte überprüfen Sie Ihre Konfiguration/Integration(en)."
}
}
},
"durationModal": {
"title": "Deaktivierungsdauer festlegen",
"hours": "Stunden",
"minutes": "Minuten",
"unlimited": "leer lassen für unbegrenzt",
"set": "Speichern"
}
}

View File

@@ -86,7 +86,7 @@
},
"info": {
"uptime": "Betriebszeit",
"uptimeFormat": "{{days}} Tage, {{hours}} Stunden",
"uptimeFormat": "{{days}} Tage, {{hours}} Stunden, {{minutes}} Minuten",
"updates": "Updates verfügbar",
"reboot": "Neustart"
},

View File

@@ -3,7 +3,10 @@
"name": "Status des Indexer-Managers",
"description": "Status ihrer Indexer",
"settings": {
"title": "Status des Indexer-Managers"
"title": "Status des Indexer-Managers",
"openIndexerSiteInNewTab": {
"label": "Indexer in neuem Tab öffnen"
}
}
},
"indexersStatus": {

View File

@@ -22,11 +22,11 @@
},
"displayFriendlyName": {
"label": "Benutzerdefinierten Namen anzeigen",
"info": ""
"info": "Zeige Benutzerdefinierten Namen anstatt des Anzeigenamen vom Home-Assistent an."
},
"genericToggle": {
"label": "",
"info": ""
"label": "Entität umschalten",
"info": "Führen Sie beim Klicken eine Home Assistant-Umschaltaktion für die Entität aus."
}
}
}

View File

@@ -7,8 +7,8 @@
}
},
"modal": {
"text": "",
"label": "Dein Fehler",
"reportButton": "Fehler melden"
"text": "Das Widet ist unerwartet abgestürzt. Bitte lesen Sie die Dokumentation und beheben Sie etwaige Tippfehler.",
"label": "Fehler aufgetreten",
"reportButton": "Diesen Fehler auf GitHub melden"
}
}

View File

@@ -17,6 +17,7 @@
"disabled": "Απενεργοποιημένο",
"enableAll": "Ενεργοποίηση όλων",
"disableAll": "Απενεργοποίηση όλων",
"setTimer": "Ορισμός Χρονοδιακόπτη",
"version": "Έκδοση",
"changePosition": "Αλλαγή θέσης",
"remove": "Αφαίρεση",

View File

@@ -26,7 +26,8 @@
"title": "Εργαλεία",
"items": {
"docker": "Docker",
"api": "API"
"api": "API",
"migrate": ""
}
},
"about": {

View File

@@ -31,7 +31,8 @@
},
"externalAddress": {
"label": "Εξωτερική διεύθυνση",
"description": "URL που θα ανοίγει όταν κάνετε κλικ στην εφαρμογή."
"description": "URL που θα ανοίγει όταν κάνετε κλικ στην εφαρμογή.",
"tooltip": "Μπορείτε να χρησιμοποιήσετε μερικές μεταβλητές για να δημιουργήσετε δυναμικές διευθύνσεις:<br><br><b>[homarr_base]</b>: πλήρης διεύθυνση χωρίς τη πόρτα και τη διαδρομή. <i>(Παράδειγμα: 'https://subdomain.homarr.dev')</i><br><b>[homarr_hostname]</b>: πλήρες url βάσης συμπεριλαμβανομένου του τρέχοντος subdomain. <i>(Παράδειγμα: 'subdomain.homarr.dev')</i><br><b>[homarr_domain]</b>: domain χωρίς το subdomoain. <i>(Παράδειγμα: `homarr.dev')</i><br><b>[homarr_protocol]</b>: <i>http/https</i><br><br>Όλες αυτές οι μεταβλητές εξαρτώνται από το τρέχον url."
}
},
"behaviour": {

View File

@@ -0,0 +1,33 @@
{
"metaTitle": "",
"pageTitle": "",
"description": "",
"securityNote": {
"title": "",
"text": ""
},
"form": {
"label": "",
"option": {
"boards": {
"label": ""
},
"integrations": {
"label": "",
"description": ""
},
"users": {
"label": "",
"description": ""
}
}
},
"action": {
"export": ""
},
"modal": {
"title": "",
"description": "",
"copyDismiss": ""
}
}

View File

@@ -14,5 +14,12 @@
"text": "Υπήρξε ένα πρόβλημα κατά τη σύνδεση στο/α DNS Hole(s) σας. Παρακαλώ επαληθεύστε τις ρυθμίσεις / ενσωμάτωση."
}
}
},
"durationModal": {
"title": "Ρύθμιση χρόνου απενεργοποίησης",
"hours": "Ώρες",
"minutes": "Λεπτά",
"unlimited": "αφήστε κενό για απεριόριστο",
"set": "Ορισμός"
}
}

View File

@@ -86,7 +86,7 @@
},
"info": {
"uptime": "Χρόνος Λειτουργίας",
"uptimeFormat": "{{days}} ημέρες, {{hours}} ώρες",
"uptimeFormat": "{{days}} ημέρες, {{hours}} ώρες, {{minutes}} λεπτά",
"updates": "Διαθέσιμες ενημερώσεις",
"reboot": "Επανεκκίνηση"
},

View File

@@ -3,7 +3,10 @@
"name": "Κατάσταση διαχειριστή indexer",
"description": "Κατάσταση σχετικά με τους indexers σας",
"settings": {
"title": "Κατάσταση διαχειριστή indexer"
"title": "Κατάσταση διαχειριστή indexer",
"openIndexerSiteInNewTab": {
"label": "Άνοιγμα του Indexer ιστότοπου σε νέα καρτέλα"
}
}
},
"indexersStatus": {

View File

@@ -22,11 +22,11 @@
},
"displayFriendlyName": {
"label": "Εμφάνιση φιλικού ονόματος",
"info": ""
"info": "Εμφάνιση φιλικού ονόματος από το Home Assistant αντί για το εμφανιζόμενο όνομα."
},
"genericToggle": {
"label": "",
"info": ""
"label": "Εναλλαγή οντοτήτων",
"info": "Εκτέλεση εναλλαγής στην οντότητα του Home Assistant όταν κάνετε κλικ."
}
}
}

View File

@@ -8,7 +8,7 @@
},
"modal": {
"text": "",
"label": "Το σφάλμα σας",
"reportButton": "Αναφέρετε αυτό το σφάλμα"
"label": "",
"reportButton": ""
}
}

View File

@@ -17,6 +17,7 @@
"disabled": "Disabled",
"enableAll": "Enable all",
"disableAll": "Disable all",
"setTimer": "Set timer",
"version": "Version",
"changePosition": "Change position",
"remove": "Remove",

View File

@@ -26,7 +26,8 @@
"title": "Tools",
"items": {
"docker": "Docker",
"api": "API"
"api": "API",
"migrate": "Migrate to 1.0"
}
},
"about": {

View File

@@ -0,0 +1,33 @@
{
"metaTitle": "Migrate to 1.0",
"pageTitle": "Migrate boards, integrations and users",
"description": "Exports your boards and users to a ZIP-Archive to migrate them to Homarr after version 1.0.0",
"securityNote": {
"title": "Security Note",
"text": "When exporting users and integrations it will also open a modal with an encryption key. This key is required to import the data into Homarr. Keep it safe and do not share it with anyone."
},
"form": {
"label": "Select everything you want to export",
"option": {
"boards": {
"label": "Export boards"
},
"integrations": {
"label": "Export integrations",
"description": "This will include encrypted credentials for integrations. Only available when exporting boards"
},
"users": {
"label": "Export users",
"description": "This will only export credential users, passwords hash and salt are encrypted"
}
}
},
"action": {
"export": "Export data"
},
"modal": {
"title": "Encryption key",
"description": "Your data has been exported. Keep this key safe and do not share it with anyone. You will need this key to import the data into Homarr.",
"copyDismiss": "Copy & dismiss"
}
}

View File

@@ -14,5 +14,12 @@
"text": "There was a problem connecting to your DNS Hole(s). Please verify your configuration/integration(s)."
}
}
},
"durationModal": {
"title": "Set disable duration time",
"hours": "Hours",
"minutes": "Minutes",
"unlimited": "leave empty for unlimited",
"set": "Set"
}
}

View File

@@ -86,7 +86,7 @@
},
"info": {
"uptime": "Uptime",
"uptimeFormat": "{{days}} days, {{hours}} hours",
"uptimeFormat": "{{days}} days, {{hours}} hours, {{minutes}} minutes",
"updates": "Updates Available",
"reboot": "Reboot"
},

View File

@@ -3,7 +3,10 @@
"name": "Indexer manager status",
"description": "Status about your indexers",
"settings": {
"title": "Indexer manager status"
"title": "Indexer manager status",
"openIndexerSiteInNewTab": {
"label": "Open Indexer Site In New Tab"
}
}
},
"indexersStatus": {

View File

@@ -7,8 +7,8 @@
}
},
"modal": {
"text": "",
"label": "Your error",
"reportButton": "Report this error"
"text": "The widet crashed unexpectitly. Please read the documentation and fix any typos.",
"label": "Occurred error",
"reportButton": "Report this error on GitHub"
}
}

View File

@@ -17,7 +17,7 @@
"afterLoginRedirection": "Después de iniciar sesión, serás redirigido a {{url}}",
"providersEmpty": {
"title": "Error del proveedor de autenticación",
"message": "Los proveedor(es) no están configurados; consulte sus registros para obtener más información."
"message": "El/Los Proveedor(es) no están configurados, por favor, revisa tus registros para obtener más información."
}
},
"alert": "Tus credenciales son incorrectas o esta cuenta no existe. Por favor, inténtalo de nuevo."

View File

@@ -17,6 +17,7 @@
"disabled": "Desactivado",
"enableAll": "Activar todo",
"disableAll": "Desactivar todo",
"setTimer": "Configurar temporizador",
"version": "Versión",
"changePosition": "Cambiar posición",
"remove": "Eliminar",

View File

@@ -22,5 +22,5 @@
"message": "La categoría \"{{name}}\" ha sido creada"
}
},
"importFromDocker": "Importar desde docker"
"importFromDocker": "Importar desde Docker"
}

View File

@@ -26,7 +26,8 @@
"title": "Herramientas",
"items": {
"docker": "Docker",
"api": "API"
"api": "API",
"migrate": "Migrar a 1.0"
}
},
"about": {

View File

@@ -31,7 +31,8 @@
},
"externalAddress": {
"label": "Dirección externa",
"description": "URL que se abrirá al hacer clic en la aplicación."
"description": "URL que se abrirá al hacer clic en la aplicación.",
"tooltip": "Puedes usar algunas variables para crear direcciones dinámicas:<br><br><b>[homarr_base]</b> : dirección completa excluyendo puerto y ruta. <i>(Ejemplo: 'https://subdominio.homarr.dev')</i><br><b>[homarr_hostname]</b> : url base completa incluyendo su subdominio actual. <i>(Ejemplo: 'subdominio.homarr.dev')</i><br><b>[homarr_domain]</b> : dominio con el subdominio filtrado. <i>(Ejemplo: 'homarr.dev')</i><br><b>[homarr_protocol]</b> : <i>http/https</i><br><br>Todas estas variables dependen de la url actual."
}
},
"behaviour": {

View File

@@ -0,0 +1,33 @@
{
"metaTitle": "Migrar a 1.0",
"pageTitle": "Migrar tableros, integraciones y usuarios",
"description": "Exporta tus tableros y usuarios a un archivo ZIP para migrarlos a Homarr después de la versión 1.0.0",
"securityNote": {
"title": "Nota de seguridad",
"text": "Al exportar usuarios e integraciones, también se abrirá una modal con una clave de cifrado. Esta clave es necesaria para importar los datos a Homarr. Manténgala segura y no la comparta con nadie."
},
"form": {
"label": "Seleccione todo lo que desea exportar",
"option": {
"boards": {
"label": "Exportar tableros"
},
"integrations": {
"label": "Exportar integraciones",
"description": "Esto incluirá credenciales cifradas para integraciones. Sólo disponible cuando se exporten tableros"
},
"users": {
"label": "Exportar usuarios",
"description": "Esto sólo exportará credenciales de usuario, las contraseñas hash y salt son cifradas"
}
}
},
"action": {
"export": "Exportar datos"
},
"modal": {
"title": "Clave de cifrado",
"description": "Sus datos han sido exportados. Mantenga esta clave segura y no la comparta con nadie. Necesitará esta clave para importar los datos a Homarr.",
"copyDismiss": "Copiar y descartar"
}
}

View File

@@ -22,7 +22,7 @@
},
"titleState": {
"label": "Título del reloj",
"info": "El título personalizado y el código de zona horaria se pueden mostrar en tu widget.<br/>También puedes mostrar solo la ciudad, no mostrar ninguna<br/>o incluso mostrar solo la zona horaria cuando ambas están seleccionadas y no se proporcione ningún título.",
"info": "El título personalizado y el código de zona horaria se pueden mostrar en tu widget.<br/>También puedes mostrar solo la ciudad, no mostrar nada,<br/>o incluso mostrar solo la zona horaria cuando ambos están seleccionados pero no se proporciona un título.",
"data": {
"both": "Título y zona horaria",
"city": "Solo título",

View File

@@ -14,5 +14,12 @@
"text": "Hubo un problema al conectarse a tus agujeros DNS. Verifica tu configuración/integración(es)."
}
}
},
"durationModal": {
"title": "Establecer tiempo de desactivación",
"hours": "Horas",
"minutes": "Minutos",
"unlimited": "Dejar vacío para ilimitado",
"set": "Establecer"
}
}

View File

@@ -9,8 +9,8 @@
},
"cpu": {
"label": "Mostrar información de la CPU",
"load": "",
"minute": "",
"load": "Promedio de Carga",
"minute": "{{minute}} minutos",
"minutes": "{{minutes}} Minutos"
},
"memory": {
@@ -57,43 +57,43 @@
"label": "Mostrar sección de almacenamiento"
},
"sectionIndicatorColor": {
"label": "",
"info": "",
"label": "Requisito para que el indicador de estado de la sección sea 'OK'",
"info": "'Todos' requiere que todos los elementos estén en línea para que el indicador sea verde. 'Cualquiera' requiere que al menos un elemento esté en línea.",
"data": {
"any": "",
"all": ""
"any": "Cualquiera Activo",
"all": "Todos Activos"
}
},
"ignoreCert": {
"label": "",
"info": ""
"label": "Ignorar Errores de Certificado",
"info": "Si está habilitado, el widget ignorará los errores de certificado al acceder a la API de Proxmox. Esto puede ser útil al acceder a Proxmox a través de HTTPS."
}
}
},
"cpu": {
"label": "CPU",
"load": "",
"minute": ""
"load": "Promedio de Carga",
"minute": "{{minute}} minutos"
},
"memory": {
"label": "",
"totalMem": "",
"available": ""
"label": "Memoria",
"totalMem": "Espacio total: {{total}}GB",
"available": "Disponible: {{available}}GB - {{percentage}}%"
},
"fileSystem": {
"label": "",
"available": ""
"label": "Archivo de Sistema",
"available": "Disponible: {{available}} - {{percentage}}%"
},
"info": {
"uptime": "",
"uptimeFormat": "",
"updates": "",
"reboot": ""
"uptime": "Tiempo de Actividad",
"uptimeFormat": "{{days}} días, {{hours}} horas, {{minutes}} minutos",
"updates": "Actualización disponible",
"reboot": "Reiniciar"
},
"errors": {
"general": {
"title": "",
"text": ""
"title": "No se puede encontrar tu(s) sistema(s).",
"text": "Hubo un problema al conectarse a tu sistema. Por favor verifica tu configuración/integración(es)."
}
},
"headings": {
@@ -118,24 +118,24 @@
"name": "Nombre",
"cpu": "CPU",
"ram": "RAM",
"node": ""
"node": "Nodo"
}
},
"popover": {
"node": "",
"vmid": "",
"node": "Nodo",
"vmid": "VMID",
"details": "Detalles",
"cores": "",
"memSize": "",
"memRatio": "",
"diskSize": "",
"diskRatio": "",
"uptime": "",
"plugin": "",
"ha": "",
"sharedStorage": "",
"localStorage": "",
"na": ""
"cores": "Núcleos - {{maxCpu}}",
"memSize": "Memoria - {{maxMem}}",
"memRatio": "Memoria - {{usedMem}} / {{maxMem}}",
"diskSize": "Disco - {{maxDisk}}",
"diskRatio": "Disco - {{usedDisk}} / {{maxDisk}}",
"uptime": "Tiempo de actividad - {{uptime}}",
"plugin": "Complemento",
"ha": "Estado de HA - {{haState}}",
"sharedStorage": "Almacenamiento Compartido",
"localStorage": "Almacenamiento Local",
"na": "N/D"
}
}
}

View File

@@ -1,19 +1,22 @@
{
"descriptor": {
"name": "",
"description": "",
"name": "Estado del Administrador de Índices",
"description": "Estado sobre tus índices",
"settings": {
"title": ""
"title": "Estado del Administrador de Índices",
"openIndexerSiteInNewTab": {
"label": "Abrir el Sitio del Indexador en una Nueva Pestaña"
}
}
},
"indexersStatus": {
"title": "",
"testAllButton": ""
"title": "Administrador de Índices",
"testAllButton": "Probar todo"
},
"errors": {
"general": {
"title": "",
"text": ""
"title": "No se puede encontrar un administrador de índices",
"text": "Hubo un problema al conectarse a tu administrador de índices. Por favor verifica tu configuración/integración(es)."
}
}
}

View File

@@ -1,96 +1,96 @@
{
"descriptor": {
"name": "",
"description": "",
"name": "Transcodificación de Medios",
"description": "Muestra información sobre la transcodificación de medios",
"settings": {
"title": "",
"title": "Configuraciones de Transcodificación de Medios",
"appId": {
"label": ""
"label": "Seleccionar una aplicación"
},
"defaultView": {
"label": "",
"label": "Vista predeterminada",
"data": {
"workers": "",
"workers": "Trabajadores",
"queue": "Cola",
"statistics": ""
"statistics": "Estadísticas"
}
},
"showHealthCheck": {
"label": ""
"label": "Mostrar indicador de Verificación de Salud"
},
"showHealthChecksInQueue": {
"label": ""
"label": "Mostrar Verificaciones de Salud en cola"
},
"queuePageSize": {
"label": ""
"label": "Cola: Elementos por página"
},
"showAppIcon": {
"label": ""
"label": "Mostrar icono de aplicación en la esquina inferior derecha"
}
}
},
"noAppSelected": "",
"noAppSelected": "Por favor selecciona una aplicación en la configuración del widget",
"views": {
"workers": {
"table": {
"header": {
"name": "",
"name": "Archivo",
"eta": "Tiempo restante",
"progress": "Completado %"
},
"empty": "Vacío",
"tooltip": {
"transcode": "",
"healthCheck": ""
"transcode": "Transcodificar",
"healthCheck": "Verificación de Salud"
}
}
},
"queue": {
"table": {
"header": {
"name": "",
"name": "Archivo",
"size": "Tamaño"
},
"footer": {
"currentIndex": ""
"currentIndex": "{{start}}-{{end}} de {{total}}"
},
"empty": "Vacío",
"tooltip": {
"transcode": "",
"healthCheck": ""
"transcode": "Transcodificar",
"healthCheck": "Verificación de Salud"
}
}
},
"statistics": {
"empty": "Vacío",
"box": {
"transcodes": "",
"healthChecks": "",
"files": "",
"spaceSaved": ""
"transcodes": "Transcodificaciones: {{value}}",
"healthChecks": "Verificaciones de Salud: {{value}}",
"files": "Archivos: {{value}}",
"spaceSaved": "Guardado: {{value}}"
},
"pies": {
"transcodes": "",
"healthChecks": "",
"videoCodecs": "",
"videoContainers": "",
"videoResolutions": ""
"transcodes": "Transcodificaciones",
"healthChecks": "Verificaciones de Salud",
"videoCodecs": "Códecs",
"videoContainers": "Contenedores",
"videoResolutions": "Resoluciones"
}
}
},
"error": {
"title": "Error",
"message": ""
"message": "Ocurrió un error al obtener datos de Tdarr."
},
"tabs": {
"workers": "",
"workers": "Trabajadores",
"queue": "Cola",
"statistics": ""
"statistics": "Estadísticas"
},
"healthCheckStatus": {
"title": "",
"queued": "",
"healthy": "",
"unhealthy": ""
"title": "Verificación de Salud",
"queued": "En cola",
"healthy": "Saludable",
"unhealthy": "No saludable"
}
}

View File

@@ -19,13 +19,13 @@
"label": "Límite de líneas de texto"
},
"sortByPublishDateAscending": {
"label": ""
"label": "Ordenar por fecha de publicación (ascendente)"
},
"sortPostsWithoutPublishDateToTheTop": {
"label": ""
"label": "Colocar publicaciones sin fecha de publicación en la parte superior"
},
"maximumAmountOfPosts": {
"label": ""
"label": "Cantidad máxima de publicaciones"
}
},
"card": {

View File

@@ -11,22 +11,22 @@
},
"appendUnit": {
"label": "Añadir unidad de medida",
"info": "Añadir el atributo unidad de medida al estado de la entidad."
"info": "Añadir el atributo de unidad de medida al estado de la entidad."
},
"automationId": {
"label": "ID de automatización opcional",
"info": "Su ID de automatización única. Siempre empieza por automation.XXXXX. Si no está establecida, no se podrá hacer clic en el widget, y solo se mostrará el estado. Al hacer clic, la entidad se refrescará."
"info": "Tu ID de automatización único. Siempre empieza con automation.XXXXX. Si no está configurado, el widget no será clicable y solo mostrará el estado. Después de hacer clic, el estado de la entidad se actualizará."
},
"displayName": {
"label": "Nombre a mostrar"
},
"displayFriendlyName": {
"label": "Mostrar nombre descriptivo",
"info": "Mostrar el nombre descriptivo de Home Assistant en lugar del nombre para mostrar."
"label": "Mostrar nombre amigable",
"info": "Mostrar el nombre amigable de Home Assistant en lugar del nombre de visualización."
},
"genericToggle": {
"label": "Cambio de entidad",
"info": "Realizar una acción genérica de Home Assistant en la entidad cuando se hace clic."
"label": "Interruptor de entidad",
"info": "Realizar una acción genérica de alternar de Home Assistant en la entidad al hacer clic."
}
}
}

View File

@@ -6,7 +6,7 @@
"title": "Ejecutar una automatización",
"automationId": {
"label": "ID de automatización",
"info": "Su ID de automatización única. Siempre empieza por automation.XXXXX."
"info": "Tu ID de automatización único. Siempre empieza con automatización.XXXXX."
},
"displayName": {
"label": "Nombre a mostrar"

Some files were not shown because too many files have changed in this diff Show More