Compare commits

...

240 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
SeDemal
042a381b66 AUTH_OIDC_TIMEOUT make default a string (#2041) 2024-05-08 16:06:31 +02:00
Manuel
9b95ac3c91 chore: merge version 0.15.3 to master 2024-05-07 20:36:15 +02:00
Meier Lukas
0a08b8fb9b Merge branch 'master' into dev 2024-05-07 20:04:46 +02:00
Meier Lukas
b70e179ff9 core: increase version to 0.15.3 (#2007) 2024-05-07 19:48:03 +02:00
Jelte Lagendijk
5fbb444d5f feat: add [homarr_base] replacement for external urls (#2024) 2024-05-07 19:47:19 +02:00
Thomas Camlong
477d249da8 chore(translations): new crowdin updates (#1984) 2024-05-07 19:46:34 +02:00
SeDemal
f12dd52208 fix: ldap filters (#2033) 2024-05-07 19:43:51 +02:00
SeDemal
452304b471 Add logout callback URL and session expiration environment variables (#2023)
Co-authored-by: @Meierschlumpf
2024-05-07 00:06:07 +02:00
Dennis Vesterlund
18cd1f961f feat: home assistant entity generic toggle (#2015)
Added support for generic toggle on Home Assistant entities that support
it. For entities that does not support toggle the feature will silently
fail. This way matches how Home Assistant handles it.
2024-05-06 20:00:13 +02:00
SeDemal
6a5836f096 fix: avatar host default address on not found (#2027)
feat: updated to use libravatar
2024-04-29 22:19:41 +02:00
SeDemal
7dffe393ab fix: Modals titles nested headers and header nested buttons errors (#2019) 2024-04-20 18:43:46 +02:00
SeDemal
fdbb8d8b35 refactor: polish UI and improve popover interactions (#2016) 2024-04-20 18:41:54 +02:00
Janik Brüll
2b92c98975 Add Tdarr integration and widget (#1882) 2024-04-18 23:01:20 +02:00
Meier Lukas
39f416c6a9 fix: missing romanian language in next-i18next.config.js (#2018) 2024-04-18 22:26:24 +02:00
Thomas Camlong
34903d528c Merge pull request #2017 from ajnart/add-romanian 2024-04-18 22:23:29 +02:00
Meier Lukas
230f1f77f9 feat: add romanian language support
Closes #1971 #1954
2024-04-18 22:10:23 +02:00
Dylan Slattery
f1dc67f206 Bugfix: Pass axios error into log call for proxmox. (#2012)
* add error to proxmox api log call

* Update src/server/api/routers/health-monitoring/proxmox.ts

Co-authored-by: Thomas Camlong <thomas@ajnart.fr>

---------

Co-authored-by: Thomas Camlong <thomas@ajnart.fr>
2024-04-18 21:07:12 +02:00
Thomas Camlong
53d1a57f3d Merge pull request #2002 from catrielmuller/catrielmuller/oidc-timeout
OIDC Timeout
2024-04-18 10:34:15 +02:00
Catriel Müller
e71af87b90 Add support for AUTH_OIDC_TIMEOUT 2024-04-09 23:29:33 -03:00
Krishna Muppaneni
8f78184323 Fix ping indicators floating above header in board customization page (#1998)
🐛 fix indicators floating above header
2024-04-05 14:57:33 +02:00
Julian
f861eb4bd9 🐛 Added playsInline to VideoBackground (#1996)
Co-authored-by: spkesDE <spkes@spkes.de>
2024-04-04 18:30:47 +02:00
Yossi Hillali
a74aa5412c Columns customize (#1975)
* Columns customization

Related issue: #1471
Related issue: #1832
Related issue: #1354
Related issue: #1929
2024-03-23 17:26:59 +01:00
Dylan Slattery
06772713ce feat: add Proxmox integration/widget (#1903) 2024-03-23 16:19:38 +01:00
Thomas Camlong
4a8b7377a8 chore: new Crowdin updates (#1968) 2024-03-23 16:18:26 +01:00
Manuel
5f8b96704b fix: #1976 lower debounce time (#1979) 2024-03-23 16:18:02 +01:00
Yossi Hillali
d512ae7e22 fix: weather widget does not refresh automatically (#1981) 2024-03-23 16:17:23 +01:00
Tagaishi
11eaf9eb8e fix: change media request TV poster and movie name (#1983) 2024-03-23 16:16:17 +01:00
Yossi Hillali
ef70e9317d fix: health monitoring hotfix (#1970)
* fix cpu temp when not available, fix hover dropdown, resize progress rings.

* fix spelling
2024-03-18 22:53:06 +01:00
Manuel
f67e2c5a45 core: increase version to 0.15.2 (#1967) 2024-03-15 19:46:12 +01:00
Thomas Camlong
ce8259b031 chore: new Crowdin updates (#1949) 2024-03-15 19:46:12 +01:00
Tagaishi
d4aa866e5b feat: Apply translation automation from select option to multi-select option (#1963) 2024-03-15 19:46:12 +01:00
Yossi Hillali
6989ce8311 fix: OMV 7 support (#1959) 2024-03-15 19:46:12 +01:00
Manuel
5875b1b264 Merge branch 'master' into dev 2024-03-15 19:28:42 +01:00
Manuel
fca7fcbad2 core: increase version to 0.15.2 (#1967) 2024-03-15 18:42:32 +01:00
Manuel
bbad5a7866 chore: increase version 2024-03-15 18:41:03 +01:00
Thomas Camlong
08153f9f54 chore: new Crowdin updates (#1949) 2024-03-15 18:20:07 +01:00
Tagaishi
81e51d2877 feat: Apply translation automation from select option to multi-select option (#1963) 2024-03-15 13:51:25 +01:00
Yossi Hillali
030f05b24b fix: OMV 7 support (#1959) 2024-03-15 09:00:43 +01:00
Manuel
49b6ef2bde Merge pull request #1960 from ajnart/chore/increase-version
chore: increase version
2024-03-14 20:55:58 +01:00
Manuel
29bc596090 chore: increase version 2024-03-14 20:55:08 +01:00
Manuel
4f301856fb chore: version 0.15.1 2024-03-14 17:16:16 +01:00
Yossi Hillali
1cc4ae5c03 feat: add column ordering in torrent widget (#1952) 2024-03-13 20:07:51 +01:00
Meier Lukas
4fa51821ef Fix: dead links (#1955)
* Fix dead link on manage page

* Fix: dead link for edit mode toggle
2024-03-13 17:45:41 +01:00
diederbert
4bafe6bfe7 perf: Improve TorrentTile rendering performance (#1951) 2024-03-13 17:43:24 +01:00
Thomas Camlong
184aa5eca6 Merge pull request #1953 from ajnart/fix-death-links 2024-03-11 06:55:05 +01:00
Meier Lukas
a9df79642d fix: death links in readme 2024-03-11 06:49:59 +01:00
Thomas Camlong
e23e25890a chore: new Crowdin updates (#1890) 2024-03-09 17:56:56 +01:00
Thomas Camlong
28bd849af7 feat: add Estonian language (#1931)
Co-authored-by: Manuel <30572287+manuel-rw@users.noreply.github.com>
2024-03-09 16:58:24 +01:00
Yossi Hillali
918585c3e2 feat: add weekly forecast to weather widget (#1932) 2024-03-09 16:57:16 +01:00
Tagaishi
0906420584 feat: Mention Emby on Jellyfin integration (#1917) 2024-03-09 16:52:47 +01:00
Thomas Camlong
18bd9c856d config: add Lithuanian support (#1935) 2024-03-09 16:49:30 +01:00
Tagaishi
93379145ac fix: log when incorrect and show error in login page (#1943)
* feat: Add logs for incorrect AUTH_PROVIDER and show in login page

* feat: format any entry to lower case for AUTH_PROVIDER

* fix: Change simple text to Alert element on login page
2024-03-09 16:48:52 +01:00
Meier Lukas
9c81d34d66 feat: add ldap search scope (#1948) 2024-03-09 16:37:36 +01:00
Yossi Hillali
b51fcdb342 Add OMV integration / widget (#1879)
feat: Add health monitoring widget (OMV)
OpenMediaVault as first supported integration.
2024-02-27 20:44:52 +01:00
Tagaishi
db2501633d fix: set maximum size for indexer manager to 12 (#1912) 2024-02-24 19:40:05 +01:00
Meier Lukas
5cd940f3cc Fix redirect OIDC (#1911)
* fix: redirect oidc not defined

* fix: construct redirect url from x-forwarded prot and host

* fix: redirect method does not support comma seperated protocol list and url starting with http(s)://

* fix: redirect_uri not specified for oidc as authorization parameter

* fix: unit test not modified

* docs: add comment why the redirect_uri is constructed

* fix: add redirect callback with forwarded headers as redirect url host and protocol

* Apply suggestions from code review
2024-02-20 20:34:57 +01:00
Meier Lukas
1bc19e7857 Merge pull request #1913 from ajnart/add-env-for-oidc-scopes
feat: add environment variable to overwrite oidc scopes
2024-02-19 05:57:17 +01:00
Meier Lukas
83e3800ddf fix: change groups check to undefined instead of not to not show warning when 0 groups in list 2024-02-18 11:53:44 +01:00
Meier Lukas
34ef216f3f feat: add environment variable to overwrite oidc scopes 2024-02-18 11:51:26 +01:00
Manuel
2e014a5883 Merge Version 0.15 2024-02-17 17:36:17 +01:00
Manuel
46a57c1cf2 config: tag release (#1906) 2024-02-17 14:36:09 +01:00
Thomas Camlong
78527cb375 Merge pull request #1892 from ajnart/ajnart-patch-1 2024-02-10 15:32:27 +01:00
Thomas Camlong
508f687491 Update README.md
Fixed incorrect URLs in the integrations part of the README #1891
2024-02-10 15:31:59 +01:00
Rikpat
9a8ea9e1fe feat: add ldap and oidc support (#1497)
Co-authored-by: Thomas Camlong <49837342+ajnart@users.noreply.github.com>
Co-authored-by: Tagaishi <Tagaishi@hotmail.ch>
2024-02-09 22:57:00 +01:00
Thomas Camlong
b1ae5f700e chore(translations): new Crowdin updates (#1878) 2024-02-09 22:37:26 +01:00
Thomas Camlong
f0a67d9a29 feat: allow up to 8128 characters for links in bookmark widget (#1851) #1850 2024-02-09 22:36:34 +01:00
Yossi Hillali
5d113ea280 Indexer manager (#1807)
* indexer manager widget

Co-authored-by: Tagaishi <Tagaishi@hotmail.ch>
2024-02-09 22:35:56 +01:00
Dennis Vesterlund
d45ae5fab9 feat: add unit display to smart home entitiy card (#1844)
Unit of measurement can be chosen to display on the entity card.
Friendly name can be used instead of displayName.
2024-02-09 22:30:57 +01:00
Tagaishi
02249d20c2 fix: add check for already existing name upon creating board (#1887) 2024-02-09 22:30:03 +01:00
Tagaishi
cefa0d8fde fix: notebook link target bug fix (#1889) 2024-02-09 22:28:23 +01:00
Manuel
4933b4f60d docs: add argos ci to readme (#1883) 2024-02-05 18:18:16 +01:00
Manuel
55174476e8 Version 0.14.6 2024-02-04 09:14:17 +01:00
Manuel
a60053e6c4 config: chore version (#1876) 2024-02-04 09:12:48 +01:00
Thomas Camlong
6756838d5f chore: new Crowdin updates (#1873) 2024-02-04 09:10:54 +01:00
Manuel
74fe7a7a28 fix: attempt to fix hidden docker button (#1875) 2024-02-04 09:08:04 +01:00
Manuel
5812a6bd97 Version 0.14.5 2024-02-03 18:30:20 +01:00
Manuel
824f4b8acc fix: #1859 dayjs locale translation (#1868) 2024-02-03 16:38:56 +01:00
Thomas Camlong
a6ea9ac333 chore: new Crowdin updates (#1869) 2024-02-03 16:38:39 +01:00
Manuel
a87bda7810 chore: increase version (#1867) 2024-01-31 20:18:39 +01:00
Thomas Camlong
a8f00f5242 chore: new Crowdin updates (#1862) 2024-01-31 20:11:18 +01:00
Manuel
6268db182e fix: #1805 remove server prefetching docker (#1860) 2024-01-31 07:51:38 +01:00
Manuel
6f077f1c5e fix: remove console log (#1861) 2024-01-28 21:19:41 +01:00
Manuel
ff21033b0c fix: rss widget post sorting (#1855) 2024-01-28 21:15:46 +01:00
Manuel
6fdf1dfaa8 feat: #1835 copy apps (#1854) 2024-01-28 21:15:08 +01:00
Thomas Camlong
f1e0b9236c config: new crowdin updates (#1834) 2024-01-27 22:12:04 +01:00
Julian
4da75134ed feat: add video background support (#1839) 2024-01-25 17:45:26 +01:00
Dennis Vesterlund
957ba4e058 fix: schemas for lights attributes in home assistant entity widget 2024-01-25 17:38:28 +01:00
Manuel
732ef95bd9 config: update stale.yml (#1847) 2024-01-25 17:34:24 +01:00
Manuel
37d728cc83 chore: merge version 0.14.4 from ajnart/dev 2024-01-16 20:45:14 +01:00
Thomas Camlong
7fb8a18a1e chore: new Crowdin updates (#1824) 2024-01-16 20:34:33 +01:00
Manuel
0dc16977a5 fix: attempt to fix ping redirects (#1829) 2024-01-16 20:23:22 +01:00
Manuel
ffc9387edb fix: remove max redirects from ping (#1828) 2024-01-16 20:14:52 +01:00
Manuel
b911e8b56f fix: http ping agent (#1826) 2024-01-16 19:44:02 +01:00
Manuel
52ca28d0ec fix: #1734 fix local icons path (#1821) 2024-01-15 21:40:45 +01:00
Thomas Camlong
684ce37f4d config: new Crowdin updates (#1820) 2024-01-15 21:31:58 +01:00
Manuel
5bae5bf04d refactor: optimize imports (#1822) 2024-01-15 17:16:13 +01:00
Manuel
c701f723cf feature: add trpc openapi (#1818) 2024-01-14 22:20:51 +01:00
Thomas Camlong
33da630db5 config: new Crowdin updates (#1772) 2024-01-14 14:10:59 +01:00
Manuel
e57af4ae10 revert: #1714 migrate to axios.get (#1819) 2024-01-14 14:09:08 +01:00
Manuel
c7992260f0 feature: board operations (#1800) 2024-01-13 22:52:44 +01:00
Manuel
6717bcf8b4 feature: rss improvements (#1810) 2024-01-11 19:19:59 +01:00
Tagaishi
60bca7412c feat: improve admin security on dnshole controls (#1686) 2024-01-11 19:04:41 +01:00
Manuel
bd280d171b chore: increase version (#1811) 2024-01-11 19:02:06 +01:00
anonysoul
0089d396c4 fix: database is not initialized inside the docker container (#1806) 2024-01-11 18:11:09 +01:00
Manuel
c4669ca516 feature: #1765 reduce transferred torrent data (#1798) 2024-01-11 18:10:30 +01:00
Manuel
35e8c76120 feature: trigger automations (#1799) 2024-01-11 17:49:27 +01:00
Marek Tancak
6d6750c665 feat: add availability information about media requests (#1794) 2024-01-09 20:56:57 +01:00
Thomas Camlong
209119f14c Merge pull request #1796 from StefanB7/sb/fix_link_after_user_creation 2024-01-07 10:39:54 +01:00
Stefan Buys
a99555c1d0 Fixes documentation links 2024-01-07 08:18:13 +02:00
Manuel
e208693806 refactor: improve torrent table design (#1786) 2024-01-03 21:54:42 +01:00
Meier Lukas
514d4a145d Merge pull request #1775 from stark1tty/patch-1
Updated dead installation links in README.md
2024-01-01 11:35:23 +01:00
Nika Shilobod
c1d0299c40 Update README.md
updated installation instruction links from https://homarr.dev/docs/introduction/installation to https://homarr.dev/docs/getting-started/installation/
2024-01-01 06:44:02 +00:00
Manuel
b4a8d47636 version 0.14.3 2023-12-31 12:37:23 +01:00
ajnart
a68f8424f5 Update tests 2023-12-31 12:07:39 +01:00
Thomas Camlong
eba4dd3b9d Merge pull request #1773 from ajnart/docker-onboarding-fix 2023-12-31 11:58:00 +01:00
Thomas Camlong
745adb3a95 Merge branch 'dev' into docker-onboarding-fix 2023-12-31 11:42:56 +01:00
ajnart
c83b04dfc0 Refactor Docker integration in board page 2023-12-31 11:25:21 +01:00
Manuel
a3948430ed chore: increase version in package.json (#1771) 2023-12-30 22:11:05 +01:00
Manuel
108803ae2a fix: outdated config schema (#1769) 2023-12-30 21:54:48 +01:00
Thomas Camlong
b9a5b5ed09 chore: new Crowdin updates (#1770) 2023-12-30 21:46:01 +01:00
Manuel
159ba4b1c3 config: greetings (#1753) 2023-12-30 21:42:48 +01:00
Manuel
0a929a93a3 config; stale action (#1752) 2023-12-30 21:42:30 +01:00
Thomas Camlong
e9100fce91 Update FUNDING.yml (#1768) 2023-12-30 21:41:49 +01:00
Thomas Camlong
082077ec9d feat: import to docker form board, docker button on boards (#1714) 2023-12-30 20:11:38 +01:00
Tagaishi
e13a4afdde feat: remove location based timezone resolving (#1680) 2023-12-30 20:09:17 +01:00
ajnart
f20c209c94 Address PR comments 2023-12-29 17:59:19 +01:00
Thomas Camlong
f9c9f23b0c Update overseerr.ts 2023-12-29 17:57:32 +01:00
Thomas Camlong
19e65e0d08 config: new crowdin updates 2023-12-29 10:57:26 +01:00
Manuel
b6b697cabd fix: umlaute in RSS (#1755) 2023-12-29 10:55:59 +01:00
Thomas Camlong
fd3f8f317a config: update crowdin translations 2023-12-22 21:50:04 +01:00
Manuel
553fa98e61 #1616 better user management (#1748) 2023-12-20 10:18:24 +01:00
gleb
199b711324 Updated entityStateSchema to handle nullables (#1744)
Co-authored-by: Gleb Fomichev <gleb.fomichev@softswiss.com>
2023-12-17 18:06:51 +01:00
Tagaishi
976634a908 ️ Improve code in manage layout page (#1681)
Co-authored-by: Thomas Camlong <ajnart@users.noreply.github.com>
2023-12-07 18:30:49 +01:00
Someone
217020154b feat: add filter and sorting functionality to torrents table 2023-12-07 18:28:28 +01:00
Tagaishi
51e96c0ccf Use gravatar with user email (#1688)
*  Use gravatar with user email
2023-12-07 18:15:07 +01:00
Thomas Camlong
d6af6af0b6 🐛 About page and manage user pages not translated (#1724) 2023-12-07 18:14:10 +01:00
Manuel
fc38f7ab29 #1616 Recovery script in Docker container (#1726) 2023-12-04 13:06:14 +01:00
Thomas Camlong
deee511f86 Fix unused function and enable user count check in
getServerSideProps
2023-12-02 12:41:07 +01:00
Thomas Camlong
48ca5352c9 Add client side reload of the config with the newly added apps 2023-11-27 00:14:41 +01:00
Thomas Camlong
e2da8338e0 🚧 WIP on adding docker containers to boards 2023-11-26 23:24:03 +01:00
Thomas Camlong
cca8be09cb Merge pull request #1709 from jeffersonraimon/patch-1 2023-11-26 22:32:11 +01:00
Jefferson J. Raimon
9bdd6a442e Update acceptableStatusCodes.ts
add 202 code
2023-11-25 16:28:21 -03:00
Manuel
15605e3f09 🔀 Version 0.14.2 2023-11-23 22:54:43 +01:00
Manuel
dfcb899013 Stale time for entity state (#1702) 2023-11-23 22:21:34 +01:00
Manuel
5522abdfb6 🔖 Increase version (#1699) 2023-11-23 21:46:51 +01:00
Manuel
312e2c8297 #698 homeassistant widget (#1658) 2023-11-23 21:44:05 +01:00
Thomas Camlong
7f46fafbb9 🌐 New Crowdin updates (#1692) 2023-11-23 21:43:18 +01:00
Tagaishi
5a8a378a2e 🐛 Affix overlapping custom CSS box (#1687) 2023-11-21 18:34:01 +01:00
Thomas Camlong
fe63c03372 🌐 New Crowdin updates (#1682) 2023-11-21 18:33:18 +01:00
ajnart
c88cd3c05e 🚧 WIP on docker import feature 2023-11-20 13:37:58 +01:00
Meier Lukas
eadfa4a10f Add support for installation in address bar (#1675) 2023-11-18 22:11:29 +01:00
Thomas Camlong
5aefd0962f New Crowdin updates (#1641) 2023-11-18 15:43:46 +01:00
tuxsudo
da7c111438 Allow custom nextauth port (#1663) 2023-11-18 15:42:47 +01:00
ajnart
669d311b0c 🚧 WIP on Docker import group 2023-11-17 15:34:14 +01:00
Thomas Camlong
228c51299b Merge pull request #1651 from ajnart/fix-notebook-settings-overlapped 2023-11-15 20:54:40 +01:00
Thomas Camlong
57975f3030 Merge pull request #1652 from ajnart/fix-edit-mode-notification-link
🐛 Link to definition of screen sized for edit mode notification wrong
2023-11-15 09:08:57 +01:00
Thomas Camlong
f4e737b4a1 Merge pull request #1654 from ajnart/add-licence-field-to-migration-package-json
🐛 Migrate package.json has no license field
2023-11-15 09:08:26 +01:00
Tagaishi
a933406ef8 Merge pull request #1655 from No-Maines-Land/patch-1
Update GeneralTab.tsx
2023-11-15 08:40:46 +01:00
No-Maines-Land
a30d6f6f7b Update GeneralTab.tsx 2023-11-15 01:03:38 -05:00
Meier Lukas
34074b1c92 🐛 Migrate package.json has no license field 2023-11-15 06:48:23 +01:00
Meier Lukas
f7ab929bcb 🐛 Link to definition of screen sized for edit mode notification wrong 2023-11-15 06:44:07 +01:00
Meier Lukas
21dcde44a1 🐛 Notebook edit button placed above edit mode settings 2023-11-15 06:39:40 +01:00
1259 changed files with 49092 additions and 7054 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

2
.github/FUNDING.yml vendored
View File

@@ -2,7 +2,7 @@
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
open_collective: homarr
ko_fi: ajnart
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry

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 }}

16
.github/workflows/greetings.yml vendored Normal file
View File

@@ -0,0 +1,16 @@
name: Greetings
on: [pull_request_target, issues]
jobs:
greeting:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- 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 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."

28
.github/workflows/stale.yml vendored Normal file
View File

@@ -0,0 +1,28 @@
# This workflow warns and then closes issues and PRs that have had no activity for a specified amount of time.
#
# You can adjust the behavior by modifying this file.
# For more information, see:
# https://github.com/actions/stale
name: Mark stale issues and pull requests
on:
schedule:
- cron: '18 17 * * *'
jobs:
stale:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v5
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
stale-issue-message: "Hello 👋, this issue has been open for 60 days without activity. We mark issues to help prioritise and close dead issues. Can you confirm that this issue is still relevant on the latest version? I'll remove the stale label as soon as there is further activity on this issue. Thank you 🙏"
stale-pr-message: 'Hello 👋, this PR has gone stale. Please reply to mark it as active.'
stale-issue-label: 'Stale'
stale-pr-label: 'Stale'
days-before-close: -1

2
.gitignore vendored
View File

@@ -4,6 +4,7 @@
/node_modules
/.pnp
.pnp.js
/cli/node_modules/
# testing
/coverage
@@ -49,6 +50,7 @@ data/configs
!.yarn/releases
!.yarn/sdks
!.yarn/versions
/cli/.yarn/
#envfiles
.env

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

@@ -17,10 +17,12 @@ COPY yarn.lock ./temp_yarn.lock
COPY .next/standalone ./
COPY .next/static ./.next/static
COPY ./scripts/run.sh ./scripts/run.sh
RUN chmod +x ./scripts/run.sh
COPY ./drizzle ./drizzle
COPY ./drizzle/migrate ./migrate
COPY ./tsconfig.json ./migrate/tsconfig.json
COPY ./cli ./cli
RUN mkdir /data
@@ -30,25 +32,27 @@ 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
RUN echo '#!/bin/bash\nnode /app/cli/cli.js "$@"' > /usr/bin/homarr
RUN chmod +x /usr/bin/homarr
RUN cd /app/cli && yarn --immutable
# Expose the default application port
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
@@ -57,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/introduction/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
@@ -53,59 +59,71 @@ Simplify the management of your server with Homarr - a sleek, modern dashboard t
- 🦞 Comprehensive built-in icon picker with over 7000 icons
- 🐳 Easy deployment with Docker, unRAID, and Synology
- 🚀 Compatible with any major consumer hardware (x86, Raspberry Pi, old laptops, ...)
- 💵 Free and Open-Source - your data stays on your device. No telemetry data.
<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/integrations/), that connect to your applications and enable you to control them directly from the dashboard.
Each widget and integration has a comprehensive documentation for your comfort.
Homarr will integrate with the following applications of yours:
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
Homarr will integrate with the following applications:
- 📥 Torrent clients
- [Deluge](https://homarr.dev/docs/integrations/#deluge)
- [Transmission](https://homarr.dev/docs/integrations/#transmission)
- [qBittorent](https://homarr.dev/docs/integrations/#qbittorrent-integration)
- 📥 Usenet clients
- [SABnzbd](https://homarr.dev/docs/integrations/#sabnzbd)
- [NZBGet](https://homarr.dev/docs/integrations/#nzbget)
- 📚 Media collection managers
- [Sonarr](https://homarr.dev/docs/integrations/#sonarr)
- [Radarr](https://homarr.dev/docs/integrations/#radarr)
- [Lidarr](https://homarr.dev/docs/integrations/#lidarr)
- [Readarr](https://homarr.dev/docs/integrations/#readarr)
- 🎞️ Media request managers
- [Overseerr](https://homarr.dev/docs/integrations/#overseerr--jellyseerr)
- [Jellyseerr](https://homarr.dev/docs/integrations/#overseerr--jellyseerr)
- 🔌 [Dash.](https://homarr.dev/docs/integrations/#dash)
- 🐳 [Docker](https://homarr.dev/docs/integrations/#docker)
📥 Torrent clients
- [Deluge](https://homarr.dev/docs/integrations/torrent#deluge)
- [Transmission](https://homarr.dev/docs/integrations/torrent#transmission)
- [qBittorent](https://homarr.dev/docs/integrations/torrent#qbittorrent-integration)
📥 Usenet clients
- [SABnzbd](https://homarr.dev/docs/integrations/usenet#sabnzbd)
- [NZBGet](https://homarr.dev/docs/integrations/usenet#nzbget)
📺 Media servers
- [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)
- [Radarr](https://homarr.dev/docs/integrations/servarr#radarr)
- [Lidarr](https://homarr.dev/docs/integrations/servarr#lidarr)
- [Readarr](https://homarr.dev/docs/integrations/servarr#readarr)
🎞️ Media request managers
- [Overseerr](https://homarr.dev/docs/integrations/media-requester)
- [Jellyseerr](https://homarr.dev/docs/integrations/media-requester)
🚫 DNS ad-blockers
- [Pihole](https://homarr.dev/docs/integrations/dns#pihole)
- [AdGuard Home](https://homarr.dev/docs/integrations/dns#adguard-home)
Other integrations
- [🔌 Dash.](https://homarr.dev/docs/integrations/hardware)
- [🐳 Docker](https://homarr.dev/docs/integrations/containers)
We're constantly adding new integrations and widgets, which will enhance your experience even further.
<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/introduction/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.
@@ -123,3 +141,4 @@ You can also support us by helping with [translating the entire project](https:/
All contributions, regardless of their size or scope, are welcome and highly appreciated! Thank you ❤️
![Alt](https://repobeats.axiom.co/api/embed/60a6f68f193faf831f64221bdf90782adec51c93.svg "Repobeats analytics image")
[![Covered by Argos Visual Testing](https://argos-ci.com/badge-large.svg)](https://argos-ci.com?utm_source=%5Bhomarr%5D&utm_campaign=oss)

30
cli/cli.js Normal file
View File

@@ -0,0 +1,30 @@
import yargs from 'yargs';
import { resetPasswordForOwner } from './commands/reset-owner-password.js';
import { resetPasswordForUsername } from './commands/reset-password.js';
yargs(process.argv.slice(2))
.scriptName('homarr')
.usage('$0 <cmd> [args]')
.command('reset-owner-password', 'Resets the current owner password without UI access', async () => {
await resetPasswordForOwner();
})
.command(
'reset-password',
'Reset the password of a specific user without UI access',
(yargs) => {
yargs.option('username', {
type: 'string',
describe: 'Username of user',
demandOption: true
});
},
async (argv) => {
await resetPasswordForUsername(argv.username);
}
)
.version(false)
.showHelpOnFail(true)
.alias('h', 'help')
.demandCommand()
.help().argv;

View File

@@ -0,0 +1,55 @@
import bcrypt from 'bcryptjs';
import Database from 'better-sqlite3';
import boxen from 'boxen';
import chalk from 'chalk';
import Consola from 'consola';
import crypto from 'crypto';
import { sql } from 'drizzle-orm';
import { drizzle } from 'drizzle-orm/better-sqlite3';
export async function resetPasswordForOwner() {
if (!process.env.DATABASE_URL) {
Consola.error('Unable to connect to database due to missing database URL environment variable');
return;
}
Consola.info('Connecting to the database...');
const sqlite = new Database(process.env.DATABASE_URL.replace('file:', ''));
const db = drizzle(sqlite);
Consola.info('Connected to the database ' + chalk.green('✓'));
Consola.info('Generating new random password...');
const newPassword = crypto.randomUUID();
const salt = bcrypt.genSaltSync(10);
const hashedPassword = bcrypt.hashSync(newPassword, salt);
try {
await db.transaction((tx) => {
tx.run(
sql`DELETE FROM session WHERE userId = (SELECT id FROM user WHERE is_owner = 1 LIMIT 1)`
);
tx.run(sql`UPDATE user SET password = ${hashedPassword} WHERE is_owner = 1 LIMIT 1;`);
});
console.log(
boxen(`New owner password is '${chalk.red(newPassword)}'. You can now log in with this password.\nExising sessions have been destroyed and need to login again with the new passowrd.`, {
dimBorder: true,
borderStyle: 'round',
padding: {
left: 1,
right: 1
}
})
);
} catch (err) {
Consola.error('Failed to update password', err);
} finally {
Consola.info('Command has completed');
}
}

View File

@@ -0,0 +1,56 @@
import bcrypt from 'bcryptjs';
import Database from 'better-sqlite3';
import Consola from 'consola';
import crypto from 'crypto';
import boxen from 'boxen';
import chalk from 'chalk';
import { sql } from 'drizzle-orm';
import { drizzle } from 'drizzle-orm/better-sqlite3';
export async function resetPasswordForUsername(username) {
if (!process.env.DATABASE_URL) {
Consola.error('Unable to connect to database due to missing database URL environment variable');
return;
}
Consola.info('Connecting to the database...');
const sqlite = new Database(process.env.DATABASE_URL.replace('file:', ''));
const db = drizzle(sqlite);
Consola.info('Generating new random password...');
const newPassword = crypto.randomUUID();
const salt = bcrypt.genSaltSync(10);
const hashedPassword = bcrypt.hashSync(newPassword, salt);
Consola.info(`Updating password for user '${username}'`);
try {
await db.transaction((tx) => {
tx.run(
sql`DELETE FROM session WHERE userId = (SELECT id FROM user WHERE name = ${username} LIMIT 1)`
);
tx.run(sql`UPDATE user SET password = ${hashedPassword} WHERE id = (SELECT id FROM user WHERE name = ${username} LIMIT 1) LIMIT 1`);
});
console.log(
boxen(`New password for '${username}' is '${chalk.red(newPassword)}'. You can now log in with this password.\nExising sessions have been destroyed and need to login again with the new passowrd.`, {
dimBorder: true,
borderStyle: 'round',
padding: {
left: 1,
right: 1
}
})
);
} catch (err) {
Consola.error('Failed to update password', err);
} finally {
Consola.info('Command has completed');
}
}

12
cli/package.json Normal file
View File

@@ -0,0 +1,12 @@
{
"dependencies": {
"bcryptjs": "^2.4.3",
"better-sqlite3": "^8.6.0",
"boxen": "^7.1.1",
"chalk": "^5.3.0",
"consola": "^3.0.0",
"drizzle-orm": "^0.28.6",
"yargs": "^17.7.2"
},
"type": "module"
}

1371
cli/yarn.lock Normal file

File diff suppressed because it is too large Load Diff

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
}
}
}
}

View File

@@ -1,5 +1,5 @@
{
"schemaVersion": 1,
"schemaVersion": 2,
"configProperties": {
"name": "default"
},
@@ -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",

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

@@ -1,14 +1,15 @@
{
"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',
@@ -33,6 +34,9 @@ module.exports = {
'tw',
'uk',
'vi',
'et',
'lt',
'ro'
],
localeDetection: false,

View File

@@ -6,6 +6,14 @@ 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 };
return config;
},
images: {
domains: ['cdn.jsdelivr.net'],
},
@@ -16,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.14.1",
"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,15 +19,16 @@
"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": {
"@auth/drizzle-adapter": "^0.3.2",
"@ctrl/deluge": "^4.1.0",
"@ctrl/qbittorrent": "^6.0.0",
"@ctrl/shared-torrent": "^4.1.1",
@@ -72,10 +73,10 @@
"@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",
"browser-geo-tz": "^0.0.4",
"consola": "^3.0.0",
"cookies": "^0.8.0",
"cookies-next": "^2.1.1",
@@ -84,6 +85,7 @@
"dotenv": "^16.3.1",
"drizzle-kit": "^0.19.13",
"drizzle-orm": "^0.28.6",
"drizzle-zod": "^0.5.1",
"fily-publish-gridstack": "^0.0.13",
"flag-icons": "^6.9.2",
"framer-motion": "^10.0.0",
@@ -91,9 +93,13 @@
"html-entities": "^2.3.3",
"i18next": "^22.5.1",
"immer": "^10.0.2",
"js-file-download": "^0.4.12",
"ldapjs": "^3.0.5",
"mantine-react-table": "^1.3.4",
"next": "13.4.12",
"next-auth": "^4.23.0",
"next-i18next": "^14.0.0",
"nextjs-cors": "^2.2.0",
"nzbget-api": "^0.0.3",
"prismjs": "^1.29.0",
"react": "^18.2.0",
@@ -102,6 +108,9 @@
"react-simple-code-editor": "^0.13.1",
"rss-parser": "^3.12.0",
"sabnzbd-api": "^1.5.0",
"swagger-ui-react": "^5.11.0",
"tldts": "^6.1.18",
"trpc-openapi": "^1.2.0",
"uuid": "^9.0.0",
"xml-js": "^1.6.11",
"xss": "^1.0.14",
@@ -113,12 +122,15 @@
"@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/node": "18.17.8",
"@types/ldapjs": "^3.0.2",
"@types/node": "^20.6.0",
"@types/prismjs": "^1.26.0",
"@types/react": "^18.2.11",
"@types/swagger-ui-react": "^4.18.3",
"@types/umami": "^0.1.4",
"@types/uuid": "^9.0.0",
"@types/video.js": "^7.3.51",
@@ -140,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",
@@ -175,7 +187,6 @@
"importOrderSortSpecifiers": true
},
"eslintConfig": {
"ignoreDuringBuilds": true,
"extends": [
"next",
"eslint:recommended",
@@ -233,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

@@ -14,7 +14,11 @@
"buttons": {
"submit": "登录"
},
"afterLoginRedirection": "登录后,您将被重定向到 {{url}}"
"afterLoginRedirection": "登录后,您将被重定向到 {{url}}",
"providersEmpty": {
"title": "验证提供程序错误",
"message": "服务提供商未设置,请检查您的日志获取更多信息。"
}
},
"alert": "您的凭据不正确或此账户不存在。请重试。"
}

View File

@@ -13,9 +13,11 @@
"previous": "上一步",
"confirm": "确认",
"enabled": "已启用",
"duplicate": "复制",
"disabled": "已禁用",
"enableAll": "全部启用",
"disableAll": "全部禁用",
"setTimer": "设置计时器",
"version": "版本",
"changePosition": "换位",
"remove": "删除",
@@ -51,5 +53,7 @@
"attributes": {
"width": "宽度",
"height": "高度"
}
},
"public": "公开",
"restricted": "限制"
}

View File

@@ -1,25 +1,26 @@
{
"modal": {
"title": "添加新磁贴",
"text": "磁贴是 Homarr 的主要组成元素。它们被用来显示你的应用程序和其他信息。您可以根据需要增加任意数量的磁贴。"
},
"widgetDescription": "组件与您的应用交互,为您提供更多的应用程序控制。它们在使用前通常需要额外的配置。",
"goBack": "上一步",
"actionIcon": {
"tooltip": "添加磁贴"
},
"apps": "应用",
"app": {
"defaultName": "您的应用"
},
"widgets": "组件",
"categories": "分类",
"category": {
"newName": "新分类名称",
"defaultName": "新建分类",
"created": {
"title": "分类已创建",
"message": "已创建分类\"{{name}}\""
}
"modal": {
"title": "添加新磁贴",
"text": "磁贴是 Homarr 的主要组成元素。它们被用来显示你的应用程序和其他信息。您可以根据需要增加任意数量的磁贴。"
},
"widgetDescription": "组件与您的应用交互,为您提供更多的应用程序控制。它们在使用前通常需要额外的配置。",
"goBack": "上一步",
"actionIcon": {
"tooltip": "添加磁贴"
},
"apps": "应用",
"app": {
"defaultName": "您的应用"
},
"widgets": "组件",
"categories": "分类",
"category": {
"newName": "新分类名称",
"defaultName": "新建分类",
"created": {
"title": "分类已创建",
"message": "已创建分类\"{{name}}\""
}
},
"importFromDocker": "从 docker 导入"
}

View File

@@ -11,9 +11,9 @@
"actions": {
"avatar": {
"switchTheme": "切换主题",
"preferences": "用户选项",
"defaultBoard": "默认仪表盘",
"manage": "管理",
"preferences": "用户选项",
"defaultBoard": "默认面板",
"manage": "管理中心",
"logout": "注销 {{username}}",
"login": "登录"
}

View File

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

View File

@@ -5,7 +5,7 @@
"key": "快捷键",
"action": "操作",
"keybinds": "热键绑定",
"translators": "翻译 ({{count}})",
"translators": "翻译 ({{count}})",
"translatorsDescription": "感谢这些人Homarr 现已支持 {{languages}} 种语言!想要帮助将 Homarr 翻译成您的语言吗?请阅读<a>此处</a>了解如何执行此操作 。",
"contributors": "贡献者 ({{count}})",
"contributorsDescription": "这些人构建了让 homarr 工作的代码!想帮助建造 Homarr 吗?请阅读<a>此处</a>了解如何操作",
@@ -17,7 +17,7 @@
},
"metrics": {
"configurationSchemaVersion": "配置模式版本",
"version": "版本",
"version": "当前版本",
"nodeEnvironment": "节点环境",
"i18n": "I18n 翻译空间已加载",
"locales": "I18n 本地语言已配置",

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

@@ -15,6 +15,19 @@
"delete": {
"label": "永久删除",
"disabled": "删除功能被禁用,因为较旧的 Homarr 组件不允许删除默认配置。将来可能会删除。"
},
"duplicate": "复制",
"rename": {
"label": "重命名",
"modal": {
"title": "重命名面板 {{name}}",
"fields": {
"name": {
"label": "新名称",
"placeholder": "新面板名称"
}
}
}
}
},
"badges": {

View File

@@ -1,5 +1,5 @@
{
"metaTitle": "管理",
"metaTitle": "管理中心",
"hero": {
"title": "欢迎回来,{{username}}",
"fallbackUsername": "匿名",

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

@@ -1,13 +1,21 @@
{
"metaTitle": "用户",
"pageTitle": "管理用户",
"text": "通过账号您可以配置谁可以编辑您的面板。Homarr的未来版本将对权限和面板进行更精细地控制。",
"buttons": {
"create": "创建"
},
"filter": {
"roles": {
"all": "全部",
"normal": "普通",
"admin": "管理员",
"owner": "所有者"
}
},
"table": {
"header": {
"user": "用户"
"user": "用户",
"email": "邮箱"
}
},
"tooltips": {

View File

@@ -0,0 +1,55 @@
{
"metaTitle": "用户 {{username}}",
"back": "返回用户管理",
"sections": {
"general": {
"title": "通用",
"inputs": {
"username": {
"label": "用户名"
},
"eMail": {
"label": "邮箱"
}
}
},
"security": {
"title": "安全",
"inputs": {
"password": {
"label": "新密码"
},
"terminateExistingSessions": {
"label": "终止现有会话",
"description": "强制用户在其设备上重新登录"
},
"confirm": {
"label": "确认",
"description": "密码将被更新。该操作不可撤销。"
}
}
},
"roles": {
"title": "角色",
"currentRole": "当前角色: ",
"badges": {
"owner": "所有者",
"admin": "管理员",
"normal": "普通"
}
},
"deletion": {
"title": "删除账号",
"inputs": {
"confirmUsername": {
"label": "确认用户名",
"description": "输入用户名以确认删除"
},
"confirm": {
"label": "永久删除",
"description": "我知道此操作是永久性的,所有帐户数据都将丢失。"
}
}
}
}
}

View File

@@ -4,6 +4,13 @@
"description": "显示当前的日期和时间。",
"settings": {
"title": "日期和时间组件设置",
"timezone": {
"label": "时区",
"info": "选择您所在时区的名称,在此找到您所在的时区: "
},
"customTitle": {
"label": "城市名称或自定义标题"
},
"display24HourFormat": {
"label": "全时显示24 小时)"
},
@@ -13,19 +20,13 @@
"hide": "隐藏日期"
}
},
"enableTimezone": {
"label": "显示自定义时区"
},
"timezoneLocation": {
"label": "时区位置"
},
"titleState": {
"label": "城市名称",
"info": "如果激活时区选项,则可显示城市名称和时区代码。<br/>您可以显示城市,甚至不显示。",
"label": "时钟标题",
"info": "自定义标题和时区代码可以显示在 widget 上。<br/>您可以单独显示城市、不显示、<br/>,甚至在同时选择了城市和时区但未提供标题时单独显示时区。",
"data": {
"both": "城市和时区",
"city": "仅城市",
"none": ""
"both": "标题和时区",
"city": "仅标题",
"none": "不显示"
}
}
}

View File

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

View File

@@ -0,0 +1,141 @@
{
"descriptor": {
"name": "系统健康监测",
"description": "显示系统运行状况和状态的信息。",
"settings": {
"title": "系统健康监测设置",
"fahrenheit": {
"label": "CPU 温度(华氏度)"
},
"cpu": {
"label": "显示CPU信息",
"load": "平均负载",
"minute": "{{minute}} 分钟",
"minutes": "{{minutes}} 分钟"
},
"memory": {
"label": "显示内存信息"
},
"fileSystem": {
"label": "显示文件系统信息"
},
"node": {
"label": "按节点名称过滤",
"info": "输入您的 Proxmox 节点名称以仅显示该节点的指标。默认情况下,显示整个集群。"
},
"defaultViewState": {
"label": "默认打开的部分",
"data": {
"none": "不显示",
"node": "节点",
"vm": "虚拟机",
"lxc": "LXCs",
"storage": "存储"
}
},
"defaultTabState": {
"label": "默认打开选项卡",
"info": "默认打开选项卡。仅当多个集成可用时才使用。",
"data": {
"system": "系统",
"cluster": "集群"
}
},
"summary": {
"label": "显示摘要部分"
},
"showNode": {
"label": "显示节点部分"
},
"showVM": {
"label": "显示虚拟机部分"
},
"showLXCs": {
"label": "显示 LXC 部分"
},
"showStorage": {
"label": "显示存储部分"
},
"sectionIndicatorColor": {
"label": "要求部分状态指示器为“OK”",
"info": "全部 \"要求所有项目都在线,指标才会变为绿色。任意 \"要求至少有一个项目在线。",
"data": {
"any": "任意活动",
"all": "全部活动"
}
},
"ignoreCert": {
"label": "忽略证书错误",
"info": "如果启用,小工具在访问 Proxmox API 时将忽略证书错误。这在通过 HTTPS 访问 Proxmox 时很有帮助。"
}
}
},
"cpu": {
"label": "CPU",
"load": "平均负载",
"minute": "{{minute}} 分钟"
},
"memory": {
"label": "内存",
"totalMem": "内存总量: {{total}}GB",
"available": "可用: {{available}}GB - {{percentage}}%"
},
"fileSystem": {
"label": "文件系统",
"available": "可用: {{available}} - {{percentage}}%"
},
"info": {
"uptime": "运行时间",
"uptimeFormat": "{{days}} 天, {{hours}} 小时, {{minutes}} 分钟",
"updates": "可用更新",
"reboot": "重启"
},
"errors": {
"general": {
"title": "无法找到您的系统。",
"text": "连接到您的系统时出现问题。请验证您的配置/集成。"
}
},
"headings": {
"system": "系统",
"cluster": "集群"
},
"cluster": {
"summary": {
"cpu": "CPU",
"ram": "内存"
},
"accordion": {
"title": {
"nodes": "节点",
"vms": "虚拟机",
"lxcs": "LXCs",
"storage": "存储"
}
},
"table": {
"header": {
"name": "名称",
"cpu": "CPU",
"ram": "内存",
"node": "节点"
}
},
"popover": {
"node": "节点",
"vmid": "VMID",
"details": "详情",
"cores": "核心 - {{maxCpu}}",
"memSize": "内存 - {{maxMem}}",
"memRatio": "内存 - {{usedMem}} / {{maxMem}}",
"diskSize": "磁盘 - {{maxDisk}}",
"diskRatio": "磁盘 - {{usedDisk}} / {{maxDisk}}",
"uptime": "运行时间 - {{uptime}}",
"plugin": "插件",
"ha": "状态 - {{haState}}",
"sharedStorage": "共享存储",
"localStorage": "本地存储",
"na": "不可用"
}
}
}

View File

@@ -0,0 +1,22 @@
{
"descriptor": {
"name": "索引器管理状态",
"description": "有关索引器的状态",
"settings": {
"title": "索引器管理状态",
"openIndexerSiteInNewTab": {
"label": "在新选项卡中打开索引器站点"
}
}
},
"indexersStatus": {
"title": "索引器管理",
"testAllButton": "测试全部"
},
"errors": {
"general": {
"title": "无法找到索引管理器",
"text": "连接索引管理器时出现问题。请验证您的配置/集成。"
}
}
}

View File

@@ -16,7 +16,9 @@
"state": {
"approved": "已批准",
"pendingApproval": "待批准",
"declined": "已拒绝"
"declined": "已拒绝",
"available": "可用",
"partial": "部分"
},
"tooltips": {
"approve": "批准请求",

View File

@@ -0,0 +1,96 @@
{
"descriptor": {
"name": "媒体转码",
"description": "显示有关媒体转码的信息",
"settings": {
"title": "媒体转码设置",
"appId": {
"label": "选择一个应用"
},
"defaultView": {
"label": "默认视图",
"data": {
"workers": "工作种",
"queue": "队列",
"statistics": "统计"
}
},
"showHealthCheck": {
"label": "显示健康检查指示器"
},
"showHealthChecksInQueue": {
"label": "在队列中显示健康检查"
},
"queuePageSize": {
"label": "队列:每页项目数"
},
"showAppIcon": {
"label": "在右下角显示应用程序图标"
}
}
},
"noAppSelected": "请在小组件设置中选择一个应用程序",
"views": {
"workers": {
"table": {
"header": {
"name": "文件",
"eta": "剩余时间",
"progress": "进度"
},
"empty": "空",
"tooltip": {
"transcode": "转码",
"healthCheck": "健康检查"
}
}
},
"queue": {
"table": {
"header": {
"name": "文件",
"size": "大小"
},
"footer": {
"currentIndex": "{{start}}-{{end}} 共 {{total}}"
},
"empty": "空",
"tooltip": {
"transcode": "转码",
"healthCheck": "健康检查"
}
}
},
"statistics": {
"empty": "空",
"box": {
"transcodes": "转码: {{value}}",
"healthChecks": "健康检查: {{value}}",
"files": "文件: {{value}}",
"spaceSaved": "已保存: {{value}}"
},
"pies": {
"transcodes": "转码",
"healthChecks": "健康检查",
"videoCodecs": "编码",
"videoContainers": "容器",
"videoResolutions": "分辨率"
}
}
},
"error": {
"title": "错误",
"message": "从 Tdarr 获取数据时发生错误。"
},
"tabs": {
"workers": "工作种",
"queue": "队列",
"statistics": "统计"
},
"healthCheckStatus": {
"title": "健康检查",
"queued": "排队中",
"healthy": "健康",
"unhealthy": "不良"
}
}

View File

@@ -17,6 +17,15 @@
},
"textLinesClamp": {
"label": "文字线条"
},
"sortByPublishDateAscending": {
"label": "按发布日期排序(升序)"
},
"sortPostsWithoutPublishDateToTheTop": {
"label": "将没有发布日期的文章置顶"
},
"maximumAmountOfPosts": {
"label": "最大文章数量"
}
},
"card": {

View File

@@ -0,0 +1,34 @@
{
"entityNotFound": "未找到实体",
"descriptor": {
"name": "家庭助理实体",
"description": "家庭助理中实体的当前状态",
"settings": {
"title": "实体状态",
"entityId": {
"label": "实体 ID",
"info": "家庭助理中的唯一实体 ID。通过单击实体 > 单击齿轮图标 > 单击“实体 ID”处的复制按钮进行复制。某些自定义实体可能不受支持。"
},
"appendUnit": {
"label": "附加测量单位",
"info": "将测量单位属性附加到实体状态。"
},
"automationId": {
"label": "可选自动化 ID",
"info": "您唯一的自动化 ID。总是以 automation.XXXXX 开头。如果未设置,小部件将不可点击,只能显示状态。点击后,实体状态将被刷新。"
},
"displayName": {
"label": "显示名称"
},
"displayFriendlyName": {
"label": "显示友好名称",
"info": "显示来自家庭助理的友好名称,而不是显示名称."
},
"genericToggle": {
"label": "实体切换",
"info": "单击时对实体执行通用的家庭助理切换操作。"
}
}
}
}

View File

@@ -0,0 +1,16 @@
{
"descriptor": {
"name": "家庭助理自动化",
"description": "执行自动化",
"settings": {
"title": "执行自动化",
"automationId": {
"label": "自动化 ID",
"info": "您唯一的自动化 ID。总是以 automation.XXXXX 开头。"
},
"displayName": {
"label": "显示名称"
}
}
}
}

View File

@@ -29,6 +29,25 @@
"displayRatioWithFilter": {
"label": "显示过滤后的 torrents 列表比例",
"info": "如果禁用,则只显示全局比率。如果设置为 \"禁用\",全局比率仍将使用标签。"
},
"columnOrdering": {
"label": "启用重新排序列"
},
"rowSorting": {
"label": "启用行排序"
},
"columns": {
"label": "选择要显示的列",
"data": {
"date": "日期已添加",
"down": "下载",
"up": "上传",
"eta": "剩余时间",
"progress": "进度"
}
},
"nameColumnSize": {
"label": "更改名称列大小"
}
}
},
@@ -41,12 +60,22 @@
},
"table": {
"header": {
"isCompleted": "正在下载",
"name": "名称",
"dateAdded": "已添加到",
"size": "大小",
"download": "下载",
"upload": "上传",
"estimatedTimeOfArrival": "剩余时间",
"progress": "进度"
"progress": "进度",
"totalUploaded": "上传总量",
"totalDownloaded": "下载总量",
"ratio": "分享率",
"seeds": "种子数(已连接)",
"peers": "用户数(已连接)",
"label": "标签",
"state": "状态",
"stateMessage": "状态信息"
},
"item": {
"text": "由 {{appName}}, {{ratio}} 管理的比率"
@@ -74,10 +103,6 @@
"text": "无法与您的 Torrent 客户端通信。请检查您的配置"
}
},
"loading": {
"title": "加载中",
"description": "建立连接中"
},
"popover": {
"introductionPrefix": "管理方:",
"metrics": {

View File

@@ -10,6 +10,12 @@
"displayCityName": {
"label": "显示城市名称"
},
"displayWeekly": {
"label": "显示每周预测"
},
"forecastDays": {
"label": "显示天数"
},
"location": {
"label": "天气位置"
}

View File

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

View File

@@ -14,7 +14,11 @@
"buttons": {
"submit": "crwdns1876:0crwdne1876:0"
},
"afterLoginRedirection": "crwdns3347:0{{url}}crwdne3347:0"
"afterLoginRedirection": "crwdns3347:0{{url}}crwdne3347:0",
"providersEmpty": {
"title": "crwdns4236:0crwdne4236:0",
"message": "crwdns4238:0crwdne4238:0"
}
},
"alert": "crwdns3349:0crwdne3349:0"
}

View File

@@ -13,9 +13,11 @@
"previous": "crwdns3375:0crwdne3375:0",
"confirm": "crwdns3377:0crwdne3377:0",
"enabled": "crwdns2883:0crwdne2883:0",
"duplicate": "crwdns4174:0crwdne4174:0",
"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",
@@ -51,5 +53,7 @@
"attributes": {
"width": "crwdns3910:0crwdne3910:0",
"height": "crwdns3912:0crwdne3912:0"
}
},
"public": "crwdns4034:0crwdne4034:0",
"restricted": "crwdns4036:0crwdne4036:0"
}

View File

@@ -1,25 +1,26 @@
{
"modal": {
"title": "crwdns1989:0crwdne1989:0",
"text": "crwdns2293:0crwdne2293:0"
},
"widgetDescription": "crwdns2295:0crwdne2295:0",
"goBack": "crwdns1995:0crwdne1995:0",
"actionIcon": {
"tooltip": "crwdns1997:0crwdne1997:0"
},
"apps": "crwdns3231:0crwdne3231:0",
"app": {
"defaultName": "crwdns3233:0crwdne3233:0"
},
"widgets": "crwdns3235:0crwdne3235:0",
"categories": "crwdns3237:0crwdne3237:0",
"category": {
"newName": "crwdns3239:0crwdne3239:0",
"defaultName": "crwdns3241:0crwdne3241:0",
"created": {
"title": "crwdns3243:0crwdne3243:0",
"message": "crwdns3245:0{{name}}crwdne3245:0"
}
"modal": {
"title": "crwdns1989:0crwdne1989:0",
"text": "crwdns2293:0crwdne2293:0"
},
"widgetDescription": "crwdns2295:0crwdne2295:0",
"goBack": "crwdns1995:0crwdne1995:0",
"actionIcon": {
"tooltip": "crwdns1997:0crwdne1997:0"
},
"apps": "crwdns3231:0crwdne3231:0",
"app": {
"defaultName": "crwdns3233:0crwdne3233:0"
},
"widgets": "crwdns3235:0crwdne3235:0",
"categories": "crwdns3237:0crwdne3237:0",
"category": {
"newName": "crwdns3239:0crwdne3239:0",
"defaultName": "crwdns3241:0crwdne3241:0",
"created": {
"title": "crwdns3243:0crwdne3243:0",
"message": "crwdns3245:0{{name}}crwdne3245:0"
}
},
"importFromDocker": "crwdns4138:0crwdne4138:0"
}

View File

@@ -25,7 +25,9 @@
"tools": {
"title": "crwdns3525:0crwdne3525:0",
"items": {
"docker": "crwdns3527:0crwdne3527:0"
"docker": "crwdns3527:0crwdne3527: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

@@ -15,6 +15,19 @@
"delete": {
"label": "crwdns3543:0crwdne3543:0",
"disabled": "crwdns3545:0crwdne3545:0"
},
"duplicate": "crwdns4162:0crwdne4162:0",
"rename": {
"label": "crwdns4164:0crwdne4164:0",
"modal": {
"title": "crwdns4166:0{{name}}crwdne4166:0",
"fields": {
"name": {
"label": "crwdns4168:0crwdne4168:0",
"placeholder": "crwdns4170:0crwdne4170:0"
}
}
}
}
},
"badges": {

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

@@ -1,13 +1,21 @@
{
"metaTitle": "crwdns3789:0crwdne3789:0",
"pageTitle": "crwdns3791:0crwdne3791:0",
"text": "crwdns3793:0crwdne3793:0",
"buttons": {
"create": "crwdns3795:0crwdne3795:0"
},
"filter": {
"roles": {
"all": "crwdns4114:0crwdne4114:0",
"normal": "crwdns4116:0crwdne4116:0",
"admin": "crwdns4118:0crwdne4118:0",
"owner": "crwdns4120:0crwdne4120:0"
}
},
"table": {
"header": {
"user": "crwdns3797:0crwdne3797:0"
"user": "crwdns3797:0crwdne3797:0",
"email": "crwdns4122:0crwdne4122:0"
}
},
"tooltips": {

View File

@@ -0,0 +1,55 @@
{
"metaTitle": "crwdns4072:0{{username}}crwdne4072:0",
"back": "crwdns4074:0crwdne4074:0",
"sections": {
"general": {
"title": "crwdns4076:0crwdne4076:0",
"inputs": {
"username": {
"label": "crwdns4078:0crwdne4078:0"
},
"eMail": {
"label": "crwdns4080:0crwdne4080:0"
}
}
},
"security": {
"title": "crwdns4082:0crwdne4082:0",
"inputs": {
"password": {
"label": "crwdns4084:0crwdne4084:0"
},
"terminateExistingSessions": {
"label": "crwdns4086:0crwdne4086:0",
"description": "crwdns4088:0crwdne4088:0"
},
"confirm": {
"label": "crwdns4090:0crwdne4090:0",
"description": "crwdns4092:0crwdne4092:0"
}
}
},
"roles": {
"title": "crwdns4094:0crwdne4094:0",
"currentRole": "crwdns4096:0crwdne4096:0",
"badges": {
"owner": "crwdns4098:0crwdne4098:0",
"admin": "crwdns4100:0crwdne4100:0",
"normal": "crwdns4102:0crwdne4102:0"
}
},
"deletion": {
"title": "crwdns4104:0crwdne4104:0",
"inputs": {
"confirmUsername": {
"label": "crwdns4106:0crwdne4106:0",
"description": "crwdns4108:0crwdne4108:0"
},
"confirm": {
"label": "crwdns4110:0crwdne4110:0",
"description": "crwdns4112:0crwdne4112:0"
}
}
}
}
}

View File

@@ -4,6 +4,13 @@
"description": "crwdns2341:0crwdne2341:0",
"settings": {
"title": "crwdns2343:0crwdne2343:0",
"timezone": {
"label": "crwdns4124:0crwdne4124:0",
"info": "crwdns4126:0crwdne4126:0"
},
"customTitle": {
"label": "crwdns4128:0crwdne4128:0"
},
"display24HourFormat": {
"label": "crwdns1430:0crwdne1430:0"
},
@@ -13,18 +20,12 @@
"hide": "crwdns3057:0crwdne3057:0"
}
},
"enableTimezone": {
"label": "crwdns3059:0crwdne3059:0"
},
"timezoneLocation": {
"label": "crwdns3061:0crwdne3061:0"
},
"titleState": {
"label": "crwdns3063:0crwdne3063:0",
"info": "crwdns3065:0crwdne3065:0",
"label": "crwdns4130:0crwdne4130:0",
"info": "crwdns4132:0crwdne4132:0",
"data": {
"both": "crwdns3067:0crwdne3067:0",
"city": "crwdns3069:0crwdne3069:0",
"both": "crwdns4134:0crwdne4134:0",
"city": "crwdns4136:0crwdne4136:0",
"none": "crwdns3071:0crwdne3071: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

@@ -0,0 +1,141 @@
{
"descriptor": {
"name": "crwdns4202:0crwdne4202:0",
"description": "crwdns4246:0crwdne4246:0",
"settings": {
"title": "crwdns4248:0crwdne4248:0",
"fahrenheit": {
"label": "crwdns4250:0crwdne4250:0"
},
"cpu": {
"label": "crwdns4252:0crwdne4252:0",
"load": "crwdns4254:0crwdne4254:0",
"minute": "crwdns4256:0{{minute}}crwdne4256:0",
"minutes": "crwdns4258:0{{minutes}}crwdne4258:0"
},
"memory": {
"label": "crwdns4260:0crwdne4260:0"
},
"fileSystem": {
"label": "crwdns4262:0crwdne4262:0"
},
"node": {
"label": "crwdns4264:0crwdne4264:0",
"info": "crwdns4266:0crwdne4266:0"
},
"defaultViewState": {
"label": "crwdns4268:0crwdne4268:0",
"data": {
"none": "crwdns4270:0crwdne4270:0",
"node": "crwdns4272:0crwdne4272:0",
"vm": "crwdns4274:0crwdne4274:0",
"lxc": "crwdns4276:0crwdne4276:0",
"storage": "crwdns4278:0crwdne4278:0"
}
},
"defaultTabState": {
"label": "crwdns4280:0crwdne4280:0",
"info": "crwdns4282:0crwdne4282:0",
"data": {
"system": "crwdns4284:0crwdne4284:0",
"cluster": "crwdns4286:0crwdne4286:0"
}
},
"summary": {
"label": "crwdns4288:0crwdne4288:0"
},
"showNode": {
"label": "crwdns4290:0crwdne4290:0"
},
"showVM": {
"label": "crwdns4292:0crwdne4292:0"
},
"showLXCs": {
"label": "crwdns4294:0crwdne4294:0"
},
"showStorage": {
"label": "crwdns4296:0crwdne4296:0"
},
"sectionIndicatorColor": {
"label": "crwdns4298:0crwdne4298:0",
"info": "crwdns4300:0crwdne4300:0",
"data": {
"any": "crwdns4302:0crwdne4302:0",
"all": "crwdns4304:0crwdne4304:0"
}
},
"ignoreCert": {
"label": "crwdns4306:0crwdne4306:0",
"info": "crwdns4308:0crwdne4308:0"
}
}
},
"cpu": {
"label": "crwdns4210:0crwdne4210:0",
"load": "crwdns4212:0crwdne4212:0",
"minute": "crwdns4214:0{{minute}}crwdne4214:0"
},
"memory": {
"label": "crwdns4216:0crwdne4216:0",
"totalMem": "crwdns4218:0{{total}}crwdne4218:0",
"available": "crwdns4220:0{{available}}crwdnd4220:0{{percentage}}crwdne4220:0"
},
"fileSystem": {
"label": "crwdns4222:0crwdne4222:0",
"available": "crwdns4224:0{{available}}crwdnd4224:0{{percentage}}crwdne4224:0"
},
"info": {
"uptime": "crwdns4226:0crwdne4226:0",
"uptimeFormat": "crwdns4498:0{{days}}crwdnd4498:0{{hours}}crwdnd4498:0{{minutes}}crwdne4498:0",
"updates": "crwdns4312:0crwdne4312:0",
"reboot": "crwdns4230:0crwdne4230:0"
},
"errors": {
"general": {
"title": "crwdns4314:0crwdne4314:0",
"text": "crwdns4316:0crwdne4316:0"
}
},
"headings": {
"system": "crwdns4318:0crwdne4318:0",
"cluster": "crwdns4320:0crwdne4320:0"
},
"cluster": {
"summary": {
"cpu": "crwdns4322:0crwdne4322:0",
"ram": "crwdns4324:0crwdne4324:0"
},
"accordion": {
"title": {
"nodes": "crwdns4326:0crwdne4326:0",
"vms": "crwdns4328:0crwdne4328:0",
"lxcs": "crwdns4330:0crwdne4330:0",
"storage": "crwdns4332:0crwdne4332:0"
}
},
"table": {
"header": {
"name": "crwdns4334:0crwdne4334:0",
"cpu": "crwdns4336:0crwdne4336:0",
"ram": "crwdns4338:0crwdne4338:0",
"node": "crwdns4340:0crwdne4340:0"
}
},
"popover": {
"node": "crwdns4342:0crwdne4342:0",
"vmid": "crwdns4344:0crwdne4344:0",
"details": "crwdns4346:0crwdne4346:0",
"cores": "crwdns4348:0{{maxCpu}}crwdne4348:0",
"memSize": "crwdns4350:0{{maxMem}}crwdne4350:0",
"memRatio": "crwdns4352:0{{usedMem}}crwdnd4352:0{{maxMem}}crwdne4352:0",
"diskSize": "crwdns4354:0{{maxDisk}}crwdne4354:0",
"diskRatio": "crwdns4356:0{{usedDisk}}crwdnd4356:0{{maxDisk}}crwdne4356:0",
"uptime": "crwdns4358:0{{uptime}}crwdne4358:0",
"plugin": "crwdns4360:0crwdne4360:0",
"ha": "crwdns4362:0{{haState}}crwdne4362:0",
"sharedStorage": "crwdns4364:0crwdne4364:0",
"localStorage": "crwdns4366:0crwdne4366:0",
"na": "crwdns4368:0crwdne4368:0"
}
}
}

View File

@@ -0,0 +1,22 @@
{
"descriptor": {
"name": "crwdns4188:0crwdne4188:0",
"description": "crwdns4190:0crwdne4190:0",
"settings": {
"title": "crwdns4192:0crwdne4192:0",
"openIndexerSiteInNewTab": {
"label": "crwdns4496:0crwdne4496:0"
}
}
},
"indexersStatus": {
"title": "crwdns4194:0crwdne4194:0",
"testAllButton": "crwdns4196:0crwdne4196:0"
},
"errors": {
"general": {
"title": "crwdns4198:0crwdne4198:0",
"text": "crwdns4200:0crwdne4200:0"
}
}
}

View File

@@ -16,7 +16,9 @@
"state": {
"approved": "crwdns2765:0crwdne2765:0",
"pendingApproval": "crwdns2767:0crwdne2767:0",
"declined": "crwdns2769:0crwdne2769:0"
"declined": "crwdns2769:0crwdne2769:0",
"available": "crwdns4140:0crwdne4140:0",
"partial": "crwdns4142:0crwdne4142:0"
},
"tooltips": {
"approve": "crwdns2893:0crwdne2893:0",

View File

@@ -0,0 +1,96 @@
{
"descriptor": {
"name": "crwdns4382:0crwdne4382:0",
"description": "crwdns4384:0crwdne4384:0",
"settings": {
"title": "crwdns4386:0crwdne4386:0",
"appId": {
"label": "crwdns4388:0crwdne4388:0"
},
"defaultView": {
"label": "crwdns4390:0crwdne4390:0",
"data": {
"workers": "crwdns4392:0crwdne4392:0",
"queue": "crwdns4394:0crwdne4394:0",
"statistics": "crwdns4396:0crwdne4396:0"
}
},
"showHealthCheck": {
"label": "crwdns4398:0crwdne4398:0"
},
"showHealthChecksInQueue": {
"label": "crwdns4400:0crwdne4400:0"
},
"queuePageSize": {
"label": "crwdns4402:0crwdne4402:0"
},
"showAppIcon": {
"label": "crwdns4404:0crwdne4404:0"
}
}
},
"noAppSelected": "crwdns4406:0crwdne4406:0",
"views": {
"workers": {
"table": {
"header": {
"name": "crwdns4408:0crwdne4408:0",
"eta": "crwdns4410:0crwdne4410:0",
"progress": "crwdns4412:0crwdne4412:0"
},
"empty": "crwdns4414:0crwdne4414:0",
"tooltip": {
"transcode": "crwdns4416:0crwdne4416:0",
"healthCheck": "crwdns4418:0crwdne4418:0"
}
}
},
"queue": {
"table": {
"header": {
"name": "crwdns4420:0crwdne4420:0",
"size": "crwdns4422:0crwdne4422:0"
},
"footer": {
"currentIndex": "crwdns4424:0{{start}}crwdnd4424:0{{end}}crwdnd4424:0{{total}}crwdne4424:0"
},
"empty": "crwdns4426:0crwdne4426:0",
"tooltip": {
"transcode": "crwdns4428:0crwdne4428:0",
"healthCheck": "crwdns4430:0crwdne4430:0"
}
}
},
"statistics": {
"empty": "crwdns4432:0crwdne4432:0",
"box": {
"transcodes": "crwdns4434:0{{value}}crwdne4434:0",
"healthChecks": "crwdns4436:0{{value}}crwdne4436:0",
"files": "crwdns4438:0{{value}}crwdne4438:0",
"spaceSaved": "crwdns4440:0{{value}}crwdne4440:0"
},
"pies": {
"transcodes": "crwdns4442:0crwdne4442:0",
"healthChecks": "crwdns4444:0crwdne4444:0",
"videoCodecs": "crwdns4446:0crwdne4446:0",
"videoContainers": "crwdns4448:0crwdne4448:0",
"videoResolutions": "crwdns4450:0crwdne4450:0"
}
}
},
"error": {
"title": "crwdns4452:0crwdne4452:0",
"message": "crwdns4454:0crwdne4454:0"
},
"tabs": {
"workers": "crwdns4456:0crwdne4456:0",
"queue": "crwdns4458:0crwdne4458:0",
"statistics": "crwdns4460:0crwdne4460:0"
},
"healthCheckStatus": {
"title": "crwdns4462:0crwdne4462:0",
"queued": "crwdns4464:0crwdne4464:0",
"healthy": "crwdns4466:0crwdne4466:0",
"unhealthy": "crwdns4468:0crwdne4468:0"
}
}

View File

@@ -17,6 +17,15 @@
},
"textLinesClamp": {
"label": "crwdns2933:0crwdne2933:0"
},
"sortByPublishDateAscending": {
"label": "crwdns4160:0crwdne4160:0"
},
"sortPostsWithoutPublishDateToTheTop": {
"label": "crwdns4176:0crwdne4176:0"
},
"maximumAmountOfPosts": {
"label": "crwdns4178:0crwdne4178:0"
}
},
"card": {

View File

@@ -0,0 +1,34 @@
{
"entityNotFound": "crwdns4038:0crwdne4038:0",
"descriptor": {
"name": "crwdns4040:0crwdne4040:0",
"description": "crwdns4042:0crwdne4042:0",
"settings": {
"title": "crwdns4044:0crwdne4044:0",
"entityId": {
"label": "crwdns4046:0crwdne4046:0",
"info": "crwdns4048:0crwdne4048:0"
},
"appendUnit": {
"label": "crwdns4180:0crwdne4180:0",
"info": "crwdns4182:0crwdne4182:0"
},
"automationId": {
"label": "crwdns4156:0crwdne4156:0",
"info": "crwdns4158:0crwdne4158:0"
},
"displayName": {
"label": "crwdns4050:0crwdne4050:0"
},
"displayFriendlyName": {
"label": "crwdns4184:0crwdne4184:0",
"info": "crwdns4476:0crwdne4476:0"
},
"genericToggle": {
"label": "crwdns4478:0crwdne4478:0",
"info": "crwdns4480:0crwdne4480:0"
}
}
}
}

View File

@@ -0,0 +1,16 @@
{
"descriptor": {
"name": "crwdns4144:0crwdne4144:0",
"description": "crwdns4146:0crwdne4146:0",
"settings": {
"title": "crwdns4148:0crwdne4148:0",
"automationId": {
"label": "crwdns4150:0crwdne4150:0",
"info": "crwdns4152:0crwdne4152:0"
},
"displayName": {
"label": "crwdns4154:0crwdne4154:0"
}
}
}
}

View File

@@ -29,6 +29,25 @@
"displayRatioWithFilter": {
"label": "crwdns4000:0crwdne4000:0",
"info": "crwdns4002:0crwdne4002:0"
},
"columnOrdering": {
"label": "crwdns4470:0crwdne4470:0"
},
"rowSorting": {
"label": "crwdns4472:0crwdne4472:0"
},
"columns": {
"label": "crwdns4370:0crwdne4370:0",
"data": {
"date": "crwdns4474:0crwdne4474:0",
"down": "crwdns4372:0crwdne4372:0",
"up": "crwdns4374:0crwdne4374:0",
"eta": "crwdns4376:0crwdne4376:0",
"progress": "crwdns4378:0crwdne4378:0"
}
},
"nameColumnSize": {
"label": "crwdns4380:0crwdne4380:0"
}
}
},
@@ -41,12 +60,22 @@
},
"table": {
"header": {
"isCompleted": "crwdns4052:0crwdne4052:0",
"name": "crwdns2225:0crwdne2225:0",
"dateAdded": "crwdns4054:0crwdne4054:0",
"size": "crwdns2227:0crwdne2227:0",
"download": "crwdns2229:0crwdne2229:0",
"upload": "crwdns2231:0crwdne2231:0",
"estimatedTimeOfArrival": "crwdns2233:0crwdne2233:0",
"progress": "crwdns2235:0crwdne2235:0"
"progress": "crwdns2235:0crwdne2235:0",
"totalUploaded": "crwdns4056:0crwdne4056:0",
"totalDownloaded": "crwdns4058:0crwdne4058:0",
"ratio": "crwdns4060:0crwdne4060:0",
"seeds": "crwdns4062:0crwdne4062:0",
"peers": "crwdns4064:0crwdne4064:0",
"label": "crwdns4066:0crwdne4066:0",
"state": "crwdns4068:0crwdne4068:0",
"stateMessage": "crwdns4070:0crwdne4070:0"
},
"item": {
"text": "crwdns2461:0{{appName}}crwdnd2461:0{{ratio}}crwdne2461:0"
@@ -74,10 +103,6 @@
"text": "crwdns3193:0crwdne3193:0"
}
},
"loading": {
"title": "crwdns3195:0crwdne3195:0",
"description": "crwdns3197:0crwdne3197:0"
},
"popover": {
"introductionPrefix": "crwdns2463:0crwdne2463:0",
"metrics": {

View File

@@ -10,6 +10,12 @@
"displayCityName": {
"label": "crwdns3047:0crwdne3047:0"
},
"displayWeekly": {
"label": "crwdns4240:0crwdne4240:0"
},
"forecastDays": {
"label": "crwdns4242:0crwdne4242:0"
},
"location": {
"label": "crwdns1568:0crwdne1568:0"
}

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

@@ -1,35 +1,35 @@
{
"metaTitle": "",
"title": "",
"text": "",
"metaTitle": "Vytvořit účet",
"title": "Vytvořit účet",
"text": "Prosím uveďte níže své přihlašovací údaje",
"form": {
"fields": {
"username": {
"label": ""
"label": "Uživatelské jméno"
},
"password": {
"label": ""
"label": "Heslo"
},
"passwordConfirmation": {
"label": ""
"label": "Potvrďte heslo"
}
},
"buttons": {
"submit": ""
"submit": "Vytvořit účet"
}
},
"notifications": {
"loading": {
"title": "",
"text": ""
"title": "Vytváření účtu",
"text": "Čekejte prosím"
},
"success": {
"title": "",
"text": ""
"title": "Účet byl vytvořen",
"text": "Váš účet byl úspěšně vytvořen"
},
"error": {
"title": "",
"text": ""
"title": "Chyba",
"text": "Něco se nepodařilo, objevila se následující chyba: {{error}}"
}
}
}

View File

@@ -1,20 +1,24 @@
{
"metaTitle": "",
"title": "",
"text": "",
"metaTitle": "Přihlásit se",
"title": "Vítejte zpět!",
"text": "Zadejte prosím Vaše přihlašovací údaje",
"form": {
"fields": {
"username": {
"label": ""
"label": "Uživatelské jméno"
},
"password": {
"label": ""
"label": "Heslo"
}
},
"buttons": {
"submit": ""
"submit": "Přihlásit se"
},
"afterLoginRedirection": ""
"afterLoginRedirection": "Po přihlášení budete přesměrováni na {{url}}",
"providersEmpty": {
"title": "Chyba poskytovatele ověření",
"message": "Poskytovatel(é) není/nejsou nastaven/i, další informace naleznete ve Vašich protokolech."
}
},
"alert": ""
"alert": "Vaše přihlašovací údaje jsou nesprávné nebo tento účet neexistuje. Zkuste to prosím znovu."
}

View File

@@ -1,5 +1,5 @@
{
"header": {
"customize": ""
"customize": "Přizpůsobit plochu"
}
}

View File

@@ -1,6 +1,6 @@
{
"metaTitle": "Přizpůsobení {{name}} plochy",
"pageTitle": "Přizpůsobení {{name}} plochy",
"pageTitle": "Přizpůsobení plochy {{name}}",
"backToBoard": "Zpět na plochu",
"settings": {
"appearance": {
@@ -9,21 +9,21 @@
}
},
"save": {
"button": "",
"note": ""
"button": "Uložit změny",
"note": "Pozor, máte neuložené změny!"
},
"notifications": {
"pending": {
"title": "",
"message": ""
"title": "Ukládání přizpůsobení",
"message": "Počkejte prosím, než vaše přizpůsobení uložíme"
},
"success": {
"title": "",
"message": ""
"title": "Přizpůsobení uloženo",
"message": "Vaše přizpůsobení bylo úspěšně uloženo"
},
"error": {
"title": "",
"message": ""
"title": "Chyba",
"message": "Nelze uložit změny"
}
}
}

View File

@@ -1,55 +1,59 @@
{
"save": "Uložit",
"apply": "",
"insert": "",
"about": "",
"cancel": "",
"close": "",
"back": "",
"delete": "",
"ok": "",
"edit": "",
"next": "",
"previous": "",
"confirm": "",
"enabled": "",
"disabled": "",
"enableAll": "",
"disableAll": "",
"version": "",
"apply": "Použít",
"insert": "Vložit",
"about": "O aplikaci",
"cancel": "Zrušit",
"close": "Zavřít",
"back": "Zpět",
"delete": "Odstranit",
"ok": "OK",
"edit": "Upravit",
"next": "Další",
"previous": "Zpět",
"confirm": "Potvrdit",
"enabled": "Zapnuto",
"duplicate": "Duplikovat",
"disabled": "Vypnuto",
"enableAll": "Aktivovat vše",
"disableAll": "Zakázat vše",
"setTimer": "Nastavit časovat",
"version": "Verze",
"changePosition": "Změnit pozici",
"remove": "",
"removeConfirm": "",
"createItem": "",
"remove": "Odstranit",
"removeConfirm": "Jste si jisti, že chcete odstranit {{item}}?",
"createItem": "+ vytvořit {{item}}",
"sections": {
"settings": "",
"settings": "Nastavení",
"dangerZone": "Nebezpečná zóna"
},
"secrets": {
"apiKey": "",
"username": "",
"password": ""
"apiKey": "API klíč",
"username": "Uživatelské jméno",
"password": "Heslo"
},
"tip": "",
"tip": "Tip: ",
"time": {
"seconds": "",
"minutes": "",
"hours": ""
"seconds": "vteřiny",
"minutes": "minuty",
"hours": "hodiny"
},
"loading": "",
"loading": "Načítám...",
"breakPoints": {
"small": "malý",
"medium": "střední",
"large": "velký"
},
"seeMore": "",
"seeMore": "Zobrazit více...",
"position": {
"left": "",
"center": "",
"right": ""
"left": "Vlevo",
"center": "Střed",
"right": "Vpravo"
},
"attributes": {
"width": "",
"height": ""
}
"width": "Šířka",
"height": "Výška"
},
"public": "Veřejné",
"restricted": "Omezené"
}

View File

@@ -1,25 +1,25 @@
{
"modals": {
"blockedPopups": {
"title": "",
"text": "",
"title": "Vyskakovací okna jsou zablokována",
"text": "Váš prohlížeč zablokoval Homarr přístup k jeho API. Nejčastěji je to způsobeno blokátory reklam nebo odepřenými oprávněními. Homarr nemůže automaticky žádat o oprávnění.",
"list": {
"browserPermission": "",
"adBlockers": "",
"otherBrowser": ""
"browserPermission": "Klikněte na ikonu nastavení webu vedle adresy URL a zkontrolujte oprávnění. Povolte vyskakovací okna a přesměrování",
"adBlockers": "Zakažte v prohlížeči blokátory reklam a bezpečnostní nástroje",
"otherBrowser": "Zkuste jiný webový prohlížeč"
}
}
},
"actions": {
"category": {
"openAllInNewTab": ""
"openAllInNewTab": "Otevřít na nové kartě"
}
},
"menu": {
"moveUp": "",
"moveDown": "",
"addCategory": "",
"addAbove": "",
"addBelow": ""
"moveUp": "Posunout nahoru",
"moveDown": "Posunout dolů",
"addCategory": "Přidat kategorii {{location}}",
"addAbove": "nad",
"addBelow": "pod"
}
}

View File

@@ -1,25 +1,26 @@
{
"modal": {
"title": "Přidat novou dlaždici",
"text": "Dlaždice jsou hlavním prvkem Homarru. Slouží k zobrazení Vašich aplikací a dalších informací. Můžete přidat libovolný počet dlaždic."
},
"widgetDescription": "",
"goBack": "",
"actionIcon": {
"tooltip": ""
},
"apps": "Aplikace",
"app": {
"defaultName": ""
},
"widgets": "Widgety",
"categories": "Kategorie",
"category": {
"newName": "",
"defaultName": "",
"created": {
"title": "",
"message": ""
}
"modal": {
"title": "Přidat novou dlaždici",
"text": "Dlaždice jsou hlavním prvkem Homarru. Slouží k zobrazení Vašich aplikací a dalších informací. Můžete přidat libovolný počet dlaždic."
},
"widgetDescription": "Widgety komunikují s vašimi aplikacemi, aby nad nimi poskytovaly větší kontrolu. Před použitím obvykle vyžadují další konfiguraci.",
"goBack": "Přejít zpět na předchozí stránku",
"actionIcon": {
"tooltip": "Přidat dlaždici"
},
"apps": "Aplikace",
"app": {
"defaultName": "Vaše aplikace"
},
"widgets": "Widgety",
"categories": "Kategorie",
"category": {
"newName": "Název nové kategorie",
"defaultName": "Nová kategorie",
"created": {
"title": "Kategorie vytvořena",
"message": "Kategorie \"{{name}}\" byla vytvořena"
}
},
"importFromDocker": "Importovat z dockeru"
}

View File

@@ -1 +1,5 @@
{}
{
"title": "Přístup odepřen",
"text": "Nemáte dostatečná oprávnění pro přístup k této stránce. Pokud se domníváte, že se jedná o chybu, kontaktujte, prosím, svého správce.",
"switchAccount": "Přepněte na jiný účet"
}

View File

@@ -1 +1,5 @@
{}
{
"title": "Stránka nenalezena",
"text": "Tato stránka nebyla nalezena. Platnost adresy URL této stránky možná vypršela, adresa URL je neplatná nebo nemáte požadovaná oprávnění pro přístup k této stránce.",
"button": "Přejít domů"
}

View File

@@ -2,10 +2,10 @@
"search": {
"label": "Vyhledat",
"engines": {
"web": "",
"youtube": "",
"torrent": "",
"movie": ""
"web": "Hledat {{query}} na internetu",
"youtube": "Hledat {{query}} na YouTube",
"torrent": "Hledat {{query}} torrenty",
"movie": "Hledat {{query}} na {{app}}"
}
},
"actions": {
@@ -14,14 +14,14 @@
"preferences": "Uživatelská nastavení",
"defaultBoard": "Výchozí plocha",
"manage": "Spravovat",
"logout": "Odhlásit {{username}}",
"login": ""
"logout": "Odhlásit uživatele {{username}}",
"login": "Přihlásit se"
}
},
"modals": {
"movie": {
"title": "",
"topResults": ""
"topResults": "{{count}} výsledků pro <b>{{search}}</b>."
}
}
}

View File

@@ -1,12 +1,12 @@
{
"description": "",
"description": "V režimu úprav můžete upravovat dlaždice a konfigurovat aplikace. Změny se uloží až po opuštění režimu úprav.",
"button": {
"disabled": "",
"enabled": ""
"disabled": "Vstoupit do režimu úprav",
"enabled": "Ukončit a uložit"
},
"popover": {
"title": "Režim úprav je povolen pro velikost <1>{{size}}</1>",
"text": "Nyní můžete upravovat a configurovat Vaše aplikace. Změny <strong>nejsou uloženy</strong> dokud neopustíte režim úprav"
"text": "Nyní můžete upravovat a konfigurovat Vaše aplikace. Změny <strong>nejsou uloženy</strong> dokud neopustíte režim úprav"
},
"unloadEvent": ""
"unloadEvent": "Ukončete režim úprav pro uložení změn"
}

View File

@@ -16,7 +16,7 @@
"help": {
"title": "Nápověda",
"items": {
"documentation": "",
"documentation": "Dokumentace",
"report": "Nahlášení problému/chyby",
"discord": "Komunitní Discord",
"contribute": "Zapojte se"
@@ -25,11 +25,13 @@
"tools": {
"title": "Nástroje",
"items": {
"docker": ""
"docker": "Docker",
"api": "API",
"migrate": "Přechod na verzi 1.0"
}
},
"about": {
"title": ""
"title": "O aplikaci"
}
}
}

View File

@@ -1 +1,3 @@
{}
{
"title": "{{position}} postranní panel"
}

View File

@@ -1,30 +1,30 @@
{
"description": "",
"addToDashboard": "",
"tip": "",
"key": "",
"action": "",
"keybinds": "",
"translators": "",
"translatorsDescription": "",
"contributors": "",
"contributorsDescription": "",
"description": "Homarr je <strong>elegantní</strong>, <strong>moderní</strong> plocha, která vám poskytne všechny aplikace a služby na dosah ruky. S aplikací Homarr máte přístup ke všemu na jednom místě a můžete vše pohodlně ovládat. Homarr se hladce integruje s aplikacemi, které jste si přidali, poskytuje Vám cenné informace a dává Vám plnou kontrolu. Instalace je snadná a Homarr podporuje širokou škálu metod nasazení.",
"addToDashboard": "Přidat na plochu",
"tip": "Mod odkazuje na Vaši modifikační klávesu, je to Ctrl a klávesa Command/Super/Windows",
"key": "Klávesová zkratka",
"action": "Akce",
"keybinds": "Klávesové zkratky",
"translators": "Překladatelé ({{count}})",
"translatorsDescription": "Díky těmto lidem je Homarr dostupný v {{languages}} jazycích! Chcete pomoci přeložit Homarr do svého jazyka? Přečtěte si, jak na to, <a>zde</a>.",
"contributors": "Přispěvatelé ({{count}})",
"contributorsDescription": "Tito lidé vytvořili kód, díky kterému funguje homarr! Chcete pomoci vybudovat Homarr? Přečtěte si, jak na to, <a>zde</a>",
"actions": {
"toggleTheme": "",
"focusSearchBar": "",
"openDocker": "",
"toggleEdit": ""
"toggleTheme": "Přepne světlý/tmavý motiv",
"focusSearchBar": "Zaměří na vyhledávací panel",
"openDocker": "Otevře Docker widget",
"toggleEdit": "Přepne režim úprav"
},
"metrics": {
"configurationSchemaVersion": "",
"version": "",
"nodeEnvironment": "",
"i18n": "",
"locales": "",
"experimental_disableEditMode": ""
"configurationSchemaVersion": "Verze konfiguračního schématu",
"version": "Verze",
"nodeEnvironment": "Prostředí uzlu",
"i18n": "Načteny jmenné prostory překladu I18n",
"locales": "Nakonfigurováno I18n jazyků",
"experimental_disableEditMode": "<b>EXPERIMENTÁLNÍ</b>: Zakázat režim úprav"
},
"version": {
"new": "",
"dropdown": ""
"new": "Nová verze: {{newVersion}}",
"dropdown": "Verze {{newVersion}} je nyní dostupná! Vaše aktuální verze je {{currentVersion}}"
}
}

View File

@@ -2,36 +2,37 @@
"tabs": {
"general": "Obecné",
"behaviour": "Chování",
"network": "",
"network": "Síť",
"appearance": "Vzhled",
"integration": "Integrace"
},
"general": {
"appname": {
"label": "Název aplikace",
"description": ""
"description": "Zobrazuje se s aplikací na ploše."
},
"internalAddress": {
"label": "",
"description": "",
"label": "Interní adresa",
"description": "Interní IP adresa aplikace.",
"troubleshoot": {
"label": "Narazili jste na problém?",
"header": "",
"header": "Zde je seznam nejčastějších chyb a jejich řešení:",
"lines": {
"nothingAfterPort": "",
"protocolCheck": "",
"preferIP": "",
"enablePings": "",
"wget": "",
"iframe": "",
"clearCache": ""
"nothingAfterPort": "Ve většině případů, ne-li ve všech, byste za port neměli zadávat žádnou cestu. (Dokonce ani '/admin' pro pihole nebo '/web' pro plex)",
"protocolCheck": "Vždy se ujistěte, že na začátku URL je http nebo https a také se ujistěte, že používáte správnou předponu.",
"preferIP": "Doporučuje se používat přímo Ip adresu stroje nebo kontejneru, se kterým se snažíte komunikovat.",
"enablePings": "Zkontrolujte, zda je IP adresa správná, povolením pingů. Běžte do Přizpůsobení plochy -> Rozložení -> Povolit ping. Na dlaždicích aplikace se objeví malá červená nebo zelená bublina a po najetí na ni se zobrazí kód odpovědi (ve většině případů se očekává zelená bublina s kódem 200).",
"wget": "Chcete-li se ujistit, že homarr může komunikovat s ostatními aplikacemi, zkontrolujte, zda wget/curl/ping odpovídá IP adrese:portu aplikace.",
"iframe": "Pokud jde o iframe, ty by měly vždy používat stejný protokol (http/s) jako Homarr.",
"clearCache": "Některé informace jsou zaznamenány v mezipaměti, takže integrace nemusí fungovat, pokud nevymažete mezipaměť v obecných možnostech aplikace Homarr."
},
"footer": ""
"footer": "Pro řešení dalších problémů se obraťte na náš {{discord}}."
}
},
"externalAddress": {
"label": "",
"description": ""
"label": "Veřejná adresa",
"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": {
@@ -41,88 +42,88 @@
},
"tooltipDescription": {
"label": "Popis aplikace",
"description": ""
"description": "Zadaný text se zobrazí po najetí na aplikaci.\nPoužijte jej k tomu, abyste uživatelům poskytli více informací o své aplikaci, nebo jej nechte prázdný, aby se nic nezobrazovalo."
},
"customProtocolWarning": ""
"customProtocolWarning": "Používá se nestandardní protokol. To může vyžadovat předinstalované aplikace a může přinést bezpečnostní rizika. Ujistěte se, že vaše adresa je bezpečná a důvěryhodná."
},
"network": {
"statusChecker": {
"label": "",
"description": ""
"label": "Kontrola stavu",
"description": "Kontroluje, zda je aplikace online pomocí jednoduchého HTTP(S) požadavku."
},
"statusCodes": {
"label": "",
"description": ""
"label": "Stavové kódy HTTP",
"description": "Stavové kódy HTTP, které jsou považovány jako online."
}
},
"appearance": {
"icon": {
"label": "",
"description": "",
"label": "Ikona aplikace",
"description": "Začněte psát pro vyhledání ikony. Můžete také vložit adresu URL obrázku a použít vlastní ikonu.",
"autocomplete": {
"title": "",
"text": ""
"title": "Nebyly nalezeny žádné výsledky",
"text": "Zkuste použít konkrétnější vyhledávací výraz. Pokud nemůžete najít požadovanou ikonu, vložte adresu URL obrázku Vaší žádané ikony"
},
"noItems": {
"title": "",
"text": ""
"title": "Načítám externí ikony",
"text": "Může to chvíli trvat"
}
},
"appNameFontSize": {
"label": "",
"description": ""
"label": "Velikost písma názvu aplikace",
"description": "Nastavte velikost písma zobrazení názvu aplikace na dlaždici."
},
"appNameStatus": {
"label": "",
"description": "",
"label": "Stav názvu aplikace",
"description": "Zvolte, kde se má název zobrazit, resp. má-li se vůbec má zobrazit.",
"dropdown": {
"normal": "",
"hover": "",
"hidden": ""
"normal": "Zobrazení názvu pouze na dlaždici",
"hover": "Zobrazení názvu pouze při najetí myší",
"hidden": "Nezobrazovat název vůbec"
}
},
"positionAppName": {
"label": "",
"description": "",
"label": "Pozice názvu aplikace",
"description": "Pozice názvu aplikace vzhledem k ikoně.",
"dropdown": {
"top": "",
"right": "",
"bottom": "",
"left": ""
"top": "Nahoře",
"right": "Vpravo",
"bottom": "Dole",
"left": "Vlevo"
}
},
"lineClampAppName": {
"label": "",
"description": ""
"label": "Řádky názvu aplikace",
"description": "Určuje, na kolik řádků se má maximálně vejít váš nadpis. Nastavte 0 pro neomezený počet."
}
},
"integration": {
"type": {
"label": "",
"description": "",
"placeholder": "",
"defined": "",
"undefined": "",
"public": "",
"private": "",
"explanationPrivate": "",
"explanationPublic": ""
"label": "Nastavení integrace",
"description": "Konfigurace integrace, která bude použita pro připojení k vaší aplikaci.",
"placeholder": "Vyberte integraci",
"defined": "Definováno",
"undefined": "Nedefinovaný",
"public": "Veřejné",
"private": "Soukromý",
"explanationPrivate": "Soukromé heslo/API klíč se na server odešle pouze jednou. Po obnovení stránky se již nikdy neodešle.",
"explanationPublic": "Veřejný secret se vždy odešle klientovi a je přístupný prostřednictvím API. Neměl by obsahovat žádné důvěrné hodnoty, jako jsou uživatelská jména, hesla, tokeny, certifikáty a podobně!"
},
"secrets": {
"description": "",
"warning": "",
"clear": "",
"save": "",
"update": ""
"description": "Chcete-li aktualizovat API klíč, zadejte novou hodnotu a klikněte na tlačítko uložit. Chcete-li API klíč vymazat, použijte tlačítko vymazat.",
"warning": "Vaše přihlašovací údaje slouží jako přístup k vašim integracím a <strong> nikdy</strong> byste je neměli sdílet s nikým jiným. Tým Homarr Vás nikdy nebude žádat o Vaše přihlašovací údaje. Dbejte na to, abyste svá <strong>hesla bezpečně ukládali a spravovali</strong>.",
"clear": "Vymazat heslo/klíč",
"save": "Uložit heslo/klíč",
"update": "Aktualizovat heslo/klíč"
}
},
"validation": {
"popover": "",
"name": "",
"noUrl": "",
"invalidUrl": "",
"noIconUrl": "",
"noExternalUri": "",
"invalidExternalUri": ""
"popover": "Váš formulář obsahuje neplatná data. Proto jej nelze uložit. Vyřešte prosím všechny problémy a znovu uložte změny",
"name": "Jméno aplikace je nutné vyplnit",
"noUrl": "URL je nutné vyplnit",
"invalidUrl": "URL je nutné vyplnit",
"noIconUrl": "Toto pole je nutné vyplnit",
"noExternalUri": "Je vyžadována externí URI",
"invalidExternalUri": "Externí URI není platná URI"
}
}

View File

@@ -1 +1,8 @@
{}
{
"xPosition": "Poloha osy X",
"width": "Šířka",
"height": "Výška",
"yPosition": "Poloha osy Y",
"zeroOrHigher": "0 a vyšší",
"betweenXandY": "Mezi {{min}} a {{max}}"
}

View File

@@ -8,36 +8,49 @@
"categories": "Kategorie"
},
"buttons": {
"view": ""
"view": "Zobrazit plochu"
},
"menu": {
"setAsDefault": "",
"setAsDefault": "Nastavit jako výchozí plochu",
"delete": {
"label": "",
"disabled": ""
"label": "Trvale smazat",
"disabled": "Smazání je zakázáno, protože starší komponenty Homarru neumožňují smazání výchozí konfigurace. Smazání bude možné v budoucnu."
},
"duplicate": "Duplikovat",
"rename": {
"label": "Přejmenovat",
"modal": {
"title": "Přejmenovat plochu {{name}}",
"fields": {
"name": {
"label": "Nové jméno",
"placeholder": "Nové jméno plochy"
}
}
}
}
},
"badges": {
"fileSystem": "",
"default": ""
"fileSystem": "Souborový systém",
"default": "Výchozí"
}
},
"buttons": {
"create": ""
"create": "Vytvořit novou plochu"
},
"modals": {
"delete": {
"title": "",
"text": ""
"title": "Odstranit plochu",
"text": "Jste si jisti, že chcete tuto plochu smazat? Tuto akci nelze vrátit zpět a vaše data budou trvale ztracena."
},
"create": {
"title": "",
"text": "",
"title": "Vytvořit plochu",
"text": "Jméno nelze po vytvoření plochy změnit.",
"form": {
"name": {
"label": ""
"label": "Název"
},
"submit": ""
"submit": "Vytvořit"
}
}
}

View File

@@ -2,7 +2,7 @@
"metaTitle": "Spravovat",
"hero": {
"title": "Vítej zpět, {{username}}",
"fallbackUsername": "",
"fallbackUsername": "Anonymní",
"subtitle": "Vítejte ve Vašem Centru aplikací. Organizujte, optimalizujte a ovládněte!"
},
"quickActions": {

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