Compare commits

...

41 Commits

Author SHA1 Message Date
Ben Phelps
88c774339d Merge pull request #333 from JazzFisch/add-error-boundary
Add ErrorBoundary component
2022-10-05 04:22:26 +03:00
Jason Fischer
962e6e576c Add ErrorBoundary component
- wrap a myriad of components in ErrorBoundary

resolves #270
2022-10-04 13:15:49 -07:00
Anonymous
07a28c0841 Translated using Weblate (Finnish)
Currently translated at 100.0% (0 of 0 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/
2022-10-04 14:32:40 +02:00
Juan Manuel Bennàssar Carretero
1e7ef54c05 Translated using Weblate (Catalan)
Currently translated at 100.0% (119 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-04 14:32:39 +02:00
Juan Manuel Bennàssar Carretero
701270b020 Translated using Weblate (Spanish)
Currently translated at 100.0% (119 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-04 14:32:38 +02:00
Kai Huuhko
84f142683f Added translation using Weblate (Finnish) 2022-10-04 14:32:32 +02:00
Ben Phelps
7033652508 Merge pull request #328 from JazzFisch/disable-open-proxy
Remove pages/api/proxy.js as it was an open proxy
2022-10-04 09:41:49 +03:00
Anonymous
6c3489aa3d Translated using Weblate (Yue)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/
2022-10-04 08:41:21 +02:00
Anonymous
82f18c7cff Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.6% (115 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/
2022-10-04 08:41:20 +02:00
Anonymous
875eefe71f Translated using Weblate (Romanian)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/
2022-10-04 08:41:20 +02:00
Anonymous
1972f2b6db Translated using Weblate (Hebrew)
Currently translated at 84.8% (101 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/
2022-10-04 08:41:20 +02:00
Anonymous
dd080d9a04 Translated using Weblate (Hungarian)
Currently translated at 90.7% (108 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/
2022-10-04 08:41:20 +02:00
Anonymous
933414934c Translated using Weblate (Croatian)
Currently translated at 96.6% (115 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/
2022-10-04 08:41:20 +02:00
Anonymous
dec25762f0 Translated using Weblate (Swedish)
Currently translated at 89.9% (107 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/
2022-10-04 08:41:19 +02:00
Anonymous
a2c9754560 Translated using Weblate (Polish)
Currently translated at 82.3% (98 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/
2022-10-04 08:41:19 +02:00
Anonymous
0f107d8648 Translated using Weblate (Catalan)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-04 08:41:19 +02:00
Anonymous
1b7b6af84d Translated using Weblate (Chinese (Traditional))
Currently translated at 7.5% (9 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/
2022-10-04 08:41:19 +02:00
Anonymous
5e38e71229 Translated using Weblate (Dutch)
Currently translated at 52.9% (63 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/
2022-10-04 08:41:19 +02:00
Anonymous
83983d772d Translated using Weblate (Vietnamese)
Currently translated at 36.9% (44 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/
2022-10-04 08:41:18 +02:00
Anonymous
3e133c10d2 Translated using Weblate (Norwegian Bokmål)
Currently translated at 66.3% (79 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/
2022-10-04 08:41:18 +02:00
Anonymous
6a67873c10 Translated using Weblate (Italian)
Currently translated at 64.7% (77 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/
2022-10-04 08:41:18 +02:00
Anonymous
588ea9b04e Translated using Weblate (Chinese (Simplified))
Currently translated at 91.5% (109 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/
2022-10-04 08:41:18 +02:00
Anonymous
68b7fe2b35 Translated using Weblate (Russian)
Currently translated at 19.3% (23 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/
2022-10-04 08:41:18 +02:00
Anonymous
5643af9845 Translated using Weblate (Portuguese)
Currently translated at 96.6% (115 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/
2022-10-04 08:41:17 +02:00
Anonymous
ad3752650b Translated using Weblate (French)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/
2022-10-04 08:41:17 +02:00
Anonymous
8718b4bcee Translated using Weblate (Spanish)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-04 08:41:17 +02:00
Anonymous
f29154cfa4 Translated using Weblate (German)
Currently translated at 99.1% (118 of 119 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/
2022-10-04 08:41:17 +02:00
Ben Phelps
da948f83a1 Merge pull request #326 from juanmanuelbc/main
Fix resources CPU label...
2022-10-04 09:41:01 +03:00
Jason Fischer
84bb98b007 Update component.jsx 2022-10-03 15:20:30 -07:00
Jason Fischer
c3a623c329 Remove pages/api/proxy.js as it was an open proxy
- The only location pages/api/proxy was used was for icon loading in item.jsx, simply returning the icon URL instead worked just fine.  There was no need to proxy icon requests.

fixes: #327
2022-10-03 15:17:56 -07:00
Juan Manuel Bennàssar Carretero
1249724f8a Fix resources CPU label... 2022-10-03 15:47:46 +02:00
Ángel Fernández Sánchez
4503612bf0 Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-03 11:21:53 +02:00
Juan Manuel Bennàssar Carretero
9c7a9eb326 Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-03 11:21:53 +02:00
Ben Phelps
07e99768e6 speedtest widget, catch api errors 2022-10-03 10:45:45 +03:00
Juan Manuel Bennàssar Carretero
a63f71d3ee Translated using Weblate (Catalan)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/
2022-10-01 16:04:04 +02:00
Juan Manuel Bennàssar Carretero
76f6b3a4a7 Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-01 16:04:03 +02:00
Ángel Fernández Sánchez
7052951a43 Translated using Weblate (Spanish)
Currently translated at 100.0% (118 of 118 strings)

Translation: Homepage/Homepage
Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/
2022-10-01 16:04:03 +02:00
Ben Phelps
09b4de08e3 hopefully improve font rendering 2022-10-01 15:21:13 +03:00
Ben Phelps
82b490c524 fix formatting typos 2022-10-01 10:33:04 +03:00
Ben Phelps
e0bc45f37e Update README.md 2022-10-01 10:31:22 +03:00
Ben Phelps
6e2197a254 update readme 2022-10-01 10:30:54 +03:00
35 changed files with 345 additions and 170 deletions

View File

@@ -1,12 +1,19 @@
<p align="center">
<br>
<picture>
<source media="(prefers-color-scheme: dark)" srcset="images/homepage-dark.png">
<img src="images/homepage-light.png" width="65%">
</picture>
<br><br>
</p>
<p align="center">
A modern <em>(fully static, fast)</em>, secure <em>(fully proxied)</em>, highly customizable application dashboard with integrations for more than 25 services and translations for 15 languages. Easily configured via YAML files (or discovery via docker labels).
</p>
<p align="center">
<img src="images/1.png" />
<br>
</p>
<p align="center">
<img src="images/2.png" width="19%" />
<img src="images/3.png" width="19%" />
<img src="images/4.png" width="19%" />
@@ -20,17 +27,18 @@
</p>
<p align="center">
<a href="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml"><img src="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml/badge.svg" alt="Docker"></a>
<a href="https://hosted.weblate.org/engage/homepage/"><img src="https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg" alt="Weblate"></a>
<a href="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml"><img src="https://github.com/benphelps/homepage/actions/workflows/docker-publish.yml/badge.svg" alt="Docker"></a>
<a href="https://hosted.weblate.org/engage/homepage/"><img src="https://hosted.weblate.org/widgets/homepage/-/homepage/svg-badge.svg" alt="Weblate"></a>
</p>
## Features
- Fast! The entire site is statically generated at build time, so you can expect instant load times
- **Fast!** The entire site is statically generated at build time, so you can expect instant load times
- **Secure!** Every API request to backend services goes through a proxy server, so your API keys are never exposed to the frontend client.
- Images built for AMD64 (x86_64), ARM64, ARMv7 and ARMv6
- Supports all Raspberry Pi's, most SBCs & Apple Silicon
- Full i18n support with automatic language detection
- Translations for Chinese, Dutch, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Russian, Spanish and Swedish
- Translantions for Chinese, Dutch, French, German, Hebrew, Hungarian, Norwegian Bokmål, Polish, Portuguese, Portuguese (Brazil), Romainian, Russian, Spanish, Swedish and Yue
- Want to help translate? [Join the Weblate project](https://hosted.weblate.org/engage/homepage/)
- Service & Web Bookmarks
- Docker Integration
@@ -39,17 +47,17 @@
- Service Integration
- Sonarr, Radarr, Readarr, Prowlarr, Bazarr, Lidarr, Emby, Jellyfin, Tautulli (Plex)
- Ombi, Overseerr, Jellyseerr, Jackett, NZBGet, SABnzbd, ruTorrent, Transmission, qBittorrent
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server
- Portainer, Traefik, Speedtest Tracker, PiHole, AdGuard Home, Nginx Proxy Manager, Gotify, Syncthing Relay Server, Authentic
- Information Providers
- Coin Market Cap, Mastodon
- Information & Utility Widgets
- System Stats (Disk, CPU, Memory)
- Weather via WeatherAPI.com or OpenWeatherMap
- Automatic location detection (with HTTPS), or manual location selection
- Search Bar
- Customizable
- 21 theme colors with light and dark mode support
- Background image support
- Column and Row layout options
## Support & Suggestions
@@ -140,26 +148,41 @@ Huge thanks to the all the contributors who have helped make this project what i
- [aidenpwnz](https://github.com/benphelps/homepage/commits?author=aidenpwnz) - Nginx Proxy Manager, Search Bar Widget
- [AlexFullmoon](https://github.com/benphelps/homepage/commits?author=AlexFullmoon) - OpenWeatherMap Widget
- [AmadeusGraves](https://github.com/benphelps/homepage/commits?author=AmadeusGraves) - Spanish Translation
- [andrii-kryvoviaz](https://github.com/benphelps/homepage/commits?author=andrii-kryvoviaz) - Background opacity option
- [boerniee](https://github.com/benphelps/homepage/commits?author=boerniee) - German Translation
- [comradekingu](https://github.com/benphelps/homepage/commits?author=comradekingu) - Norwegian Bokmål Translation
- Daniel Varga - German & Hungarian Translation
- [deffcolony](https://github.com/benphelps/homepage/commits?author=deffcolony) - Dutch Translation
- [desolaris](https://github.com/benphelps/homepage/commits?author=desolaris) - Russian Translation
- [DevPGSV](https://github.com/benphelps/homepage/commits?author=DevPGSV) - Syncthing Relay Server & Mastodon widgets
- [ilusi0n](https://github.com/benphelps/homepage/commits?author=ilusi0n) - Jellyseerr Integration
- [ItsJustMeChris](https://github.com/benphelps/homepage/commits?author=ItsJustMeChris) - Coin Market Cap Widget
- [jackblk](https://github.com/benphelps/homepage/commits?author=jackblk) - Vietnamese Translation
- [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, Bazarr, Lidarr, SABnzbd, Transmission & qBittorrent Integrations
- [juanmanuelbc](https://github.com/benphelps/homepage/commits?author=juanmanuelbc) - Spanish and Catalan Translations
- [JazzFisch](https://github.com/benphelps/homepage/commits?author=JazzFisch) - Readarr, Bazarr, Lidarr, SABnzbd, Transmission, qBittorrent Integrations & countless more improvements
- [josways](https://github.com/benphelps/homepage/commits?author=josways) - Baidu search provider
- [mauricio-kalil](https://github.com/benphelps/homepage/commits?author=mauricio-kalil) - Portuguese (Brazil)
- [modem7](https://github.com/benphelps/homepage/commits?author=modem7) - Impvoed Docker Image
- [nicedc](https://github.com/benphelps/homepage/commits?author=nicedc) - Chinese Translation
- [Nonoss117](https://github.com/benphelps/homepage/commits?author=Nonoss117) - French Translation
- [pacoculebras](https://github.com/benphelps/homepage/commits?author=pacoculebras) - Catalan Translation
- [psychodracon](https://github.com/benphelps/homepage/commits?author=psychodracon) - Polish Translation
- [quod](https://github.com/benphelps/homepage/commits?author=quod) - Fixed Typos
- [schklom](https://github.com/benphelps/homepage/commits?author=schklom) - ARM64, ARMv7 and ARMv6
- [ShlomiPorush](https://github.com/benphelps/homepage/commits?author=ShlomiPorush) - Hebrew Translation
- [SuperDOS](https://github.com/benphelps/homepage/commits?author=SuperDOS) - Swedish Translation
- [xicopitz](https://github.com/benphelps/homepage/commits?author=xicopitz) - Gotify & Prowlarr Integration
### Translators
- [3vilson](https://github.com/benphelps/homepage/commits?author=3vilson) - German
- [4lenz1](https://github.com/benphelps/homepage/commits?author=4lenz1) - Chinese
- [AmadeusGraves](https://github.com/benphelps/homepage/commits?author=AmadeusGraves) - Spanish
- [boerniee](https://github.com/benphelps/homepage/commits?author=boerniee) - German
- [brunoccr](https://github.com/benphelps/homepage/commits?author=brunoccr) - Portuguese (Brazil)
- [C8opmBM](https://github.com/benphelps/homepage/commits?author=C8opmBM) - Romainian
- [comradekingu](https://github.com/benphelps/homepage/commits?author=comradekingu) - Norwegian Bokmål
- Daniel Varga - German & Hungarian
- [deffcolony](https://github.com/benphelps/homepage/commits?author=deffcolony) - Dutch
- [desolaris](https://github.com/benphelps/homepage/commits?author=desolaris) - Russian
- [ericlokz](https://github.com/benphelps/homepage/commits?author=ericlokz) - Yue
- [FunsKiTo](https://github.com/benphelps/homepage/commits?author=FunsKiTo) - Spanish
- [jackblk](https://github.com/benphelps/homepage/commits?author=jackblk) - Vietnamese
- [juanmanuelbc](https://github.com/benphelps/homepage/commits?author=juanmanuelbc) - Spanish and Catalan
- [ling0412](https://github.com/benphelps/homepage/commits?author=ling0412) - Chinese
- [milotype](https://github.com/benphelps/homepage/commits?author=milotype) - Croatian
- [nicedc](https://github.com/benphelps/homepage/commits?author=nicedc) - Chinese
- [Nonoss117](https://github.com/benphelps/homepage/commits?author=Nonoss117) - French
- [pacoculebras](https://github.com/benphelps/homepage/commits?author=pacoculebras) - Catalan
- [Prilann](https://github.com/benphelps/homepage/commits?author=Prilann) - German
- [psychodracon](https://github.com/benphelps/homepage/commits?author=psychodracon) - Polish
- Sascha Jelinek - German
- [ShlomiPorush](https://github.com/benphelps/homepage/commits?author=ShlomiPorush) - Hebrew
- [SuperDOS](https://github.com/benphelps/homepage/commits?author=SuperDOS) - Swedish

View File

@@ -33,13 +33,14 @@
"total": "Total",
"free": "Lliure",
"used": "Usat",
"load": "Càrrega"
"load": "Càrrega",
"cpu": "CPU"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"rx": "Rebut",
"tx": "Transmès",
"mem": "Memòria",
"cpu": "Processador",
"offline": "Fora de línia"
},
"emby": {
@@ -170,8 +171,8 @@
"transferRate": "Velocitat"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
"users": "Usuaris",
"loginsLast24H": "Inicis de sessió (24h)",
"failedLoginsLast24H": "Errors d'inici de sessió (24h)"
}
}

View File

@@ -11,7 +11,8 @@
"total": "Gesamt",
"free": "Frei",
"used": "Gebraucht",
"load": "Belastung"
"load": "Belastung",
"cpu": "CPU"
},
"docker": {
"rx": "Rx",

View File

@@ -25,6 +25,7 @@
"placeholder": "Search…"
},
"resources": {
"cpu": "CPU",
"total": "Total",
"free": "Free",
"used": "Used",

View File

@@ -11,13 +11,14 @@
"total": "Total",
"free": "Libre",
"used": "Usado",
"load": "Carga"
"load": "Carga",
"cpu": "CPU"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"rx": "Recibido",
"tx": "Transmitido",
"mem": "Memoria",
"cpu": "Procesador",
"offline": "Desconectado"
},
"emby": {
@@ -171,7 +172,7 @@
},
"authentik": {
"users": "Usuarios",
"loginsLast24H": "Accesos (24h)",
"failedLoginsLast24H": "Accesos Fallidos (24h)"
"loginsLast24H": "Inicios de sesión (24h)",
"failedLoginsLast24H": "Inicios de sesión fallidos (24h)"
}
}

View File

@@ -0,0 +1,178 @@
{
"widget": {
"missing_type": "Missing Widget Type: {{type}}",
"api_error": "API Error",
"status": "Status"
},
"weather": {
"current": "Current Location",
"allow": "Click to allow",
"updating": "Updating",
"wait": "Please wait"
},
"search": {
"placeholder": "Search…"
},
"resources": {
"cpu": "CPU",
"total": "Total",
"free": "Free",
"used": "Used",
"load": "Load"
},
"docker": {
"rx": "RX",
"tx": "TX",
"mem": "MEM",
"cpu": "CPU",
"offline": "Offline"
},
"emby": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
},
"tautulli": {
"playing": "Playing",
"transcoding": "Transcoding",
"bitrate": "Bitrate",
"no_active": "No Active Streams"
},
"nzbget": {
"rate": "Rate",
"remaining": "Remaining",
"downloaded": "Downloaded"
},
"sabnzbd": {
"rate": "Rate",
"queue": "Queue",
"timeleft": "Time Left"
},
"rutorrent": {
"active": "Active",
"upload": "Upload",
"download": "Download"
},
"transmission": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"qbittorrent": {
"download": "Download",
"upload": "Upload",
"leech": "Leech",
"seed": "Seed"
},
"sonarr": {
"wanted": "Wanted",
"queued": "Queued",
"series": "Series"
},
"radarr": {
"wanted": "Wanted",
"queued": "Queued",
"movies": "Movies"
},
"lidarr": {
"wanted": "Wanted",
"queued": "Queued",
"albums": "Albums"
},
"readarr": {
"wanted": "Wanted",
"queued": "Queued",
"books": "Books"
},
"bazarr": {
"missingEpisodes": "Missing Episodes",
"missingMovies": "Missing Movies"
},
"ombi": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"jellyseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"overseerr": {
"pending": "Pending",
"approved": "Approved",
"available": "Available"
},
"pihole": {
"queries": "Queries",
"blocked": "Blocked",
"gravity": "Gravity"
},
"adguard": {
"queries": "Queries",
"blocked": "Blocked",
"filtered": "Filtered",
"latency": "Latency"
},
"speedtest": {
"upload": "Upload",
"download": "Download",
"ping": "Ping"
},
"portainer": {
"running": "Running",
"stopped": "Stopped",
"total": "Total"
},
"traefik": {
"routers": "Routers",
"services": "Services",
"middleware": "Middleware"
},
"npm": {
"enabled": "Enabled",
"disabled": "Disabled",
"total": "Total"
},
"coinmarketcap": {
"configure": "Configure one or more crypto currencies to track",
"1hour": "1 Hour",
"1day": "1 Day",
"7days": "7 Days",
"30days": "30 Days"
},
"gotify": {
"apps": "Applications",
"clients": "Clients",
"messages": "Messages"
},
"prowlarr": {
"enableIndexers": "Indexers",
"numberOfGrabs": "Grabs",
"numberOfQueries": "Queries",
"numberOfFailGrabs": "Fail Grabs",
"numberOfFailQueries": "Fail Queries"
},
"jackett": {
"configured": "Configured",
"errored": "Errored"
},
"strelaysrv": {
"numActiveSessions": "Sessions",
"numConnections": "Connections",
"dataRelayed": "Relayed",
"transferRate": "Rate"
},
"mastodon": {
"user_count": "Users",
"status_count": "Posts",
"domain_count": "Domains"
},
"authentik": {
"users": "Users",
"loginsLast24H": "Logins (24h)",
"failedLoginsLast24H": "Failed Logins (24h)"
}
}

View File

@@ -11,7 +11,8 @@
"total": "Total",
"free": "Libre",
"used": "Utilisé",
"load": "Charge"
"load": "Charge",
"cpu": "CPU"
},
"docker": {
"rx": "Rx",

View File

@@ -17,7 +17,8 @@
"total": "סה\"כ",
"free": "פנוי",
"used": "בשימוש",
"load": "עומס"
"load": "עומס",
"cpu": "CPU"
},
"docker": {
"rx": "RX",

View File

@@ -12,7 +12,8 @@
"total": "Ukupno",
"free": "Slobodno",
"used": "Korišteno",
"load": "Opterećenje"
"load": "Opterećenje",
"cpu": "CPU"
},
"sabnzbd": {
"rate": "Stopa",

View File

@@ -3,7 +3,8 @@
"total": "Összes",
"free": "Szabad",
"used": "Használt",
"load": "Terhelés"
"load": "Terhelés",
"cpu": "CPU"
},
"docker": {
"rx": "RX",

View File

@@ -45,7 +45,8 @@
"total": "Totale",
"free": "Libero",
"used": "In utilizzo",
"load": "Load"
"load": "Load",
"cpu": "CPU"
},
"rutorrent": {
"active": "Attivo",

View File

@@ -11,7 +11,8 @@
"total": "Totalt",
"free": "Ledig",
"used": "Brukt",
"load": "Last inn"
"load": "Last inn",
"cpu": "CPU"
},
"docker": {
"rx": "Mottatt",

View File

@@ -8,7 +8,8 @@
"total": "Totaal",
"free": "Vrij",
"used": "Gebruikt",
"load": "Load"
"load": "Load",
"cpu": "CPU"
},
"docker": {
"rx": "RX",

View File

@@ -12,7 +12,8 @@
"used": "Użyte",
"load": "Obciążenie",
"total": "Całkowite",
"free": "Wolne"
"free": "Wolne",
"cpu": "CPU"
},
"emby": {
"no_active": "Brak aktywnych strumieni",

View File

@@ -45,7 +45,8 @@
"total": "Total",
"free": "Livre",
"used": "Usado",
"load": "Carregamento"
"load": "Carregamento",
"cpu": "CPU"
},
"docker": {
"rx": "Rx",

View File

@@ -11,7 +11,8 @@
"total": "Total",
"free": "Livre",
"used": "Usado",
"load": "Carregar"
"load": "Carregar",
"cpu": "CPU"
},
"docker": {
"rx": "Rx",

View File

@@ -3,7 +3,8 @@
"used": "Utilizați",
"load": "Sarcină",
"total": "Total",
"free": "Disponibili"
"free": "Disponibili",
"cpu": "CPU"
},
"docker": {
"rx": "RX",

View File

@@ -11,7 +11,8 @@
"total": "Всего",
"free": "Свободно",
"used": "Использовано",
"load": "Load"
"load": "Load",
"cpu": "CPU"
},
"docker": {
"rx": "Rx",

View File

@@ -14,7 +14,8 @@
"load": "Laddar",
"total": "Total",
"free": "Ledigt",
"used": "Använt"
"used": "Använt",
"cpu": "CPU"
},
"docker": {
"rx": "RX",

View File

@@ -11,7 +11,8 @@
"total": "Tổng",
"free": "Dư",
"used": "Đã dùng",
"load": "Load"
"load": "Load",
"cpu": "CPU"
},
"docker": {
"rx": "RX",

View File

@@ -35,7 +35,8 @@
"total": "全部",
"free": "剩餘",
"used": "用咗",
"load": "負荷"
"load": "負荷",
"cpu": "CPU"
},
"docker": {
"rx": "接收",

View File

@@ -11,7 +11,8 @@
"total": "共",
"free": "空闲",
"used": "已用",
"load": "负载"
"load": "负载",
"cpu": "CPU"
},
"docker": {
"rx": "接收",

View File

@@ -41,7 +41,8 @@
"total": "Total",
"free": "Free",
"used": "Used",
"load": "Load"
"load": "Load",
"cpu": "CPU"
},
"nzbget": {
"rate": "Rate",

View File

@@ -1,10 +1,11 @@
import ErrorBoundary from "components/errorboundry";
import List from "components/bookmarks/list";
export default function BookmarksGroup({ group }) {
return (
<div key={group.name} className="basis-full md:basis-1/2 lg:basis-1/3 xl:basis-1/4 flex-1 p-1">
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{group.name}</h2>
<List bookmarks={group.bookmarks} />
<ErrorBoundary><List bookmarks={group.bookmarks} /></ErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,41 @@
import React from 'react';
export default class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { error: null, errorInfo: null };
}
componentDidCatch(error, errorInfo) {
// Catch errors in any components below and re-render with error message
this.setState({
error,
errorInfo
})
// You can also log error messages to an error reporting service here
// eslint-disable-next-line no-console
console.error(error, errorInfo);
}
render() {
const { error, errorInfo } = this.state;
if (errorInfo) {
// Error path
return (
<div>
<h2>Something went wrong.</h2>
<details style={{ whiteSpace: 'pre-wrap' }}>
{error && error.toString()}
<br />
{errorInfo.componentStack}
</details>
</div>
);
}
// Normally, just render children
const { children } = this.props;
return children;
}
}

View File

@@ -1,5 +1,6 @@
import classNames from "classnames";
import ErrorBoundary from "components/errorboundry";
import List from "components/services/list";
export default function ServicesGroup({ services, layout }) {
@@ -12,7 +13,7 @@ export default function ServicesGroup({ services, layout }) {
)}
>
<h2 className="text-theme-800 dark:text-theme-300 text-xl font-medium">{services.name}</h2>
<List services={services.services} layout={layout} />
<ErrorBoundary><List services={services.services} layout={layout} /></ErrorBoundary>
</div>
);
}

View File

@@ -10,7 +10,7 @@ import { SettingsContext } from "utils/contexts/settings";
function resolveIcon(icon) {
if (icon.startsWith("http")) {
return `/api/proxy?url=${encodeURIComponent(icon)}`;
return icon;
}
if (icon.startsWith("/")) {

View File

@@ -1,5 +1,6 @@
import classNames from "classnames";
import ErrorBoundary from "components/errorboundry";
import Item from "components/services/item";
const columnMap = [
@@ -23,7 +24,7 @@ export default function List({ services, layout }) {
)}
>
{services.map((service) => (
<Item key={service.name} service={service} />
<ErrorBoundary key={service.name}><Item key={service.name} service={service} /></ErrorBoundary>
))}
</ul>
);

View File

@@ -30,7 +30,7 @@ export default function Cpu({ expanded }) {
<div className="flex flex-col ml-3 text-left min-w-[85px]">
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
<div className="pl-0.5">-</div>
<div className="pr-1">{t("docker.cpu")}</div>
<div className="pr-1">{t("resources.cpu")}</div>
</div>
{expanded && (
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">
@@ -59,7 +59,7 @@ export default function Cpu({ expanded }) {
maximumFractionDigits: 0,
})}
</div>
<div className="pr-1">{t("docker.cpu")}</div>
<div className="pr-1">{t("resources.cpu")}</div>
</div>
{expanded && (
<div className="text-theme-800 dark:text-theme-200 text-xs flex flex-row justify-between">

View File

@@ -1,59 +0,0 @@
import https from "https";
import getRawBody from "raw-body";
import { httpRequest, httpsRequest } from "utils/proxy/http";
export const config = {
api: {
bodyParser: false,
},
};
export default async function handler(req, res) {
const headers = ["X-API-Key", "Authorization"].reduce((obj, key) => {
if (req.headers && Object.prototype.hasOwnProperty.call(req.headers, key.toLowerCase())) {
// eslint-disable-next-line no-param-reassign
obj[key] = req.headers[key.toLowerCase()];
}
return obj;
}, {});
const url = new URL(req.query.url);
if (url.protocol === "https:") {
// this agent allows us to bypass the certificate check
// which is required for most self-signed certificates
const httpsAgent = new https.Agent({
rejectUnauthorized: false,
});
const [status, contentType, data] = await httpsRequest(url, {
agent: httpsAgent,
method: req.method,
headers,
body:
req.method === "GET" || req.method === "HEAD"
? null
: await getRawBody(req, {
encoding: "utf8",
}),
});
res.setHeader("Content-Type", contentType);
return res.status(status).send(data);
}
const [status, contentType, data] = await httpRequest(url, {
method: req.method,
headers,
body:
req.method === "GET" || req.method === "HEAD"
? null
: await getRawBody(req, {
encoding: "utf8",
}),
});
res.setHeader("Content-Type", contentType);
return res.status(status).send(data);
}

View File

@@ -8,6 +8,7 @@ import { useEffect, useContext, useState } from "react";
import { BiError } from "react-icons/bi";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import ErrorBoundary from "components/errorboundry";
import ServicesGroup from "components/services/group";
import BookmarksGroup from "components/bookmarks/group";
import Widget from "components/widgets/widget";
@@ -191,14 +192,14 @@ function Home({ initialSettings }) {
{widgets
.filter((widget) => !rightAlignedWidgets.includes(widget.type))
.map((widget, i) => (
<Widget key={i} widget={widget} />
<ErrorBoundary key={i}><Widget key={i} widget={widget} /></ErrorBoundary>
))}
<div className="ml-4 flex flex-wrap basis-full grow sm:basis-auto justify-between md:justify-end mt-2 md:mt-0">
{widgets
.filter((widget) => rightAlignedWidgets.includes(widget.type))
.map((widget, i) => (
<Widget key={i} widget={widget} />
<ErrorBoundary key={i}><Widget key={i} widget={widget} /></ErrorBoundary>
))}
</div>
</>
@@ -208,7 +209,7 @@ function Home({ initialSettings }) {
{services && (
<div className="flex flex-wrap p-8 items-start">
{services.map((group) => (
<ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} />
<ErrorBoundary key={group.name}><ServicesGroup key={group.name} services={group} layout={initialSettings.layout?.[group.name]} /></ErrorBoundary>
))}
</div>
)}
@@ -216,7 +217,7 @@ function Home({ initialSettings }) {
{bookmarks && (
<div className="grow flex flex-wrap pt-0 p-8">
{bookmarks.map((group) => (
<BookmarksGroup key={group.name} group={group} />
<ErrorBoundary key={group.name}><BookmarksGroup key={group.name} group={group} /></ErrorBoundary>
))}
</div>
)}

BIN
src/styles/font/Manrope.ttf Normal file

Binary file not shown.

View File

@@ -13,6 +13,9 @@ html,
body {
font-family: Manrope, "Manrope-Fallback", Arial, sans-serif;
overflow: hidden;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
#page_wrapper {

View File

@@ -13,49 +13,16 @@
@font-face {
font-family: "Manrope";
font-weight: 200;
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
font-weight: 200 800;
font-style: normal;
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2"), url("./font/Manrope.ttf") format("ttf");
font-display: swap;
}
@font-face {
font-family: "Manrope";
font-weight: 300;
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
font-display: swap;
}
@font-face {
font-family: "Manrope";
font-weight: 400;
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
font-display: swap;
}
@font-face {
font-family: "Manrope";
font-weight: 500;
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
font-display: swap;
}
@font-face {
font-family: "Manrope";
font-weight: 600;
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
font-display: swap;
}
@font-face {
font-family: "Manrope";
font-weight: 700;
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
font-display: swap;
}
@font-face {
font-family: "Manrope";
font-weight: 800;
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2");
font-weight: 200 800;
fint-style: italic;
src: local("Manrope"), url("./font/Manrope.woff2") format("woff2"), url("./font/Manrope.ttf") format("ttf");
font-display: swap;
}

View File

@@ -11,7 +11,7 @@ export default function Component({ service }) {
const { data: speedtestData, error: speedtestError } = useWidgetAPI(widget, "speedtest/latest");
if (speedtestError) {
if (speedtestError || (speedtestData && !speedtestData.data)) {
return <Container error={t("widget.api_error")} />;
}
@@ -31,10 +31,7 @@ export default function Component({ service }) {
label="speedtest.download"
value={t("common.bitrate", { value: speedtestData.data.download * 1024 * 1024 })}
/>
<Block
label="speedtest.upload"
value={t("common.bitrate", { value: speedtestData.data.upload * 1024 * 1024 })}
/>
<Block label="speedtest.upload" value={t("common.bitrate", { value: speedtestData.data.upload * 1024 * 1024 })} />
<Block
label="speedtest.ping"
value={t("common.ms", {