diff --git a/assets/icons/code.svg b/assets/icons/code.svg new file mode 100644 index 0000000..e9be046 --- /dev/null +++ b/assets/icons/code.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/config/_default/params.toml b/config/_default/params.toml index 68ef295..2aa1b15 100644 --- a/config/_default/params.toml +++ b/config/_default/params.toml @@ -4,7 +4,8 @@ favicon = "/favicon.png" [footer] since = 2024 -customText = "Colorscheme based on Shades of Purple" +customText = "Art by byung jun ko" +customTextUrl= "https://www.behance.net/gallery/111899291/Blue-Spring-2019" [dateFormat] published = "Jan 02, 2006" diff --git a/content/page/archives/index.fr.md b/content/page/archives/index.fr.md index d695d6d..0d6b150 100644 --- a/content/page/archives/index.fr.md +++ b/content/page/archives/index.fr.md @@ -4,7 +4,6 @@ date: 2022-03-06 layout: "archives" menu: main: - weight: 2 params: icon: archives --- diff --git a/content/page/archives/index.hu.md b/content/page/archives/index.hu.md index bece97d..7690eab 100644 --- a/content/page/archives/index.hu.md +++ b/content/page/archives/index.hu.md @@ -4,7 +4,6 @@ date: 2022-03-06 layout: "archives" menu: main: - weight: 2 params: icon: archives --- diff --git a/content/page/archives/index.md b/content/page/archives/index.md index 83d8770..d44d3d9 100644 --- a/content/page/archives/index.md +++ b/content/page/archives/index.md @@ -5,7 +5,6 @@ layout: "archives" slug: "archives" menu: main: - weight: 2 params: icon: archives --- diff --git a/content/page/frontends/index.md b/content/page/frontends/index.md index 036d9ae..4b6a820 100644 --- a/content/page/frontends/index.md +++ b/content/page/frontends/index.md @@ -88,7 +88,9 @@ Any issues with the services shall be discussed on the [dedicated matrix channel **You are free to use mine anytime free of charge.** -A plan on hosting **every** frontend that Libredirect has. I will also make them available via I2P sometime in the future. +A plan on hosting **every** frontend that Libredirect has. I will also make them available via I2P, Tor and lokinet sometime in the future. [If you're interested in reviewing my privacy terms, they are available here.](/privacy-policy) + +This below is not the full list, if you want all the details go and look at my [infrastructure repo containing them all](https://git.4o1x5.dev/4o1x5/infrastructure/#Privacy-respecting-services) diff --git a/content/page/livestream/index.md b/content/page/livestream/index.md index 595ccc1..1de92ce 100644 --- a/content/page/livestream/index.md +++ b/content/page/livestream/index.md @@ -2,10 +2,9 @@ title: "Livestream" date: 2024-04-28 edited: 2024-04-28 -draft: false +draft: true menu: main: - weight: 2 params: icon: cast --- diff --git a/content/page/projects/index.md b/content/page/projects/index.md new file mode 100644 index 0000000..da61657 --- /dev/null +++ b/content/page/projects/index.md @@ -0,0 +1,15 @@ +--- +title: "Projects" +date: 2024-05-31 +edited: 2024-05-31 +draft: true +menu: + main: + weight: 2 + params: + icon: code + +layout: "projects" +--- + +my projects diff --git a/content/post/guides/ host-your-own-spotify/Replay_2024-07-15_20-43-44.mp4 b/content/post/guides/ host-your-own-spotify/Replay_2024-07-15_20-43-44.mp4 new file mode 100644 index 0000000..595cd30 Binary files /dev/null and b/content/post/guides/ host-your-own-spotify/Replay_2024-07-15_20-43-44.mp4 differ diff --git a/content/post/guides/ host-your-own-spotify/feishin.mp4 b/content/post/guides/ host-your-own-spotify/feishin.mp4 new file mode 100644 index 0000000..f96878e Binary files /dev/null and b/content/post/guides/ host-your-own-spotify/feishin.mp4 differ diff --git a/content/post/guides/ host-your-own-spotify/feishin.png b/content/post/guides/ host-your-own-spotify/feishin.png new file mode 100644 index 0000000..2cfd006 Binary files /dev/null and b/content/post/guides/ host-your-own-spotify/feishin.png differ diff --git a/content/post/guides/ host-your-own-spotify/fieshin_front_page.png b/content/post/guides/ host-your-own-spotify/fieshin_front_page.png new file mode 100644 index 0000000..5a3f230 Binary files /dev/null and b/content/post/guides/ host-your-own-spotify/fieshin_front_page.png differ diff --git a/content/post/guides/ host-your-own-spotify/fieshin_not_like_us.png b/content/post/guides/ host-your-own-spotify/fieshin_not_like_us.png new file mode 100644 index 0000000..5ead47d Binary files /dev/null and b/content/post/guides/ host-your-own-spotify/fieshin_not_like_us.png differ diff --git a/content/post/guides/ host-your-own-spotify/finamp_song.png b/content/post/guides/ host-your-own-spotify/finamp_song.png new file mode 100644 index 0000000..6ff1d3f Binary files /dev/null and b/content/post/guides/ host-your-own-spotify/finamp_song.png differ diff --git a/content/post/guides/ host-your-own-spotify/finamp_songs.png b/content/post/guides/ host-your-own-spotify/finamp_songs.png new file mode 100644 index 0000000..7fe45cd Binary files /dev/null and b/content/post/guides/ host-your-own-spotify/finamp_songs.png differ diff --git a/content/post/guides/ host-your-own-spotify/index.en.md b/content/post/guides/ host-your-own-spotify/index.en.md new file mode 100644 index 0000000..4320275 --- /dev/null +++ b/content/post/guides/ host-your-own-spotify/index.en.md @@ -0,0 +1,218 @@ +--- +title: Ditch spotify, make your own +description: Stream music from your local jellyfin server +date: 2024-07-15 07:00:00+0000 +image: feishin.png +categories: + - Nix + - Piracy + +tags: + - Jellyfin + - Music + - Homelab + - Selfhost + +draft: false + +writingTime: "1h 40m" +--- + +## Introduction + +I have ditched all kind of subscription based services as of 2024. Spotify was one of my last subscriptions I cancelled and I have migrated to listening offline, then to online via my jellyfin server. I mainly listen to high-bitrate flac music that I pirate from sources like [soulseek](https://wl.vern.cc/wiki/Soulseek?lang=en). I have a collection of about 1000 music from 500 different artists. + +I download flacs only to make my self feel better by saying I listen to HQ music but in reality I probably don't hear the difference between a 128kb compressed MP3 and a 1440kb ripped Flac. I also have a entry level [KZ ZS10 IEM](https://kz-audio.com/kz-zs10-pro.html) that I use with my on-board audio driver. I am also a based bass enjoyer, so all I really need is sub frequencies... + +## Why pirate? + +My main reason is privacy. I have yet to found a platform that respects my privacy and allows me to buy any kind of albums/songs with Bitcoin or Monero, therefore my last resort is to pirate it. I could buy the original CD's but most artists I listen to don't have one, and I loath ripping. +Everyone has their own opinion about piracy, and I think in my case it's a 100% justified. + +## Jellyfin + +_Jellyfin is a Free Software Media System that puts you in control of managing and streaming your media. It is an alternative to the proprietary Emby and Plex, to provide media from a dedicated server to end-user devices via multiple apps._ + +Jellyfin is a really great mediaserver, It has many clients and supports almost any kind of media, ranging from visual to audible. +I have been using it for about two years now, but recently I just realized I could stream my music from there instead of syncing my pirated music to all my devices. For the past few days It has been a pleasureful experience and I have no complaints. + +### Feishin _desktop_ + +Feishin is a rewrite of sonixd, a client for subsonic. +It's a really clean music client for jellyfin, I found it in nixpkgs and I use it daily. +It has many features and a modern spotify-like UI. +Sadly it's missing a download feature, meaning I cannot download music then listen to it on the road or something like that. Streaming flacs is really inefficient if you are using mobile data or some public data. I travel a lot meaning this is kind of a deal breaker, but I can just use my phone. +Here is a video of how it looks like in it's _fullscreen_ mode: + + + +![](fieshin_front_page.png) + +### Finamp _mobile_ + +Finamp is an open-source jellyfin music client for Android. +It's one of the most feature rich clients out there, supporting many features also found in the mobile Spotify client. +I don't really like it's design as It doesn't really look like Spotify but that probably due to their focus not being on that. Regardless Its clean. +| Song focus | List of songs | +| :------------------: | :-------------------: | +| ![](finamp_song.png) | ![](finamp_songs.png) | + +## Self-hosting + +### Jellyfin + +Nixpkgs has jellyfin options so we can deploy it that way. It's really straight-forward and seamless. +This example also includes a nginx configuration, since I'm assuming you want to access it from remote locations and maybe share it with friends. + +```nix +{ pkgs, config, ... }: { + + services.jellyfin = { + enable = true; + # Setting the home directory + # might need to create with mkdir /home/jellyfin + dataDir = "/home/jellyfin"; + }; + services.nginx = { + virtualHosts = { + "jelly.${config.networking.domain}" = { + forceSSL = true; + enableACME = true; + + locations."/" = { + extraConfig = '' + proxy_pass http://localhost:8096; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Protocol $scheme; + proxy_set_header X-Forwarded-Host $http_host; + ''; + + }; + # Enable socket for features like syncPlay and live view in the admin panel + locations."/socket" = { + extraConfig = '' + proxy_pass http://localhost:8096; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Protocol $scheme; + proxy_set_header X-Forwarded-Host $http_host; + ''; + }; + }; + }; + }; +} +``` + +After this you can head to `jelly.yourdomain.com` and run the setup. +Keep in mind this is a really basic setup, all data will be stored at `/home/jellyfin` including the SQLite database. + +### slskd + +slskd is a fully featured modern client-server client for soulseek. You can log in to it's panel and download files from the network. +I had some problems with permissions when I was trying to use the native version from _nixpkgs_, so instead I just made an oci-container that uses linux namespaces to run applications. Docker and podman is also based on it. + +**Create directories** + +```bash +mkdir /home/jellyfin/Music +mkdir /home/jellyfin/Music/unsorted +``` + +```nix +{ pkgs, config, ... }: { + + # Define the slskd container + virtualisation.oci-containers.containers = { + slskd = { + image = "slskd/slskd"; + ports = [ + "5030:5030" # panel + "50300:50300" # soulseek + ]; + volumes = [ + # you can use picard or similar applications to sort them, that's why I link it to unsorted + "/home/jellyfin/Music/unsorted:/downloads" + "/home/jellyfin/Music:/music" + ]; + + environment = { + SLSKD_SHARED_DIR = "/music"; + SLSKD_DOWNLOADS_DIR = "/downloads"; + SLSKD_USERNAME = "slskd username"; + SLSKD_PASSWORD = "slskd password"; + SLSKD_SLSK_USERNAME = "soulseek login name"; + SLSKD_SLSK_PASSWORD = "soulseek login name"; + SLSKD_SLSK_LISTEN_IP_ADDRESS = "0.0.0.0"; + }; + }; + }; + # Open the ports for slskd so users can download from you + networking.firewall = { + enable = true; + allowedTCPPorts = [ + 50300 + ]; + allowedUDPPorts = [ + 50300 + ]; + }; + + + services.nginx = { + virtualHosts = { + "soulseek.${config.networking.domain}" = { + forceSSL = true; + enableACME = true; + locations."/" = { + extraConfig = '' + proxy_pass http://localhost:5030; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "Upgrade"; + proxy_set_header Host $host; + proxy_request_buffering off; + ''; + }; + }; + }; + }; +} +``` + +Don't forget to open up the ports on your router so that users can download from you! + +## Usage + +### Create a music library for jellyfin + +Head to the defined jellyfin domain, and log in with the credentials you have given. +On the top right click on the profile icon and head to `Dashboard` -> `Libraries` -> `Add Media Library` and add a new music library like in the picture. +![](jellyfin_music_library.png) + +### Download music + +Head to the domain soulseek domain you have defined, and log into `slskd`. +Slskd is really easy to use, upon entering you are greeted with the search bar, type in anything and hit enter. Slskd will search other peers on the network for the string and return files. +![](slskd_search.png) + +![](slskd_search_result.png) + +After hitting download slskd will put it in `/home/jellyfin/Music/unsorted`. +Jellyfin will automatically scan you library every 3 hours bot you can override this by clicking `Scan All Libraries` in the `Dashboard` + +### Connect a client. + +Download a client, I recommend the ones I mentioned and connect to your server. +They will ask for a server url, which is always `https://jelly.yourdomain.com` and your user credentials. + +### Enjoy + + diff --git a/content/post/guides/ host-your-own-spotify/jellyfin_music_library.png b/content/post/guides/ host-your-own-spotify/jellyfin_music_library.png new file mode 100644 index 0000000..092e82c Binary files /dev/null and b/content/post/guides/ host-your-own-spotify/jellyfin_music_library.png differ diff --git a/content/post/guides/ host-your-own-spotify/slskd_search.png b/content/post/guides/ host-your-own-spotify/slskd_search.png new file mode 100644 index 0000000..bbc3a81 Binary files /dev/null and b/content/post/guides/ host-your-own-spotify/slskd_search.png differ diff --git a/content/post/guides/ host-your-own-spotify/slskd_search_result.png b/content/post/guides/ host-your-own-spotify/slskd_search_result.png new file mode 100644 index 0000000..826e21e Binary files /dev/null and b/content/post/guides/ host-your-own-spotify/slskd_search_result.png differ diff --git a/content/post/guides/switch-to-forgejo-now/index.md b/content/post/guides/switch-to-forgejo-now/index.md index cb9a93c..238aba0 100644 --- a/content/post/guides/switch-to-forgejo-now/index.md +++ b/content/post/guides/switch-to-forgejo-now/index.md @@ -1,5 +1,5 @@ --- -title: Avoid GitHub, selfhost a frogejo instance now +title: Avoid GitHub, selfhost a forgejo instance now description: GitHub has long been the de facto place for hosting code, but as forgejo is getting federation support its a better idea to just host your own GitHub date: 2024-04-25 00:00:00+0000 image: yancy-min-842ofHC6MaI-unsplash.jpg @@ -122,7 +122,7 @@ Forgejo has runners that you can use with workflows to build software on every p services.gitea-actions-runner.instances = { root = { enable = true; - url = "https://git.${config.networking.domain}"; + url = "127.0.0.1:${toString services.forgejo.settings.server.HTTP_PORT}"; token = "place your token here"; settings = { container = { diff --git a/content/privacy-policy/index.hu.md b/content/privacy-policy/index.hu.md index 6b458f7..1feebc0 100644 --- a/content/privacy-policy/index.hu.md +++ b/content/privacy-policy/index.hu.md @@ -1,20 +1,62 @@ ## Adatvédelem -> This Regulation does not apply to the processing of personal data by a natural person in the course of a purely personal or household activity and thus with no connection to a professional or commercial activity. Personal or household activities could include correspondence and the holding of addresses, or social networking and online activity undertaken within the context of such activities. However, this Regulation applies to controllers or processors which provide the means for processing personal data for such personal or household activities +## Milyen adatokat gyűjtök? -Mivel ez egy személyes weboldal nem vagyok kötelezve arra hogy írjak az adatkezelésről. -A szolgáltatásaim sem köteleznek arra hogy személyes adatot adj meg. +Majdnem minden paramétert az Nginx szerverem loggol, itt láthatod hogy én mit látok amikor valamelyik szolgáltatásomra felmész: -De a biztonság kedvéért ezt idézem: +```json +{ + "msec": "1717282535.756", + "connection": "16014", + "connection_requests": "633", + "pid": "612008", + "request_id": "cfe2d77a7db2e5ca3bea0716d8c54769", + "request_length": "112", + "remote_addr": "192.168.1.1", + "remote_user": "", + "remote_port": "53236", + "time_local": "02/Jun/2024:00:55:35 +0200", + "time_iso8601": "2024-06-02T00:55:35+02:00", + "request": "OPTIONS /_matrix/client/v3/sync?filter=0&timeout=30000&set_presence=online&since=s31158_1541328_15670_64635_15313_26_839_110647_0_25 HTTP/2.0", + "request_uri": "/_matrix/client/v3/sync?filter=0&timeout=30000&set_presence=online&since=s31158_1541328_15670_64635_15313_26_839_110647_0_25", + "args": "filter=0&timeout=30000&set_presence=online&since=s31158_1541328_15670_64635_15313_26_839_110647_0_25", + "status": "204", + "body_bytes_sent": "0", + "bytes_sent": "221", + "http_referer": "", + "http_user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Element/1.11.66 Chrome/122.0.6261.156 Electron/29.4.0 Safari/537.36", + "http_x_forwarded_for": "", + "http_host": "4o1x5.dev", + "server_name": "4o1x5.dev", + "request_time": "0.002", + "upstream": "pink:8008", + "upstream_connect_time": "0.000", + "upstream_header_time": "0.002", + "upstream_response_time": "0.002", + "upstream_response_length": "0", + "upstream_cache_status": "", + "ssl_protocol": "TLSv1.3", + "ssl_cipher": "TLS_AES_128_GCM_SHA256", + "scheme": "https", + "request_method": "OPTIONS", + "server_protocol": "HTTP/2.0", + "pipe": ".", + "gzip_ratio": "", + "http_cf_ray": "", + "geoip_country_code": "US" +} +``` -## Milyen adatot gyűjtök +## Hogyan használom fel ezt az adatot? -A szolgáltatásaim lehet hogy loggolnak IP címeket, user agenteket, url paramétereket és irányokat. Ezeket lehet hogy vagy a `docker` vagy a `systemd` felkap. +Időnként beleolvasok a grafana panelem segítségével. +**De! Ezeket az adatokat soha nem osztom meg senkivel és nem is dolgozom fel másképpen!** +![Grafana panel](./dashboard.png) -## Hogyan használom ezeket az adatokat? +## Hogyan tárolom az adatokat? -Sehogyan. Semmilyen alakalommal nem használom fel, adom el vagy olvasok bele. +Ezek az adatok `.log` fájlonként vannak a szerveremen. -## Hogyan tárolom ezeket az adatokat? +## Milyen sokáig tárolom az adatokat? -Az adatok ideiglenes memóriában tárolódhatnak, mint példáúl RAM, de megeshet hogy a merevlemezeimen. +Maximum egy év. diff --git a/content/privacy-policy/index.md b/content/privacy-policy/index.md index 8526671..701e38c 100644 --- a/content/privacy-policy/index.md +++ b/content/privacy-policy/index.md @@ -1,23 +1,68 @@ ## Privacy policy -> This Regulation does not apply to the processing of personal data by a natural person in the course of a purely personal or household activity and thus with no connection to a professional or commercial activity. Personal or household activities could include correspondence and the holding of addresses, or social networking and online activity undertaken within the context of such activities. However, this Regulation applies to controllers or processors which provide the means for processing personal data for such personal or household activities - -Since this is a personal website and is not owned by a company or other entity, I don't have to disclose a privacy policy. -And since none of my services require you to enter any personal data, I won't be processing any personal information. -However, for the sake of completeness, I will include the following: - ## What data I collect -My services may log IP addresses, user agents, routes, query parameters. These may be logged by `docker` or `systemd`. +These may be logged by `docker` or `systemd`. +I also heavily log any requests sent to my server **but purely for analytic purposes**. +Here is an example of what I will see once you visit any of my services. + +```json +{ + "msec": "1717282535.756", + "connection": "16014", + "connection_requests": "633", + "pid": "612008", + "request_id": "cfe2d77a7db2e5ca3bea0716d8c54769", + "request_length": "112", + "remote_addr": "192.168.1.1", + "remote_user": "", + "remote_port": "53236", + "time_local": "02/Jun/2024:00:55:35 +0200", + "time_iso8601": "2024-06-02T00:55:35+02:00", + "request": "OPTIONS /_matrix/client/v3/sync?filter=0&timeout=30000&set_presence=online&since=s31158_1541328_15670_64635_15313_26_839_110647_0_25 HTTP/2.0", + "request_uri": "/_matrix/client/v3/sync?filter=0&timeout=30000&set_presence=online&since=s31158_1541328_15670_64635_15313_26_839_110647_0_25", + "args": "filter=0&timeout=30000&set_presence=online&since=s31158_1541328_15670_64635_15313_26_839_110647_0_25", + "status": "204", + "body_bytes_sent": "0", + "bytes_sent": "221", + "http_referer": "", + "http_user_agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Element/1.11.66 Chrome/122.0.6261.156 Electron/29.4.0 Safari/537.36", + "http_x_forwarded_for": "", + "http_host": "4o1x5.dev", + "server_name": "4o1x5.dev", + "request_time": "0.002", + "upstream": "pink:8008", + "upstream_connect_time": "0.000", + "upstream_header_time": "0.002", + "upstream_response_time": "0.002", + "upstream_response_length": "0", + "upstream_cache_status": "", + "ssl_protocol": "TLSv1.3", + "ssl_cipher": "TLS_AES_128_GCM_SHA256", + "scheme": "https", + "request_method": "OPTIONS", + "server_protocol": "HTTP/2.0", + "pipe": ".", + "gzip_ratio": "", + "http_cf_ray": "", + "geoip_country_code": "US" +} +``` ## How will I use or process your data? -I won't. I never publish, read, save or sell the data. +I look thru it via my grafana panel. +**But I never share, sell or process the information otherwise** + +![Grafana panel](./dashboard.png) ## How do I store your data? This data may be stored only in volatile storage such as RAM or my hard drives. +Nginx logs are stored in a `.log` format, pure text. + +But promtail also processes these logs and sends them to loki for `in-memory` storage. ## How long do I store data -I store them for a day mostly, as I have script to delete them. +I store them for a year at most, as they tend to clog up my storage. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..5db6fe9 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1 @@ +version: "3" diff --git a/flake.lock b/flake.lock index 81eead7..1cd801e 100644 --- a/flake.lock +++ b/flake.lock @@ -2,16 +2,16 @@ "nodes": { "nixpkgs": { "locked": { - "lastModified": 1713344939, - "narHash": "sha256-jpHkAt0sG2/J7ueKnG7VvLLkBYUMQbXQ2L8OBpVG53s=", + "lastModified": 1720954236, + "narHash": "sha256-1mEKHp4m9brvfQ0rjCca8P1WHpymK3TOr3v34ydv9bs=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "e402c3eb6d88384ca6c52ef1c53e61bdc9b84ddd", + "rev": "53e81e790209e41f0c1efa9ff26ff2fd7ab35e27", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-23.11", + "ref": "nixos-24.05", "repo": "nixpkgs", "type": "github" } diff --git a/flake.nix b/flake.nix index 013c65b..eaa633b 100644 --- a/flake.nix +++ b/flake.nix @@ -1,7 +1,7 @@ { description = "Developer shell"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-23.11"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05"; }; outputs = { self, nixpkgs, ... }: let diff --git a/layouts/page/projects.html b/layouts/page/projects.html new file mode 100644 index 0000000..5429a4a --- /dev/null +++ b/layouts/page/projects.html @@ -0,0 +1,13 @@ + +{{ define "body-class" }}template-search{{ end }} +{{ define "head" }} + {{- with .OutputFormats.Get "json" -}} + + {{- end -}} +{{ end }} +{{ define "main" }} + +

Projects

+ +{{ partialCached "footer/footer" . }} +{{ end }} \ No newline at end of file diff --git a/layouts/partials/footer/footer.html b/layouts/partials/footer/footer.html new file mode 100644 index 0000000..eb4e920 --- /dev/null +++ b/layouts/partials/footer/footer.html @@ -0,0 +1,20 @@ +{{- $ThemeVersion := "3.25.0" -}} + + diff --git a/static/dashboard.png b/static/dashboard.png new file mode 100644 index 0000000..cc44aa2 Binary files /dev/null and b/static/dashboard.png differ