Summary
+I am a Kiwi living in Australia and studying a Bachelor of Science at The + University of Melbourne.
+From 15c5cf1a3eb453ab2888f479d08177ba83df906b Mon Sep 17 00:00:00 2001 From: wi11-holdsworth <83637728+wi11-holdsworth@users.noreply.github.com> Date: Wed, 28 May 2025 01:13:32 +1000 Subject: [PATCH] hand code posts --- .gitignore | 1 - CNAME | 1 - LICENSE | 121 ----------- Makefile | 204 ------------------ README.md | 1 - about.html | 37 ++++ articles/dufs.md | 80 ------- articles/welcome.md | 18 -- ...8-leveraging-nixos-dufs-cloud-storage.html | 154 +++++++++++++ blog/@all.html | 1 - blog/@cloud-storage.html | 1 - blog/@cloud.html | 1 - blog/@hosting,.html | 1 - blog/@nixos,.html | 1 - blog/@nixos.html | 1 - blog/@self-hosting.html | 1 - blog/@self.html | 1 - blog/@storage,.html | 1 - blog/@tailscale.html | 1 - blog/atom.xml | 27 --- blog/dufs.html | 95 -------- blog/index.html | 41 +++- blog/rss.xml | 22 -- blog/welcome.html | 23 -- config | 7 - contact.html | 42 ++++ flake.lock | 57 ----- flake.nix | 16 -- index.html | 36 ++++ projects/index.html | 35 +++ public/img/HAND_CODED.gif | Bin 0 -> 5196 bytes public/img/InternetPrivacy.gif | Bin 0 -> 7418 bytes public/img/anybrowser.png | Bin 0 -> 405 bytes public/img/js.png | Bin 0 -> 1527 bytes public/img/kendrick.gif | Bin 0 -> 3303 bytes public/img/nocookie.png | Bin 0 -> 587 bytes shell.nix | 8 - style.css | 23 ++ tags/dufs | 4 - tags/welcome | 0 templates/article_entry.html | 1 - templates/article_footer.html | 1 - templates/article_header.html | 1 - templates/article_list_footer.html | 1 - templates/article_list_header.html | 1 - templates/article_separator.html | 0 templates/footer.html | 1 - templates/header.html | 1 - templates/index_footer.html | 1 - templates/index_header.html | 1 - templates/tag_entry.html | 1 - templates/tag_index_footer.html | 1 - templates/tag_index_header.html | 1 - templates/tag_list_footer.html | 1 - templates/tag_list_header.html | 1 - templates/tag_separator.html | 1 - 56 files changed, 367 insertions(+), 711 deletions(-) delete mode 100644 .gitignore delete mode 100644 CNAME delete mode 100644 LICENSE delete mode 100644 Makefile delete mode 100644 README.md create mode 100644 about.html delete mode 100644 articles/dufs.md delete mode 100644 articles/welcome.md create mode 100644 blog/2025/01/28-leveraging-nixos-dufs-cloud-storage.html delete mode 100644 blog/@all.html delete mode 100644 blog/@cloud-storage.html delete mode 100644 blog/@cloud.html delete mode 100644 blog/@hosting,.html delete mode 100644 blog/@nixos,.html delete mode 100644 blog/@nixos.html delete mode 100644 blog/@self-hosting.html delete mode 100644 blog/@self.html delete mode 100644 blog/@storage,.html delete mode 100644 blog/@tailscale.html delete mode 100644 blog/atom.xml delete mode 100644 blog/dufs.html delete mode 100644 blog/rss.xml delete mode 100644 blog/welcome.html delete mode 100644 config create mode 100644 contact.html delete mode 100644 flake.lock delete mode 100644 flake.nix create mode 100644 index.html create mode 100644 projects/index.html create mode 100644 public/img/HAND_CODED.gif create mode 100644 public/img/InternetPrivacy.gif create mode 100644 public/img/anybrowser.png create mode 100644 public/img/js.png create mode 100644 public/img/kendrick.gif create mode 100644 public/img/nocookie.png delete mode 100644 shell.nix create mode 100644 style.css delete mode 100644 tags/dufs delete mode 100644 tags/welcome delete mode 100644 templates/article_entry.html delete mode 100644 templates/article_footer.html delete mode 100644 templates/article_header.html delete mode 100644 templates/article_list_footer.html delete mode 100644 templates/article_list_header.html delete mode 100644 templates/article_separator.html delete mode 100644 templates/footer.html delete mode 100644 templates/header.html delete mode 100644 templates/index_footer.html delete mode 100644 templates/index_header.html delete mode 100644 templates/tag_entry.html delete mode 100644 templates/tag_index_footer.html delete mode 100644 templates/tag_index_header.html delete mode 100644 templates/tag_list_footer.html delete mode 100644 templates/tag_list_header.html delete mode 100644 templates/tag_separator.html diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 527238f..0000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -tags/ diff --git a/CNAME b/CNAME deleted file mode 100644 index e26b5ea..0000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -fi33.buzz \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 0e259d4..0000000 --- a/LICENSE +++ /dev/null @@ -1,121 +0,0 @@ -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. diff --git a/Makefile b/Makefile deleted file mode 100644 index 9353745..0000000 --- a/Makefile +++ /dev/null @@ -1,204 +0,0 @@ -#!/usr/bin/make -f - -BLOG := $(MAKE) -f $(lastword $(MAKEFILE_LIST)) --no-print-directory -ifneq ($(filter-out help,$(MAKECMDGOALS)),) -include config -endif - -# The following can be configured in config -BLOG_DATE_FORMAT_INDEX ?= %x -BLOG_DATE_FORMAT ?= %x %X -BLOG_TITLE ?= blog -BLOG_DESCRIPTION ?= blog -BLOG_URL_ROOT ?= http://localhost/blog -BLOG_FEED_MAX ?= 20 -BLOG_FEEDS ?= rss atom -BLOG_SRC ?= articles - - -.PHONY: help init build deploy clean - -ARTICLES = $(shell git ls-tree HEAD --name-only -- $(BLOG_SRC)/ 2>/dev/null) -TAGFILES = $(patsubst $(BLOG_SRC)/%.md,tags/%,$(ARTICLES)) - -help: - $(info blogit init|build|deploy|clean) - -init: - mkdir -p $(BLOG_SRC) data templates - printf '
tags: ' > templates/tag_list_header.html - printf '#$$NAME' > templates/tag_entry.html - printf ', ' > templates/tag_separator.html - printf '
' > templates/tag_list_footer.html - printf 'posted: $$DATE_POSTED
edited: $$DATE_EDITED
,;bT}' \
- -e 'x;/<\/code>/{x;s,\$$,\$,g;$$G;p;d};x' \
- -e 's,\\\$$,\$,g' \
- -e '/^####/{s,^####,,;s,$$,
,;H;s,.*,,;x;p;d}' \
- -e '/^###/{s,^###,,;s,$$,
,;H;s,.*,,;x;p;d}' \
- -e '/^##/{s,^##,,;s,$$,
,;H;s,.*,,;x;p;d}' \
- -e '/^#/{s,^#,,;s,$$,
,;H;s,.*,,;x;p;d}' \
- -e 's,`\([^`]*\)`,\1,g' \
- -e 's,\*\*\(\([^*<>][^*<>]*\*\?\)*\)\*\*,\1,g' \
- -e 's,\*\([^*<>][^*<>]*\)\*,\1,g' \
- -e 's,!\[\([^]]*\)\](\([^)]*\)),
,g' \
- -e 's,\[\([^]]*\)\](\([^)]*\)),\1,g' \
- -e '/^- /{s,^- ,,;s,$$, ,;x;/^<\/ul>/{x;bL};p;s,.*,,;bT}' \
- -e '/^[1-9][0-9]*\. /{s,^[0-9]*\. ,- ,;s,$$,
,;x;/^<\/ol>/{x;bL};p;s,.*,,;bT}' \
- -e '/^$$/{x;/^$$/d;p;d}' \
- -e 'x;/^$$/{s,.*,,;bT};x' \
- -e ':L;$$G;p;d' \
- -e ':T;p;:t;s,<\([^/>][^>]*\)>\(\(<[^/>][^>]*>\)*\),\2\1>,;/<[^\/>]/bt;x;/^$$/{$${x;p};d};bL' \
- "$<" | envsubst >> $@; \
- envsubst < templates/article_footer.html >> $@; \
- envsubst < templates/footer.html >> $@; \
-
-blog/rss.xml: $(ARTICLES)
- printf '\n\n\n%s \n%s\n%s \n' \
- "$(BLOG_TITLE)" "$(BLOG_URL_ROOT)" "$(BLOG_DESCRIPTION)" > $@
- for f in $(ARTICLES); do \
- printf '%s ' "$$f"; \
- git log --diff-filter=A --date="format:%s %a, %d %b %Y %H:%M:%S %z" --pretty=format:'%ad%n' -- "$$f"; \
- done | sort -k2nr | head -n $(BLOG_FEED_MAX) | cut -d" " -f1,3- | while IFS=" " read -r FILE DATE; do \
- printf '- \n
%s \n%s\n%s \n%s \n%s \n \n' \
- "`head -n 1 $$FILE`" \
- "$(BLOG_URL_ROOT)/`basename $$FILE .md`.html" \
- "$(BLOG_URL_ROOT)/`basename $$FILE .md`.html" \
- "$$DATE" \
- "`sed -n '1d;/^$$/{2{d;b};q};p' < $$FILE`"; \
- done >> $@
- printf ' \n \n' >> $@
-
-blog/atom.xml: $(ARTICLES)
- printf '\n\n%s \n%s \n%s \n\n%s \n\n' \
- "$(BLOG_TITLE)" "$(BLOG_DESCRIPTION)" "$(shell date +%Y-%m-%dT%H:%M:%SZ)" "$(BLOG_URL_ROOT)" "$(BLOG_URL_ROOT)/atom.xml" "$(BLOG_URL_ROOT)/atom.xml" > $@
- for f in $(ARTICLES); do \
- printf '%s ' "$$f"; \
- git log --diff-filter=A --date="format:%s %Y-%m-%dT%H:%M:%SZ" --pretty=format:'%ad %aN%n' -- "$$f"; \
- done | sort -k2nr | head -n $(BLOG_FEED_MAX) | cut -d" " -f1,3- | while IFS=" " read -r FILE DATE AUTHOR; do \
- printf '\n%s \n\n%s \n%s \n%s \n%s \n%s \n \n' \
- "`head -n 1 $$FILE`" \
- "$(BLOG_URL_ROOT)/`basename $$FILE .md`.html" \
- "$(BLOG_URL_ROOT)/`basename $$FILE .md`.html" \
- "$$DATE" \
- "`git log -n 1 --date="format:%Y-%m-%dT%H:%M:%SZ" --pretty=format:'%ad' -- "$$FILE"`" \
- "$$AUTHOR" \
- "`sed -n '1d;/^$$/{2{d;b};q};p' < $$FILE`"; \
- done >> $@
- printf ' \n' >> $@
-
diff --git a/README.md b/README.md
deleted file mode 100644
index 8b45c9d..0000000
--- a/README.md
+++ /dev/null
@@ -1 +0,0 @@
-my personal fork of [blogit](https://pedantic.software/git/blogit)
diff --git a/about.html b/about.html
new file mode 100644
index 0000000..0c26a8c
--- /dev/null
+++ b/about.html
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+ Document
+
+
+
+
+ Will Holdsworth
+
+
+
+
+
+ Summary
+ I am a Kiwi living in Australia and studying a Bachelor of Science at The
+ University of Melbourne.
+
+
+
+
+
\ No newline at end of file
diff --git a/articles/dufs.md b/articles/dufs.md
deleted file mode 100644
index f2bfab5..0000000
--- a/articles/dufs.md
+++ /dev/null
@@ -1,80 +0,0 @@
-quick and easy cloud storage with dufs and nixos
-
-dufs[1] -- the distinctive file utility server -- is a decent cloud storage replacement for those looking to move away from third-party services like google drive or proton drive. it supports webdav and https file transfer protocols.
-
-it's very easy to set up and get going in nixos using a docker container.
-
-## set up dufs
-
-first, enable docker in your `configuration.nix`:
-```
-virtualisation.docker.enable = true;
-```
-
-then define a docker container, either in your `configuration.nix` or in a custom module:
-```
-virtualisation.oci-containers = {
- backend = "docker";
-
- containers.dufs = {
- # automatically restart server after reboot
- autoStart = true;
-
- image = "sigoden/dufs";
-
- ports = [
- "5000:5000"
- ];
-
- # the files i want to serve are in /srv/dufs
- volumes = [
- "/srv/dufs:/data"
- ];
-
- # tells dufs to serve the files in the docker volume /data
- cmd = [
- "-A"
- "/data"
- ];
- };
-};
-```
-
-rebuild your configuration using `nixos-rebuild switch` and head on over to `http://localhost:5000` to behold your lovely files.
-
-## set up tailscale
-
-you can use tailscale[2] to access the files on other devices inside (and outside) of your home network. tailscale is like a crazy-fast vpn with a bunch of other comfort features like magic dns[3], keyless ssh[4] and easy https[5].
-
-to enable it in nixos, add the following to your `configuration.nix`:
-```
-services.tailscale.enable = true;
-networking.firewall.trustedInterfaces = [ "tailscale0" ];
-```
-
-once again, rebuild your configuration using `nixos-rebuild switch` and run `tailscale up` to start tailscale.
-
-i recommend enabling magic dns in admin console > dns > magic dns, but if you prefer not to, your server's ip address will be visible by running `tailscale ip -4`.
-
-head over to `http://:5000` on one of your other machines running tailscale to upload, download, and view your self-hosted files.
-
-## dufs clients
-
-as for client recommendations, round sync[6] on android is quite good. it supports both webdav and https remotes, i chose to use webdav when connecting.
-
-thanks for stopping by ^.^
-
-[1] [dufs](https://github.com/sigoden/dufs)
-
-[2] [tailscale](https://tailscale.com/)
-
-[3] [magic dns](https://tailscale.com/kb/1081/magicdns)
-
-[4] [tailscale ssh](https://tailscale.com/kb/1193/tailscale-ssh)
-
-[5] [tailscale https](https://tailscale.com/kb/1153/enabling-https)
-
-[6] [round sync](https://github.com/newhinton/Round-Sync)
-
-;tags: self-hosting cloud-storage nixos tailscale
-
diff --git a/articles/welcome.md b/articles/welcome.md
deleted file mode 100644
index 532ea14..0000000
--- a/articles/welcome.md
+++ /dev/null
@@ -1,18 +0,0 @@
-welcome!
-
-the static site generator i'm using to kickstart this blog[1] requires a single post to exist in order to compile, and failing to provide a post sends `make` into an infinite loop.
-
-so without further ado... here it is, my first post!
-
-topics to expect once i get myself more organised:
-
-- basic tutorials on setting up self-hosted nixos web services
-- lazy hardware reviews
-- software shenanigans
-- anything else i feel is relevant and useful to the wider web
-
-thanks for stopping by ^.^
-
-[1] [blogit](https://pedantic.software/git/blogit)
-
-;tags:
diff --git a/blog/2025/01/28-leveraging-nixos-dufs-cloud-storage.html b/blog/2025/01/28-leveraging-nixos-dufs-cloud-storage.html
new file mode 100644
index 0000000..ddf974e
--- /dev/null
+++ b/blog/2025/01/28-leveraging-nixos-dufs-cloud-storage.html
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+ Document
+
+
+
+
+ Will Holdsworth
+
+
+
+
+
+
+ Quick & easy cloud storage with dufs and NixOS
+
+ dufs1 (the distinctive file
+ utility server) is a cloud storage replacement for those looking to move away from third-party services like
+ Google Drive or Proton Drive. it supports WebDAV and HTTPS file transfer protocols.
+
+ It's very easy to set up and get going in NixOS using a Docker container.
+
+ Set up dufs
+ First, enable docker in your configuration.nix:
+
+
+ virtualisation.docker.enable = true;
+
+
+ Then define a Docker container, either in your configuration.nix or in a custom module:
+
+
+ virtualisation.oci-containers = {
+ backend = "docker";
+ containers.dufs = {
+
+ # automatically restart server after reboot
+ autoStart = true;
+
+ image = "sigoden/dufs";
+
+ ports = [
+ "5000:5000"
+ ];
+
+ # the files i want to serve are in /srv/dufs
+ volumes = [
+ "/srv/dufs:/data"
+ ];
+
+ # tells dufs to serve the files in the docker volume /data
+ cmd = [
+ "-A"
+ "/data"
+ ];
+ };
+ };
+
+
+ Rebuild your configuration by running sudo nixos-rebuild switch and head on over to
+ http://localhost:5000 to behold your lovely files. Now we need a method to access our files on other
+ devices inside (and outside) of our home network. Tailscale2 provides commands to accomplish this easily.
+
+ Set up Tailscale
+
+ You can use Tailscale to access the files on other devices inside (and outside) of your home network. Tailscale is
+ like a crazy-fast vpn with a bunch of other comfort features like MagicDNS3, keyless SSH4 and
+ easy HTTPS5.
+
+ To enable it in nixos, add the following to your configuration.nix:
+
+
+ services.tailscale.enable = true;
+ networking.firewall.trustedInterfaces = [ "tailscale0" ];
+
+
+
+ Once again, rebuild your configuration by running sudo nixos-rebuild switch and run
+ tailscale up to start tailscale. The tailscale connection will persist on reboot, so no need to worry
+ about adding it to your init process.
+
+
+ I recommend enabling MagicDNS in the admin console > DNS > MagicDNS, but if you prefer not to, your server's IP
+ address will be visible by running tailscale ip -4.
+
+
+ Head over to http://<hostname or ip>:5000 on one of your other machines running tailscale to
+ upload,
+ download, and view your self-hosted files.
+
+
+ dufs clients
+
+ As for client recommendations, Round Sync6 on android is quite good. it supports both WebDAV and HTTPS remotes, I
+ chose to use WebDAV when connecting.
+
+
+ Thanks for stopping by ^.^
+
+ Footnotes
+
+ -
+ dufs
+ ↩
+
+ -
+ Tailscale
+ ↩
+
+ -
+ MagicDNS
+ ↩
+
+ -
+ Tailscale SSH
+ ↩
+
+ -
+ Tailscale HTTPS
+ ↩
+
+ -
+ Round Sync
+ ↩
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/blog/@all.html b/blog/@all.html
deleted file mode 100644
index 0a0d7a6..0000000
--- a/blog/@all.html
+++ /dev/null
@@ -1 +0,0 @@
-Articles tagged all #all
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
- 2025/01/27 - welcome!
\ No newline at end of file
diff --git a/blog/@cloud-storage.html b/blog/@cloud-storage.html
deleted file mode 100644
index e87ae00..0000000
--- a/blog/@cloud-storage.html
+++ /dev/null
@@ -1 +0,0 @@
-Articles tagged cloud-storage #cloud-storage
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
\ No newline at end of file
diff --git a/blog/@cloud.html b/blog/@cloud.html
deleted file mode 100644
index e55e0c7..0000000
--- a/blog/@cloud.html
+++ /dev/null
@@ -1 +0,0 @@
-Articles tagged cloud #cloud
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
\ No newline at end of file
diff --git a/blog/@hosting,.html b/blog/@hosting,.html
deleted file mode 100644
index 0612013..0000000
--- a/blog/@hosting,.html
+++ /dev/null
@@ -1 +0,0 @@
-Articles tagged hosting, #hosting,
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
\ No newline at end of file
diff --git a/blog/@nixos,.html b/blog/@nixos,.html
deleted file mode 100644
index 3212840..0000000
--- a/blog/@nixos,.html
+++ /dev/null
@@ -1 +0,0 @@
-Articles tagged nixos, #nixos,
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
\ No newline at end of file
diff --git a/blog/@nixos.html b/blog/@nixos.html
deleted file mode 100644
index f94883c..0000000
--- a/blog/@nixos.html
+++ /dev/null
@@ -1 +0,0 @@
-Articles tagged nixos #nixos
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
\ No newline at end of file
diff --git a/blog/@self-hosting.html b/blog/@self-hosting.html
deleted file mode 100644
index 130bab3..0000000
--- a/blog/@self-hosting.html
+++ /dev/null
@@ -1 +0,0 @@
-Articles tagged self-hosting #self-hosting
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
\ No newline at end of file
diff --git a/blog/@self.html b/blog/@self.html
deleted file mode 100644
index 69fc270..0000000
--- a/blog/@self.html
+++ /dev/null
@@ -1 +0,0 @@
-Articles tagged self #self
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
\ No newline at end of file
diff --git a/blog/@storage,.html b/blog/@storage,.html
deleted file mode 100644
index 53604d3..0000000
--- a/blog/@storage,.html
+++ /dev/null
@@ -1 +0,0 @@
-Articles tagged storage, #storage,
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
\ No newline at end of file
diff --git a/blog/@tailscale.html b/blog/@tailscale.html
deleted file mode 100644
index a4d3581..0000000
--- a/blog/@tailscale.html
+++ /dev/null
@@ -1 +0,0 @@
-Articles tagged tailscale #tailscale
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
\ No newline at end of file
diff --git a/blog/atom.xml b/blog/atom.xml
deleted file mode 100644
index 93dbf59..0000000
--- a/blog/atom.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-will holdsworth's blog
-blog
-2025-01-28T19:06:19Z
-
-https://fi33.buzz/atom.xml
-
-
-quick and easy cloud storage with dufs and nixos
-
-https://fi33.buzz/dufs.html
-2025-01-28T18:41:39Z
-2025-01-28T19:05:53Z
-wi11-holdsworth
-dufs[1] -- the distinctive file utility server -- is a decent cloud storage replacement for those looking to move away from third-party services like google drive or proton drive. it supports webdav and https file transfer protocols.
-
-
-welcome!
-
-https://fi33.buzz/welcome.html
-2025-01-27T22:16:57Z
-2025-01-27T23:11:05Z
-wi11-holdsworth
-the static site generator i'm using to kickstart this blog[1] requires a single post to exist in order to compile, and failing to provide a post sends `make` into an infinite loop.
-
-
diff --git a/blog/dufs.html b/blog/dufs.html
deleted file mode 100644
index 3965c7b..0000000
--- a/blog/dufs.html
+++ /dev/null
@@ -1,95 +0,0 @@
-quick and easy cloud storage with dufs and nixos will holdsworth's blog
quick and easy cloud storage with dufs and nixos
posted: 2025/01/28 18:41
edited: 2025/01/28 19:06
-dufs[1] -- the distinctive file utility server -- is a decent cloud storage replacement for those looking to move away from third-party services like google drive or proton drive. it supports webdav and https file transfer protocols.
-
-
-it's very easy to set up and get going in nixos using a docker container.
-
-
- set up dufs
-
-first, enable docker in your configuration.nix:
-
-
-virtualisation.docker.enable = true;
-
-
-then define a docker container, either in your configuration.nix or in a custom module:
-
-
-virtualisation.oci-containers = {
- backend = "docker";
-
- containers.dufs = {
- # automatically restart server after reboot
- autoStart = true;
-
- image = "sigoden/dufs";
-
- ports = [
- "5000:5000"
- ];
-
- # the files i want to serve are in /srv/dufs
- volumes = [
- "/srv/dufs:/data"
- ];
-
- # tells dufs to serve the files in the docker volume /data
- cmd = [
- "-A"
- "/data"
- ];
- };
-};
-
-
-rebuild your configuration using nixos-rebuild switch and head on over to http://localhost:5000 to behold your lovely files.
-
-
- set up tailscale
-
-you can use tailscale[2] to access the files on other devices inside (and outside) of your home network. tailscale is like a crazy-fast vpn with a bunch of other comfort features like magic dns[3], keyless ssh[4] and easy https[5].
-
-
-to enable it in nixos, add the following to your configuration.nix:
-
-
-services.tailscale.enable = true;
-networking.firewall.trustedInterfaces = [ "tailscale0" ];
-
-
-once again, rebuild your configuration using nixos-rebuild switch and run tailscale up to start tailscale.
-
-
-i recommend enabling magic dns in admin console > dns > magic dns, but if you prefer not to, your server's ip address will be visible by running tailscale ip -4.
-
-
-head over to http://<hostname or ip>:5000 on one of your other machines running tailscale to upload, download, and view your self-hosted files.
-
-
- dufs clients
-
-as for client recommendations, round sync[6] on android is quite good. it supports both webdav and https remotes, i chose to use webdav when connecting.
-
-
-thanks for stopping by ^.^
-
-
-[1] dufs
-
-
-[2] tailscale
-
-
-[3] magic dns
-
-
-[4] tailscale ssh
-
-
-[5] tailscale https
-
-
-[6] round sync
-
-
\ No newline at end of file
diff --git a/blog/index.html b/blog/index.html
index f4a263d..a8a8811 100644
--- a/blog/index.html
+++ b/blog/index.html
@@ -1 +1,40 @@
-will holdsworth's blog will holdsworth's blog
tags: #cloud-storage, #nixos, #self-hosting, #tailscale
posts
- 2025/01/28 - quick and easy cloud storage with dufs and nixos
- 2025/01/27 - welcome!
\ No newline at end of file
+
+
+
+
+
+
+
+ Document
+
+
+
+
+ Will Holdsworth
+
+
+
+
+
+ Posts
+
+ - 2025-01-28 | Quick and easy cloud storage
+ with dufs and NixOS
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/blog/rss.xml b/blog/rss.xml
deleted file mode 100644
index 2473d2c..0000000
--- a/blog/rss.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
-will holdsworth's blog
-https://fi33.buzz
-blog
--
-
quick and easy cloud storage with dufs and nixos
-https://fi33.buzz/dufs.html
-https://fi33.buzz/dufs.html
-Tue, 28 Jan 2025 18:41:39 +1100
-dufs[1] -- the distinctive file utility server -- is a decent cloud storage replacement for those looking to move away from third-party services like google drive or proton drive. it supports webdav and https file transfer protocols.
-
--
-
welcome!
-https://fi33.buzz/welcome.html
-https://fi33.buzz/welcome.html
-Mon, 27 Jan 2025 22:16:57 +1100
-the static site generator i'm using to kickstart this blog[1] requires a single post to exist in order to compile, and failing to provide a post sends `make` into an infinite loop.
-
-
-
diff --git a/blog/welcome.html b/blog/welcome.html
deleted file mode 100644
index 2b2742a..0000000
--- a/blog/welcome.html
+++ /dev/null
@@ -1,23 +0,0 @@
-welcome! will holdsworth's blog
welcome!
posted: 2025/01/27 22:16
edited: 2025/01/28 19:06
-the static site generator i'm using to kickstart this blog[1] requires a single post to exist in order to compile, and failing to provide a post sends make into an infinite loop.
-
-
-so without further ado... here it is, my first post!
-
-
-topics to expect once i get myself more organised:
-
-
-
-- basic tutorials on setting up self-hosted nixos web services
-- lazy hardware reviews
-- software shenanigans
-- anything else i feel is relevant and useful to the wider web
-
-
-thanks for stopping by ^.^
-
-
-[1] blogit
-
-
diff --git a/config b/config
deleted file mode 100644
index a36760b..0000000
--- a/config
+++ /dev/null
@@ -1,7 +0,0 @@
-BLOG_REMOTE:=opal:/srv/fi33buzz
-BLOG_DATE_FORMAT:=%Y/%m/%d %H:%M
-BLOG_DATE_FORMAT_INDEX:=%Y/%m/%d
-BLOG_TITLE:=will holdsworth's blog
-BLOG_URL_ROOT:=https://fi33.buzz
-BLOG_FEED_MAX:=20
-BLOG_FEEDS:=rss atom
diff --git a/contact.html b/contact.html
new file mode 100644
index 0000000..6806545
--- /dev/null
+++ b/contact.html
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+ Document
+
+
+
+
+ Will Holdsworth
+
+
+
+
+
+ Email Address
+ This forwarding address is provided by DuckDuckGo and is periodically
+ regenerated to reduce spam.
+ canyon-scary-tutu@duck.com
+ Social Media
+ I currently use social media exclusively among close friends. If this ever changes, I will add some links.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/flake.lock b/flake.lock
deleted file mode 100644
index 7ce6dc3..0000000
--- a/flake.lock
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "nodes": {
- "flake-utils": {
- "inputs": {
- "systems": "systems"
- },
- "locked": {
- "lastModified": 1731533236,
- "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
- "owner": "numtide",
- "repo": "flake-utils",
- "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
- "type": "github"
- },
- "original": {
- "owner": "numtide",
- "repo": "flake-utils",
- "type": "github"
- }
- },
- "nixpkgs": {
- "locked": {
- "lastModified": 0,
- "narHash": "sha256-nmKOgAU48S41dTPIXAq0AHZSehWUn6ZPrUKijHAMmIk=",
- "path": "/nix/store/irknf7niks2djxz4csh7sr44wwrs082y-source",
- "type": "path"
- },
- "original": {
- "id": "nixpkgs",
- "type": "indirect"
- }
- },
- "root": {
- "inputs": {
- "flake-utils": "flake-utils",
- "nixpkgs": "nixpkgs"
- }
- },
- "systems": {
- "locked": {
- "lastModified": 1681028828,
- "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
- "owner": "nix-systems",
- "repo": "default",
- "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
- "type": "github"
- },
- "original": {
- "owner": "nix-systems",
- "repo": "default",
- "type": "github"
- }
- }
- },
- "root": "root",
- "version": 7
-}
diff --git a/flake.nix b/flake.nix
deleted file mode 100644
index c996dab..0000000
--- a/flake.nix
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- inputs.flake-utils.url = "github:numtide/flake-utils";
-
- outputs = {
- nixpkgs,
- flake-utils,
- ...
- }:
- flake-utils.lib.eachDefaultSystem
- (system:
- let pkgs = nixpkgs.legacyPackages.${system}; in
- {
- devShells.default = import ./shell.nix { inherit pkgs; };
- }
- );
-}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..d1eed37
--- /dev/null
+++ b/index.html
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+ Document
+
+
+
+
+ Will Holdsworth
+
+
+
+
+
+ 🚧 Page under construction 🚧
+
+
+
+
+
\ No newline at end of file
diff --git a/projects/index.html b/projects/index.html
new file mode 100644
index 0000000..173132e
--- /dev/null
+++ b/projects/index.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+ Document
+
+
+
+
+ Will Holdsworth
+
+
+
+
+
+ 🚧 Page under construction 🚧
+
+
+
+
+
\ No newline at end of file
diff --git a/public/img/HAND_CODED.gif b/public/img/HAND_CODED.gif
new file mode 100644
index 0000000000000000000000000000000000000000..73c1a239647f5322a1250eedc7d74b432a3d00b2
GIT binary patch
literal 5196
zcmZ?wbhEHbj9`#w_|CwfprD|pruH8M7)HTp2#mB4Q2fvB=Nc01>=@u`q-Vg)$iTp$
z_>+axh=G|w2NV{dY{J0tkAaax#$&^RgUuYmS}`XkBs8=ONPErk*r;@vLCiSo&WVkS
zkM}D$cgbi5Hh8u%1OkRdDk8S*{b8
zmCP(&5j@XxvC!14D+$3%JvL|ESA6}0h3oU3?EYTWi&~a!Io($)JSXZx#ZsYXx__33KHB&H-!fnG
z?Vq0=6#wlew=M6?%NrN3^~Krl%w2Y7srY5tdB4|Y&)R%;`>~&vn}2`*@c8t6drJk(
zplTm2Pe7?=6pz#p80kfY1WHj+{Or)X$EWA}#}_#;SdY{sG3xKp5Eu=C(GVC7fzc2c
R4S~@R7!85Z5Ew2Y004ZUE%yKb
literal 0
HcmV?d00001
diff --git a/public/img/InternetPrivacy.gif b/public/img/InternetPrivacy.gif
new file mode 100644
index 0000000000000000000000000000000000000000..4f371b838786cab6d72d37cec2324e30ff60d7b9
GIT binary patch
literal 7418
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
literal 0
HcmV?d00001
diff --git a/public/img/js.png b/public/img/js.png
new file mode 100644
index 0000000000000000000000000000000000000000..61ce5cb31e21015f87774d4cb31d1ccdb72176bd
GIT binary patch
literal 1527
zcmeAS@N?(olHy`uVBq!ia0y~yV2EH~V36lvW?*0l5&LzCfq|JJz$e6&fq{WRgMq<<
zfy07t)frCejfkTUhM~g*3fk!}#
zg-4HtLyL#O6pt?)5&Jx^MC&PplQVCgocVL-%9}TL{yh2e=FOi!e?Tc}=wK_+JT(Re2F?PH$YKTtZXpn6ymYtj
z4+8_!Tu&Fr5Rc
z7QG;bpd(kl$C)RenO`tb?~>ZlUZFpg2lk(-ncVWX&d=bRj$YG4PQym-m)kb#WLhq%
z2)wDqJabB+_agtLXV@6DpUx<9&s_fEWXq*Xc?X(%lB4{K8ltYP_R-Xqme(lkcLOa%GJ4ODP!kTlp+AX&EvdEPe
zu5Rl~pS7$F>rTJdbvVg2>`2y(gMYYePAswLiCb~a+AuY0gQjTo0`Cj`XBXQWG(T1;
zH7=;OYw|Y~dveQX(v9kgmFhKWp-*-#wZ6gd)30~=s`$u<%-`=cb4#uk{@Q!_<=^j4
zeSSVO!&bWdI(UqI)s%p}UipnbS=v^ui0Rs;KX*;{H>=CjU7zZ-Y|~h=a^AX9!v@`D
zbIt!>XR6C6_$OmkTQjzth!s;Uxs~%|
z|4!`!y%#*9S2}IqnN)P@#(>m`{_vi2FlO1U+M_D^Y-XSM-Z9y6PkerB`~2s>Pjb$!
zpSv9-WEQbVlKU37ZcS$O#n>
zQhQ?ldY+lQ$zKffbrRmsao6E!>SwJHOtPBLT_ZDP^5p|zMQqG_@ePT#2OoCaW@OR-quf<5h;t#ZHjNUY_J`*hAzW<_3t
z?)9)evL`$5^0V1+R7w~yxgYs|&VSaL12KGE?m>O+ckmypK=~Y~`l&M#grBAA9P`P1LwPjSbVN{D{REuSDi)r!%%j`Lp#Y^47
za-8DogW`&dbE4gnTbwec1!cDcW%t!pBs5Kl%PnteX({$7Tjo{0HM)LvY44h@_UN9L
z{GOiTo+-tXy5gpE=FXUqwrFBzPfK-APxX|Z>S+@j=S-71U;b81&?uiL$@Y0jJpOP5aR
znX
@J^Q_Eg2
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
Vi?)=AwiF8{B?cxz0RaXEYXE&?#lrvq
literal 0
HcmV?d00001
diff --git a/public/img/nocookie.png b/public/img/nocookie.png
new file mode 100644
index 0000000000000000000000000000000000000000..3bc8237f5214e934afc7795144d13eab63bbe054
GIT binary patch
literal 587
zcmeAS@N?(olHy`uVBq!ia0y~yV2EH~V322FW?*2L_)PpV0|SFWfKP}kGXt|GBSVTD
z<8))j8!Qa}85sVnsjZF>JXx&&H6`-gWYary1OCsLarx%m|6nj%T<9zV0|RG)M`SSr
z1Gf+eGhVt|_lJRj@t~)RV~EA+ty4C7F*^#hJ!gH!TEn9KuqDK{x+B1gXX2Q$xx
z4?;^GnztTwiIrlwxcThP&%3#vPjvga1c`F6PXCAQUtz6}Q}wpX3+ctPz*X63ov3y?OQC&K+e>pQZE_q!o{1Rj
z3Ok)v#ag$0?V^w$x7r>CbY0lIE%;NO_3DTw=f}#<8bAH3H-v7Bzopr0ImQKHUIzs
literal 0
HcmV?d00001
diff --git a/shell.nix b/shell.nix
deleted file mode 100644
index cf1447d..0000000
--- a/shell.nix
+++ /dev/null
@@ -1,8 +0,0 @@
-{ pkgs ? import {} }:
- pkgs.mkShell {
- nativeBuildInputs = with pkgs.buildPackages; [
- gnumake
- envsubst
- python312Packages.mat2
- ];
-}
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..fd7bbde
--- /dev/null
+++ b/style.css
@@ -0,0 +1,23 @@
+html {
+ background-color: #000;
+ color: #d9d9d9;
+ font-family: sans-serif;
+ font-size: large;
+ line-height: 1.4;
+ margin: 2em auto;
+ max-width: 800px;
+ padding: 1em;
+ scrollbar-gutter: stable both-edges;
+}
+
+a {
+ color: #00a2e7
+}
+
+a:visited {
+ color: #ca1a70
+}
+
+h1 {
+ font-family: serif;
+}
\ No newline at end of file
diff --git a/tags/dufs b/tags/dufs
deleted file mode 100644
index 8a3518a..0000000
--- a/tags/dufs
+++ /dev/null
@@ -1,4 +0,0 @@
-cloud-storage
-nixos
-self-hosting
-tailscale
diff --git a/tags/welcome b/tags/welcome
deleted file mode 100644
index e69de29..0000000
diff --git a/templates/article_entry.html b/templates/article_entry.html
deleted file mode 100644
index 858c6c4..0000000
--- a/templates/article_entry.html
+++ /dev/null
@@ -1 +0,0 @@
-- $DATE - $TITLE
\ No newline at end of file
diff --git a/templates/article_footer.html b/templates/article_footer.html
deleted file mode 100644
index b55125b..0000000
--- a/templates/article_footer.html
+++ /dev/null
@@ -1 +0,0 @@
-
posted: $DATE_POSTED
edited: $DATE_EDITED