├── .babelrc
├── .dockerignore
├── .github
└── workflows
│ └── docker-image.yml
├── .gitignore
├── .prettierrc.json
├── CHANGELOG.md
├── Dockerfile
├── LICENSE
├── README.md
├── bun.lockb
├── docker-compose.yml
├── index.html
├── package.json
├── postcss.config.js
├── public
├── CNAME
├── dojonodelogo-dark-square.png
├── dojonodelogo-dark.png
├── dojonodelogo-light.png
└── splashscreens
│ ├── ipad_splash.png
│ ├── ipadpro1_splash.png
│ ├── ipadpro2_splash.png
│ ├── ipadpro3_splash.png
│ ├── iphone5_splash.png
│ ├── iphone6_splash.png
│ ├── iphoneplus_splash.png
│ ├── iphonex_splash.png
│ ├── iphonexr_splash.png
│ └── iphonexsmax_splash.png
├── src
├── App.svelte
├── app.css
├── assets
│ ├── Header.avif
│ ├── TaikoHeart.avif
│ ├── icons
│ │ ├── Abacus.avif
│ │ ├── Antenna.avif
│ │ ├── Brain.avif
│ │ ├── Chain.avif
│ │ ├── Chain.png
│ │ ├── CheckMark.avif
│ │ ├── CremeMode.avif
│ │ ├── Cross.avif
│ │ ├── DarkMode.avif
│ │ ├── Discord.avif
│ │ ├── DojoScroll.svg
│ │ ├── Dolls.avif
│ │ ├── Error.avif
│ │ ├── Ethereum.avif
│ │ ├── FileBox.avif
│ │ ├── Gas.avif
│ │ ├── Github.avif
│ │ ├── Heart.avif
│ │ ├── NodeTaiko.avif
│ │ ├── Package.avif
│ │ ├── Purse.avif
│ │ ├── Timer_Clock.avif
│ │ ├── Twitter.avif
│ │ └── Warning.avif
│ ├── taiko-banner.svg
│ └── taikoLogoIcon.png
├── components
│ ├── Card.svelte
│ ├── ChainCard.svelte
│ ├── DetailsModal.svelte
│ ├── Footer.svelte
│ ├── Modal.svelte
│ ├── Progressbar.svelte
│ └── ThemeSwitcher.svelte
├── domain
│ ├── constants.ts
│ ├── enums.ts
│ └── types.ts
├── main.ts
├── routes
│ └── Dashboard.svelte
├── utils
│ ├── connection.ts
│ ├── localstorage.ts
│ └── prometheus.ts
└── vite-env.d.ts
├── svelte.config.js
├── tailwind.config.cjs
├── tsconfig.json
├── tsconfig.node.json
└── vite.config.ts
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [["@babel/preset-env", { "targets": { "node": "current" } }]],
3 | "env": {
4 | "test": {
5 | "plugins": ["transform-es2015-modules-commonjs"]
6 | }
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | /systeminformation
2 | /node_modules
--------------------------------------------------------------------------------
/.github/workflows/docker-image.yml:
--------------------------------------------------------------------------------
1 | name: Docker Image CI
2 |
3 | on:
4 | push:
5 | tags:
6 | - '*'
7 |
8 | jobs:
9 | buildx:
10 | runs-on: ubuntu-latest
11 | steps:
12 | - name: Checkout
13 | uses: actions/checkout@v3
14 |
15 | - name: Docker Login
16 | uses: docker/login-action@v2.2.0
17 | with:
18 | username: wolfderechter
19 | password: ${{ secrets.DOCKERHUB_TOKEN }}
20 |
21 | - name: Set up QEMU
22 | uses: docker/setup-qemu-action@v2
23 |
24 | - name: Set up Docker Buildx
25 | id: buildx
26 | uses: docker/setup-buildx-action@v2
27 |
28 | - name: Build and push latest
29 | uses: docker/build-push-action@v4
30 | with:
31 | context: .
32 | file: ./Dockerfile
33 | platforms: linux/amd64,linux/arm64
34 | push: true
35 | tags: |
36 | wolfderechter/taiko-node-dashboard:latest
37 | wolfderechter/taiko-node-dashboard:${{ github.ref_name }}
38 |
39 | - name: Create github release
40 | uses: ncipollo/release-action@v1
41 | with:
42 | makeLatest: true
43 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 | .env
26 | .a1.env
27 | .s.env
28 |
29 | # vite
30 | vite.config.ts.timestamp-*.mjs
--------------------------------------------------------------------------------
/.prettierrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "doubleQuote": true,
3 | "trailingComma": "all",
4 | "tabWidth": 2,
5 | "semi": true,
6 | "arrowParens": "always"
7 | }
8 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 |
3 | All notable changes to this project will be documented in this file.
4 |
5 | The format is based on [Keep a Changelog],
6 | and this project adheres to [Semantic Versioning].
7 |
8 | ## [Unreleased]
9 |
10 | ## [1.4.2] - 2024-06-19
11 |
12 | ### Fixed
13 |
14 | - use mainnet etherscan
15 | - show 4 fixed digits for eth balances
16 |
17 | ## [1.4.1] - 2024-06-06
18 |
19 | ### Fixed
20 |
21 | - darkmode network dropdown issue
22 |
23 | ## [1.4.0] - 2024-05-27
24 |
25 | ### Added
26 |
27 | - Upgraded to support mainnet
28 |
29 | ## [1.3.3] - 2024-05-22
30 |
31 | ### Added
32 |
33 | - Check for `https://dashboard.dojonode.xyz` and add warning to use http or selfhost to fix common issue
34 |
35 | ### Changed
36 |
37 | - remove cursor pointer on cards
38 |
39 | ## [1.3.2] - 2024-05-06
40 |
41 | ### Fixed
42 |
43 | - fix broken startNodeHeight which broke the ETA timer
44 |
45 | ## [1.3.1] - 2024-05-02
46 |
47 | ### Changed
48 |
49 | - include arm in docker build
50 |
51 | ## [1.3.0] - 2024-04-25
52 |
53 | ### Changed
54 |
55 | - upgrade to alpha7 hekla testnet
56 |
57 | ## [1.2.2] - 2024-01-23
58 |
59 | ### Fixed
60 |
61 | - fix dojo flag title
62 | - update headerimage href url
63 |
64 | ## [1.2.1] - 2024-01-16
65 |
66 | ### Fixed
67 |
68 | - issue with animateConnections on error
69 |
70 | ## [1.2.0] - 2024-01-16
71 |
72 | ### Added
73 |
74 | - add changelog
75 |
76 | ### Changed
77 |
78 | - upgrade postcss to es6
79 | - update dependencies: vite v5
80 | - update footer
81 | - upgrade to alpha6 katla testnet
82 | - optimize images
83 | - combine connections and settings into connections popup
84 | - refactored the themeswitcher
85 | - updated theme colors
86 |
87 | ## [1.1.5] - 2023-11-12
88 |
89 | ### Added
90 |
91 | - add RPC checks before fetching
92 |
93 | ### Changed
94 |
95 | - refactored initializeRPCConnection with max time so users sees quicker connection feedback
96 |
97 | ## [1.1.4] - 2023-11-05
98 |
99 | ### Added
100 |
101 | - add PWA splashscreen
102 | - add node check before fetching data
103 |
104 | ### Changed
105 |
106 | - update Docker base images
107 | - update npm dependencies
108 |
109 | ### Removed
110 |
111 | - remove L2 address input
112 |
113 | ## [1.1.3] - 2023-10-28
114 |
115 | ## Added
116 |
117 | - add URL params support
118 | - add Footer
119 | - add 'expert mode'
120 |
121 | ### Changed
122 |
123 | - cleanup systeminfo
124 | - abstract away RPC inits
125 | - refactor Prometheus calls
126 | - linting + cleanup project
127 |
128 | ## [1.1.2] - 2023-10-22
129 |
130 | ### Added
131 |
132 | - add PWA support
133 | - add deployment scripts
134 | - add umami website analytics
135 |
136 | ### Changed
137 |
138 | - refactored project
139 |
140 | ### Fixed
141 |
142 | - fixed accessibility issue of input fields
143 |
144 | ## [1.1.1] - 2023-09-22
145 |
146 | ### Fixed
147 |
148 | - update blockexplorer url to jolnir
149 |
150 | ## [1.1.0] - 2023-09-22
151 |
152 | ### Added
153 |
154 | - support custom event indexer API in connections
155 |
156 | ### Changed
157 |
158 | - support a5 testnet (jolnir)
159 | - update default ports to a5 ports
160 | - hide ETA time when (almost) synced
161 | - update npm dependencies
162 |
163 | ## [1.0.3] - 2023-07-17
164 |
165 | - initial release
166 |
167 |
168 | [keep a changelog]: https://keepachangelog.com/en/1.0.0/
169 | [semantic versioning]: https://semver.org/spec/v2.0.0.html
170 |
171 |
172 | [unreleased]: https://github.com/dojonode/taiko-node-dashboard/compare/1.1.5...HEAD
173 | [1.1.5]: https://github.com/dojonode/taiko-node-dashboard/compare/1.1.4...1.1.5
174 | [1.1.4]: https://github.com/dojonode/taiko-node-dashboard/compare/1.1.3...1.1.4
175 | [1.1.3]: https://github.com/dojonode/taiko-node-dashboard/compare/1.1.2...1.1.3
176 | [1.1.2]: https://github.com/dojonode/taiko-node-dashboard/compare/1.1.1...1.1.2
177 | [1.1.1]: https://github.com/dojonode/taiko-node-dashboard/compare/1.1.0...1.1.1
178 | [1.1.0]: https://github.com/dojonode/taiko-node-dashboard/compare/1.0.3...1.1.0
179 | [1.0.3]: https://github.com/dojonode/taiko-node-dashboard/releases/tag/0.0.1
180 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM oven/bun AS build
2 |
3 | # Set the working directory
4 | WORKDIR /app
5 |
6 | # Copy the package.json into the container
7 | COPY package.json package.json
8 |
9 | # Install dependencies using bun
10 | RUN bun install
11 |
12 | # Copy the rest of the Svelte app into the container
13 | COPY . .
14 |
15 | # Build the Svelte app
16 | RUN bun run build
17 |
18 | # Use a lightweight Nginx image as the base image for the final image
19 | FROM nginx:1.27.1
20 | # Copy the built app from the Build stage to the Nginx web server
21 | COPY --from=build /app/dist /usr/share/nginx/html
22 |
23 | # Expose port 80 so that the container can be accessed from the host
24 | EXPOSE 80
25 |
26 | # Start the Nginx web server
27 | CMD ["nginx", "-g", "daemon off;"]
28 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2023 dojonode
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Taiko Node Dashboard
2 | 
3 |
4 | Taiko node dashboard is aimed to provide quick and digestible insights into your Taiko node.
5 | 
6 |
7 | ## Usage
8 |
9 | To run the dashboard simply append the following two services to the `docker-compose.yml` of the taiko node.
10 |
11 | To configure the dashboard for the Hekla testnet, use the `hekla` image tag in `wolfderechter/taiko-node-dashboard:hekla`.
12 |
13 | ```docker-compose
14 | taiko-node-dashboard:
15 | image: wolfderechter/taiko-node-dashboard:latest
16 | ports:
17 | - "7744:80"
18 | dojonode-systeminformation:
19 | image: wolfderechter/dojonode-systeminformation:latest
20 | ports:
21 | - "3009:3009"
22 | ```
23 |
24 | Or if you wish to run the dashboard standalone:
25 |
26 | 1. `git clone https://github.com/dojonode/taiko-node-dashboard-docker`
27 | 2. `cd taiko-node-dashboard-docker`
28 | 3. `docker compose up`
29 | 4. visit http://localhost:7744 to access the dashboard
30 | 5. Click on the 📡 button and change localhost to the IP address of the node's machine
31 |
32 |
33 | ## Development
34 |
35 |
36 | Development steps
37 |
38 | ### Pre-installation
39 |
40 | Make sure you have **node** and **bun** installed on your system. You can do it by:
41 |
42 | `brew install node`
43 | `curl -fsSL https://bun.sh/install | bash`
44 |
45 | ### Development Usage
46 |
47 | You can start the application with the following lines:
48 |
49 | `bun install`
50 |
51 | `bun start`
52 |
53 | You'll probably also want to start the [systeminformation](https://github.com/dojonode/dojonode-systeminformation) application with:
54 |
55 | `git clone https://github.com/dojonode/dojonode-systeminformation`
56 |
57 | `cd dojonode-systeminformation`
58 |
59 | `bun server.js`
60 |
61 | ### Deployment
62 |
63 | To deploy to the website run: `pnpm run predeploy` and `pnpm run deploy`. This will build the website and push to the `gh-pages` branch.
64 |
65 |
66 |
--------------------------------------------------------------------------------
/bun.lockb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/bun.lockb
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: "3.9"
2 |
3 | services:
4 | taiko-node-dashboard:
5 | image: wolfderechter/taiko-node-dashboard:latest
6 | ports:
7 | - "7744:80"
8 | dojonode-systeminformation:
9 | image: wolfderechter/dojonode-systeminformation:latest
10 | ports:
11 | - "3009:3009"
12 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | dojo node
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@wolfderechter/taiko-node-dashboard",
3 | "version": "1.4.8",
4 | "type": "module",
5 | "homepage": "https://dojonode.xyz",
6 | "scripts": {
7 | "start": "bun run dev",
8 | "dev": "vite",
9 | "build": "vite build",
10 | "preview": "vite preview",
11 | "check": "svelte-check --tsconfig ./tsconfig.json",
12 | "prettier": "bunx prettier '**/*.{ts,svelte}'",
13 | "prettier:write": "bunx run prettier -- --write",
14 | "prettier:check": "run prettier -- --check",
15 | "svelte:check": "bunx svelte-check",
16 | "lint": "bunx eslint './**/*.{ts,svelte}'",
17 | "lint:fix": "bunx eslint --fix './**/*.{ts,svelte}'",
18 | "predeploy": "bun run build",
19 | "deploy": "gh-pages -d dist",
20 | "knip": "knip"
21 | },
22 | "devDependencies": {
23 | "@sveltejs/vite-plugin-svelte": "^3.1.2",
24 | "@tsconfig/svelte": "^5.0.4",
25 | "@types/node": "^22.10.2",
26 | "autoprefixer": "^10.4.20",
27 | "babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
28 | "gh-pages": "^6.2.0",
29 | "knip": "^5.40.0",
30 | "postcss": "^8.4.49",
31 | "postcss-cli": "^11.0.0",
32 | "postcss-loader": "^8.1.1",
33 | "prettier": "3.4.2",
34 | "rollup-plugin-polyfill-node": "^0.13.0",
35 | "svelte": "^4.2.19",
36 | "svelte-check": "^4.1.1",
37 | "svelte-loader": "^3.2.4",
38 | "svelte-preprocess": "^6.0.3",
39 | "tailwindcss": "^3.4.16",
40 | "ts-loader": "^9.5.1",
41 | "tslib": "^2.8.0",
42 | "typescript": "^5.6.3",
43 | "vite": "^5.4.11"
44 | },
45 | "dependencies": {
46 | "buffer": "^6.0.3",
47 | "canvas-confetti": "^1.9.3",
48 | "simple-duration": "^1.1.1",
49 | "svelte-spa-router": "^4.0.1",
50 | "tw-colors": "^3.3.2",
51 | "vite-plugin-pwa": "^0.21.1",
52 | "web3": "^4.16.0"
53 | }
54 | }
55 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | export default {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | }
6 | };
7 |
--------------------------------------------------------------------------------
/public/CNAME:
--------------------------------------------------------------------------------
1 | dashboard.dojonode.xyz
2 |
--------------------------------------------------------------------------------
/public/dojonodelogo-dark-square.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/dojonodelogo-dark-square.png
--------------------------------------------------------------------------------
/public/dojonodelogo-dark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/dojonodelogo-dark.png
--------------------------------------------------------------------------------
/public/dojonodelogo-light.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/dojonodelogo-light.png
--------------------------------------------------------------------------------
/public/splashscreens/ipad_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/splashscreens/ipad_splash.png
--------------------------------------------------------------------------------
/public/splashscreens/ipadpro1_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/splashscreens/ipadpro1_splash.png
--------------------------------------------------------------------------------
/public/splashscreens/ipadpro2_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/splashscreens/ipadpro2_splash.png
--------------------------------------------------------------------------------
/public/splashscreens/ipadpro3_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/splashscreens/ipadpro3_splash.png
--------------------------------------------------------------------------------
/public/splashscreens/iphone5_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/splashscreens/iphone5_splash.png
--------------------------------------------------------------------------------
/public/splashscreens/iphone6_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/splashscreens/iphone6_splash.png
--------------------------------------------------------------------------------
/public/splashscreens/iphoneplus_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/splashscreens/iphoneplus_splash.png
--------------------------------------------------------------------------------
/public/splashscreens/iphonex_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/splashscreens/iphonex_splash.png
--------------------------------------------------------------------------------
/public/splashscreens/iphonexr_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/splashscreens/iphonexr_splash.png
--------------------------------------------------------------------------------
/public/splashscreens/iphonexsmax_splash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/public/splashscreens/iphonexsmax_splash.png
--------------------------------------------------------------------------------
/src/App.svelte:
--------------------------------------------------------------------------------
1 |
16 |
17 |
18 |
19 |
20 |
21 |
31 |
--------------------------------------------------------------------------------
/src/app.css:
--------------------------------------------------------------------------------
1 | /* Responsiveness */
2 | .nodeTypes button.active {
3 | transition: 0.4s;
4 | -webkit-transform: scale(1.02);
5 | -moz-transform: scale(1.02);
6 | -ms-transform: scale(1.02);
7 | -o-transform: scale(1.02);
8 | transform: scale(1.02);
9 | }
10 |
11 | button.active {
12 | transition: 0.4s;
13 | -webkit-transform: scale(0.98);
14 | -moz-transform: scale(0.98);
15 | -ms-transform: scale(0.98);
16 | -o-transform: scale(0.98);
17 | transform: scale(0.98);
18 | }
19 |
20 | input:focus {
21 | transition: 0.4s;
22 | -webkit-transform: scale(0.98);
23 | -moz-transform: scale(0.98);
24 | -ms-transform: scale(0.98);
25 | -o-transform: scale(0.98);
26 | transform: scale(0.98);
27 | }
--------------------------------------------------------------------------------
/src/assets/Header.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/Header.avif
--------------------------------------------------------------------------------
/src/assets/TaikoHeart.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/TaikoHeart.avif
--------------------------------------------------------------------------------
/src/assets/icons/Abacus.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Abacus.avif
--------------------------------------------------------------------------------
/src/assets/icons/Antenna.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Antenna.avif
--------------------------------------------------------------------------------
/src/assets/icons/Brain.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Brain.avif
--------------------------------------------------------------------------------
/src/assets/icons/Chain.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Chain.avif
--------------------------------------------------------------------------------
/src/assets/icons/Chain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Chain.png
--------------------------------------------------------------------------------
/src/assets/icons/CheckMark.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/CheckMark.avif
--------------------------------------------------------------------------------
/src/assets/icons/CremeMode.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/CremeMode.avif
--------------------------------------------------------------------------------
/src/assets/icons/Cross.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Cross.avif
--------------------------------------------------------------------------------
/src/assets/icons/DarkMode.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/DarkMode.avif
--------------------------------------------------------------------------------
/src/assets/icons/Discord.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Discord.avif
--------------------------------------------------------------------------------
/src/assets/icons/DojoScroll.svg:
--------------------------------------------------------------------------------
1 |
2 |
126 |
--------------------------------------------------------------------------------
/src/assets/icons/Dolls.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Dolls.avif
--------------------------------------------------------------------------------
/src/assets/icons/Error.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Error.avif
--------------------------------------------------------------------------------
/src/assets/icons/Ethereum.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Ethereum.avif
--------------------------------------------------------------------------------
/src/assets/icons/FileBox.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/FileBox.avif
--------------------------------------------------------------------------------
/src/assets/icons/Gas.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Gas.avif
--------------------------------------------------------------------------------
/src/assets/icons/Github.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Github.avif
--------------------------------------------------------------------------------
/src/assets/icons/Heart.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Heart.avif
--------------------------------------------------------------------------------
/src/assets/icons/NodeTaiko.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/NodeTaiko.avif
--------------------------------------------------------------------------------
/src/assets/icons/Package.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Package.avif
--------------------------------------------------------------------------------
/src/assets/icons/Purse.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Purse.avif
--------------------------------------------------------------------------------
/src/assets/icons/Timer_Clock.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Timer_Clock.avif
--------------------------------------------------------------------------------
/src/assets/icons/Twitter.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Twitter.avif
--------------------------------------------------------------------------------
/src/assets/icons/Warning.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/icons/Warning.avif
--------------------------------------------------------------------------------
/src/assets/taikoLogoIcon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/dojonode/taiko-node-dashboard/9928a5834d3c3bb09c68b6c7227f7fc128038d7d/src/assets/taikoLogoIcon.png
--------------------------------------------------------------------------------
/src/components/Card.svelte:
--------------------------------------------------------------------------------
1 |
25 |
26 |
27 |
{title}
28 |
29 |
32 |
33 |

34 |
35 |
36 |
37 |
38 | {#if body !== undefined && body !== null}
39 |
40 |
46 |
47 | {#if bodyMetricType === MetricTypes.ethereum && subBodyMetricType === MetricTypes.ethereum}
48 |

53 |
57 | {bodyString}
58 | {bodyMetricType}
59 |
60 |
61 | {:else if bodyMetricType && bodyMetricType === MetricTypes.blockheight && subBody !== null && subBodyMetricType === MetricTypes.blockheight}
62 | {bodyString}
63 |
64 | {:else if bodyMetricType && subBody === null && bodyMetricType === MetricTypes.percentage}
65 | {bodyString}
66 |
[ {bodyMetricType} ]
67 |
68 | {:else if bodyMetricType && subBody === null}
69 | {bodyString}
70 |
{bodyMetricType}
71 |
72 | {:else}
73 | {bodyString}
74 | {bodyMetricType}
75 | {/if}
76 |
77 | {/if}
78 | {#if subBody !== undefined && subBody !== null}
79 |
85 |
86 | {#if bodyMetricType === MetricTypes.ethereum && subBodyMetricType === MetricTypes.ethereum}
87 |

88 |
92 | {subBodyString}
93 | {subBodyMetricType}
94 |
95 |
96 | {:else if bodyMetricType === MetricTypes.blockheight && subBodyMetricType === MetricTypes.blockheight}
97 | of {subBodyString}
98 | {:else}
99 | {subBodyString}
100 | {subBodyMetricType}
101 | {/if}
102 |
103 | {/if}
104 |
105 |
106 |
107 |
108 | {#if loadingbar}
109 |
115 | {/if}
116 |
117 |
118 |
119 |
120 |
159 |
--------------------------------------------------------------------------------
/src/components/ChainCard.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
{title}
10 |
11 |
14 |
15 |

16 |
17 |
18 |
{body}
19 |
{subBody}
20 |
21 |
22 |
23 |
24 |
64 |
--------------------------------------------------------------------------------
/src/components/DetailsModal.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
9 |
17 |
18 |
--------------------------------------------------------------------------------
/src/components/Footer.svelte:
--------------------------------------------------------------------------------
1 |
7 |
8 |
25 |
26 |
38 |
--------------------------------------------------------------------------------
/src/components/Modal.svelte:
--------------------------------------------------------------------------------
1 |
14 |
15 |
22 |
26 |
27 |
30 | {title}
31 |
32 | {#if showXButton}
33 |
34 |
41 |
42 | {/if}
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
64 |
--------------------------------------------------------------------------------
/src/components/Progressbar.svelte:
--------------------------------------------------------------------------------
1 |
10 |
11 |
15 |
16 | {#if showPercentage}
17 |
18 |
19 | {#if finishedMessage}
20 | {progress < 100 && progress >= 0
21 | ? progress.toFixed(precision) + "%"
22 | : finishedMessage}
23 | {:else}
24 |
25 | {progress + "%"}
26 | {/if}
27 |
28 | {/if}
29 |
30 |
31 |
32 |
33 |
72 |
--------------------------------------------------------------------------------
/src/components/ThemeSwitcher.svelte:
--------------------------------------------------------------------------------
1 |
33 |
34 |
35 |
36 |
43 |
50 |
51 |
52 |
58 |
59 |
60 |
85 |
--------------------------------------------------------------------------------
/src/domain/constants.ts:
--------------------------------------------------------------------------------
1 | export const SYSTEMINFO_API_URL = "http://localhost:3009";
2 | export const PROMETHEUS_API_URL = "http://localhost:9091";
3 | export const MYNODE_API_URL = "ws://localhost:8548";
4 | export const ETH_RPC_API_URL = "https://ethereum-rpc.publicnode.com";
5 | export const L2_TAIKO_RPC_API_URL = "https://rpc.taiko.xyz";
6 | export const EVENT_INDEXER_API_URL = "https://eventindexer.mainnet.taiko.xyz";
7 |
--------------------------------------------------------------------------------
/src/domain/enums.ts:
--------------------------------------------------------------------------------
1 | export const MetricTypes = {
2 | percentage: "%",
3 | gigabyte: "GB",
4 | megabyte: "MB",
5 | peers: "connected",
6 | ethereum: "ETH",
7 | taiko: "TKO",
8 | hours: "hours",
9 | minutes: "minutes",
10 | blockheight: "blocks",
11 | proposer: "blocks",
12 | prover: "blocks",
13 | total: "",
14 | gas: "gwei",
15 | };
16 |
17 | export const NodeTypes = {
18 | Node: "node",
19 | Proposer: "proposer",
20 | Prover: "prover",
21 | };
22 |
23 | export const Themes = {
24 | Dark: "dark",
25 | Paper: "paper",
26 | };
27 |
--------------------------------------------------------------------------------
/src/domain/types.ts:
--------------------------------------------------------------------------------
1 | export interface SysteminformationMetricsInterface {
2 | memUsedGB: number;
3 | memUsedPerc: number;
4 | cpuUsedPerc: number;
5 | filestorageFreeGB: number;
6 | filestorageUsedGB: number;
7 | filestorageUsedPerc: number;
8 | runtime: number;
9 | runtimeMetricType: any;
10 | }
11 | // TODO: strip this interface to the necesary items?
12 | export interface Systeminfo {
13 | mem: {
14 | total: number;
15 | free: number;
16 | used: number;
17 | active: number;
18 | available: number;
19 | buffers: number;
20 | cached: number;
21 | slab: number;
22 | buffcache: number;
23 | swaptotal: number;
24 | swapused: number;
25 | swapfree: number;
26 | };
27 | cpu: {
28 | avgLoad: number;
29 | currentLoad: number;
30 | currentLoadUser: number;
31 | currentLoadSystem: number;
32 | currentLoadNice: number;
33 | currentLoadIdle: number;
34 | currentLoadIrq: number;
35 | rawCurrentLoad: number;
36 | rawCurrentLoadUser: number;
37 | rawCurrentLoadSystem: number;
38 | rawCurrentLoadNice: number;
39 | rawCurrentLoadIdle: number;
40 | rawCurrentLoadIrq: number;
41 | cpus: {
42 | load: number;
43 | loadUser: number;
44 | loadSystem: number;
45 | loadNice: number;
46 | loadIdle: number;
47 | loadIrq: number;
48 | rawLoad: number;
49 | rawLoadUser: number;
50 | rawLoadSystem: number;
51 | rawLoadNice: number;
52 | rawLoadIdle: number;
53 | rawLoadIrq: number;
54 | }[];
55 | };
56 | disk: {
57 | fs: string;
58 | type: string;
59 | size: number;
60 | used: number;
61 | available: number;
62 | use: number;
63 | mount: string;
64 | rw: boolean;
65 | };
66 | startTime: number;
67 | }
68 |
--------------------------------------------------------------------------------
/src/main.ts:
--------------------------------------------------------------------------------
1 | import "./app.css";
2 | import App from "./App.svelte";
3 |
4 | const app = new App({
5 | target: document.getElementById("app"),
6 | });
7 |
8 | export default app;
9 |
--------------------------------------------------------------------------------
/src/routes/Dashboard.svelte:
--------------------------------------------------------------------------------
1 |
410 |
411 |
421 |
422 |
423 |
424 |
425 |
426 |
427 | dojo
428 |
429 | {#if url?.startsWith('http://dashboard.dojonode.xyz') || url?.startsWith('http://hekla.dojonode.xyz') || url?.startsWith('https://dashboard.dojonode.xyz') || url?.startsWith('https://hekla.dojonode.xyz')}
430 |
431 |
435 |
436 | {/if}
437 |
438 |
439 |
440 |
node dashboard
441 | the main training area
442 |
443 |
444 |
445 |
446 |
447 |
451 | |
452 |
456 | |
457 |
461 |
462 |
463 |
464 |
465 |
473 |
474 |
490 | {#if estimatedSyncingTime && syncingStatus}
491 |
{estimatedSyncingTime}
494 | {/if}
495 |
496 |
497 |
500 |
513 |
514 |
518 |
524 |
534 |
542 |
552 |
561 |
568 |
575 |
576 | {#if nodeType === NodeTypes.Proposer || nodeType === NodeTypes.Prover}
577 |
588 | {/if}
589 |
590 | {#if nodeType === NodeTypes.Proposer}
591 |
598 |
599 | {:else if nodeType === NodeTypes.Prover}
600 |
607 | {/if}
608 |
615 |
616 |
617 |
618 |
619 |
620 |
621 |
622 |
623 |
624 |
625 |
626 |
627 |
628 |
629 |
630 | {#if connectionsOpen}
631 |
632 |
636 |
637 | {#if url.startsWith('https://dashboard.dojonode.xyz') }
638 |
639 |

644 |
647 |
648 | {:else if url.startsWith('https://hekla.dojonode.xyz')}
649 |
650 |

655 |
658 |
659 | {/if}
660 |
661 |
664 | ethereum address
665 |
666 | {
671 | setLocalStorageItem("customAddressL1", customAddressL1.trim());
672 | customAddressL2 = customAddressL1;
673 | setLocalStorageItem("customAddressL2", customAddressL2.trim());
674 | }}
675 | />
676 |
677 |
678 |
681 | node
682 |
683 |
{
689 | setLocalStorageItem(
690 | "CUSTOM_MYNODE_API_URL",
691 | CUSTOM_MYNODE_API_URL,
692 | );
693 | initConnections();
694 | }}
695 | />
696 |

701 |
702 |
703 |
706 | systeminformation
707 |
708 |
{
714 | setLocalStorageItem(
715 | "CUSTOM_SYSTEMINFO_API_URL",
716 | CUSTOM_SYSTEMINFO_API_URL,
717 | );
718 | }}
719 | />
720 |

725 |
726 |
727 |
730 | prometheus
731 |
732 |
{
738 | setLocalStorageItem(
739 | "CUSTOM_PROMETHEUS_API_URL",
740 | CUSTOM_PROMETHEUS_API_URL,
741 | );
742 | }}
743 | />
744 |

749 |
750 |
751 |
754 | ethereum RPC
755 |
756 |
{
762 | setLocalStorageItem(
763 | "CUSTOM_ETH_RPC_API_URL",
764 | CUSTOM_ETH_RPC_API_URL,
765 | );
766 | initConnections();
767 | }}
768 | />
769 |

774 |
775 |
776 |
777 |
782 | Event Indexer:
783 |
784 |
{
790 | setLocalStorageItem(
791 | "CUSTOM_EVENT_INDEXER_API_URL",
792 | CUSTOM_EVENT_INDEXER_API_URL,
793 | );
794 | initConnections();
795 | }}
796 | />
797 |

802 |
803 |
804 |
805 |
806 | {/if}
807 |
808 |
919 |
--------------------------------------------------------------------------------
/src/utils/connection.ts:
--------------------------------------------------------------------------------
1 | import Web3 from "web3";
2 |
3 | export async function initializeRPCConnection(url) {
4 | try {
5 | const web3Instance = new Web3(url);
6 | let fetchErrorBoolean = false;
7 |
8 | await web3Instance.eth.net.isListening().then(() => {
9 | fetchErrorBoolean = false;
10 | });
11 |
12 | return { web3Instance, fetchErrorBoolean };
13 | } catch (error) {
14 | console.error(error);
15 | return { web3Instance: null, fetchErrorBoolean: true };
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/src/utils/localstorage.ts:
--------------------------------------------------------------------------------
1 | export function setLocalStorageItem(key: string, value: string): void {
2 | try {
3 | localStorage.setItem(key, value);
4 | } catch (e) {
5 | console.error(`Error setting "${key}" in localStorage:`, e);
6 | }
7 | }
8 |
9 | export function getLocalStorageItem(key: string): string | null {
10 | try {
11 | return localStorage.getItem(key);
12 | } catch (e) {
13 | console.error(`Error getting "${key}" from localStorage:`, e);
14 | return null;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/utils/prometheus.ts:
--------------------------------------------------------------------------------
1 | export async function queryPrometheus(
2 | address: string,
3 | query: string,
4 | ): Promise {
5 | if (!address.endsWith("/api")) {
6 | address = address.endsWith("/") ? `${address}api` : `${address}/api`;
7 | }
8 |
9 | const response = await fetch(`${address}/v1/query?query=${query}`);
10 |
11 | if (response.ok) {
12 | return await response.json();
13 | } else {
14 | throw new Error(`Error querying Prometheus: ${response.status} - ${response.statusText}`);
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 | ///
3 |
--------------------------------------------------------------------------------
/svelte.config.js:
--------------------------------------------------------------------------------
1 | import preprocess from 'svelte-preprocess';
2 |
3 | const config = {
4 | preprocess: preprocess()
5 | }
6 |
7 | export default config;
8 |
--------------------------------------------------------------------------------
/tailwind.config.cjs:
--------------------------------------------------------------------------------
1 | import {createThemes} from "tw-colors";
2 |
3 | export default {
4 | content: ["./src/**/*.{html,js,svelte,ts}"],
5 | plugins: [
6 | createThemes({
7 | paper: {
8 | secondaryColor: "#f8c4cf",
9 | tertiaryColor: "#808080",
10 | backgroundColor: "#FFF9EB",
11 | textColor: "#444444",
12 | nodeTypesColorActive: "#E53325",
13 | progressBarFillColor: "#F4AB9F",
14 | progressBarBackgroundColor: "#E0E7EC",
15 | cardBackgroundColor: "#F4F4F4",
16 | cardTitleColor: "#E53325",
17 | cardSubBodyColor: "#9A989F",
18 | inputAccentColor: "#E0E7EC",
19 | glowColor: "#0000004C",
20 | themeSwitcherColor: "#F4AB9F",
21 | },
22 | dark: {
23 | secondaryColor: "#f8c4cf",
24 | tertiaryColor: "#cecece",
25 | backgroundColor: "#1a1b1b",
26 | textColor: "#F4F4F4",
27 | nodeTypesColorActive: "#E53325",
28 | progressBarFillColor: "#E53325",
29 | progressBarBackgroundColor: "#707D75",
30 | cardBackgroundColor: "#444444",
31 | cardTitleColor: "#E53325",
32 | cardSubBodyColor: "#BDC0BA",
33 | inputAccentColor: "#707D75",
34 | glowColor: "#ffffffb3",
35 | themeSwitcherColor: "#E53325",
36 | },
37 | })
38 | ],
39 | };
40 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@tsconfig/svelte/tsconfig.json",
3 | "compilerOptions": {
4 | "target": "es2022",
5 | "useDefineForClassFields": true,
6 | "strict": false,
7 | "module": "es2022",
8 | "resolveJsonModule": true,
9 | "baseUrl": ".",
10 | /**
11 | * Typecheck JS in `.svelte` and `.js` files by default.
12 | * Disable checkJs if you'd like to use dynamic types in JS.
13 | * Note that setting allowJs false does not prevent the use
14 | * of JS in `.svelte` files.
15 | */
16 | "allowJs": true,
17 | "checkJs": true,
18 | "isolatedModules": false
19 | },
20 | "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
21 | "references": [{ "path": "./tsconfig.node.json" }]
22 | }
23 |
--------------------------------------------------------------------------------
/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "module": "ESNext",
5 | "moduleResolution": "Node"
6 | },
7 | "include": ["vite.config.ts"]
8 | }
9 |
--------------------------------------------------------------------------------
/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from "vite";
2 | import { svelte } from "@sveltejs/vite-plugin-svelte";
3 | import { VitePWA } from "vite-plugin-pwa";
4 |
5 | // https://vitejs.dev/config/
6 | export default defineConfig({
7 | define: {
8 | global: "globalThis",
9 | "process.env.NODE_DEBUG": false,
10 | "process.env.LINK_API_URL": false,
11 | },
12 | server: {
13 | host: "0.0.0.0",
14 | port: 5173,
15 | },
16 | plugins: [
17 | svelte(),
18 | VitePWA({
19 | includeAssets: [
20 | "splashscreens/iphone5_splash.png",
21 | "splashscreens/iphone6_splash.png",
22 | "splashscreens/iphoneplus_splash.png",
23 | "splashscreens/iphonex_splash.png",
24 | "splashscreens/iphonexr_splash.png",
25 | "splashscreens/iphonexsmax_splash.png",
26 | "splashscreens/ipad_splash.png",
27 | "splashscreens/ipadpro1_splash.png",
28 | "splashscreens/ipadpro3_splash.png",
29 | "splashscreens/ipadpro2_splash.png",
30 | ],
31 | manifest: {
32 | name: "dojo node dashboard",
33 | short_name: "dojo node",
34 | start_url: "./",
35 | display: "standalone",
36 | background_color: "#FFF9EB",
37 | theme_color: "#1a1b1b",
38 | icons: [
39 | {
40 | src: "dojonodelogo-dark-square.png",
41 | sizes: "any",
42 | },
43 | ],
44 | },
45 | }),
46 | ],
47 | base: "/",
48 | });
49 |
--------------------------------------------------------------------------------