├── .editorconfig
├── .envrc
├── .github
└── workflows
│ ├── build.yml
│ └── check.yml
├── .gitignore
├── LICENSE
├── README.md
├── flake.lock
├── flake.nix
├── nix
└── builder.nix
├── scripts
├── lutgen.py
├── populate.py
└── sanitise.py
├── site
├── .gitignore
├── astro.config.mjs
├── bun.lockb
├── package.json
├── public
│ └── favicon.svg
├── src
│ ├── assets
│ │ └── wallpapers
│ ├── components
│ │ ├── Card.astro
│ │ ├── FlavourSelector.astro
│ │ ├── Gallery.astro
│ │ ├── Greeting.astro
│ │ └── Navbar.astro
│ ├── layouts
│ │ └── Layout.astro
│ ├── pages
│ │ └── index.astro
│ ├── styles
│ │ └── global.css
│ └── utils
│ │ └── flavour-selector.ts
└── tsconfig.json
└── wallpapers
├── images
├── art
│ ├── kurzgesagt
│ │ ├── asteroid_miner_1.png
│ │ ├── asteroid_miner_2.png
│ │ ├── asteroids.png
│ │ ├── baby_star.png
│ │ ├── black_hole_1.png
│ │ ├── black_hole_2.png
│ │ ├── cloudy_quasar_1.png
│ │ ├── cloudy_quasar_2.png
│ │ ├── contemplative_cosmonaut_1.png
│ │ ├── contemplative_cosmonaut_2.png
│ │ ├── contemplative_cosmonaut_3.png
│ │ ├── contemplative_cosmonaut_4.png
│ │ ├── cosmic_islands.png
│ │ ├── fleet.png
│ │ ├── galaxies.png
│ │ ├── galaxy_1.png
│ │ ├── galaxy_2.png
│ │ ├── galaxy_3.png
│ │ ├── mars.png
│ │ ├── on_a_moon.png
│ │ ├── ringed_earth.png
│ │ ├── satellite_over_earth.png
│ │ ├── solar_system.png
│ │ ├── stars.png
│ │ ├── stellar_phenomenon.png
│ │ └── unknown_lifeform.png
│ └── willow_and_sundew.jpg
└── photography
│ ├── lake.jpg
│ ├── leaves_with_droplets.jpg
│ ├── macro_mushrooms.jpg
│ ├── mountains.jpg
│ ├── sandstone.jpg
│ ├── trees_mountain_fog_1.jpg
│ ├── trees_mountain_fog_2.jpg
│ └── trees_mountain_fog_3.jpg
└── pixel
├── art
├── animated_street_night.gif
└── waterfall.jpg
└── gaming
└── stardew_valley_map.png
/.editorconfig:
--------------------------------------------------------------------------------
1 | # EditorConfig helps developers define and maintain consistent
2 | # coding styles between different editors and IDEs
3 | # EditorConfig is awesome: https://EditorConfig.org
4 |
5 | root = true
6 |
7 | [*]
8 | charset = utf-8
9 | indent_size = 2
10 | indent_style = space
11 | end_of_line = lf
12 | insert_final_newline = true
13 | trim_trailing_whitespace = true
14 |
15 | # go
16 | [*.go]
17 | indent_style = tab
18 | indent_size = 4
19 |
20 | # python
21 | [*.{ini,py,py.tpl,rst}]
22 | indent_size = 4
23 |
24 | # rust
25 | [*.rs]
26 | indent_size = 4
27 |
28 | # documentation, utils
29 | [*.{md,mdx,diff}]
30 | trim_trailing_whitespace = false
31 |
32 | # windows shell scripts
33 | [*.{cmd,bat,ps1}]
34 | end_of_line = crlf
35 |
--------------------------------------------------------------------------------
/.envrc:
--------------------------------------------------------------------------------
1 | use flake
2 |
--------------------------------------------------------------------------------
/.github/workflows/build.yml:
--------------------------------------------------------------------------------
1 | name: "build and deploy"
2 |
3 | on:
4 | push:
5 | branches: [main]
6 | workflow_dispatch:
7 |
8 | permissions:
9 | contents: write
10 | pages: write
11 | id-token: write
12 |
13 | jobs:
14 | build:
15 | name: "build wallpapers"
16 | runs-on: ubuntu-latest
17 | steps:
18 | - uses: actions/checkout@v4
19 | - uses: nixbuild/nix-quick-install-action@v30
20 | - uses: nix-community/cache-nix-action@v6
21 | id: nix-cache
22 | with:
23 | primary-key: nix-${{ runner.os }}-${{ hashFiles('**/*.nix', '**/flake.lock', 'scripts/**/*', 'wallpapers/**/*') }}
24 |
25 | - if: ${{ steps.nix-cache.outputs.hit-primary-key == 'false' }}
26 | id: nix-build
27 | name: "build wallpapers"
28 | run: nix build .#full
29 |
30 | - name: "upload build artifacts"
31 | if: ${{ steps.nix-build.outcome == 'success' }}
32 | uses: actions/upload-artifact@v4
33 | with:
34 | name: nix-result
35 | path: result
36 |
37 | - name: "use cached wallpapers"
38 | id: use-cache
39 | if: ${{ steps.nix-cache.outputs.hit-primary-key == 'true' }}
40 | run: |
41 | ln -s $(find /nix/store/ -type d -name '*-wallpapers-*' | head -n 1) result
42 | ls -R result
43 |
44 | - name: "upload cache artifacts"
45 | if: ${{ steps.use-cache.outcome == 'success' }}
46 | uses: actions/upload-artifact@v4
47 | with:
48 | name: nix-result
49 | path: result
50 |
51 | upload:
52 | name: "upload wallpapers"
53 | needs: build
54 | runs-on: ubuntu-latest
55 | steps:
56 | - uses: actions/checkout@v4
57 |
58 | - name: "download artifacts"
59 | uses: actions/download-artifact@v4
60 | with:
61 | name: nix-result
62 | path: result
63 |
64 | - name: "zip wallpapers"
65 | run: |
66 | mkdir -p dist
67 |
68 | cp -rL --no-preserve=ownership result/share/wallpapers/* dist/
69 |
70 | for dir in dist/*; do
71 | zip -r "dist/wallpapers-$(basename "$dir").zip" "$dir"
72 | done
73 |
74 | - name: "upload to release"
75 | run: gh release upload --clobber wallpapers ./dist/*.zip
76 | env:
77 | GH_TOKEN: ${{ github.token }}
78 |
79 | build-site:
80 | name: "build site"
81 | needs: build
82 | runs-on: ubuntu-latest
83 | steps:
84 | - uses: actions/checkout@v4
85 | - name: "download artifacts"
86 | uses: actions/download-artifact@v4
87 | with:
88 | name: nix-result
89 | path: result
90 | - name: install, build, and upload site
91 | uses: withastro/action@v3
92 | with:
93 | path: site
94 |
95 | deploy-site:
96 | name: "deploy site"
97 | needs: build-site
98 | runs-on: ubuntu-latest
99 | environment:
100 | name: github-pages
101 | url: ${{ steps.deployment.outputs.page_url }}
102 | steps:
103 | - name: Deploy to GitHub Pages
104 | id: deployment
105 | uses: actions/deploy-pages@v4
106 |
--------------------------------------------------------------------------------
/.github/workflows/check.yml:
--------------------------------------------------------------------------------
1 | name: "check"
2 | on:
3 | pull_request:
4 | push:
5 | jobs:
6 | check:
7 | runs-on: ubuntu-latest
8 | steps:
9 | - uses: actions/checkout@v4
10 | - uses: cachix/install-nix-action@v27
11 | with:
12 | github_access_token: ${{ secrets.GITHUB_TOKEN }}
13 | - run: nix flake check --show-trace
14 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .direnv/
2 | dist/
3 | result
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 willow
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 |
2 |
3 |
4 | willow's wallpaper dump
5 |
6 |
7 |
8 |
15 |
16 |
17 |
22 |
23 |
24 |
25 |
26 |
30 |
31 |
35 |
36 |
40 |
41 |
45 |
46 |
47 |
48 | ---
49 |
50 | This repo provides a curated collection of wallpapers that are hand-picked for high resolution displays. Each wallpaper has been (or will be!) converted to the four colour schemes of [Catppuccin](https://catppuccin.com). Other colour schemes can be added in future if requested.
51 |
52 | ## Usage
53 |
54 | ### Download
55 |
56 | See instructions on the [GitHub release page](https://github.com/42willow/wallpapers/releases/tag/wallpapers).
57 |
58 | ### Nix
59 |
60 | `nix flake show github:42willow/wallpapers`
61 |
62 | Package inputs:
63 |
64 | - `full` (default)
65 | - `latte`
66 | - `frappe`
67 | - `macchiato`
68 | - `mocha`
69 |
70 | #### With Flakes
71 |
72 | `flake.nix`
73 | ```nix
74 | inputs = {
75 | wallpapers = {
76 | url = "github:42willow/wallpapers";
77 | inputs.nixpkgs.follows = "nixpkgs";
78 | # «https://github.com/nix-systems/nix-systems»
79 | # inputs.systems.follows = "systems"; # if using nix-systems
80 | };
81 | };
82 | ```
83 |
84 | `configuration.nix`
85 | ```nix
86 | {inputs, pkgs, ...}: {
87 | environment = {
88 | etc."wallpapers".source = inputs.wallpapers.packages.${pkgs.system}.full;
89 | };
90 | }
91 | ```
92 |
93 | #### Without Flakes
94 |
95 | ```bash
96 | $ nix profile install github:42willow/wallpapers#full
97 | ```
98 |
99 | Nix instructions adapted from [NotAShelf/wallpkgs](https://github.com/NotAShelf/wallpkgs?tab=readme-ov-file#installing), please read there for more detail.
100 |
101 | ## Previews
102 |
103 | Check out the [website](https://42willow.github.io/wallpapers/)!
104 |
105 | ## Credits
106 |
107 | A huge thanks to [NotAShelf](https://github.com/NotAShelf) for his [wallpkgs](https://github.com/NotAShelf/wallpkgs) that this is based on.
108 | I would recommend checking out his projects and maybe even giving them a star!
109 |
110 | All images are sourced from the internet and are not my own work. If you are the original artist and would like me to remove your work, please contact me via email at `42willow [at] pm [dot] me`.
111 |
112 | ### Collections
113 |
114 | - [Flick0](https://github.com/flick0/kabegami)
115 | - [DragonDev07 (for more script features)](https://github.com/DragonDev07/Wallpapers/blob/main/markdown.py)
116 | - [Biohazardia](https://www.deviantart.com/biohazardia/gallery)
117 | - [Imgur Pixel Art Dump](https://imgur.com/gallery/SELjK)
118 | - [Kurzgesagt - AI upscaled](https://www.reddit.com/r/kurzgesagt/comments/15pvf7h/kurzgesagt_4k_wallpapers_3840x2160/)
119 |
120 | ### Tools
121 |
122 | - [tineye](https://www.tineye.com/) - Reverse image search
123 | - [faerber](https://github.com/nekowinston/faerber) - CLI tool to match images to colour schemes
124 | - [lutgen](https://github.com/ozwaldorf/lutgen-rs) - CLI tool to generate LUTs and apply them to images
125 | - [pixeldetector](https://github.com/Astropulse/pixeldetector) - CLI tool to downscale and colour palette limit pixel art
126 |
--------------------------------------------------------------------------------
/flake.lock:
--------------------------------------------------------------------------------
1 | {
2 | "nodes": {
3 | "crane": {
4 | "locked": {
5 | "lastModified": 1733286231,
6 | "narHash": "sha256-mlIDSv1/jqWnH8JTiOV7GMUNPCXL25+6jmD+7hdxx5o=",
7 | "owner": "ipetkov",
8 | "repo": "crane",
9 | "rev": "af1556ecda8bcf305820f68ec2f9d77b41d9cc80",
10 | "type": "github"
11 | },
12 | "original": {
13 | "owner": "ipetkov",
14 | "repo": "crane",
15 | "type": "github"
16 | }
17 | },
18 | "fenix": {
19 | "inputs": {
20 | "nixpkgs": [
21 | "lutgen-rs",
22 | "nixpkgs"
23 | ],
24 | "rust-analyzer-src": "rust-analyzer-src"
25 | },
26 | "locked": {
27 | "lastModified": 1732689334,
28 | "narHash": "sha256-yKI1KiZ0+bvDvfPTQ1ZT3oP/nIu3jPYm4dnbRd6hYg4=",
29 | "owner": "nix-community",
30 | "repo": "fenix",
31 | "rev": "a8a983027ca02b363dfc82fbe3f7d9548a8d3dce",
32 | "type": "github"
33 | },
34 | "original": {
35 | "owner": "nix-community",
36 | "repo": "fenix",
37 | "type": "github"
38 | }
39 | },
40 | "flake-utils": {
41 | "inputs": {
42 | "systems": "systems"
43 | },
44 | "locked": {
45 | "lastModified": 1731533236,
46 | "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
47 | "owner": "numtide",
48 | "repo": "flake-utils",
49 | "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
50 | "type": "github"
51 | },
52 | "original": {
53 | "owner": "numtide",
54 | "repo": "flake-utils",
55 | "type": "github"
56 | }
57 | },
58 | "lutgen-rs": {
59 | "inputs": {
60 | "crane": "crane",
61 | "fenix": "fenix",
62 | "flake-utils": "flake-utils",
63 | "nixpkgs": [
64 | "nixpkgs"
65 | ]
66 | },
67 | "locked": {
68 | "lastModified": 1733529242,
69 | "narHash": "sha256-VE4R0rdQbZ7cyCPRtWWARUAnlR/KWGFUoJSJ4lySwzY=",
70 | "owner": "ozwaldorf",
71 | "repo": "lutgen-rs",
72 | "rev": "caf37f3f38989d17941c4d821640473cd255a6a0",
73 | "type": "github"
74 | },
75 | "original": {
76 | "owner": "ozwaldorf",
77 | "repo": "lutgen-rs",
78 | "type": "github"
79 | }
80 | },
81 | "nixpkgs": {
82 | "locked": {
83 | "lastModified": 1743827369,
84 | "narHash": "sha256-rpqepOZ8Eo1zg+KJeWoq1HAOgoMCDloqv5r2EAa9TSA=",
85 | "owner": "nixos",
86 | "repo": "nixpkgs",
87 | "rev": "42a1c966be226125b48c384171c44c651c236c22",
88 | "type": "github"
89 | },
90 | "original": {
91 | "owner": "nixos",
92 | "ref": "nixos-unstable",
93 | "repo": "nixpkgs",
94 | "type": "github"
95 | }
96 | },
97 | "root": {
98 | "inputs": {
99 | "lutgen-rs": "lutgen-rs",
100 | "nixpkgs": "nixpkgs",
101 | "systems": "systems_2"
102 | }
103 | },
104 | "rust-analyzer-src": {
105 | "flake": false,
106 | "locked": {
107 | "lastModified": 1732633904,
108 | "narHash": "sha256-7VKcoLug9nbAN2txqVksWHHJplqK9Ou8dXjIZAIYSGc=",
109 | "owner": "rust-lang",
110 | "repo": "rust-analyzer",
111 | "rev": "8d5e91c94f80c257ce6dbdfba7bd63a5e8a03fa6",
112 | "type": "github"
113 | },
114 | "original": {
115 | "owner": "rust-lang",
116 | "ref": "nightly",
117 | "repo": "rust-analyzer",
118 | "type": "github"
119 | }
120 | },
121 | "systems": {
122 | "locked": {
123 | "lastModified": 1681028828,
124 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
125 | "owner": "nix-systems",
126 | "repo": "default",
127 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
128 | "type": "github"
129 | },
130 | "original": {
131 | "owner": "nix-systems",
132 | "repo": "default",
133 | "type": "github"
134 | }
135 | },
136 | "systems_2": {
137 | "locked": {
138 | "lastModified": 1681028828,
139 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
140 | "owner": "nix-systems",
141 | "repo": "default",
142 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
143 | "type": "github"
144 | },
145 | "original": {
146 | "owner": "nix-systems",
147 | "repo": "default",
148 | "type": "github"
149 | }
150 | }
151 | },
152 | "root": "root",
153 | "version": 7
154 | }
155 |
--------------------------------------------------------------------------------
/flake.nix:
--------------------------------------------------------------------------------
1 | {
2 | description = "wallpapers- catppuccin-ified!";
3 |
4 | inputs = {
5 | nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
6 | systems.url = "github:nix-systems/default";
7 | lutgen-rs = {
8 | url = "github:ozwaldorf/lutgen-rs";
9 | inputs.nixpkgs.follows = "nixpkgs";
10 | };
11 | };
12 |
13 | outputs = {
14 | self,
15 | nixpkgs,
16 | systems,
17 | ...
18 | } @ inputs: let
19 | inherit (nixpkgs) lib;
20 |
21 | genSystems = lib.genAttrs (import systems);
22 | pkgsFor = nixpkgs.legacyPackages;
23 | version = self.shortRev or "dirty";
24 | in {
25 | overlays.default = _: prev: let
26 | genFlavour = flavour:
27 | prev.callPackage ./nix/builder.nix {
28 | inherit flavour version inputs;
29 | };
30 | in {
31 | full = genFlavour null; # includes all flavours and unthemed
32 | unthemed = genFlavour "unthemed";
33 | latte = genFlavour "latte";
34 | frappe = genFlavour "frappe";
35 | macchiato = genFlavour "macchiato";
36 | mocha = genFlavour "mocha";
37 | };
38 |
39 | packages = genSystems (system:
40 | (self.overlays.default null pkgsFor.${system})
41 | // {
42 | default = self.packages.${system}.full;
43 | });
44 |
45 | formatter = genSystems (system: pkgsFor.${system}.alejandra);
46 | };
47 | }
48 |
--------------------------------------------------------------------------------
/nix/builder.nix:
--------------------------------------------------------------------------------
1 | # originally inspired by https://github.com/NotAShelf/wallpkgs/blob/e5a34ff48313b6ae38ac72da02f889ed8985d76b/nix/builder.nix
2 | {
3 | lib,
4 | stdenvNoCC,
5 | flavour ? null,
6 | version,
7 | pkgs,
8 | inputs,
9 | ...
10 | }: let
11 | pname =
12 | if (flavour == null)
13 | then "wallpapers"
14 | else "wallpapers-${flavour}";
15 |
16 | lutApply = pkgs.writers.writePython3Bin "lut-apply" {} (
17 | pkgs.replaceVars ../scripts/lutgen.py {
18 | lutgen = lib.getExe' inputs.lutgen-rs.packages.${pkgs.system}.default "lutgen";
19 | }
20 | );
21 | in
22 | stdenvNoCC.mkDerivation {
23 | inherit pname version;
24 |
25 | src = builtins.path {
26 | path = ../wallpapers;
27 | name = "${pname}-${version}";
28 | };
29 |
30 | strictDeps = true;
31 |
32 | preInstall = ''
33 | mkdir -p $out/share/wallpapers
34 | '';
35 |
36 | installPhase = ''
37 | runHook preInstall
38 | ${lib.getExe lutApply} $src $out/share/wallpapers ${
39 | if flavour != null
40 | then flavour
41 | else ""
42 | }
43 | runHook postInstall
44 | '';
45 |
46 | meta = {
47 | description = "wallpapers- catppuccin-ified!";
48 | license = lib.licenses.mit;
49 | platforms = lib.platforms.all;
50 | };
51 | }
52 |
--------------------------------------------------------------------------------
/scripts/lutgen.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | import subprocess
4 | import shutil
5 |
6 | CTP_FLAVOURS = ["latte", "frappe", "macchiato", "mocha"]
7 |
8 |
9 | def main(input_dir, output_dir, input_flavour=None):
10 | for flavour in CTP_FLAVOURS:
11 | if input_flavour and input_flavour != flavour:
12 | continue
13 | # for every file in the input directory and its subdirectories
14 | for root, dirs, files in os.walk(input_dir):
15 | for file in files:
16 | if any(file.endswith(ext) for ext in [
17 | "jpg",
18 | "jpeg",
19 | "png",
20 | "gif"
21 | ]):
22 | input_path = os.path.join(root, file)
23 | # print("input_path: " + input_path)
24 | relative_path = os.path.relpath(input_path, input_dir)
25 | output_path = os.path.join(
26 | output_dir,
27 | flavour,
28 | relative_path
29 | )
30 | # print("output_path: " + output_path)
31 | apply_lutgen(
32 | [input_path],
33 | output_path=output_path,
34 | palette=f"catppuccin-{flavour}",
35 | level=16
36 | )
37 | if input_flavour == "unthemed" or input_flavour is None:
38 | shutil.copytree(input_dir, os.path.join(output_dir, "unthemed"))
39 |
40 |
41 | def apply_lutgen(images, output_path=None, palette=None, level=10):
42 | command = [
43 | '@lutgen@',
44 | 'apply'
45 | ]
46 | if output_path:
47 | command.append(f'--output={output_path}')
48 | if palette:
49 | command.append(f'--palette={palette}')
50 | command.append(f'--level={level}')
51 | command.extend(images)
52 | try:
53 | result = subprocess.run(
54 | command,
55 | check=True,
56 | text=True,
57 | capture_output=True
58 | )
59 | print("[lutgen] output: ", result.stdout)
60 | except subprocess.CalledProcessError as e:
61 | print("[lutgen] error: ", e.stderr)
62 | sys.exit(e.returncode)
63 |
64 |
65 | if __name__ == "__main__":
66 | if len(sys.argv) < 3 or len(sys.argv) > 4:
67 | print("usage: python lutgen.py [flavour]")
68 | sys.exit(1)
69 |
70 | input_dir = sys.argv[1]
71 | output_dir = sys.argv[2]
72 | flavour = sys.argv[3] if len(sys.argv) == 4 else None
73 |
74 | main(input_dir, output_dir, flavour)
75 |
--------------------------------------------------------------------------------
/scripts/populate.py:
--------------------------------------------------------------------------------
1 | # TODO)) update for github actions, not in use
2 |
3 | # This is a merge of https://github.com/DragonDev07/Wallpapers/blob/main/markdown.py and https://github.com/42Willow/dotfiles/blob/45ef591a5cb06454f04b82e17be613e186533edf/hypr/wallpapers/populate.py
4 | # These are based off https://github.com/flick0/kabegami/blob/master/populate.py
5 |
6 | import os
7 |
8 | pre = f"""
9 |
10 |
11 |
12 |
13 |
14 | ~ willow's wallpaper dump ~
15 |
16 |
17 | All wallpapers here are suitable for a 4K monitor :)
18 |
19 | Inspired by [flick0](https://github.com/flick0/kabegami)
20 |
21 | -----------------
22 | """
23 |
24 | post = """
25 | -----------------
26 |
27 | ## Credits
28 |
29 | A huge thanks to [NotAShelf](https://github.com/NotAShelf) for his [wallpkgs](https://github.com/NotAShelf/wallpkgs) that this was originally based on.
30 | I would recommend checking out his projects and maybe even giving them a star!
31 |
32 | All images are sourced from the internet and are not my own work. If you are the original artist and would like me to remove your work, please contact me via email at `42willow [at] pm [dot] me`.
33 |
34 | - [Flick0](https://github.com/flick0/kabegami)
35 | - [DragonDev07 (for more script features)](https://github.com/DragonDev07/Wallpapers/blob/main/markdown.py)
36 | - [Biohazardia](https://www.deviantart.com/biohazardia/gallery)
37 | - [Imgur Pixel Art Dump](https://imgur.com/gallery/SELjK)
38 | - [Kurzgesagt - AI upscaled](https://www.reddit.com/r/kurzgesagt/comments/15pvf7h/kurzgesagt_4k_wallpapers_3840x2160/)
39 |
40 | ## Tools
41 |
42 | - [tineye](https://www.tineye.com/) - Reverse image search
43 | - [faerber](https://github.com/nekowinston/faerber) - CLI tool to match images to colour schemes
44 | - [lutgen](https://github.com/ozwaldorf/lutgen-rs) - CLI tool to generate LUTs and apply them to images
45 | - [pixeldetector](https://github.com/Astropulse/pixeldetector) - CLI tool to downscale and colour palette limit pixel art
46 | """
47 |
48 | def image_embed(title,folder,img):
49 | return f""" \n"""
50 |
51 | def has_image_files(directory):
52 | for _, _, files in os.walk(directory):
53 | for file in files:
54 | if file.lower().endswith(('.png', '.jpg', '.jpeg', '.gif', '.webp', '.webm')):
55 | return True
56 | return False
57 |
58 | def create_readme(directory):
59 | readme_content = pre
60 |
61 | # Get top-level directories
62 | top_level_dirs = [d for d in os.listdir(directory) if os.path.isdir(os.path.join(directory, d))]
63 |
64 | for top_level_dir in top_level_dirs:
65 | top_level_path = os.path.join(directory, top_level_dir)
66 | print(f"======{top_level_path}======")
67 |
68 | # Ignore hidden directories and directories without image files
69 | if top_level_dir.startswith('.') or not has_image_files(top_level_path):
70 | continue
71 |
72 | # Add heading for top-level directories
73 | readme_content += f"## {top_level_dir}\n\n"
74 |
75 | # Check if top-level directory has subdirectories
76 | has_subdirectories = any(os.path.isdir(os.path.join(top_level_path, d)) for d in os.listdir(top_level_path))
77 |
78 | # If top-level directory doesn't have subdirectories, add dropdown
79 | if not has_subdirectories:
80 | readme_content += f"{top_level_dir} \n\n"
81 |
82 | # Walk through the directory structure
83 | for root, dirs, files in os.walk(top_level_path):
84 | relative_path = os.path.relpath(root, directory)
85 | print(f"+++ {relative_path} +++")
86 |
87 | # Ignore hidden directories
88 | dirs[:] = [d for d in dirs if not d.startswith('.')]
89 |
90 | # If we are in a subdirectory, add it as a dropdown
91 | if relative_path != top_level_dir:
92 | readme_content += f"{os.path.basename(relative_path)} \n\n"
93 |
94 | for file in files:
95 | file_path = os.path.relpath(os.path.join(root, file))
96 | file_name, _ = os.path.splitext(file)
97 | print(file_name)
98 |
99 | # Extract tags from filename and enclose them in inline code blocks
100 | tags = [f"`{tag.strip('`')}`" for tag in file_name.split("-")] if "-" in file_name else [f"`{file_name.strip('`')}`"]
101 |
102 | # Add tags above image
103 | readme_content += f"**Tags:** {' '.join(tags)}\n\n"
104 | readme_content += f" \n\n"
105 |
106 |
107 | # Close the details tag if we are in a subdirectory
108 | if relative_path != top_level_dir:
109 | readme_content += " \n\n"
110 |
111 | # Close the top-level directory dropdown
112 | readme_content += f" \n\n"
113 |
114 | with open("README.md", "w") as readme_file:
115 | readme_file.write(readme_content + post)
116 |
117 | if __name__ == "__main__":
118 | directory_path = input("Enter the directory path: ")
119 | create_readme(directory_path)
120 | print("README.md created successfully.")
121 |
--------------------------------------------------------------------------------
/scripts/sanitise.py:
--------------------------------------------------------------------------------
1 | import os
2 | import glob
3 |
4 | def sanitise_filenames(file_patterns):
5 | files = []
6 | for pattern in file_patterns:
7 | files.extend(glob.glob(pattern, recursive=True))
8 |
9 | for old_file in files:
10 | name, ext = os.path.splitext(old_file)
11 | sanitised_name = name.lower().replace(' ', '_').replace('-', '_')
12 | if ext.lower() == '.jpeg':
13 | ext = '.jpg'
14 | new_filename = sanitised_name + ext
15 | if old_file != new_filename:
16 | os.rename(old_file, new_filename)
17 | print(f'Renamed: "{old_file}" to "{new_filename}"')
18 |
19 | file_patterns_input = input("Enter files:")
20 | file_patterns = file_patterns_input.split()
21 |
22 | sanitise_filenames(file_patterns)
23 |
--------------------------------------------------------------------------------
/site/.gitignore:
--------------------------------------------------------------------------------
1 | # build output
2 | dist/
3 |
4 | # generated types
5 | .astro/
6 |
7 | # dependencies
8 | node_modules/
9 |
10 | # logs
11 | npm-debug.log*
12 | yarn-debug.log*
13 | yarn-error.log*
14 | pnpm-debug.log*
15 |
16 | # environment variables
17 | .env
18 | .env.production
19 |
20 | # macOS-specific files
21 | .DS_Store
22 |
23 | # jetbrains setting folder
24 | .idea/
25 |
--------------------------------------------------------------------------------
/site/astro.config.mjs:
--------------------------------------------------------------------------------
1 | // @ts-check
2 | import { defineConfig } from "astro/config";
3 | import tailwindcss from "@tailwindcss/vite";
4 |
5 | // https://astro.build/config
6 | export default defineConfig({
7 | vite: {
8 | plugins: [tailwindcss()],
9 | },
10 | site: "https://42willow.github.io",
11 | base: "wallpapers",
12 | });
13 |
--------------------------------------------------------------------------------
/site/bun.lockb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/site/bun.lockb
--------------------------------------------------------------------------------
/site/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "site",
3 | "type": "module",
4 | "version": "0.0.1",
5 | "scripts": {
6 | "dev": "astro dev",
7 | "build": "astro build",
8 | "preview": "astro preview",
9 | "astro": "astro"
10 | },
11 | "dependencies": {
12 | "@catppuccin/tailwindcss": "github:catppuccin/tailwindcss#feat!/tailwindcss-v4",
13 | "@tailwindcss/vite": "^4.1.3",
14 | "astro": "^5.6.1",
15 | "tailwindcss": "^4.1.3"
16 | }
17 | }
--------------------------------------------------------------------------------
/site/public/favicon.svg:
--------------------------------------------------------------------------------
1 |
2 |
20 |
22 |
51 |
53 |
54 |
56 | image/svg+xml
57 |
59 |
60 |
61 |
62 |
67 |
74 |
75 |
80 |
85 |
92 |
99 |
106 |
113 |
120 |
121 |
122 |
--------------------------------------------------------------------------------
/site/src/assets/wallpapers:
--------------------------------------------------------------------------------
1 | ../../../result/share/wallpapers
--------------------------------------------------------------------------------
/site/src/components/Card.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import type { ImageMetadata } from "astro";
3 | import { Image } from "astro:assets";
4 |
5 | interface Props {
6 | images: Record Promise<{ default: ImageMetadata }>>;
7 | imgPath: string;
8 | name: string;
9 | flavour: string;
10 | author?: string;
11 | class?: string;
12 | }
13 |
14 | const {
15 | images,
16 | imgPath,
17 | name,
18 | flavour,
19 | author,
20 | class: className,
21 | } = Astro.props;
22 | if (!images[imgPath]) throw new Error(`"${imgPath}" does not exist in glob`);
23 | ---
24 |
25 |
26 |
27 |
34 |
37 | {name.replaceAll("_", " ")}
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/site/src/components/FlavourSelector.astro:
--------------------------------------------------------------------------------
1 |
2 | latte
3 | frappe
4 | macchiato
5 | mocha
6 | unthemed
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/site/src/components/Gallery.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Card from "./Card.astro";
3 | import type { ImageMetadata } from "astro";
4 |
5 | const images = import.meta.glob<{ default: ImageMetadata }>(
6 | "/src/assets/**/*.{jpeg,jpg,png,gif}",
7 | );
8 |
9 | let re =
10 | /^\/src\/assets\/wallpapers\/(?\w+)\/(?\w+)\/(?:(?\w+)\/)?(?:(?\w+)\/)?(?\w+)\..*$/;
11 |
12 | const walls = Object.keys(images)
13 | .map((item) => {
14 | // console.log(`item: ${item}`);
15 | const match = item.match(re);
16 | // console.log(match);
17 | if (!match) {
18 | throw new Error(`failed to parse image path: ${item}`);
19 | }
20 | return {
21 | path: item,
22 | flavour: match.groups?.flavour,
23 | type: match.groups?.type,
24 | category: match.groups?.category,
25 | author: match.groups?.author,
26 | name: match.groups?.name,
27 | };
28 | })
29 | .filter((item) => item !== null);
30 | ---
31 |
32 |
33 | {
34 | walls.map((item) => (
35 |
43 | ))
44 | }
45 |
46 |
47 |
50 |
51 |
52 |
133 |
--------------------------------------------------------------------------------
/site/src/components/Greeting.astro:
--------------------------------------------------------------------------------
1 |
2 |
3 | warning: this site is still a work in progress, you may have
4 | a better experience previewing the wallpapers here in the meantime
9 |
10 |
11 |
12 | hii, welcome to my wallpaper dump!
13 |
14 | remember to credit original authors and enjoy your stay ^-^
15 |
16 |
17 | note: the reason the wallpapers are compressed is to speed up
18 | your viewing experience, if you hover over the wallpaper you will find a download
19 | button
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/site/src/components/Navbar.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import FlavourSelector from "./FlavourSelector.astro";
3 | ---
4 |
5 |
8 |
9 |
10 |
11 |
17 |
18 | willow's wallpaper dump
19 |
20 |
21 |
22 |
23 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/site/src/layouts/Layout.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import "../styles/global.css";
3 | ---
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | willow's wallpaper dump
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/site/src/pages/index.astro:
--------------------------------------------------------------------------------
1 | ---
2 | import Navbar from "../components/Navbar.astro";
3 | import Greeting from "../components/Greeting.astro";
4 | import Gallery from "../components/Gallery.astro";
5 | import Layout from "../layouts/Layout.astro";
6 | ---
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/site/src/styles/global.css:
--------------------------------------------------------------------------------
1 | @import url("https://unpkg.com/@catppuccin/palette/css/catppuccin.css");
2 | @import url("https://fonts.googleapis.com/css2?family=Lexend:wght@100..900&family=Pacifico&display=swap");
3 |
4 | @import "tailwindcss";
5 | @import "@catppuccin/tailwindcss/docs/src/styles/palette.css";
6 | @import "@catppuccin/tailwindcss/docs/src/styles/tailwind.config.css";
7 |
8 | @theme {
9 | --font-pacifico: "Pacifico", sans-serif;
10 | --font-lexend: "Lexend", sans-serif;
11 | --nav-h-desktop: 5rem;
12 | --nav-h-mobile: 10rem;
13 | }
14 |
15 | @layer base {
16 | body {
17 | @apply bg-ctp-base text-ctp-text font-lexend;
18 | }
19 | .card {
20 | @apply hidden;
21 |
22 | &.latte {
23 | @apply in-[.latte]:inline-block;
24 | }
25 | &.frappe {
26 | @apply in-[.frappe]:inline-block;
27 | }
28 | &.macchiato {
29 | @apply in-[.macchiato]:inline-block;
30 | }
31 | &.mocha {
32 | @apply in-[.mocha]:inline-block;
33 | }
34 | &.unthemed {
35 | @apply in-[.unthemed]:inline-block;
36 | }
37 | }
38 | }
39 |
40 | @layer components {
41 | .btn {
42 | @apply rounded-lg p-1.5 text-sm sm:text-base bg-ctp-crust transition-colors duration-300 hover:!bg-ctp-pink hover:!text-ctp-base ring-1 ring-ctp-surface0;
43 | &.active {
44 | @apply bg-ctp-pink/20 ring-1 ring-ctp-pink;
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/site/src/utils/flavour-selector.ts:
--------------------------------------------------------------------------------
1 | const flavours = ["latte", "frappe", "macchiato", "mocha", "unthemed"];
2 |
3 | applyTheme("macchiato");
4 |
5 | // flavour selector listeners
6 | flavours.forEach((flavour) => {
7 | let btn = document.querySelectorAll(
8 | `#flavour-selector > #${flavour}`,
9 | ) as NodeListOf;
10 | btn.forEach((btn) => {
11 | btn.addEventListener("click", () => {
12 | applyTheme(flavour);
13 | });
14 | });
15 | });
16 |
17 | function applyTheme(theme: string) {
18 | document.body.className = theme;
19 | // reset active class
20 | document.querySelectorAll("#flavour-selector > button").forEach((btn) => {
21 | btn.classList.remove("active");
22 | });
23 | // set active button
24 | document.querySelectorAll(`#flavour-selector > #${theme}`)?.forEach((btn) => {
25 | btn.classList.add("active");
26 | });
27 | }
28 |
--------------------------------------------------------------------------------
/site/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "astro/tsconfigs/strict",
3 | "include": [".astro/types.d.ts", "**/*"],
4 | "exclude": ["dist"]
5 | }
6 |
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/asteroid_miner_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/asteroid_miner_1.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/asteroid_miner_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/asteroid_miner_2.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/asteroids.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/asteroids.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/baby_star.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/baby_star.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/black_hole_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/black_hole_1.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/black_hole_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/black_hole_2.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/cloudy_quasar_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/cloudy_quasar_1.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/cloudy_quasar_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/cloudy_quasar_2.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/contemplative_cosmonaut_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/contemplative_cosmonaut_1.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/contemplative_cosmonaut_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/contemplative_cosmonaut_2.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/contemplative_cosmonaut_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/contemplative_cosmonaut_3.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/contemplative_cosmonaut_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/contemplative_cosmonaut_4.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/cosmic_islands.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/cosmic_islands.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/fleet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/fleet.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/galaxies.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/galaxies.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/galaxy_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/galaxy_1.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/galaxy_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/galaxy_2.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/galaxy_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/galaxy_3.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/mars.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/mars.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/on_a_moon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/on_a_moon.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/ringed_earth.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/ringed_earth.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/satellite_over_earth.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/satellite_over_earth.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/solar_system.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/solar_system.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/stars.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/stars.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/stellar_phenomenon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/stellar_phenomenon.png
--------------------------------------------------------------------------------
/wallpapers/images/art/kurzgesagt/unknown_lifeform.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/kurzgesagt/unknown_lifeform.png
--------------------------------------------------------------------------------
/wallpapers/images/art/willow_and_sundew.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/art/willow_and_sundew.jpg
--------------------------------------------------------------------------------
/wallpapers/images/photography/lake.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/photography/lake.jpg
--------------------------------------------------------------------------------
/wallpapers/images/photography/leaves_with_droplets.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/photography/leaves_with_droplets.jpg
--------------------------------------------------------------------------------
/wallpapers/images/photography/macro_mushrooms.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/photography/macro_mushrooms.jpg
--------------------------------------------------------------------------------
/wallpapers/images/photography/mountains.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/photography/mountains.jpg
--------------------------------------------------------------------------------
/wallpapers/images/photography/sandstone.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/photography/sandstone.jpg
--------------------------------------------------------------------------------
/wallpapers/images/photography/trees_mountain_fog_1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/photography/trees_mountain_fog_1.jpg
--------------------------------------------------------------------------------
/wallpapers/images/photography/trees_mountain_fog_2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/photography/trees_mountain_fog_2.jpg
--------------------------------------------------------------------------------
/wallpapers/images/photography/trees_mountain_fog_3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/images/photography/trees_mountain_fog_3.jpg
--------------------------------------------------------------------------------
/wallpapers/pixel/art/animated_street_night.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/pixel/art/animated_street_night.gif
--------------------------------------------------------------------------------
/wallpapers/pixel/art/waterfall.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/pixel/art/waterfall.jpg
--------------------------------------------------------------------------------
/wallpapers/pixel/gaming/stardew_valley_map.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/42willow/wallpapers/36c6dee655f04e8ea0e10aa00b2978fff781c09b/wallpapers/pixel/gaming/stardew_valley_map.png
--------------------------------------------------------------------------------