diff options
author | Christian Cleberg <hello@cleberg.net> | 2024-03-29 01:30:23 -0500 |
---|---|---|
committer | Christian Cleberg <hello@cleberg.net> | 2024-03-29 01:30:23 -0500 |
commit | 41bd0ad58e44244fe67cb36e066d4bb68738516f (patch) | |
tree | 205e844650144648e58700df2b632c89298904d4 | |
parent | 797a1404213173791a5f4126a77ad383ceb00064 (diff) | |
download | cleberg.net-41bd0ad58e44244fe67cb36e066d4bb68738516f.tar.gz cleberg.net-41bd0ad58e44244fe67cb36e066d4bb68738516f.tar.bz2 cleberg.net-41bd0ad58e44244fe67cb36e066d4bb68738516f.zip |
massive re-write from org-publish to weblorg
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | README.org | 62 | ||||
-rw-r--r-- | blog/index.org | 141 | ||||
-rw-r--r-- | blog/org-blog/index.org | 71 | ||||
-rwxr-xr-x | build.sh | 3 | ||||
-rw-r--r-- | content/blog/2018-11-28-aes-encryption.org (renamed from blog/aes-encryption/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2018-11-28-cpp-compiler.org (renamed from blog/cpp-compiler/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2019-01-07-useful-css.org (renamed from blog/useful-css/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2019-09-09-audit-analytics.org (renamed from blog/audit-analytics/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2019-12-03-the-ansoff-matrix.org (renamed from blog/the-ansoff-matrix/index.org) | 43 | ||||
-rw-r--r-- | content/blog/2019-12-16-password-security.org (renamed from blog/password-security/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-01-25-linux-software.org (renamed from blog/linux-software/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-01-26-steam-on-ntfs.org (renamed from blog/steam-on-ntfs/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-02-09-cryptography-basics.org (renamed from blog/cryptography-basics/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-03-25-session-manager.org (renamed from blog/session-manager/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-05-03-homelab.org (renamed from blog/homelab/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-05-19-customizing-ubuntu.org (renamed from blog/customizing-ubuntu/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-07-20-video-game-sales.org (renamed from blog/video-game-sales/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-07-26-business-analysis.org (renamed from blog/business-analysis/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-08-22-redirect-github-pages.org (renamed from blog/redirect-github-pages/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-08-29-php-auth-flow.org (renamed from blog/php-auth-flow/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-09-01-visual-recognition.org (renamed from blog/visual-recognition/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-09-22-internal-audit.org (renamed from blog/internal-audit/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-09-25-happiness-map.org (renamed from blog/happiness-map/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-10-12-mediocrity.org (renamed from blog/mediocrity/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-12-27-website-redesign.org (renamed from blog/website-redesign/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-12-28-neon-drive.org (renamed from blog/neon-drive/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2020-12-29-zork.org (renamed from blog/zork/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-01-01-seum.org (renamed from blog/seum/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-01-04-fediverse.org (renamed from blog/fediverse/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-01-07-ufw.org (renamed from blog/ufw/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-02-19-macos.org (renamed from blog/macos/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-03-19-clone-github-repos.org (renamed from blog/clone-github-repos/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-03-28-gemini-capsule.org (renamed from blog/gemini-capsule/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-03-28-vaporwave-vs-outrun.org (renamed from blog/vaporwave-vs-outrun/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-03-30-vps-web-server.org (renamed from blog/vps-web-server/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-04-17-gemini-server.org (renamed from blog/gemini-server/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-04-23-php-comment-system.org (renamed from blog/php-comment-system/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-04-28-photography.org (renamed from blog/photography/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-05-30-changing-git-authors.org (renamed from blog/changing-git-authors/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-07-15-delete-gitlab-repos.org (renamed from blog/delete-gitlab-repos/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-08-25-audit-sampling.org (renamed from blog/audit-sampling/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-10-09-apache-redirect.org (renamed from blog/apache-redirect/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2021-12-04-cisa.org (renamed from blog/cisa/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-02-10-leaving-the-office.org (renamed from blog/leaving-the-office/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-02-10-njalla-dns-api.org (renamed from blog/njalla-dns-api/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-02-16-debian-and-nginx.org (renamed from blog/debian-and-nginx/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-02-17-exiftool.org (renamed from blog/exiftool/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-02-20-nginx-caching.org (renamed from blog/nginx-caching/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-02-22-tuesday.org (renamed from blog/tuesday/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-03-02-reliable-notes.org (renamed from blog/reliable-notes/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-03-03-financial-database.org (renamed from blog/financial-database/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-03-08-plex-migration.org (renamed from blog/plex-migration/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-03-23-cloudflare-dns-api.org (renamed from blog/cloudflare-dns-api/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-03-23-nextcloud-on-ubuntu.org (renamed from blog/nextcloud-on-ubuntu/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-03-24-server-hardening.org (renamed from blog/server-hardening/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-03-26-ssh-mfa.org (renamed from blog/ssh-mfa/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-04-02-nginx-reverse-proxy.org (renamed from blog/nginx-reverse-proxy/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-04-09-pinetime.org (renamed from blog/pinetime/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-06-01-ditching-cloudflare.org (renamed from blog/ditching-cloudflare/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-06-07-self-hosting-freshrss.org (renamed from blog/self-hosting-freshrss/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-06-16-terminal-lifestyle.org (renamed from blog/terminal-lifestyle/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-06-22-daily-poetry.org (renamed from blog/daily-poetry/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-06-24-fedora-i3.org (renamed from blog/fedora-i3/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-07-01-git-server.org (renamed from blog/git-server/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-07-14-gnupg.org (renamed from blog/gnupg/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-07-25-curseradio.org (renamed from blog/curseradio/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-07-30-flac-to-opus.org (renamed from blog/flac-to-opus/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-07-31-bash-it.org (renamed from blog/bash-it/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-08-31-privacy-com-changes.org (renamed from blog/privacy-com-changes/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-09-17-serenity-os.org (renamed from blog/serenity-os/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-09-21-graphene-os.org (renamed from blog/graphene-os/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-10-04-mtp-linux.org (renamed from blog/mtp-linux/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-10-04-syncthing.org (renamed from blog/syncthing/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-10-22-alpine-linux.org (renamed from blog/alpine-linux/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-10-30-linux-display-manager.org (renamed from blog/linux-display-manager/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-11-07-self-hosting-matrix.org (renamed from blog/self-hosting-matrix/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-11-11-nginx-tmp-errors.org (renamed from blog/nginx-tmp-errors/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-11-27-server-build.org (renamed from blog/server-build/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-11-29-nginx-referrer-ban-list.org (renamed from blog/nginx-referrer-ban-list/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-12-01-nginx-compression.org (renamed from blog/nginx-compression/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-12-07-nginx-wildcard-redirect.org (renamed from blog/nginx-wildcard-redirect/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-12-17-st.org (renamed from blog/st/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2022-12-23-alpine-desktop.org (renamed from blog/alpine-desktop/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-01-03-recent-website-changes.org (renamed from blog/recent-website-changes/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-01-05-mass-unlike-tumblr-posts.org (renamed from blog/mass-unlike-tumblr-posts/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-01-08-fedora-login-manager.org (renamed from blog/fedora-login-manager/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-01-21-flatpak-symlinks.org (renamed from blog/flatpak-symlinks/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-01-23-random-wireguard.org (renamed from blog/random-wireguard/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-01-28-self-hosting-wger.org (renamed from blog/self-hosting-wger/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-02-02-exploring-hare.org (renamed from blog/exploring-hare/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-05-22-burnout.org (renamed from blog/burnout/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-06-08-goaccess-geoip.org (renamed from blog/goaccess-geoip/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-06-08-self-hosting-baikal.org (renamed from blog/self-hosting-baikal/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-06-18-unifi-ip-blocklist.org (renamed from blog/unifi-ip-blocklist/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-06-20-audit-review-template.org (renamed from blog/audit-review-template/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-06-23-byobu.org (renamed from blog/byobu/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-06-23-self-hosting-convos.org (renamed from blog/self-hosting-convos/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-06-28-backblaze-b2.org (renamed from blog/backblaze-b2/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-06-30-self-hosting-voyager.org (renamed from blog/self-hosting-voyager/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-07-12-wireguard-lan.org (renamed from blog/wireguard-lan/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-07-19-plex-transcoder-errors.org (renamed from blog/plex-transcoder-errors/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-08-18-agile-auditing.org (renamed from blog/agile-auditing/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-09-15-self-hosting-gitweb.org (renamed from blog/self-hosting-gitweb/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-09-19-audit-sql-scripts.org (renamed from blog/audit-sql-scripts/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-10-04-digital-minimalism.org (renamed from blog/digital-minimalism/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-10-11-self-hosting-authelia.org (renamed from blog/self-hosting-authelia/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-10-15-alpine-ssh-hardening.org (renamed from blog/alpine-ssh-hardening/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-10-17-self-hosting-anonymousoverflow.org (renamed from blog/self-hosting-anonymousoverflow/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-11-08-scli.org (renamed from blog/scli/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2023-12-03-unifi-nextdns.org (renamed from blog/unifi-nextdns/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2024-01-08-dont-say-hello.org (renamed from blog/dont-say-hello/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2024-01-09-macos-customization.org (renamed from blog/macos-customization/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2024-01-13-local-llm.org (renamed from blog/local-llm/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2024-01-26-audit-dashboard.org (renamed from blog/audit-dashboard/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2024-01-27-tableau-dashboard.org (renamed from blog/tableau-dashboard/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2024-02-06-zfs.org (renamed from blog/zfs/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2024-02-13-ubuntu-emergency-mode.org (renamed from blog/ubuntu-emergency-mode/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2024-02-21-self-hosting-otter-wiki.org (renamed from blog/self-hosting-otter-wiki/index.org) | 0 | ||||
-rw-r--r-- | content/blog/2024-03-13-doom-emacs.org | 354 | ||||
-rw-r--r-- | content/blog/2024-03-15-self-hosting-ddns-updater.org | 314 | ||||
-rw-r--r-- | content/blog/2024-03-29-org-blog.org | 43 | ||||
-rw-r--r-- | content/index.org | 2 | ||||
-rw-r--r-- | content/salary/index.org (renamed from salary/index.org) | 12 | ||||
-rw-r--r-- | content/services/index.org (renamed from services/index.org) | 2 | ||||
-rw-r--r-- | content/wiki/blogroll.org | 32 | ||||
-rw-r--r-- | content/wiki/hardware.org | 114 | ||||
-rw-r--r-- | content/wiki/ios.org | 198 | ||||
-rw-r--r-- | content/wiki/macos.org | 192 | ||||
-rw-r--r-- | index.org | 28 | ||||
-rw-r--r-- | publish.el | 98 | ||||
-rw-r--r-- | static/styles.css | 807 | ||||
-rw-r--r-- | theme/static/gpg.txt | 52 | ||||
-rw-r--r-- | theme/static/robots.txt | 3 | ||||
-rw-r--r-- | theme/static/styles.css | 578 | ||||
-rw-r--r-- | theme/static/styles.min.css | 1 | ||||
-rw-r--r-- | theme/static/syntax-theme-dark.css (renamed from static/syntax-theme-dark.css) | 0 | ||||
-rw-r--r-- | theme/static/syntax-theme-light.css (renamed from static/syntax-theme-light.css) | 0 | ||||
-rw-r--r-- | theme/templates/atom.xml | 42 | ||||
-rw-r--r-- | theme/templates/base.html | 41 | ||||
-rw-r--r-- | theme/templates/blog.html | 14 | ||||
-rw-r--r-- | theme/templates/index.html | 41 | ||||
-rw-r--r-- | theme/templates/page.html | 11 | ||||
-rw-r--r-- | theme/templates/post.html | 30 | ||||
-rw-r--r-- | theme/templates/wiki.html | 17 | ||||
-rw-r--r-- | wiki/index.org | 145 |
146 files changed, 2214 insertions, 1280 deletions
@@ -1,3 +1,2 @@ .DS_Store -public/* -sitemap.org +.build @@ -5,54 +5,19 @@ [[https://cleberg.net][cleberg.net]] is my personal webpage. -This README is viewable on [[https://git.cleberg.net/cleberg.net.git/tree/README.org][cgit]] (raw), or on [[https://cleberg.net/README.html][my website]] (html). +This README is viewable on [[https://git.cleberg.net/cleberg.net.git/tree/README.org][rgit]]. ** Overview -This website & blog uses [[https://orgmode.org/][Org-Mode]], published with =org-publish=. +This website & blog uses [[https://orgmode.org/][Org-Mode]], published with [[https://github.com/emacs-love/weblorg][weblorg]]. ** Configuration -In order to configure the project for publishing, add the following code to your =~/.emacs= file (for Doom, =~/.doom.d/config.el=). - -#+begin_src lisp -;; org-publish -(require 'ox-publish) - -(setq org-publish-project-alist - `(("blog" - :base-directory "~/Source/cleberg.net/" - :base-extension "org" - :recursive t - :publishing-directory "~/Source/cleberg.net/public/" - :publishing-function org-html-publish-to-html) - ;; HTML5 - :html-doctype "html5" - :html-html5-fancy t - ;; Disable some Org's HTML defaults - :html-head-include-scripts nil - :html-head-include-default-style nil - ;; Generate sitemap - :auto-sitemap t - :sitemap-filename "sitemap.org" - ;; Customize head, preamble, & postamble - :html-head "<link rel='stylesheet' href='/static/styles.css' type='text/css'>" - :html-preamble "" - :html-postamble "" - ("static" - :base-directory "~/Source/cleberg.net/static/" - :base-extension "css\\|txt\\|jpg\\|gif\\|png" - :recursive t - :publishing-directory "~/Source/cleberg.net/public/" - :publishing-function org-publish-attachment) - - ("cleberg.net" :components ("blog" "static"))));; org-publish -(require 'ox-publish) -#+end_src +Everything is configured within the =publish.el= file. Refer to the weblorg documentation for further configuration options. ** Building -Local testing can be done via [[https://www.gnu.org/software/emacs/][Emacs]]. +Local testing can be done via [[https://www.gnu.org/software/emacs/][Emacs]] or through the command line. To get running: @@ -62,22 +27,21 @@ cd cleberg.net emacs -nw #+end_src -Within Emacs, open any of the repository files. In Doom, I do this with =Spc f f= and selecting =README.org=. Once a file has been opened, you can publish the project with =C-c C-e P a=. +Within Emacs, open any of the repository files. In Doom, I do this with =Spc f f= and selecting =README.org=. Make any changes necessary to customize the project. + +To publish, you can use the =build.sh= script (change the deployment target!) or you can run the following commands. -If you need to re-publish unchanged files, I recommend using the following command: +Use the =ENV= environment variable to determine which base URL weblorg will use. If ENV is ommitted, it will default to =localhost:8000=. If =ENV=prod=, weblorg will look in the =publish.el= file for the production base URL. -#+begin_src lisp -M-: (org-publish "project name" t) +#+begin_src sh +ENV=prod emacs --script publish.el #+end_src -The files will be published to the =public= directory. +The files will be published to the =.build= directory. You can deploy these files to the target through any number of methods, such as =scp= or SFTP. ** Tasks -*** TODO Create RSS feed -Possible Solution: [[https://writepermission.com/org-blogging-rss-feed.html][Org mode blogging: RSS feed]] -Possible Solution: [[https://www.zoraster.org/blog/script-to-generate-rss-feed][Script to Generate RSS Feeds]] +*** DONE Create RSS feed *** TODO Format all blog posts with =M q= -*** TODO Create script to auto-generate the =/blog/= list and =/= most recent posts -Possible Solution: [[https://taingram.org/blog/org-mode-blog.html#orgde61a58][Sitemap]] +*** DONE Create script to auto-generate the =/blog/= list and =/= most recent posts *** TODO Figure out how to get filetags to show up diff --git a/blog/index.org b/blog/index.org deleted file mode 100644 index b19030a..0000000 --- a/blog/index.org +++ /dev/null @@ -1,141 +0,0 @@ -#+title: Blog -#+options: toc:nil - -Use =Ctrl + F= to search blog post titles for keywords. - -* TODO Create RSS Feed - -* 2024 - -- 2024-02-26 [[./org-blog/][Blogging in Org-Mode]] -- 2024-02-21 [[./self-hosting-otter-wiki/][Self-Hosting An Otter Wiki]] -- 2024-02-13 [[./ubuntu-emergency-mode/][Stuck in Ubuntu's Emergency Mode? Try Fixing the Fstab File]] -- 2024-02-06 [[./zfs/][How to Create a ZFS Pool on Ubuntu Linux]] -- 2024-01-27 [[./tableau-dashboard/][Data Visualization: Mapping Omaha Crime Data with Tableau]] -- 2024-01-26 [[./audit-dashboard/][Building an Audit Status Dashboard]] -- 2024-01-13 [[./local-llm/][Running Local LLMs on macOS and iOS]] -- 2024-01-09 [[./macos-customization/][Customizing macOS]] -- 2024-01-08 [[./dont-say-hello/][Don't Say Hello]] - -* 2023 - -- 2023-12-03 [[./unifi-nextdns/][How to Install NextDNS on the Unifi Dream Machine]] -- 2023-11-08 [[./scli/][Installing scli on Alpine Linux (musl)]] -- 2023-10-17 [[./self-hosting-anonymousoverflow/][Self-Hosting AnonymousOverflow]] -- 2023-10-15 [[./alpine-ssh-hardening/][SSH Hardening for Alpine Linux]] -- 2023-10-11 [[./self-hosting-authelia/][Self-Hosting Authelia]] -- 2023-10-04 [[./digital-minimalism/][Digital Minimalism]] -- 2023-09-19 [[./audit-sql-scripts/][Useful SQL Scripts for Auditing Logical Access]] -- 2023-09-15 [[./self-hosting-gitweb/][Self-Hosting GitWeb via Nginx]] -- 2023-08-18 [[./agile-auditing/][Agile Auditing: An Introduction]] -- 2023-07-19 [[./plex-transcoder-errors/][How to Avoid Plex Error: 'Conversion failed. The transcoder failed to start up.']] -- 2023-07-12 [[./wireguard-lan/][Enable LAN Access in Mullvad Wireguard Conf Files]] -- 2023-06-30 [[./self-hosting-voyager/][Self-Hosting Voyager - A Lemmy Web Client]] -- 2023-06-28 [[./backblaze-b2/][Getting Started with Backblaze B2 Cloud Storage]] -- 2023-06-23 [[./self-hosting-convos/][Self-Hosting Convos IRC Web Client]] -- 2023-06-23 [[./byobu/][Byobu]] -- 2023-06-20 [[./audit-review-template/][Audit Testing Review Template]] -- 2023-06-18 [[./unifi-ip-blocklist/][Block IP Addresses and Subnets with Unifi Network Firewall]] -- 2023-06-08 [[./goaccess-geoip/][Inspecting Nginx Logs with GoAccess and MaxMind GeoIP Data]] -- 2023-06-08 [[./self-hosting-baikal/][Self-Hosting Baikal Server (CalDAV & CardDAV)]] -- 2023-05-22 [[./burnout/][RE: Burnout]] -- 2023-02-02 [[./exploring-hare/][Exploring the Hare Programming Language]] -- 2023-01-28 [[./self-hosting-wger/][Self-Hosting Wger Workout Manager]] -- 2023-01-23 [[./random-wireguard/][Connecting to a Random Mullvad Wireguard Host on Boot]] -- 2023-01-21 [[./flatpak-symlinks/][Running Flatpak Apps with Symlinks]] -- 2023-01-08 [[./fedora-login-manager/][How to Remove the Login Manager from Fedora i3]] -- 2023-01-05 [[./mass-unlike-tumblr-posts/][How to Easily Mass Unlike Tumblr Posts with Javascript]] -- 2023-01-03 [[./recent-website-changes/][Recent Website Changes]] - -* 2022 - -- 2022-12-23 [[./alpine-desktop/][Alpine Linux as a Desktop OS]] -- 2022-12-17 [[./st/][Simple Terminal]] -- 2022-12-07 [[./nginx-wildcard-redirect/][Redirect Nginx Subdomains & Trailing Content with Regex]] -- 2022-12-01 [[./nginx-compression/][Enable GZIP Compression in Nginx]] -- 2022-11-29 [[./nginx-referrer-ban-list/][Creating a Referrer Ban List in Nginx]] -- 2022-11-27 [[./server-build/][Building a Custom Rack-Mounted Server]] -- 2022-11-11 [[./nginx-tmp-errors/][Fixing Permission Errors in /var/lib/nginx]] -- 2022-10-30 [[./linux-display-manager/][How to Disable or Change the Display Manager on Void Linux]] -- 2022-10-22 [[./alpine-linux/][Alpine Linux: My New Server OS]] -- 2022-10-04 [[./syncthing/][Syncthing: A Minimal Self-Hosted Cloud Storage Solution]] -- 2022-10-04 [[./mtp-linux/][How to Mount an MTP Mobile Device on Fedora Linux]] -- 2022-09-21 [[./graphene-os/][Installing Graphene OS on the Pixel 6 Pro]] -- 2022-09-17 [[./serenity-os/][Serenity OS: Testing Out a Unique System]] -- 2022-08-31 [[./privacy-com-changes/][Concerning Changes on Privacy.com]] -- 2022-03-23 [[./cloudflare-dns-api/][Dynamic DNS with Cloudflare API]] -- 2022-07-31 [[./bash-it/][Upgrade Bash with Bash-It & Ble.sh]] -- 2022-07-30 [[./flac-to-opus/][Recursive Command-Line FLAC to Opus Conversion]] -- 2022-07-25 [[./curseradio/][CurseRadio: Listening to the Radio on the Command Line]] -- 2022-07-14 [[./gnupg/][GNU Privacy Guard (GPG)]] -- 2022-07-01 [[./git-server/][Self-Hosting a Personal Git Server]] -- 2022-06-24 [[./fedora-i3/][Rebooting My Love Affair with Linux]] -- 2022-06-22 [[./daily-poetry/][Daily Plaintext Poetry via Email]] -- 2022-06-16 [[./terminal-lifestyle/][A Terminal Lifestyle]] -- 2022-06-07 [[./self-hosting-freshrss/][Self-Hosting FreshRSS]] -- 2022-06-01 [[./ditching-cloudflare/][Ditching Cloudflare for Njalla]] -- 2022-04-09 [[./pinetime/][PineTime: An Open-Source Smart Watch]] -- 2022-04-02 [[./nginx-reverse-proxy/][Set-Up a Reverse Proxy with Nginx]] -- 2022-03-26 [[./ssh-mfa/][Enable TOTP MFA for SSH]] -- 2022-03-24 [[./server-hardening/][Hardening a Public-Facing Home Server]] -- 2022-03-23 [[./nextcloud-on-ubuntu/][Nextcloud on Ubuntu]] -- 2022-03-08 [[./plex-migration/][Migrating Plex to a New Server (& Nvidia Transcoding)]] -- 2022-03-03 [[./financial-database/][Maintaining a Personal Financial Database]] -- 2022-03-02 [[./reliable-notes/][Easy, Reliable Note-Taking]] -- 2022-02-22 [[./tuesday/][Tuesday]] -- 2022-02-20 [[./nginx-caching/][Caching Static Content with Nginx]] -- 2022-02-17 [[./exiftool/][Stripping Image Metadata with exiftool]] -- 2022-02-16 [[./debian-and-nginx/][Migrating to a New Web Server Setup with Debian, Nginx, and Agate]] -- 2022-02-10 [[./leaving-the-office/][Leaving Office-Based Work in the Past]] -- 2022-02-10 [[./njalla-dns-api/][Dynamic DNS with Njalla API]] - -* 2021 - -- 2021-12-04 [[./cisa/][I Passed the CISA!]] -- 2021-10-09 [[./apache-redirect/][Apache Redirect HTML Files to a Directory]] -- 2021-08-25 [[./audit-sampling/][Audit Sampling with Python]] -- 2021-07-15 [[./delete-gitlab-repos/][How to Delete All GitLab Repositories]] -- 2021-05-30 [[./changing-git-authors/][Changing Git Authors]] -- 2021-04-28 [[./photography/][Jumping Back Into Photography]] -- 2021-04-23 [[./php-comment-system/][Roll Your Own Static Commenting System in PHP]] -- 2021-04-17 [[./gemini-server/][Hosting a Gemini Server]] -- 2021-03-30 [[./vps-web-server/][How to Set Up a VPS Web Server]] -- 2021-03-28 [[./vaporwave-vs-outrun/][Vaporwave vs Outrun]] -- 2021-03-28 [[./gemini-capsule/][Launching a Gemini Capsule]] -- 2021-03-19 [[./clone-github-repos/][How to Clone All Repositories from a GitHub or Sourcehut Account]] -- 2021-02-19 [[./macos/][macOS: Testing Out A New OS]] -- 2021-01-04 [[./fediverse/][A Simple Guide to the Fediverse]] -- 2021-01-07 [[./ufw/][Secure Your Network with the Uncomplicated Firewall (ufw)]] -- 2021-01-01 [[./seum/][SEUM: Speedrunners from Hell]] - -* 2020 - -- 2020-12-29 [[./zork/][Zork: Let's Explore a Classic]] -- 2020-12-27 [[./website-redesign/][Redesigning My Website: The 5 KB Result]] -- 2020-12-28 [[./neon-drive/][Neon Drive: A Nostalgic 80s Arcade Racing Game]] -- 2020-10-12 [[./mediocrity/][On the Pursuit of Mediocrity]] -- 2020-09-25 [[./happiness-map/][Data Visualization: World Choropleth Map of Happiness]] -- 2020-09-22 [[./internal-audit/][What is Internal Audit?]] -- 2020-09-01 [[./visual-recognition/][IBM Watson Visual Recognition]] -- 2020-08-29 [[./php-auth-flow/][PHP Authentication Flow]] -- 2020-08-22 [[./redirect-github-pages/][Redirect GitHub Pages from Subdomain to the Top-Level Domain]] -- 2020-07-26 [[./business-analysis/][Algorithmically Analyzing Local Businesses]] -- 2020-07-20 [[./video-game-sales/][Data Exploration: Video Game Sales]] -- 2020-05-19 [[./customizing-ubuntu/][Beginner's Guide: Customizing Ubuntu]] -- 2020-05-03 [[./homelab/][An Inside Look at My Homelab]] -- 2020-03-25 [[./session-manager/][Session Private Messenger]] -- 2020-02-09 [[./cryptography-basics/][Cryptography Basics]] -- 2020-01-26 [[./steam-on-ntfs/][Linux Gaming Tweak: Steam on NTFS Drives]] -- 2020-01-25 [[./linux-software/][Linux Software]] - -* 2019 - -- 2019-12-16 [[./password-security//][Password Security]] -- 2019-12-03 [[./the-ansoff-matrix//][The Ansoff Matrix]] -- 2019-09-09 [[./audit-analytics//][Data Analysis in Auditing]] -- 2019-01-07 [[./useful-css//][Useful CSS Snippets]] - -* 2018 - -- 2018-12-08 [[./aes-encryption//][AES Encryption]] -- 2018-11-28 [[./cpp-compiler//][The C++ Compiler]] diff --git a/blog/org-blog/index.org b/blog/org-blog/index.org deleted file mode 100644 index b806ae3..0000000 --- a/blog/org-blog/index.org +++ /dev/null @@ -1,71 +0,0 @@ -#+title: Blogging in Org-Mode -#+date: 2024-02-26 -#+description: A guide to blogging with org-mode, no third-party tools required. -#+filetags: :dev: - -* TODO Write a post on emacs first? - -- Could write-up my Doom Emacs config and workflow first, then reference here. - -* TODO Configure Emacs - -#+begin_src sh -emacs -nw -#+end_src - -=SPC f f= ---> =~/.doom.d/config.el= - -#+begin_src lisp -;; org-publish -(require 'ox-publish) - -(setq org-publish-project-alist - `(("blog" - :base-directory "~/Source/cleberg.net/" - :base-extension "org" - :recursive t - :publishing-directory "~/Source/cleberg.net/public/" - :publishing-function org-html-publish-to-html - ;; HTML5 - :html-doctype "html5" - :html-html5-fancy t - ;; Disable some Org's HTML defaults - :html-head-include-scripts nil - :html-head-include-default-style nil - :section-numbers nil - :with-title nil - ;; Generate sitemap - :auto-sitemap t - :sitemap-filename "sitemap.org" - ;; Customize HTML output - :html-divs ((preamble "header" "preamble") - (content "main" "content") - (postamble "footer" "postamble")) - :html-head "<link rel='stylesheet' href='/styles.css' type='text/css'>" - :html-preamble "<nav class='site-nav' aria-label='site-nav' role='navigation'> - <ul> - <li><a href='/'>Home</a></li> - <li><a href='/blog/'>Blog</a></li> - <li><a href='/services/'>Services</a></li> - <li><a href='/wiki/'>Wiki</a></li> - </ul></nav> - <h1>%t</h1> - <time datetime='%d'>%d</time>" - :html-postamble " - <p>Last build: %T</p> - <p>Created with %c</p>" - ) - - ("static" - :base-directory "~/Source/cleberg.net/static/" - :base-extension "css\\|txt\\|jpg\\|gif\\|png" - :recursive t - :publishing-directory "~/Source/cleberg.net/public/" - :publishing-function org-publish-attachment) - - ("cleberg.net" :components ("blog" "static")))) -#+end_src - -* TODO Build Process - -* TODO Deploy Process diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..98b60bd --- /dev/null +++ b/build.sh @@ -0,0 +1,3 @@ +rm -rf .build/* && \ +ENV=prod emacs --script publish.el && \ +scp -r .build/* ubuntu:/var/www/cleberg.net/ diff --git a/blog/aes-encryption/index.org b/content/blog/2018-11-28-aes-encryption.org index 03dcbf9..03dcbf9 100644 --- a/blog/aes-encryption/index.org +++ b/content/blog/2018-11-28-aes-encryption.org diff --git a/blog/cpp-compiler/index.org b/content/blog/2018-11-28-cpp-compiler.org index 1e2f802..1e2f802 100644 --- a/blog/cpp-compiler/index.org +++ b/content/blog/2018-11-28-cpp-compiler.org diff --git a/blog/useful-css/index.org b/content/blog/2019-01-07-useful-css.org index fa5edc5..fa5edc5 100644 --- a/blog/useful-css/index.org +++ b/content/blog/2019-01-07-useful-css.org diff --git a/blog/audit-analytics/index.org b/content/blog/2019-09-09-audit-analytics.org index 77b3082..77b3082 100644 --- a/blog/audit-analytics/index.org +++ b/content/blog/2019-09-09-audit-analytics.org diff --git a/blog/the-ansoff-matrix/index.org b/content/blog/2019-12-03-the-ansoff-matrix.org index 8910f22..c845b2e 100644 --- a/blog/the-ansoff-matrix/index.org +++ b/content/blog/2019-12-03-the-ansoff-matrix.org @@ -9,11 +9,11 @@ planning and strategy with a contemporary mindset. According to Dess, McNamara, Eisner, and Lee, managers must be willing to adapt to the modern business environment by going beyond "'incremental management', whereby they view their job as making a series of small, minor changes -to improve the efficiency of the firm's operations"[fn:1]. +to improve the efficiency of the firm's operations"(2019). One reason that strategic management is crucial is because most businesses that fail in the United States each year fail due to a lack -of strategic focus or direction[fn:2]. The rate of failure for +of strategic focus or direction(2019). The rate of failure for businesses with poor strategies shows that strategic planning and management are crucial to a business's strength and longevity, injecting the critical factors of growth and direction into a company's business @@ -25,7 +25,7 @@ that companies can use is the this framework has unique purposes and use-cases, it can effectively help an organization grow and compete. Specifically, the Ansoff matrix is one of the most effective frameworks for companies who want to focus -on increasing sales revenue or profitability[fn:3]. +on increasing sales revenue or profitability(2019). This framework uses a two-by-two figure to show the four strategic options for companies to use in this framework: market penetration, @@ -43,7 +43,7 @@ their existing products or explore new products. ** Market Penetration The most straightforward strategy in the Ansoff matrix is to focus on existing products in existing markets, also known as market -penetration[fn:4]. Companies such as Coca-Cola have used market +penetration(2019). Companies such as Coca-Cola have used market penetration successfully by investing a lot of money to get further value out of their current markets. Coca-Cola does this by introducing new features such as Christmas-themed bottles, personal names on the @@ -53,19 +53,19 @@ bottles, and other marketing schemes. Market development extends existing products into new markets in an attempt to increase the number of buyers. One interesting way that Coca-Cola used this strategy comes from the stigma that Diet Coke is a -woman's drink[fn:5]. Coca-Cola introduced Coca-Cola Zero, which +woman's drink(2019). Coca-Cola introduced Coca-Cola Zero, which contained the same nutritional content as Diet Coke, but was packaged in -a dark black can to appear more "manly"[fn:6]. +a dark black can to appear more "manly"(2019). ** Product Development Product development uses existing markets to introduce new products so -that the firm can better meet customer needs[fn:7]. The extreme end of +that the firm can better meet customer needs(2019). The extreme end of diversification is home to companies such as Johnson & Johnson, a healthcare company that has developed a business portfolio of more than -60,000 different products[fn:8]. Johnson & Johnson's dedication to +60,000 different products(2019). Johnson & Johnson's dedication to continuous diversification has led them to a balance sheet rating of "AAA", industry recognition for diversification, and increases in their -investor dividends for 57 consecutive years[fn:9]. +investor dividends for 57 consecutive years(2019). ** Related Diversification Diversification, the final strategy of the Ansoff Matrix, is more @@ -73,7 +73,7 @@ difficult than the others since it involves exploring both new markets and new products. Related diversification is a diversification strategy that closely relates to the firm's core business. Coca-Cola's best example of related diversification is its acquisition of Glaceau and -Vitamin Water, which expanded their drinking lines of business[fn:10]. +Vitamin Water, which expanded their drinking lines of business(2019). ** Unrelated Diversification Unrelated diversification is a diversification strategy that does not @@ -115,26 +115,3 @@ analysis]] to explain the mistake of companies who overuse analysis and spend too much time planning. Companies need to understand the utility of a strategic management framework while ensuring that the company is poised to execute as efficiently as they have planned. - -* Footnotes - -[fn:1] Dess, G. G., McNamara, G., Eisner, A. B., Lee, S. H. (2019). Strategic management: Text & cases, ninth edition. New York, NY: McGraw-Hill Education. - -[fn:2] Juneja, P. (n.d.). Benefits of strategic management. Management Study Guide. Retrieved from [[https://www.managementstudyguide.com/strategic-management-benefits.htm]]. - -[fn:3] Meldrum M., McDonald M. (1995) The Ansoff matrix. In: Key Marketing Concepts. London: Palgrave. - -[fn:4] Meldrum M., McDonald M. (1995) The Ansoff matrix. In: Key Marketing Concepts. London: Palgrave. - -[fn:5] Oakley, T. (2015). Coca-Cola: The Ansoff matrix. The Marketing Agenda. Retrieved from [[https://themarketingagenda.com/2015/03/28/coca-cola-ansoff-matrix/]]. - -[fn:6] Oakley, T. (2015). Coca-Cola: The Ansoff matrix. The Marketing Agenda. Retrieved from [[https://themarketingagenda.com/2015/03/28/coca-cola-ansoff-matrix/]]. - -[fn:7] Oakley, T. (2015). Coca-Cola: The Ansoff matrix. The Marketing Agenda. Retrieved from [[https://themarketingagenda.com/2015/03/28/coca-cola-ansoff-matrix/]]. - -[fn:8] Lemke, T. (2019). The most diversified companies in the stock market. The balance. Retrieved from [[https://www.thebalance.com/the-most-diversified-companies-in-the-stock-market-4169730]]. - -[fn:9] Johnson & Johnson. (2018). 2018 Investor Fact Sheet. [PDF file]. Retrieved from [[http://www.investor.jnj.com/_document/2018-investor-fact-sheet-4-19'id=0000016a-5681-d475-a17f-d78db54a0000][http://www.investor.jnj.com/_document/2018-investor-fact-sheet-4-19'id=0000016a-5681-d475-a17f-d78db54a0000]]. - -[fn:10] Oakley, T. (2015). Coca-Cola: The Ansoff matrix. The Marketing Agenda. Retrieved from [[https://themarketingagenda.com/2015/03/28/coca-cola-ansoff-matrix/]]. - diff --git a/blog/password-security/index.org b/content/blog/2019-12-16-password-security.org index 0ebbb84..0ebbb84 100644 --- a/blog/password-security/index.org +++ b/content/blog/2019-12-16-password-security.org diff --git a/blog/linux-software/index.org b/content/blog/2020-01-25-linux-software.org index 8397483..8397483 100644 --- a/blog/linux-software/index.org +++ b/content/blog/2020-01-25-linux-software.org diff --git a/blog/steam-on-ntfs/index.org b/content/blog/2020-01-26-steam-on-ntfs.org index f453ab9..f453ab9 100644 --- a/blog/steam-on-ntfs/index.org +++ b/content/blog/2020-01-26-steam-on-ntfs.org diff --git a/blog/cryptography-basics/index.org b/content/blog/2020-02-09-cryptography-basics.org index 366239a..366239a 100644 --- a/blog/cryptography-basics/index.org +++ b/content/blog/2020-02-09-cryptography-basics.org diff --git a/blog/session-manager/index.org b/content/blog/2020-03-25-session-manager.org index 803d048..803d048 100644 --- a/blog/session-manager/index.org +++ b/content/blog/2020-03-25-session-manager.org diff --git a/blog/homelab/index.org b/content/blog/2020-05-03-homelab.org index ffefe5d..ffefe5d 100644 --- a/blog/homelab/index.org +++ b/content/blog/2020-05-03-homelab.org diff --git a/blog/customizing-ubuntu/index.org b/content/blog/2020-05-19-customizing-ubuntu.org index 6461a9a..6461a9a 100644 --- a/blog/customizing-ubuntu/index.org +++ b/content/blog/2020-05-19-customizing-ubuntu.org diff --git a/blog/video-game-sales/index.org b/content/blog/2020-07-20-video-game-sales.org index 672558d..672558d 100644 --- a/blog/video-game-sales/index.org +++ b/content/blog/2020-07-20-video-game-sales.org diff --git a/blog/business-analysis/index.org b/content/blog/2020-07-26-business-analysis.org index 6d60471..6d60471 100644 --- a/blog/business-analysis/index.org +++ b/content/blog/2020-07-26-business-analysis.org diff --git a/blog/redirect-github-pages/index.org b/content/blog/2020-08-22-redirect-github-pages.org index cae5928..cae5928 100644 --- a/blog/redirect-github-pages/index.org +++ b/content/blog/2020-08-22-redirect-github-pages.org diff --git a/blog/php-auth-flow/index.org b/content/blog/2020-08-29-php-auth-flow.org index 2e5cf5c..2e5cf5c 100644 --- a/blog/php-auth-flow/index.org +++ b/content/blog/2020-08-29-php-auth-flow.org diff --git a/blog/visual-recognition/index.org b/content/blog/2020-09-01-visual-recognition.org index d703113..d703113 100644 --- a/blog/visual-recognition/index.org +++ b/content/blog/2020-09-01-visual-recognition.org diff --git a/blog/internal-audit/index.org b/content/blog/2020-09-22-internal-audit.org index 3074266..3074266 100644 --- a/blog/internal-audit/index.org +++ b/content/blog/2020-09-22-internal-audit.org diff --git a/blog/happiness-map/index.org b/content/blog/2020-09-25-happiness-map.org index 1eab63e..1eab63e 100644 --- a/blog/happiness-map/index.org +++ b/content/blog/2020-09-25-happiness-map.org diff --git a/blog/mediocrity/index.org b/content/blog/2020-10-12-mediocrity.org index a653f80..a653f80 100644 --- a/blog/mediocrity/index.org +++ b/content/blog/2020-10-12-mediocrity.org diff --git a/blog/website-redesign/index.org b/content/blog/2020-12-27-website-redesign.org index cfa8795..cfa8795 100644 --- a/blog/website-redesign/index.org +++ b/content/blog/2020-12-27-website-redesign.org diff --git a/blog/neon-drive/index.org b/content/blog/2020-12-28-neon-drive.org index 957bd33..957bd33 100644 --- a/blog/neon-drive/index.org +++ b/content/blog/2020-12-28-neon-drive.org diff --git a/blog/zork/index.org b/content/blog/2020-12-29-zork.org index 92f5169..92f5169 100644 --- a/blog/zork/index.org +++ b/content/blog/2020-12-29-zork.org diff --git a/blog/seum/index.org b/content/blog/2021-01-01-seum.org index 4e483a8..4e483a8 100644 --- a/blog/seum/index.org +++ b/content/blog/2021-01-01-seum.org diff --git a/blog/fediverse/index.org b/content/blog/2021-01-04-fediverse.org index 5224b17..5224b17 100644 --- a/blog/fediverse/index.org +++ b/content/blog/2021-01-04-fediverse.org diff --git a/blog/ufw/index.org b/content/blog/2021-01-07-ufw.org index b1e9adf..b1e9adf 100644 --- a/blog/ufw/index.org +++ b/content/blog/2021-01-07-ufw.org diff --git a/blog/macos/index.org b/content/blog/2021-02-19-macos.org index 37aca9d..37aca9d 100644 --- a/blog/macos/index.org +++ b/content/blog/2021-02-19-macos.org diff --git a/blog/clone-github-repos/index.org b/content/blog/2021-03-19-clone-github-repos.org index 3814e9f..3814e9f 100644 --- a/blog/clone-github-repos/index.org +++ b/content/blog/2021-03-19-clone-github-repos.org diff --git a/blog/gemini-capsule/index.org b/content/blog/2021-03-28-gemini-capsule.org index 69fd8f2..69fd8f2 100644 --- a/blog/gemini-capsule/index.org +++ b/content/blog/2021-03-28-gemini-capsule.org diff --git a/blog/vaporwave-vs-outrun/index.org b/content/blog/2021-03-28-vaporwave-vs-outrun.org index e268a3d..e268a3d 100644 --- a/blog/vaporwave-vs-outrun/index.org +++ b/content/blog/2021-03-28-vaporwave-vs-outrun.org diff --git a/blog/vps-web-server/index.org b/content/blog/2021-03-30-vps-web-server.org index d0c1b4f..d0c1b4f 100644 --- a/blog/vps-web-server/index.org +++ b/content/blog/2021-03-30-vps-web-server.org diff --git a/blog/gemini-server/index.org b/content/blog/2021-04-17-gemini-server.org index fd50c20..fd50c20 100644 --- a/blog/gemini-server/index.org +++ b/content/blog/2021-04-17-gemini-server.org diff --git a/blog/php-comment-system/index.org b/content/blog/2021-04-23-php-comment-system.org index 92dd984..92dd984 100644 --- a/blog/php-comment-system/index.org +++ b/content/blog/2021-04-23-php-comment-system.org diff --git a/blog/photography/index.org b/content/blog/2021-04-28-photography.org index cc5f388..cc5f388 100644 --- a/blog/photography/index.org +++ b/content/blog/2021-04-28-photography.org diff --git a/blog/changing-git-authors/index.org b/content/blog/2021-05-30-changing-git-authors.org index b06660d..b06660d 100644 --- a/blog/changing-git-authors/index.org +++ b/content/blog/2021-05-30-changing-git-authors.org diff --git a/blog/delete-gitlab-repos/index.org b/content/blog/2021-07-15-delete-gitlab-repos.org index e8ea28f..e8ea28f 100644 --- a/blog/delete-gitlab-repos/index.org +++ b/content/blog/2021-07-15-delete-gitlab-repos.org diff --git a/blog/audit-sampling/index.org b/content/blog/2021-08-25-audit-sampling.org index 9882fb2..9882fb2 100644 --- a/blog/audit-sampling/index.org +++ b/content/blog/2021-08-25-audit-sampling.org diff --git a/blog/apache-redirect/index.org b/content/blog/2021-10-09-apache-redirect.org index 25fb7ba..25fb7ba 100644 --- a/blog/apache-redirect/index.org +++ b/content/blog/2021-10-09-apache-redirect.org diff --git a/blog/cisa/index.org b/content/blog/2021-12-04-cisa.org index d06eb51..d06eb51 100644 --- a/blog/cisa/index.org +++ b/content/blog/2021-12-04-cisa.org diff --git a/blog/leaving-the-office/index.org b/content/blog/2022-02-10-leaving-the-office.org index 34db40a..34db40a 100644 --- a/blog/leaving-the-office/index.org +++ b/content/blog/2022-02-10-leaving-the-office.org diff --git a/blog/njalla-dns-api/index.org b/content/blog/2022-02-10-njalla-dns-api.org index 363e9e3..363e9e3 100644 --- a/blog/njalla-dns-api/index.org +++ b/content/blog/2022-02-10-njalla-dns-api.org diff --git a/blog/debian-and-nginx/index.org b/content/blog/2022-02-16-debian-and-nginx.org index d346f82..d346f82 100644 --- a/blog/debian-and-nginx/index.org +++ b/content/blog/2022-02-16-debian-and-nginx.org diff --git a/blog/exiftool/index.org b/content/blog/2022-02-17-exiftool.org index 5735125..5735125 100644 --- a/blog/exiftool/index.org +++ b/content/blog/2022-02-17-exiftool.org diff --git a/blog/nginx-caching/index.org b/content/blog/2022-02-20-nginx-caching.org index 5e815d9..5e815d9 100644 --- a/blog/nginx-caching/index.org +++ b/content/blog/2022-02-20-nginx-caching.org diff --git a/blog/tuesday/index.org b/content/blog/2022-02-22-tuesday.org index 3fa72f9..3fa72f9 100644 --- a/blog/tuesday/index.org +++ b/content/blog/2022-02-22-tuesday.org diff --git a/blog/reliable-notes/index.org b/content/blog/2022-03-02-reliable-notes.org index 16c23d0..16c23d0 100644 --- a/blog/reliable-notes/index.org +++ b/content/blog/2022-03-02-reliable-notes.org diff --git a/blog/financial-database/index.org b/content/blog/2022-03-03-financial-database.org index 55a6473..55a6473 100644 --- a/blog/financial-database/index.org +++ b/content/blog/2022-03-03-financial-database.org diff --git a/blog/plex-migration/index.org b/content/blog/2022-03-08-plex-migration.org index 36aa294..36aa294 100644 --- a/blog/plex-migration/index.org +++ b/content/blog/2022-03-08-plex-migration.org diff --git a/blog/cloudflare-dns-api/index.org b/content/blog/2022-03-23-cloudflare-dns-api.org index 39d6fac..39d6fac 100644 --- a/blog/cloudflare-dns-api/index.org +++ b/content/blog/2022-03-23-cloudflare-dns-api.org diff --git a/blog/nextcloud-on-ubuntu/index.org b/content/blog/2022-03-23-nextcloud-on-ubuntu.org index baa7976..baa7976 100644 --- a/blog/nextcloud-on-ubuntu/index.org +++ b/content/blog/2022-03-23-nextcloud-on-ubuntu.org diff --git a/blog/server-hardening/index.org b/content/blog/2022-03-24-server-hardening.org index ba8a994..ba8a994 100644 --- a/blog/server-hardening/index.org +++ b/content/blog/2022-03-24-server-hardening.org diff --git a/blog/ssh-mfa/index.org b/content/blog/2022-03-26-ssh-mfa.org index 85b98de..85b98de 100644 --- a/blog/ssh-mfa/index.org +++ b/content/blog/2022-03-26-ssh-mfa.org diff --git a/blog/nginx-reverse-proxy/index.org b/content/blog/2022-04-02-nginx-reverse-proxy.org index 6467f29..6467f29 100644 --- a/blog/nginx-reverse-proxy/index.org +++ b/content/blog/2022-04-02-nginx-reverse-proxy.org diff --git a/blog/pinetime/index.org b/content/blog/2022-04-09-pinetime.org index d6345ac..d6345ac 100644 --- a/blog/pinetime/index.org +++ b/content/blog/2022-04-09-pinetime.org diff --git a/blog/ditching-cloudflare/index.org b/content/blog/2022-06-01-ditching-cloudflare.org index 51a63c6..51a63c6 100644 --- a/blog/ditching-cloudflare/index.org +++ b/content/blog/2022-06-01-ditching-cloudflare.org diff --git a/blog/self-hosting-freshrss/index.org b/content/blog/2022-06-07-self-hosting-freshrss.org index cb13c17..cb13c17 100644 --- a/blog/self-hosting-freshrss/index.org +++ b/content/blog/2022-06-07-self-hosting-freshrss.org diff --git a/blog/terminal-lifestyle/index.org b/content/blog/2022-06-16-terminal-lifestyle.org index f96a10a..f96a10a 100644 --- a/blog/terminal-lifestyle/index.org +++ b/content/blog/2022-06-16-terminal-lifestyle.org diff --git a/blog/daily-poetry/index.org b/content/blog/2022-06-22-daily-poetry.org index e150c8b..e150c8b 100644 --- a/blog/daily-poetry/index.org +++ b/content/blog/2022-06-22-daily-poetry.org diff --git a/blog/fedora-i3/index.org b/content/blog/2022-06-24-fedora-i3.org index f96bbb7..f96bbb7 100644 --- a/blog/fedora-i3/index.org +++ b/content/blog/2022-06-24-fedora-i3.org diff --git a/blog/git-server/index.org b/content/blog/2022-07-01-git-server.org index c716484..c716484 100644 --- a/blog/git-server/index.org +++ b/content/blog/2022-07-01-git-server.org diff --git a/blog/gnupg/index.org b/content/blog/2022-07-14-gnupg.org index 59e12e7..59e12e7 100644 --- a/blog/gnupg/index.org +++ b/content/blog/2022-07-14-gnupg.org diff --git a/blog/curseradio/index.org b/content/blog/2022-07-25-curseradio.org index fb2c55b..fb2c55b 100644 --- a/blog/curseradio/index.org +++ b/content/blog/2022-07-25-curseradio.org diff --git a/blog/flac-to-opus/index.org b/content/blog/2022-07-30-flac-to-opus.org index adb7763..adb7763 100644 --- a/blog/flac-to-opus/index.org +++ b/content/blog/2022-07-30-flac-to-opus.org diff --git a/blog/bash-it/index.org b/content/blog/2022-07-31-bash-it.org index 7c1316f..7c1316f 100644 --- a/blog/bash-it/index.org +++ b/content/blog/2022-07-31-bash-it.org diff --git a/blog/privacy-com-changes/index.org b/content/blog/2022-08-31-privacy-com-changes.org index 7cd0eda..7cd0eda 100644 --- a/blog/privacy-com-changes/index.org +++ b/content/blog/2022-08-31-privacy-com-changes.org diff --git a/blog/serenity-os/index.org b/content/blog/2022-09-17-serenity-os.org index ccb9049..ccb9049 100644 --- a/blog/serenity-os/index.org +++ b/content/blog/2022-09-17-serenity-os.org diff --git a/blog/graphene-os/index.org b/content/blog/2022-09-21-graphene-os.org index 2e34a00..2e34a00 100644 --- a/blog/graphene-os/index.org +++ b/content/blog/2022-09-21-graphene-os.org diff --git a/blog/mtp-linux/index.org b/content/blog/2022-10-04-mtp-linux.org index 1163e63..1163e63 100644 --- a/blog/mtp-linux/index.org +++ b/content/blog/2022-10-04-mtp-linux.org diff --git a/blog/syncthing/index.org b/content/blog/2022-10-04-syncthing.org index 8c3656a..8c3656a 100644 --- a/blog/syncthing/index.org +++ b/content/blog/2022-10-04-syncthing.org diff --git a/blog/alpine-linux/index.org b/content/blog/2022-10-22-alpine-linux.org index 8d4a14b..8d4a14b 100644 --- a/blog/alpine-linux/index.org +++ b/content/blog/2022-10-22-alpine-linux.org diff --git a/blog/linux-display-manager/index.org b/content/blog/2022-10-30-linux-display-manager.org index 3d8d6d7..3d8d6d7 100644 --- a/blog/linux-display-manager/index.org +++ b/content/blog/2022-10-30-linux-display-manager.org diff --git a/blog/self-hosting-matrix/index.org b/content/blog/2022-11-07-self-hosting-matrix.org index c812c60..c812c60 100644 --- a/blog/self-hosting-matrix/index.org +++ b/content/blog/2022-11-07-self-hosting-matrix.org diff --git a/blog/nginx-tmp-errors/index.org b/content/blog/2022-11-11-nginx-tmp-errors.org index 092b146..092b146 100644 --- a/blog/nginx-tmp-errors/index.org +++ b/content/blog/2022-11-11-nginx-tmp-errors.org diff --git a/blog/server-build/index.org b/content/blog/2022-11-27-server-build.org index 0186a15..0186a15 100644 --- a/blog/server-build/index.org +++ b/content/blog/2022-11-27-server-build.org diff --git a/blog/nginx-referrer-ban-list/index.org b/content/blog/2022-11-29-nginx-referrer-ban-list.org index a80a602..a80a602 100644 --- a/blog/nginx-referrer-ban-list/index.org +++ b/content/blog/2022-11-29-nginx-referrer-ban-list.org diff --git a/blog/nginx-compression/index.org b/content/blog/2022-12-01-nginx-compression.org index 73d218b..73d218b 100644 --- a/blog/nginx-compression/index.org +++ b/content/blog/2022-12-01-nginx-compression.org diff --git a/blog/nginx-wildcard-redirect/index.org b/content/blog/2022-12-07-nginx-wildcard-redirect.org index 41e84cb..41e84cb 100644 --- a/blog/nginx-wildcard-redirect/index.org +++ b/content/blog/2022-12-07-nginx-wildcard-redirect.org diff --git a/blog/st/index.org b/content/blog/2022-12-17-st.org index c3724fb..c3724fb 100644 --- a/blog/st/index.org +++ b/content/blog/2022-12-17-st.org diff --git a/blog/alpine-desktop/index.org b/content/blog/2022-12-23-alpine-desktop.org index 2648123..2648123 100644 --- a/blog/alpine-desktop/index.org +++ b/content/blog/2022-12-23-alpine-desktop.org diff --git a/blog/recent-website-changes/index.org b/content/blog/2023-01-03-recent-website-changes.org index c54f1e3..c54f1e3 100644 --- a/blog/recent-website-changes/index.org +++ b/content/blog/2023-01-03-recent-website-changes.org diff --git a/blog/mass-unlike-tumblr-posts/index.org b/content/blog/2023-01-05-mass-unlike-tumblr-posts.org index 8e7574c..8e7574c 100644 --- a/blog/mass-unlike-tumblr-posts/index.org +++ b/content/blog/2023-01-05-mass-unlike-tumblr-posts.org diff --git a/blog/fedora-login-manager/index.org b/content/blog/2023-01-08-fedora-login-manager.org index 861a174..861a174 100644 --- a/blog/fedora-login-manager/index.org +++ b/content/blog/2023-01-08-fedora-login-manager.org diff --git a/blog/flatpak-symlinks/index.org b/content/blog/2023-01-21-flatpak-symlinks.org index d535f31..d535f31 100644 --- a/blog/flatpak-symlinks/index.org +++ b/content/blog/2023-01-21-flatpak-symlinks.org diff --git a/blog/random-wireguard/index.org b/content/blog/2023-01-23-random-wireguard.org index 162ffc4..162ffc4 100644 --- a/blog/random-wireguard/index.org +++ b/content/blog/2023-01-23-random-wireguard.org diff --git a/blog/self-hosting-wger/index.org b/content/blog/2023-01-28-self-hosting-wger.org index 10825b8..10825b8 100644 --- a/blog/self-hosting-wger/index.org +++ b/content/blog/2023-01-28-self-hosting-wger.org diff --git a/blog/exploring-hare/index.org b/content/blog/2023-02-02-exploring-hare.org index 749e46f..749e46f 100644 --- a/blog/exploring-hare/index.org +++ b/content/blog/2023-02-02-exploring-hare.org diff --git a/blog/burnout/index.org b/content/blog/2023-05-22-burnout.org index 75757ea..75757ea 100644 --- a/blog/burnout/index.org +++ b/content/blog/2023-05-22-burnout.org diff --git a/blog/goaccess-geoip/index.org b/content/blog/2023-06-08-goaccess-geoip.org index 6136c21..6136c21 100644 --- a/blog/goaccess-geoip/index.org +++ b/content/blog/2023-06-08-goaccess-geoip.org diff --git a/blog/self-hosting-baikal/index.org b/content/blog/2023-06-08-self-hosting-baikal.org index 1414936..1414936 100644 --- a/blog/self-hosting-baikal/index.org +++ b/content/blog/2023-06-08-self-hosting-baikal.org diff --git a/blog/unifi-ip-blocklist/index.org b/content/blog/2023-06-18-unifi-ip-blocklist.org index dbde1b7..dbde1b7 100644 --- a/blog/unifi-ip-blocklist/index.org +++ b/content/blog/2023-06-18-unifi-ip-blocklist.org diff --git a/blog/audit-review-template/index.org b/content/blog/2023-06-20-audit-review-template.org index 135a845..135a845 100644 --- a/blog/audit-review-template/index.org +++ b/content/blog/2023-06-20-audit-review-template.org diff --git a/blog/byobu/index.org b/content/blog/2023-06-23-byobu.org index 902e5f5..902e5f5 100644 --- a/blog/byobu/index.org +++ b/content/blog/2023-06-23-byobu.org diff --git a/blog/self-hosting-convos/index.org b/content/blog/2023-06-23-self-hosting-convos.org index 3ed72d1..3ed72d1 100644 --- a/blog/self-hosting-convos/index.org +++ b/content/blog/2023-06-23-self-hosting-convos.org diff --git a/blog/backblaze-b2/index.org b/content/blog/2023-06-28-backblaze-b2.org index d51fd56..d51fd56 100644 --- a/blog/backblaze-b2/index.org +++ b/content/blog/2023-06-28-backblaze-b2.org diff --git a/blog/self-hosting-voyager/index.org b/content/blog/2023-06-30-self-hosting-voyager.org index 281cb38..281cb38 100644 --- a/blog/self-hosting-voyager/index.org +++ b/content/blog/2023-06-30-self-hosting-voyager.org diff --git a/blog/wireguard-lan/index.org b/content/blog/2023-07-12-wireguard-lan.org index 17696de..17696de 100644 --- a/blog/wireguard-lan/index.org +++ b/content/blog/2023-07-12-wireguard-lan.org diff --git a/blog/plex-transcoder-errors/index.org b/content/blog/2023-07-19-plex-transcoder-errors.org index ae4cf41..ae4cf41 100644 --- a/blog/plex-transcoder-errors/index.org +++ b/content/blog/2023-07-19-plex-transcoder-errors.org diff --git a/blog/agile-auditing/index.org b/content/blog/2023-08-18-agile-auditing.org index 69e5485..69e5485 100644 --- a/blog/agile-auditing/index.org +++ b/content/blog/2023-08-18-agile-auditing.org diff --git a/blog/self-hosting-gitweb/index.org b/content/blog/2023-09-15-self-hosting-gitweb.org index fb40743..fb40743 100644 --- a/blog/self-hosting-gitweb/index.org +++ b/content/blog/2023-09-15-self-hosting-gitweb.org diff --git a/blog/audit-sql-scripts/index.org b/content/blog/2023-09-19-audit-sql-scripts.org index b47771c..b47771c 100644 --- a/blog/audit-sql-scripts/index.org +++ b/content/blog/2023-09-19-audit-sql-scripts.org diff --git a/blog/digital-minimalism/index.org b/content/blog/2023-10-04-digital-minimalism.org index 84894d9..84894d9 100644 --- a/blog/digital-minimalism/index.org +++ b/content/blog/2023-10-04-digital-minimalism.org diff --git a/blog/self-hosting-authelia/index.org b/content/blog/2023-10-11-self-hosting-authelia.org index 94351f3..94351f3 100644 --- a/blog/self-hosting-authelia/index.org +++ b/content/blog/2023-10-11-self-hosting-authelia.org diff --git a/blog/alpine-ssh-hardening/index.org b/content/blog/2023-10-15-alpine-ssh-hardening.org index 4e7fcc5..4e7fcc5 100644 --- a/blog/alpine-ssh-hardening/index.org +++ b/content/blog/2023-10-15-alpine-ssh-hardening.org diff --git a/blog/self-hosting-anonymousoverflow/index.org b/content/blog/2023-10-17-self-hosting-anonymousoverflow.org index 905939c..905939c 100644 --- a/blog/self-hosting-anonymousoverflow/index.org +++ b/content/blog/2023-10-17-self-hosting-anonymousoverflow.org diff --git a/blog/scli/index.org b/content/blog/2023-11-08-scli.org index 8b55ac1..8b55ac1 100644 --- a/blog/scli/index.org +++ b/content/blog/2023-11-08-scli.org diff --git a/blog/unifi-nextdns/index.org b/content/blog/2023-12-03-unifi-nextdns.org index 277f8bb..277f8bb 100644 --- a/blog/unifi-nextdns/index.org +++ b/content/blog/2023-12-03-unifi-nextdns.org diff --git a/blog/dont-say-hello/index.org b/content/blog/2024-01-08-dont-say-hello.org index ef5662c..ef5662c 100644 --- a/blog/dont-say-hello/index.org +++ b/content/blog/2024-01-08-dont-say-hello.org diff --git a/blog/macos-customization/index.org b/content/blog/2024-01-09-macos-customization.org index 82e2d0a..82e2d0a 100644 --- a/blog/macos-customization/index.org +++ b/content/blog/2024-01-09-macos-customization.org diff --git a/blog/local-llm/index.org b/content/blog/2024-01-13-local-llm.org index ccde66e..ccde66e 100644 --- a/blog/local-llm/index.org +++ b/content/blog/2024-01-13-local-llm.org diff --git a/blog/audit-dashboard/index.org b/content/blog/2024-01-26-audit-dashboard.org index e48c938..e48c938 100644 --- a/blog/audit-dashboard/index.org +++ b/content/blog/2024-01-26-audit-dashboard.org diff --git a/blog/tableau-dashboard/index.org b/content/blog/2024-01-27-tableau-dashboard.org index 2fb9728..2fb9728 100644 --- a/blog/tableau-dashboard/index.org +++ b/content/blog/2024-01-27-tableau-dashboard.org diff --git a/blog/zfs/index.org b/content/blog/2024-02-06-zfs.org index e1a091d..e1a091d 100644 --- a/blog/zfs/index.org +++ b/content/blog/2024-02-06-zfs.org diff --git a/blog/ubuntu-emergency-mode/index.org b/content/blog/2024-02-13-ubuntu-emergency-mode.org index 9fe7a42..9fe7a42 100644 --- a/blog/ubuntu-emergency-mode/index.org +++ b/content/blog/2024-02-13-ubuntu-emergency-mode.org diff --git a/blog/self-hosting-otter-wiki/index.org b/content/blog/2024-02-21-self-hosting-otter-wiki.org index c308f12..c308f12 100644 --- a/blog/self-hosting-otter-wiki/index.org +++ b/content/blog/2024-02-21-self-hosting-otter-wiki.org diff --git a/content/blog/2024-03-13-doom-emacs.org b/content/blog/2024-03-13-doom-emacs.org new file mode 100644 index 0000000..321286c --- /dev/null +++ b/content/blog/2024-03-13-doom-emacs.org @@ -0,0 +1,354 @@ +#+title: Doom Emacs & Org-Mode +#+date: <2024-03-14 Thu 16:19:23> +#+description: A quick look at my setup with Doom Emacs and the Org-Mode syntax. + +** Screenshots + +These screenshots are showing a project opened with projectile, a +treemacs side pane open with the project contents, multiple buffers +tiled next to each other, and the help pane open at the bottomm. + +The themes are =doom-homage-white= and =doom-homage-black=. + +#+caption: Doom Emacs Light Mode +[[https://img.cleberg.net/blog/20240314-doom-emacs/light.png]] + +#+caption: Doom Emacs Dark Mode +[[https://img.cleberg.net/blog/20240314-doom-emacs/dark.png]] + +** Getting Started + +I have been switching back and forth between +[[https://en.wikipedia.org/wiki/Markdown][markdown]] and +[[https://en.wikipedia.org/wiki/Org-mode][org-mode]] recently for my +personal note taking, wiki, and even this blog. As a result, I have been +stumbling further into the world of Emacs and found myself at a point +where I now prefer to do most of my basic editing within Emacs. + +I'll leave the markdown vs. org-mode debate for another post, but I love +org-mode's extensibility and interactive nature within Emacs, but it +becomes very unwieldy in any other client implementation of org-mode - +especially on iOS. On the flip side, markdown is limited in +functionality and fractured into different standards, but it's simple +and popular enough that there are a plethora of great clients to choose +from that will get the job done. + +For now, I want to focus on how I have been using Emacs and some of the +things that would have helped me learn it faster had I known where to +start. + +*** Installation + +This post focuses on [[https://github.com/doomemacs/doomemacs][Doom +Emacs]], which is an Emacs framework that provides an alternative +experience to the vanilla [[https://www.gnu.org/software/emacs/][GNU +Emacs]]. + +The +[[https://github.com/doomemacs/doomemacs/blob/master/docs/getting_started.org][Getting +Start Guide]] has an extremely detailed walkthrough of installation for +all systems, so please refer to that guide for up-to-date instructions. + +I chose to install on macOS, using the Homebrew option with the +=railwaycat/emacsmacport= version of Emacs. + +Once the program is installed, you can run the program by typing =emacs= +in a terminal. If you installed a version of Emacs that supports both a +GUI and TUI, you will have to run =emacs -nw= to get the TUI instead of +the default GUI. + +*** Configuration + +Once installed, you can configure Doom by editing the files within the +=~/.doom.d/= directory. This directory holds four files: + +1. =config.el= - Personal configuration file +2. =custom.el= - Custom set variables +3. =init.el= - Doom modules and load order, must run =doom sync= after + modifying +4. =packages.el= - Declare packages to install in this file, then run + =doom sync= to install + +I only needed a few customizations for my configuration, so I'll list +them below. + +#+begin_src lisp +;; ~/.doom.d/config.el +(setq doom-theme 'doom-homage-black) +(setq display-line-numbers-type t) +(setq org-directory "~/Documents/Notes/") + +;; lengthy org-publish directives at the bottom of the file +#+end_src + +#+begin_src lisp +;; ~/.doom.d/init.el +(doom! :input + :completion + company ; the ultimate code completion backend + vertico ; the search engine of the future + + :ui + doom ; what makes DOOM look the way it does + doom-dashboard ; a nifty splash screen for Emacs + (emoji +unicode) ; 🙂 + hl-todo ; highlight TODO/FIXME/NOTE/DEPRECATED/HACK/REVIEW + minimap ; show a map of the code on the side + modeline ; snazzy, Atom-inspired modeline, plus API + ophints ; highlight the region an operation acts on + (popup +defaults) ; tame sudden yet inevitable temporary windows + tabs ; a tab bar for Emacs + treemacs ; a project drawer, like neotree but cooler + (vc-gutter +pretty) ; vcs diff in the fringe + vi-tilde-fringe ; fringe tildes to mark beyond EOB + workspaces ; tab emulation, persistence & separate workspaces + + :editor + (evil +everywhere); come to the dark side, we have cookies + file-templates ; auto-snippets for empty files + fold ; (nigh) universal code folding + snippets ; my elves. They type so I don't have to + + :emacs + dired ; making dired pretty [functional] + electric ; smarter, keyword-based electric-indent + undo ; persistent, smarter undo for your inevitable mistakes + vc ; version-control and Emacs, sitting in a tree + + :term + term ; basic terminal emulator for Emacs + + :checkers + syntax ; tasing you for every semicolon you forget + + :tools + (eval +overlay) ; run code, run (also, repls) + lookup ; navigate your code and its documentation + magit ; a git porcelain for Emacs + + :os + (:if (featurep :system 'macos) macos) ; improve compatibility with macOS + + :lang + common-lisp ; if you've seen one lisp, you've seen them all + emacs-lisp ; drown in parentheses + markdown ; writing docs for people to ignore + org ; organize your plain life in plain text + python ; beautiful is better than ugly + sh ; she sells {ba,z,fi}sh shells on the C xor + + :app + irc ; how neckbeards socialize + (rss +org) ; emacs as an RSS reader + + (default +bindings +smartparens)) +#+end_src + +If you're editing these files within Doom directly, remember to run +=SPC h r r= to reload the configuration. Also remember to run +=doom sync= for any changes to the =init.el= or =packages.el= files. + +** Basic Functionality + +I kept a cheat sheet note open at first with all of the basic functions +typed out, copied as I went through the tutorial. After a little while, +I no longer needed it. I highly recommend writing down the most +applicable shortcuts for your preferred functionality and refer back to +it until you've memorized it. + +Memorizing the shortcuts will differ based on the type of Emacs +framework being used. Personally, migrating from vanilla Emacs to Doom +Emacs simplified everything by a large factor and instantly enabled me +to start working on my projects, eliminating most of the hurdles I was +running into. The vanilla emacs hotkeys became obnoxious and I actually +stopped using Emacs entirely for about a month before trying Doom. + +For me, the first logical step is to interact with the local filesystem. +To do this, I needed to know how to open directories, open files, save +files, discard changes, close files, and switch between open files. Here +are some example shortcuts I've written down in order to accomplish +file-based actions. + +| Doom Hotkey | Emacs Hotkey | Description | +|-----------------+--------------+----------------------------------------| +| =SPC := | =C-x= | Run functions | +| =SPC f f= | =C-x f= | Open file in buffer | +| =SPC f d= | =C-x d= | Open directory with =dired= | +| =i= | =C-x C-q= | Edit current buffer (insert mode) | +| =q= | =C-x C-q= | Quit out of insert mode | +| =SPC f s= | =C-x s= | Save current buffer | +| =SPC b k= | =C-x k= | Kill current buffer | +| =SPC w h/j/k/l= | =C-x o=[^1] | Move left/down/up/right to next buffer | + +[^1] Doom's evil-window functionality is a bit different from GNU Emacs, +but you can always switch to the "other" buffer with =C-x o= or =C-x b= +to get a list of buffers to select. + +In general, when in Doom, you can press =SPC= and wait a second for the +help pane to appear with all available hotkey options. For example, you +can press =SPC=, wait for the help pane, and then select a key such as +=g= to enter the git help pane and explore further command options. + +** Editing + +Next in my process is to dive into editing for any languages I'm +currently using. In this post, I will just cover Markdown and Org-Mode +but I have also been slowly adoping some Python and general web dev +tools as well. + +*** Markdown + +#+caption: Markdown Preview +[[https://img.cleberg.net/blog/20240314-doom-emacs/markdown.png]] + +Markdown is fairly simple as the syntax is limited, so just make sure +the =~/.doom.d/init.el= includes the =markdown= declaration in the +=:lang= section. + +This package includes the following hotkey menus. The insert and toggle +menu expands further, allowing you to insert various markdown elements +and toggle things like link hiding. + +| Doom Hotkey | Function | +|------------------------------+--------------------------| +| =SPC m '= | markdown-edit-code-block | +| =SPC m e= | markdown-export | +| =SPC m i= | +insert | +| =SPC m o= | markdown-open | +| =SPC m p= | markdown-preview | +| =SPC m t= | +toggle | +| =SPC : markdown-table-align= | markdown-table-align | + +*** Org-Mode + +#+caption: Org-Mode Preview +[[https://img.cleberg.net/blog/20240314-doom-emacs/org.png]] + +Similar to the markdown section above, ensure that the +=~/.doom.d/init.el= includes the =org= declaration in the =:lang= +section. + +There are a few hot keys, but a quick search with =SPC : org= shows that +there are 865 possible org-related functions you can run. I won't +possibly be able to list them all, so I will simply cover a few of the +basic commands I use myself. + +| Doom Hotkey | Function | +|----------------+---------------------------------------| +| =SPC m t= | org-todo | +| =SPC n t= | org-todo-list | +| =SPC o A= | org-agenda | +| =SPC X= | org-capture | +| =SPC m p p= | org-priority | +| =SPC m d s= | org-schedule | +| =TAB= | org-cycle | +| =SHIFT TAB= | Collapse/open all headings in buffer | +| =M-q= | Format/wrap current section | +| =M-Left/Right= | Demote/promote current heading | +| =M-Down/Up= | Shift current heading section down/up | + +**** Org-Publish + +Org includes a [[https://orgmode.org/manual/Publishing.html][publishing +management system]] by default that allows you to export org files to +Org, iCalendar, HTML, LaTex, Markdown, ODT, and Plain Text. Most of +these can be exported into another buffer and opened, or simply to an +external file. + +While inside an org file, simply run =SPC m e= or +=M-x org-export-dispatch= to open the export menu. This menu will show +all options and ask you to select an option. If you want to export to +HTML, simply press =h= and then =H= (As HTML buffer), =h= (As HTML +file), or =o= (As HTML file and open). + +**** Projects + +Some publishing options are easier with a defined project in Emacs. To +create a project within Emacs, I use two methods: + +1. Add the project via the projectile command =SPC p a=. Does not always + work for me. +2. Add an empty =.projectile= file in the project root. + +Once a project has been created, you can create custom publishing +actions within your =~/.doom.d/config.el= file. For example, here's a +test project I created to try and convert this blog to org-mode +recently. + +#+begin_src lisp +;; org-publish +(require 'ox-publish) + +(defun my/org-sitemap-date-entry-format (entry style project) "Format ENTRY in + org-publish PROJECT Sitemap format ENTRY ENTRY STYLE format that includes + date." (let ((filename (org-publish-find-title entry project))) (if (= (length + filename) 0) (format "*%s*" entry) (format "{{{timestamp(%s)}}} + [[file:%s][%s]]" (format-time-string "%Y-%m-%d" (org-publish-find-date entry + project)) entry filename)))) + +(setq org-export-global-macros '(("timestamp" . "@@html:<time datetime='[$1]' + class='timestamp'>[$1]</time>@@"))) + +(setq org-publish-project-alist + `(("blog" + :base-directory "~/Source/cleberg.net/" + :base-extension "org" + :recursive t + :publishing-directory "~/Source/cleberg.net/public/" + :publishing-function org-html-publish-to-html + ;; HTML5 + :html-doctype "html5" + :html-html5-fancy t + ;; Disable some Org's HTML defaults + :html-head-include-scripts nil + :html-head-include-default-style nil + :section-numbers nil + :with-title nil + ;; Sitemap + :auto-sitemap t + :sitemap-title: "Sitemap" + :sitemap-sort-files anti-chronologically + ; :sitemap-function my/org-sitemap-date-entry-format + ;; Customize HTML output + :html-divs ((preamble "header" "preamble") + (content "main" "content") + (postamble "footer" "postamble")) + :html-head "<meta name='theme-color' content='#111' media='(prefers-color-scheme: dark)'> + <meta name='theme-color' content='#fff' media='(prefers-color-scheme: light)'> + <link rel='stylesheet' href='/syntax-theme-dark.css' media='(prefers-color-scheme: dark)'> + <link rel='stylesheet' href='/syntax-theme-light.css' media='(prefers-color-scheme: light)'> + <link rel='stylesheet' href='/styles.css' type='text/css'>" + :html-preamble "<nav class='site-nav' aria-label='site-nav' role='navigation'> + <ul> + <li><a href='/'>Home</a></li> + <li><a href='/blog/'>Blog</a></li> + <li><a href='/services/'>Services</a></li> + <li><a href='/wiki/'>Wiki</a></li> + </ul></nav> + <h1>%t</h1> + <time datetime='%d'>%d</time>" + :html-postamble " + <p>Last build: %T</p> + <p>Created with %c</p>" + ) + + ("static" + :base-directory "~/Source/cleberg.net/static/" + :base-extension "css\\|txt\\|jpg\\|gif\\|png" + :recursive t + :publishing-directory "~/Source/cleberg.net/public/" + :publishing-function org-publish-attachment) + + ("cleberg.net" :components ("blog" "static")))) +#+end_src + +** General Thoughts + +I have enjoyed Doom Emacs (far more than GNU Emacs) and will likely +continue to use it as my main editor for the time being. Org-Mode is +certainly the largest factor here, as I far prefer it over Markdown due +to its inherent features and detailed markup options. However, working +with org-mode on iOS has been a pain and I will have to see if there's +an easier way to resolve those issues or if going back to separate +Markdown, Reminders, and Calendar apps is easier to work with than an +all-in-one org solution. diff --git a/content/blog/2024-03-15-self-hosting-ddns-updater.org b/content/blog/2024-03-15-self-hosting-ddns-updater.org new file mode 100644 index 0000000..0e70c58 --- /dev/null +++ b/content/blog/2024-03-15-self-hosting-ddns-updater.org @@ -0,0 +1,314 @@ +#+title: Self-Hosting DDNS Updater +#+date: <2024-03-15 Fri 14:49:59> +#+description: A guide to self-hosting the DDNS Updater container. + +#+caption: DDNS Updater Web View +[[https://img.cleberg.net/blog/20240315-ddns-updater/ddns.png]] + +[[https://github.com/qdm12/ddns-updater][DDNS Updater]] is a program to +keep DNS A and/or AAAA records updated for multiple DNS providers. + +If you've read any of my other posts, you'll notice that I have been +searching for and using a few different DDNS updating solutions for +years. You'll also notice that I love any projects that offer a Docker +Compose solution. + +Luckily, DDNS Upater fits both of these preferences. + +** Installation + +To get started, always make sure to review the project's +[[https://github.com/qdm12/ddns-updater/blob/master/README.md][README]]. +I'll be documenting my steps below, but they may have changed by the +time you read this. + +The first step is to set up the directories and files required for the +project. + +#+begin_src sh +mkdir ~/ddns-updater +mkdir ~/ddns-updater/data +touch ~/ddns-updater/data/config.json +#+end_src + +*** Configuration + +The main configuration you need to update is the =data/config.json= +file. There is a large list of supported providers in the README, but +I'm going to use Cloudflare in this example. + +#+begin_src sh +nano ~/ddns-updater/data/config.json +#+end_src + +When setting up the configuration for Cloudflare, you'll need the +following: + +- Required Parameters + - ="zone_identifier"= is the Zone ID of your site from the domain + overview page + - ="host"= is your host and can be ="@"=, a subdomain or the wildcard + ="*"=. See + [[https://github.com/qdm12/ddns-updater/issues/243#issuecomment-928313949][this + issue comment for context]]. + - ="ttl"= integer value for record TTL in seconds (specify 1 for + automatic) + - One of the following + ([[https://developers.cloudflare.com/fundamentals/api/get-started/][how + to find API keys]]): + - Email ="email"= and Global API Key ="key"= + - User service key ="user_service_key"= + - API Token ="token"=, configured with DNS edit permissions for your + DNS name's zone +- Optional Parameters + - ="proxied"= can be set to =true= to use the proxy services of + Cloudflare + - ="ip_version"= can be =ipv4= (A records), or =ipv6= (AAAA records) + or =ipv4 or ipv6= (update one of the two, depending on the public + ip found). It defaults to =ipv4 or ipv6=. + - ="ipv6_suffix"= is the IPv6 interface identifier suffix to use. It + can be for example =0:0:0:0:72ad:8fbb:a54e:bedd/64=. If left empty, + it defaults to no suffix and the raw public IPv6 address obtained is + used in the record updating. + +#+begin_src conf +{ + "settings": [ + { + "provider": "cloudflare", + "zone_identifier": "some id", + "domain": "domain.com", + "host": "@", + "ttl": 1, + "proxied": true, + "token": "yourtoken", + "ip_version": "ipv4", + "ipv6_suffix": "" + } + ] +} +#+end_src + +Once you have configured the provider of your choice, correct the file +and directory permissions and ownership. + +#+begin_src sh +cd ~/ddns_updater +# Owned by user ID of Docker container (1000) +chown -R 1000 data +# all access (for creating json database file data/updates.json) +chmod 700 data +# read access only +chmod 400 data/config.json +#+end_src + +*** Docker Compose + +After creating the project structure, let's create the +=docker-compose.yml= file. + +#+begin_src sh +nano ~/ddns_-pdater/docker-compose.yml +#+end_src + +#+begin_src config +version: "3.7" +services: + ddns-updater: + image: qmcgaw/ddns-updater + container_name: ddns-updater + network_mode: bridge + ports: + - 8097:8000/tcp # Change the 8097 value to whichever port you want to use + volumes: + - ./data:/updater/data + environment: + - CONFIG= + - PERIOD=5m + - UPDATE_COOLDOWN_PERIOD=5m + - PUBLICIP_FETCHERS=all + - PUBLICIP_HTTP_PROVIDERS=all + - PUBLICIPV4_HTTP_PROVIDERS=all + - PUBLICIPV6_HTTP_PROVIDERS=all + - PUBLICIP_DNS_PROVIDERS=all + - PUBLICIP_DNS_TIMEOUT=3s + - HTTP_TIMEOUT=10s + + # Web UI + - LISTENING_ADDRESS=:8000 + - ROOT_URL=/ + + # Backup + - BACKUP_PERIOD=0 # 0 to disable + - BACKUP_DIRECTORY=/updater/data + + # Other + - LOG_LEVEL=info + - LOG_CALLER=hidden + - SHOUTRRR_ADDRESSES= + restart: always +#+end_src + +After configuring your preferences in the =docker-compose.yml=, launch +the container. + +#+begin_src sh +cd ~/ddns-updater +sudo docker-compose up -d +#+end_src + +If you've launched this on your local machine, you can launch +=localhost:8097= in your browser to see the results. + +*** Nginx Reverse Proxy + +If you launched this service on a server, other machine, or just want to +access it remotely via a domain name, you can use Nginx as a reverse +proxy to expose the service publicly. + +Start by creating the Nginx configuration file. + +#+begin_src sh +sudo nano /etc/nginx/sites-available/ddns +#+end_src + +Here's a basic example that should work properly. + +#+begin_src conf +server { + # If using 443, remember to include your ssl_certificate + # and ssl_certificate_key + listen [::]:80; + listen 80; + server_name ddns.example.com; + + location / { + set $upstream_ao http://127.0.0.1:9380; + proxy_pass $upstream_ao; + + # May need some additional proxy_* parameters, + # see the full example below if necessary + } +} +#+end_src + +Here's a full example that uses my Authelia authentication service to +require authentication before someone can access the web page. + +#+begin_src conf +server { + if ($host ~ ^[^.]+\.example\.com$) { + return 301 https://$host$request_uri; + } + + listen [::]:80; + listen 80; + server_name ddns.example.com; + return 404; +} + +server { + listen [::]:443 ssl http2; + listen 443 ssl http2; + server_name ddns.example.com; + access_log /var/log/nginx/ddns.access.log; + error_log /var/log/nginx/ddns.error.log; + + add_header X-Content-Type-Options "nosniff"; + add_header X-XSS-Protection "1; mode=block"; + add_header X-Frame-Options "DENY"; + add_header Strict-Transport-Security "max-age=63072000; includeSubDomains"; + add_header Referrer-Policy "no-referrer"; + + ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; + ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + include /etc/letsencrypt/options-ssl-nginx.conf; + ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; + + location /authelia { + internal; + set $upstream_authelia http://127.0.0.1:9091/api/verify; #change the IP and Port to match the IP and Port of your Authelia container + proxy_pass_request_body off; + proxy_pass $upstream_authelia; + proxy_set_header Content-Length ""; + + # Timeout if the real server is dead + proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; + client_body_buffer_size 128k; + proxy_set_header Host $host; + proxy_set_header X-Original-URL $scheme://$http_host$request_uri; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $http_host; + proxy_set_header X-Forwarded-Uri $request_uri; + proxy_set_header X-Forwarded-Ssl on; + proxy_redirect http:// $scheme://; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_cache_bypass $cookie_session; + proxy_no_cache $cookie_session; + proxy_buffers 4 32k; + + send_timeout 5m; + proxy_read_timeout 240; + proxy_send_timeout 240; + proxy_connect_timeout 240; + } + + location / { + set $upstream_ddns http://127.0.0.1:8097; #change ddns to match your container name: $upstream_some-container-name or $upstream_somecontainername + proxy_pass $upstream_ddns; #change ddns to match your container name: $upstream_some-container-name or $upstream_somecontainername + + auth_request /authelia; + auth_request_set $target_url https://$http_host$request_uri; + auth_request_set $user $upstream_http_remote_user; + auth_request_set $email $upstream_http_remote_email; + auth_request_set $groups $upstream_http_remote_groups; + proxy_set_header Remote-User $user; + proxy_set_header Remote-Email $email; + proxy_set_header Remote-Groups $groups; + + error_page 401 =302 https://auth.example.com/?rd=$target_url; #change this to match your authentication domain/subdomain + + client_body_buffer_size 128k; + + proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; + + send_timeout 5m; + proxy_read_timeout 360; + proxy_send_timeout 360; + proxy_connect_timeout 360; + + proxy_set_header Host $host; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + proxy_set_header Accept-Encoding gzip; + 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-Host $http_host; + proxy_set_header X-Forwarded-Uri $request_uri; + proxy_set_header X-Forwarded-Ssl on; + proxy_redirect http:// $scheme://; + proxy_http_version 1.1; + proxy_set_header Connection ""; + proxy_cache_bypass $cookie_session; + proxy_no_cache $cookie_session; + proxy_buffers 64 256k; + + # set_real_ip_from 192.168.1.0/16; #make sure this matches your network setup + # real_ip_header CF-Connecting-IP; + # real_ip_recursive on; + } +} +#+end_src + +When complete, simply link the file and restart the web server. + +#+begin_src sh +sudo ln -s /etc/nginx/sites-available/ddns /etc/nginx/sites-enabled/ddns +sudo systemctl restart nginx.service +#+end_src + +Your ddns-updater service will now be available via =ddns.example.com=! diff --git a/content/blog/2024-03-29-org-blog.org b/content/blog/2024-03-29-org-blog.org new file mode 100644 index 0000000..b68ded2 --- /dev/null +++ b/content/blog/2024-03-29-org-blog.org @@ -0,0 +1,43 @@ +#+title: Blogging in Org-Mode +#+date: 2024-03-29 +#+description: A guide to blogging with org-mode, no third-party tools required. +#+filetags: :dev: +#+draft: t +#+slug: org-blog + +Refer to the post I wrote about [[/blog/doom-emacs-org-mode.html][Doom Emacs & Org-Mode]] for more information about +my base Emacs configuration. + +* TODO Weblorg + +[[https://github.com/emacs-love/weblorg][Weblorg]] is a static site generator for [[https://orgmode.org/][org-mode]], built for use within [[https://www.gnu.org/software/emacs/][Emacs]]. + +** Installation + +macOS, use Doom's package installation process, link proper files in =publish.el= + +** Configuration + +* Project + +** TODO Structure + +** TODO Configuration + +** TODO Build & Deploy + +#+begin_src sh +touch build.sh && chmod +x build.sh && nano build.sh +#+end_src + +#+begin_src sh +rm -rf .build/* && \ +ENV=prod emacs --script publish.el && \ +scp -r .build/* ubuntu:/var/www/cleberg.net/ +#+end_src + +#+begin_src sh +> time ./build.sh + +./build.sh 35.46s user 0.59s system 85% cpu 41.965 total +#+end_src diff --git a/content/index.org b/content/index.org new file mode 100644 index 0000000..d94d79b --- /dev/null +++ b/content/index.org @@ -0,0 +1,2 @@ +#+title: cleberg.net +#+description: Just a blip of ones and zeroes. diff --git a/salary/index.org b/content/salary/index.org index e4f9f12..206a52d 100644 --- a/salary/index.org +++ b/content/salary/index.org @@ -1,5 +1,6 @@ #+title: Salary #+description: A historical log of my jobs and salaries. +#+slug: index * Salary Transparency @@ -30,8 +31,7 @@ raise while in the same role. | Title | Company | Location | Start | End | Salary | |------------------------------------------------+------------------------+----------------+---------+---------+----------| -| Senior IT & Security Auditor | Gemini | Remote | 2024-03 | Current | $122,000 | -| Senior Associate, Technology Assurance - Audit | KPMG | Omaha, NE | 2023-10 | 2024-03 | $116,700 | +| Senior Associate, Technology Assurance - Audit | KPMG | Omaha, NE | 2023-10 | Current | $116,700 | | Senior Associate, Technology Assurance - Audit | KPMG | Omaha, NE | 2022-06 | 2023-10 | $110,000 | | Senior Technology Risk Consultant | Ernst & Young | Des Moines, IA | 2021-09 | 2022-06 | $89,500 | | Senior IT Auditor | Ameritas | Lincoln, NE | 2021-05 | 2021-09 | $72,000 | @@ -42,9 +42,13 @@ raise while in the same role. | Teaching Assistant | University of Nebraska | Lincoln, NE | 2017-08 | 2018-05 | $7/hour | | Community Management Intern | Walgreens | Lincoln, NE | 2017-06 | 2018-02 | $14/hour | -This page was inspired by [[https://xeiaso.net/][Xe]], and I'm quoting the following wording from them as +This page was inspired by [[https://xeiaso.net/salary-transparency/][Xe]], and I'm quoting the following wording from them as I want to reiterate this piece: #+begin_quote -Please consider publishing your salary data like this as well. By open, voluntary transparency we can help to end stigmas around discussing pay and help ensure that the next generations of people in tech are treated fairly. Stigmas thrive in darkness but die in the light of day. You can help end the stigma by playing your cards out in the open like this. +Please consider publishing your salary data like this as well. By open, +voluntary transparency we can help to end stigmas around discussing pay and help +ensure that the next generations of people in tech are treated fairly. Stigmas +thrive in darkness but die in the light of day. You can help end the stigma by +playing your cards out in the open like this. #+end_quote diff --git a/services/index.org b/content/services/index.org index add8bc8..b9ecca2 100644 --- a/services/index.org +++ b/content/services/index.org @@ -1,5 +1,6 @@ #+title: Services #+description: Publicly-available services hosted on cleberg.net. +#+slug: index - [[https://ao.cleberg.net/][AnonymousOverflow]] - A StackOverflow proxy - [[https://cyberchef.cleberg.net/][CyberChef]] - The Cyber Swiss Army Knife @@ -9,6 +10,7 @@ - [[https://ip.cleberg.net/][ifconfig.php]] - A "whatsmyip" tool - [[https://invidious.cleberg.net/][Invidious]] - A YouTube proxy - [[https://office.cleberg.net/][Office]] - The world's smallest office suite +- [[https://org.cleberg.net/][Org-Live]] - A basic org-mode editor for the web I built - [[https://search.cleberg.net/][SearXNG]] - A privacy-respecting, open metasearch engine See the [[https://git.cleberg.net/cleberg.net.git/log][git log]] if you want to see changes that have been made. diff --git a/content/wiki/blogroll.org b/content/wiki/blogroll.org new file mode 100644 index 0000000..5b6da72 --- /dev/null +++ b/content/wiki/blogroll.org @@ -0,0 +1,32 @@ +#+title: Blogroll +#+date: <2024-03-15 Fri 21:50> + +** Aggregators + +- [[https://1mb.club/][1MB Club]] +- [[https://250kb.club/][250KB Club]] +- [[https://512kb.club/][512KB Club]] +- [[https://darktheme.club/][Darktheme Club]] +- [[https://nocss.club/][No CSS Club]] +- [[https://no-js.club/][No-JS Club]] +- [[https://blogroll.org/][Ye Olde Blogroll]] + +** Plain Text + +A list of various plaintext websites and lists. + +- [[https://greycoder.com/a-list-of-text-only-new-sites/][A List Of + Text-Only & Minimalist News Sites]] +- [[https://harvardlawreview.org/][Harvard Law Review]] +- [[https://sjmulder.nl/en/textonly.html][Hyperlinked Text]] +- [[https://medium.com/@letsworkshop/plain-text-web-design-a78ccaf9dbc0][Plain-text + web design]] +- [[https://plaintextworld.com/][Plaintext World]] +- [[https://justinjackson.ca/words.html][Words]] + +** Webrings + +Instead of listing my personal favorites, I'm just going to drop a link +to [[https://brisray.com/web/webring-list.htm][brisay's webring list]], +which contains 237 webrings for a total of 7078 websites, as of +2024-03-15. diff --git a/content/wiki/hardware.org b/content/wiki/hardware.org new file mode 100644 index 0000000..9fa7f4f --- /dev/null +++ b/content/wiki/hardware.org @@ -0,0 +1,114 @@ +#+title: Hardware +#+date: <2024-03-16 Sat 15:42:58> + +** Desktop + +*** macOS + +Probably should have added more RAM but Macbooks are stupid expensive. + +| Category | Details | +|----------+---------------------------------------------------------| +| Model | [[https://www.apple.com/macbook-pro/][Macbook Pro 16”]] | +| CPU | Apple M2 Pro | +| RAM | 16GB | +| Storage | 512GB SSD | + +*** Linux + +A beauty. + +| Category | Details | +|----------+----------------------------------------------------------------------------------------------------------------------------------------------------------| +| Model | [[https://www.lenovo.com/us/en/p/laptops/thinkpad/thinkpade/thinkpad--e15-gen-4-(15-inch-amd)/len101t0023][Lenovo ThinkPad E15 Gen 4, model 21ED0048US]] | +| CPU | AMD Ryzen 5 5625U with Radeon Graphics | +| RAM | 16 GB | +| Storage | 256 GB SSD | + +** Mobile + +Previously used a Pixel 6 & Pixel 7 with GrapheneOS. + +| Category | Details | +|----------+-------------------------------------------------------------| +| Model | [[https://www.apple.com/iphone-15-pro/][iPhone 15 Pro Max]] | +| CPU | A17 Pro | +| RAM | 8GB | +| Storage | 256GB | + +** Homelab + +I run a small homelab with a mix of consumer (compute/storage) and +enterprise (network) hardware. I try to keep the lab energy efficient +and quiet as my top priorities. + +*** IoT + +A collection of mainly smart lights, sensors, and smart appliances. My +first preference is to disable all networking for new smart devices or +simply not connect internet in the first place (e.g. I never enable +internet on my smart TVs). If the smart device requires LAN access, I +will connect the device to my guest-restricted IoT network. As a last +resort, I will set-up the internet but monitor the DNS lookups via +NextDNS and forcibly block any domains I do not want the device to be +using. If the device is egregious or shady, I'll just sell it and either +replace it or live without it. + +- Other Appliances (washer, dryer, humidifier, fans, etc.) +- [[https://about.irobot.com/sitecore/content/north-america/irobot-us/home/roomba/i7-series][Roomba + i7+]] +- [[https://www.philips-hue.com/en-us/p/hue-white-and-color-ambiance-a19---e26-smart-bulb---60-w--3-pack-/046677562786][Philips + Hue A19 Bulbs]] x 15 +- [[https://www.philips-hue.com/en-us/p/hue-bundle-play-blk-ext/33001][Philips + Hue Play Light Bars]] +- [[https://www.philips-hue.com/en-us/p/hue-bridge/046677458478][Philips + Hue Smart Bridge]] + play light bars and a ton of bulbs +- [[https://store.ui.com/us/en/collections/unifi-camera-security-special-chime][UP + Chime]] +- [[https://store.ui.com/us/en/collections/unifi-camera-security-special-sensor][UP-Sense]] + x 2 +- [[https://store.ui.com/us/en/products/unifi-smart-power][USP-Plug]] +- [[https://store.ui.com/us/en/collections/unifi-camera-security-compact-wifi-connected][UVC + G4 Instant]] x 3 +- [[https://store.ui.com/us/en/collections/unifi-camera-security-special-wifi-doorbell][UVC + G4 Doorbell Pro]] + +*** Network + +A rack-mounted Dream Machine Pro, connected downstream to an access +point, mesh extender, and a couple ethernet switches. + +- [[https://store.ui.com/us/en/collections/unifi-dream-machine/products/udm-pro][UDM-Pro]] +- [[https://store.ui.com/us/en/collections/unifi-switching-standard-power-over-ethernet/products/usw-24-poe][USW-24-PoE]] +- [[https://store.ui.com/us/en/collections/unifi-switching-utility-poe/products/usw-lite-8-poe][USW-Lite-8-PoE]] +- [[https://store.ui.com/us/en/collections/unifi-wifi-flagship-high-capacity/products/u6-pro][U6-Pro]] +- [[https://store.ui.com/us/en/collections/unifi-wifi-inwall-outlet-mesh][U6-Extender]] +- [[https://store.ui.com/us/en/collections/unifi-accessory-tech-installations-rackmount/products/uacc-rack-panel-patch-blank-24][USW + 24-Port Patch Panel]] + +*** Servers + +**** Rack-Mount Server + +I wasn't happy with using low-powered PCs as servers and I knew I did +not want the ear-shattering enterprise rack-mounted servers, so I built +my own. + +| Category | Details | +|--------------------+----------------------------------------| +| Case | Rosewill RSV-R4100U 4U | +| Motherboard | NZXT B550 | +| CPU | AMD Ryzen 7 5700G with Radeon Graphics | +| RAM | 64GB RAM (2x32GB) | +| Storage (On-board) | Western Digital 500GB M.2 NVME SSD | +| Storage (HDD Bay) | 48TB HDD | +| PSU | Corsair RM850 PSU | + +**** Other + +These ran as my main servers before I built the rack-mounted server +above. I have shut these down indefinitely for now as I have no use for +them. + +- Dell OptiPlex +- Raspberry Pi 4 diff --git a/content/wiki/ios.org b/content/wiki/ios.org new file mode 100644 index 0000000..adc1bf9 --- /dev/null +++ b/content/wiki/ios.org @@ -0,0 +1,198 @@ +#+title: iOS +#+date: <2024-03-13 Wed 00:00:00> + +Related: + +- [[/wiki/hardware.html][Hardware]] + +My primary mobile OS. Currently running iOS 17. This wiki page contains +most of the apps I have used at one point or another across my different +iPhones. + +[=*=] = My favorites + +** Configuration + +*** Display + +- Light Mode + - 10:00 to 16:00 +- Dark Mode + - 16:00 to 10:00 + +*** Focus Modes + +- Personal Focus + - 06:00 to 21:00 + - Allow Notifications From: + - Alarms + - Calendar + - Contacts (1 person) + - Messages + - Phone + - Reminders + - Signal + - UniFi Protect +- Sleep Focus + - 21:00 to 06:00 + - Allow Notifications From: + - Alarms + - Contacts (1 person) + - Reminders + - Signal + +*** Privacy & Security + +I generally follow the +[[https://en.wikipedia.org/wiki/Principle_of_least_privilege][principle +of least privilege]] by only permitting the bare minimum privileges and +revoking as soon as they are no longer required. + +Here's the baseline I start with: + +- Disable: + - Analytics & Improvements + - Apple Advertising + - Apple ID > Sign-In & Security > Two-Factor Authentication + - Location Services > System Services > Product Improvement + - Tracking > Allow Apps to Request to Track + - Safari > Advanced > Privacy Preserving Ad Measurement +- Enable: + - Apple ID > iCloud > Advanced Data Protection + - Apple ID > Personal Information > Communication Preferences + - App Privacy Report + - Location Services only for Camera, Find My, UDisc, & WiFiman + (=While Using=) + - Safari > Prevent Cross-Site Tracking + - Safari > Hide IP Address + - Safari > Advanced > Advanced Tracking and Fingerprinting Protection + +** Native Apps + +*** Business + +- [[https://apps.apple.com/us/app/element-messenger/id1083446067][Element]] - + A cross-platform messenger, based on Matrix +- [[https://apps.apple.com/us/app/linkedin-network-job-finder/id288429040][LinkedIn]] - + One of the only social media apps I use + +*** Developer Tools + +- [[https://testflight.apple.com/join/F2vK7xo4][Harbour]] - Easily + manage your Portainer service +- [[https://apps.apple.com/us/app/ish-shell/id1436902243][iSH]] - A + local shell with SSH functionality + +*** Entertainment + +- [[https://apps.apple.com/us/app/plex-watch-live-tv-and-movies/id383457673][Plex]] - + A client for the Plex Media Server +- [[https://apps.apple.com/us/app/steam-mobile/id495369748][Steam]] - + The top gaming marketplace for computers + +*** Lifestyle + +- [[https://apps.apple.com/us/app/home/id1110145103][Home]] [=*=] - + Apple homekit powered smart home manager +- [[https://apps.apple.com/us/app/philips-hue/id1055281310][Hue]] - + Philips Hue smart home manager +- [[https://apps.apple.com/us/app/irobot-home/id1012014442][iRobot]] - + Manage iRobot Roomba devices +- [[https://apps.apple.com/us/app/unifi-protect/id1392492235][UniFi + Protect]] - View and manage most UniFi Protect cameras and settings + +*** Music + +- [[https://apps.apple.com/us/app/apple-music/id1108187390][Apple + Music]] [=*=] - Apple's native music streaming app +- [[https://apps.apple.com/us/app/plexamp/id1500797510][Plexamp]] + [=*=] - Top-notch music app for your Plex Media Server, with a neural + network that provides excellent radio/shuffle suggestions + +*** News + +- [[https://apps.apple.com/us/app/netnewswire-rss-reader/id1480640210][NetNewsWire]] - + A free and open source RSS reader for Mac, iPhone, and iPad + +*** Photo & Video + +- [[https://testflight.apple.com/join/Q6WyyEpS][Aislingeach]] - A quick + way to generate and rate images from the Stable Horde +- [[https://apps.apple.com/us/app/unsplash/id1290631746][Unsplash]] - + Premium images, mostly free + +*** Productivity + +- [[https://apps.apple.com/us/app/beorg-to-do-list-agenda/id1238649962][beorg]] - + An org-mode editor, outline, and scheduler with paid extensions +- [[https://apps.apple.com/us/app/bitwarden-password-manager/id1137397744][Bitwarden]] + [=*=] - An open source password manager +- [[https://apps.apple.com/us/app/cryptomator/id1560822163][Cryptomator]] - + A cross-platform encryption program +- [[https://apps.apple.com/us/app/obsidian-connected-notes/id1557175442][Obsidian]] + [=*=] - A nice Markdown-based editor based on a "vault" structure. + Offers a paid sync solution and community extensions +- [[https://apps.apple.com/us/app/strongbox-password-manager/id897283731][Strongbox]] - + Keepass password manager for iOS & macOS +- [[https://apps.apple.com/us/app/unifi/id1057750338][UniFi Network]] - + View and manage most UniFi Network settings + +*** Safari Extensions + +- [[https://apps.apple.com/us/app/adguard-adblock-privacy/id1047223162][AdGuard]] - + Ad blocker +- [[https://apps.apple.com/us/app/dark-reader-for-safari/id1438243180][Dark + Reader]] - Dark mode for all the sites +- [[https://apps.apple.com/us/app/pipifier/id1234771095][PiPifier]] - + Force videos to support PiP +- [[https://apps.apple.com/us/app/privacy-redirect/id1578144015][Privacy + Redirect]] - Redirect select websites to others, usually to + privacy-focused alternatives + +*** Social Networking + +- [[https://apps.apple.com/us/app/multitab-for-tumblr/id1071533778][MultiTab + T]] [=*=] - A gallery-based Tumblr client with some unique features, + such as tab history and sync +- [[https://apps.apple.com/us/app/signal-private-messenger/id874139669][Signal]] + [=*=] - A simple, powerful, and secure messenger +- [[https://testflight.apple.com/join/mpVk1qIy][Three Cheers]] - A + client for Tildes.net with a design focus that matches the intent of + Tildes +- [[https://apps.apple.com/us/app/voyager-for-lemmy/id6451429762][Voyager]] - + A Lemmy client + +*** Sports + +- [[https://apps.apple.com/us/app/apple-sports/id6446788829][Apple + Sports]] - Apple's new sports app - lacks notifications and live + events +- [[https://apps.apple.com/us/app/udisc-disc-golf/id1072228953][UDisc]] - + Disc golf course maps, score cards, and more + +*** Utilities + +- [[https://apps.apple.com/us/app/backblaze/id628638330][Backblaze]] - + Quickly view and manage Backblaze b2 cloud storage +- [[https://apps.apple.com/us/app/mullvad-vpn/id1488466513][Mullvad + VPN]] [=*=] - A private VPN service +- [[https://apps.apple.com/us/app/otp-auth/id659877384][OTP Auth]] + [=*=] - A minimalistic OTP app with support for biometrics, custom + icons, import/export, and iCloud sync +- [[https://apps.apple.com/us/app/plex-dash/id1500797677][Plex Dash]] - + Stats about your Plex Media Server +- [[https://apps.apple.com/us/app/safari/id1146562112][Safari]] - iOS + default browser +- [[https://apps.apple.com/us/app/ubiquiti-wifiman/id1385561119][Unifi + WiFiman]] - Create visual layouts of WiFi strength and save heat maps + to your phone + +** Web Apps & Shortcuts + +- [[https://brutalist.report/][Brutalist Report]] - Minimal news + aggregator +- [[https://cyber.report/][_Cyber.Report]] - Cybersecurity news + aggregator +- [[https://news.ycombinator.com/][Hacker News]] - Mostly technical news +- [[https://nextdns.io/][NextDNS]] - NextDNS statistics dashboard +- [[https://readspike.com/][Readspike]] - Minimal news aggregator diff --git a/content/wiki/macos.org b/content/wiki/macos.org new file mode 100644 index 0000000..de59e12 --- /dev/null +++ b/content/wiki/macos.org @@ -0,0 +1,192 @@ +#+title: macOS +#+date: <2024-03-13 Wed 00:00:00> + +Related: + +- [[/wiki/hardware.html][Hardware]] + +My primary OS. Currently running macOS Sonoma 14. This wiki page +contains most of the apps I have used at one point or another across my +different Macbooks. + +[=*=] = My favorites + +** Configuration + +*** Disable System Services + +- [[https://developer.apple.com/documentation/security/disabling_and_enabling_system_integrity_protection][Disabling + and Enabling System Integrity Protection]] +- Disable Gatekeeper: =sudo spctl --master-disable= + +*** Dotfiles + +These are probably out of date, but they give a general idea of how I +configure my machine. + +#+begin_src config +# ~/.zshrc +export PATH="/opt/homebrew/bin:$PATH" +export PATH="$HOME/.emacs.d/bin:$PATH" +export EDITOR="/opt/homebrew/bin/emacs -nw" +ZSH_THEME="bureau" +plugins=(git zsh-autosuggestions) +source $ZSH/oh-my-zsh.sh +#+end_src + +#+begin_src config +# ~/.zprofile +eval "$(/opt/homebrew/bin/brew shellenv)" +#+end_src + +#+begin_src config +# ~/.config/skhd/skhdrc +cmd - return : /Applications/iTerm.app/Contents/MacOS/iTerm2 +cmd + shift - return : /Applications/LibreWolf.app/Contents/MacOS/librewolf +#+end_src + +#+begin_src config +# ~/.config/yabai/yabairc +yabai -m config \ + mouse_follows_focus off \ + focus_follows_mouse off \ + window_origin_display default \ + window_placement second_child \ + window_zoom_persist on \ + window_shadow on \ + window_animation_duration 0.0 \ + window_animation_frame_rate 120 \ + window_opacity_duration 0.0 \ + active_window_opacity 1.0 \ + normal_window_opacity 0.90 \ + window_opacity off \ + insert_feedback_color 0xffd75f5f \ + split_ratio 0.50 \ + split_type auto \ + auto_balance off \ + top_padding 15 \ + bottom_padding 15 \ + left_padding 15 \ + right_padding 15 \ + window_gap 10 \ + layout bsp \ + mouse_modifier fn \ + mouse_action1 move \ + mouse_action2 resize \ + mouse_drop_action swap +echo "yabai configuration loaded.." +#+end_src + +** Software + +*** Browsers + +- [[https://librewolf.net/][Librewolf]] [=*=] - Custom version of + Firefox, focused on privacy and security + - [[https://bitwarden.com/][Bitwarden]] - An open source password + manager + - [[https://darkreader.org/][Dark Reader]] - Dark mode for all the + websites + - [[https://libredirect.github.io/][Libredirect]] - Automatic web + redirections + - [[https://strongboxsafe.com/][Strongbox]] - Keepass password manager + for iOS & macOS + - [[https://ublockorigin.com/][uBlock Origin]] - Free, open-source ad + content blocker +- [[https://github.com/ungoogled-software/ungoogled-chromium][Ungoogled + Chromium]] - Google Chromium, sans integration with Google +- [[https://www.gnu.org/software/emacs/manual/html_mono/eww.html][eww]] - + Emacs Web Wowser, for TUI browsing + +*** Communications + +- [[https://github.com/tulir/gomuks][gomuks]] - A terminal based Matrix + client +- [[https://www.thunderbird.net/][Thunderbird]] [=*=] - An open source + email client by Mozilla +- [[https://signal.org/][Signal]] [=*=] - A simple, powerful, and secure + messenger + +*** Development + +- [[https://www.docker.com/products/docker-desktop/][Docker Desktop]] - + Docker containers for your desktop + - [[https://github.com/open-webui/open-webui][open-webui]] - + User-friendly WebUI for LLMs +- [[https://iterm2.com/][iTerm2]] [=*=] - The best terminal for macOS, + hands down +- [[https://developer.apple.com/xcode/][Xcode]] - Apple's IDE +- [[https://en.wikipedia.org/wiki/Z_shell][zsh]] [=*=] - My shell + preference due to its plugin and theme community + - [[https://github.com/zsh-users/zsh-autosuggestions][zsh-autosuggestions]] - + Fish-like autosuggestions for zsh + - [[https://github.com/zsh-users/zsh-syntax-highlighting][zsh-syntax-highlighting]] - + Fish shell like syntax highlighting for Zsh + +*** Editors + +- [[https://github.com/doomemacs/doomemacs][Doom Emacs]] - An Emacs + framework, great for working in org-mode +- [[https://obsidian.md/][Obsidian]] [=*=] - A nice Markdown-based + editor based on a "vault" structure. Offers a paid sync solution and + community extensions +- [[https://standardnotes.com/][Standard Notes]] - A simple text editor + focused on privacy and security. Offers a paid sync solution and + community extensions +- [[https://vscodium.com/][VSCodium]] [=*=] - VS Code without + proprietary blobs + +*** Media + +- [[https://skylum.com/luminar][Luminar]] - Luminar offers top-notch + photo editing features +- [[https://www.minecraft.net/][Minecraft]] - Block mining simulator +- [[https://netnewswire.com/][NetNewsWire]] - A free and open source RSS + reader for Mac, iPhone, and iPad +- [[https://www.plex.tv/][Plex]] [=*=] - Desktop client for the Plex + Media Server +- [[https://store.steampowered.com/][Steam]] - The top gaming + marketplace for computers +- [[https://transmissionbt.com/][Transmission]] [=*=] - A Fast, Easy and + Free Bittorrent Client +- [[https://www.videolan.org/vlc/][VLC]] - A free and open source + cross-platform multimedia player + +** Package Management + +- [[https://brew.sh/][Homebrew]] [=*=] - The Missing Package Manager for + macOS (or Linux) +- [[https://www.macports.org/][MacPorts]] - A system to compile, + install, and manage open source software + +*** Utilities + +- [[https://www.macbartender.com/Bartender5/][Bartender 5]] [=*=] - Easy + control and customization over the native macOS menu bar +- [[https://betterdisplay.pro/][BetterDisplay]] - Allows you to tweak a + ton of features of built-in and external screens, such as scaling, + configuration overrides, and color/brightness upscaling +- [[https://bitwarden.com/][Bitwarden]] - An open source password + manager +- [[https://ollama.com/][Ollama]] - Run Llama 2, Code Llama, and other + models locally on your machine + - [[https://github.com/kghandour/Ollama-SwiftUI][Ollama Swift]] - User + Interface made for Ollama.ai using Swift +- [[https://obdev.at/products/littlesnitch/index.html][LittleSnitch]] - + Shows all network connections on your Macbook, including system and + privileged services +- [[https://obdev.at/products/microsnitch/index.html][MicroSnitch]] - + Camera & microphone monitoring and alterting service +- [[https://mullvad.net/][Mullvad]] [=*=] - A private VPN service +- [[https://github.com/koekeishiya/skhd][skhd]] [=*=] - Simple hotkey + daemon for macOS +- [[https://strongboxsafe.com/][Strongbox]] - Keepass password manager + for iOS & macOS +- [[https://syncthing.net/][Syncthing]] [=*=] - Continuous file + synchronization +- [[https://www.bresink.com/osx/TinkerTool.html][TinkerTool]] - Unlock + hidden configuration options for macOS +- [[https://github.com/koekeishiya/yabai][yabai]] [=*=] - Automatic + window tiling +- [[https://github.com/yt-dlp/yt-dlp][yt-dlp]] - A youtube-dl fork with + additional features and fixes diff --git a/index.org b/index.org deleted file mode 100644 index 12f439d..0000000 --- a/index.org +++ /dev/null @@ -1,28 +0,0 @@ -#+title: cleberg.net -#+options: toc:nil -#+options: \n:t - -#+begin_quote -Do AIs dream in electric sheep? -He hoped it had nanosecond nightmares. -#+end_quote - -* Recent Blog Posts - -- 2024-02-21 [[./blog/self-hosting-otter-wiki/][Self-Hosting An Otter Wiki]] -- 2024-02-13 [[./blog/ubuntu-emergency-mode/][Stuck in Ubuntu's Emergency Mode? Try Fixing the Fstab File]] -- 2024-02-06 [[./blog/zfs/][How to Create a ZFS Pool on Ubuntu Linux]] - -[[./blog/][All Posts →]] - -* Everything Else - -- [[./salary/][Salary]] -- [[./services/][Services]] -- [[./wiki/][Wiki]] - -* Contact - -- hello [at] cleberg.net ([[./gpg.txt][GPG]]) -- [[https://matrix.to/#/@cyborg:matrix.tchncs.de][@cyborg:@matrix.tchncs.de]] -- [[https://git.cleberg.net/cleberg.net.git][Git]] diff --git a/publish.el b/publish.el new file mode 100644 index 0000000..ff017e8 --- /dev/null +++ b/publish.el @@ -0,0 +1,98 @@ +;; explicity load packages since I'm using Doom Emacs +(add-to-list 'load-path "~/.emacs.d/.local/straight/repos/emacs-htmlize") +(add-to-list 'load-path "~/.emacs.d/.local/straight/repos/weblorg") +(add-to-list 'load-path "~/.emacs.d/.local/straight/repos/templatel") +(require 'htmlize) +(require 'weblorg) + +;; defaults to http://localhost:8000 +;; ENV=prod emacs --script publish.el +(if (string= (getenv "ENV") "prod") + (setq weblorg-default-url "https://cleberg.net")) + +(weblorg-site + :theme nil + :template-vars '(("site_name" . "cleberg.net") + ("site_owner" . "hello@cleberg.net") + ("site_description" . "Just a blip of ones and zeroes."))) + +;; route for rendering the index page of the website +(weblorg-route + :name "index" + :input-pattern "content/index.org" + :template "index.html" + :output ".build/index.html" + :url "/") + +;; route for rendering each post +(weblorg-route + :name "blog" + :input-pattern "content/blog/*.org" + :template "post.html" + :output ".build/blog/{{ slug }}.html" + :url "/blog/{{ slug }}.html") + +;; route for rendering the index page of the blog +(weblorg-route + :name "blog-index" + :input-pattern "content/blog/*.org" + :input-aggregate #'weblorg-input-aggregate-all-desc + :template "blog.html" + :output ".build/blog/index.html" + :url "/blog/") + +;; route for rendering each wiki post +(weblorg-route + :name "wiki" + :input-pattern "content/wiki/*.org" + :template "post.html" + :output ".build/wiki/{{ slug }}.html" + :url "/wiki/{{ slug }}.html") + +;; route for rendering the index page of the wiki +(weblorg-route + :name "wiki-index" + :input-pattern "content/wiki/*.org" + :input-aggregate #'weblorg-input-aggregate-all + :template "wiki.html" + :output ".build/wiki/index.html" + :url "/wiki/") + +;; route for rendering each page +(weblorg-route + :name "pages" + :input-pattern "content/*.org" + :template "page.html" + :output ".build/{{ slug }}.html" + :url "/{{ slug }}.html") + +(weblorg-route + :name "salary" + :input-pattern "content/salary/*.org" + :template "page.html" + :output ".build/salary/{{ slug }}.html" + :url "/salary/{{ slug }}.html") + +(weblorg-route + :name "services" + :input-pattern "content/services/*.org" + :template "page.html" + :output ".build/services/{{ slug }}.html" + :url "/services/{{ slug }}.html") + +;; RSS Feed +(weblorg-route + :name "rss" + :input-pattern "content/blog/*.org" + :input-aggregate #'weblorg-input-aggregate-all-desc + :template "atom.xml" + :output ".build/atom.xml" + :url "/atom.xml") + +;; route for static assets that also copies files to .build directory +(weblorg-copy-static + :output ".build/{{ file }}" + :url "/{{ file }}") + +;; fire the engine and export all the files declared in the routes above +(weblorg-export) diff --git a/static/styles.css b/static/styles.css deleted file mode 100644 index 9835f79..0000000 --- a/static/styles.css +++ /dev/null @@ -1,807 +0,0 @@ -/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/ -html { - line-height: 1.15; - -webkit-text-size-adjust: 100%; -} - -body { - margin: 0; -} - -main { - display: block; -} - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -hr { - box-sizing: content-box; - height: 0; - overflow: visible; -} - -pre { - font-family: monospace, monospace; - font-size: 1em; -} - -a { - background-color: initial; -} - -abbr[title] { - border-bottom: none; - text-decoration: underline; - text-decoration: underline dotted; -} - -b, -strong { - font-weight: bolder; -} - -code, -kbd, -samp { - font-family: monospace, monospace; - font-size: 1em; -} - -small { - font-size: 80%; -} - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sub { - bottom: -0.25em; -} - -sup { - top: -0.5em; -} - -img { - border-style: none; -} - -button, -input, -optgroup, -select, -textarea { - font-family: inherit; - font-size: 100%; - line-height: 1.15; - margin: 0; -} - -button, -input { - overflow: visible; -} - -button, -select { - text-transform: none; -} - -button, -[type="button"], -[type="reset"], -[type="submit"] { - -webkit-appearance: button; -} - -button::-moz-focus-inner, -[type="button"]::-moz-focus-inner, -[type="reset"]::-moz-focus-inner, -[type="submit"]::-moz-focus-inner { - border-style: none; - padding: 0; -} - -button:-moz-focusring, -[type="button"]:-moz-focusring, -[type="reset"]:-moz-focusring, -[type="submit"]:-moz-focusring { - outline: 1px dotted ButtonText; -} - -fieldset { - padding: 0.35em 0.75em 0.625em; -} - -legend { - box-sizing: border-box; - color: inherit; - display: table; - max-width: 100%; - padding: 0; - white-space: normal; -} - -progress { - vertical-align: baseline; -} - -textarea { - overflow: auto; -} - -[type="checkbox"], -[type="radio"] { - box-sizing: border-box; - padding: 0; -} - -[type="number"]::-webkit-inner-spin-button, -[type="number"]::-webkit-outer-spin-button { - height: auto; -} - -[type="search"] { - -webkit-appearance: textfield; - outline-offset: -2px; -} - -[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -::-webkit-file-upload-button { - -webkit-appearance: button; - font: inherit; -} - -details { - display: block; -} - -summary { - display: list-item; -} - -template { - display: none; -} - -[hidden] { - display: none; -} - -:root { - --bg: #fff; - --bg-bright: #eee; - --fg: #111; - --link: #00f; - --code: #f00; -} - -@media (prefers-reduced-motion: no-preference) { - :root { - scroll-behavior: smooth; - } -} - -body { - background-color: var(--bg); - color: var(--fg); - font-family: - -apple-system, - BlinkMacSystemFont, - avenir next, - avenir, - segoe ui, - helvetica neue, - helvetica, - Cantarell, - Ubuntu, - roboto, - noto, - arial, - sans-serif; - font-size: 1rem; - line-height: 1.5; - max-width: 45em; - margin: 0 auto; - padding: 0 1rem; -} - -.site-nav, -footer { - border-color: var(--fg); -} - -footer { - border-top: 1px dotted; - padding-top: 1rem; - margin: 1rem 0; -} - -footer p { - font-size: 90%; - margin: 0; -} - -.site-nav { - border-bottom: 1px dotted; -} - -.site-nav ul { - list-style-type: none; - display: flex; - align-items: center; - padding: 0; -} - -.site-nav ul li { - margin-right: 0.5rem; -} - -h1, -h2, -h3, -h4 { - color: var(--fg); -} - -a, -a:visited { - color: var(--link); - text-decoration: none; -} - -a:hover { - text-decoration: underline; -} - -img { - width: 100%; -} - -table { - border-collapse: collapse; - color: var(--fg); - border-color: var(--bg-bright); - font-family: - Menlo, - Consolas, - Monaco, - Liberation Mono, - Lucida Console, - monospace; -} - -thead, -th, -tr, -td { - border: 1px solid var(--bg-bright); - padding: 0.25rem; -} - -pre > code, -time, -code { - font-family: - Menlo, - Consolas, - Monaco, - Liberation Mono, - Lucida Console, - monospace; - font-size: 1rem; -} - -pre { - background-color: var(--bg-bright) !important; - border-radius: 5px; - margin: 0.5rem 0; - padding: 0.5rem; - overflow-x: auto; -} - -:not(pre) > code { - color: var(--code); - font-family: inherit; -} - -aside { - background-color: var(--bg-bright); - padding: 1rem; -} - -blockquote { - background-color: var(--bg-bright); - border-left: 10px solid var(--link); - border-radius: 5px; - margin: 1rem 0; - padding: 0.5rem 1rem; -} - -blockquote p { - margin: 0; -} - -.post { - display: flex; -} - -.post time { - flex-shrink: 0; - margin-right: 0.5rem; -} - -.post-metadata { - border: 1px dotted var(--fg); - border-top: none; - padding: 1rem; -} - -.post-metadata h1 { - margin: 0; -} - -.post-metadata p { - margin: 0; -} - -details { - margin-top: 1rem; -} - -summary { - font-weight: 700; -} - -.footnote-definition { - display: flex; - justify-content: flex-start; - align-items: top; - margin: 1rem 0; -} - -.footnote-definition sup { - font-size: inherit; - top: 0; - line-height: inherit; - padding-right: 0.5rem; -} - -.footnote-definition sup::after { - content: "."; -} - -.footnote-definition p { - display: inline-block; - margin: 0; -} - -@media (prefers-color-scheme: dark) { - :root { - --bg: #111111; - --bg-bright: #2a2a2a; - --fg: #c9c9c9; - --link: #f07178; - --code: #ffb454; - } -} - -/* Org Styles */ -p.verse { - margin-left: 3%; -} -.timestamp { - color: var(--bg-light); -} -.timestamp-kwd { - color: var(--timestamp-kwd); -} -.org-right { - margin-left: auto; - margin-right: 0px; - text-align: right; -} -.org-left { - margin-left: 0px; - margin-right: auto; - text-align: left; -} -.org-center { - margin-left: auto; - margin-right: auto; - text-align: center; -} -.underline { - text-decoration: underline; -} -.todo { - font-family: monospace; - color: red; -} -.done { - font-family: monospace; - color: green; -} -.priority { - font-family: monospace; - color: orange; -} -.tag { - background-color: #eee; - font-family: monospace; - padding: 2px; - font-size: 80%; - font-weight: normal; -} - -.code-highlighted { - background-color: var(--highlight); -} -.org-info-js_info-navigation { - border-style: none; -} -#org-info-js_console-label { - font-size: 10px; - font-weight: bold; - white-space: nowrap; -} -.org-info-js_search-highlight { - background-color: var(--highlight); - color: var(--fg); - font-weight: bold; -} - -caption.t-above { - caption-side: top; -} -caption.t-bottom { - caption-side: bottom; -} -td, -th { - vertical-align: top; -} -th.org-right { - text-align: center; -} -th.org-left { - text-align: center; -} -th.org-center { - text-align: center; -} -td.org-right { - text-align: right; -} -td.org-left { - text-align: left; -} -td.org-center { - text-align: center; -} -dt { - font-weight: bold; -} -.footpara { - display: inline; -} -.footdef { - margin-bottom: 1em; -} -.figure { - padding: 1em; -} -.figure p { - text-align: center; -} -.equation-container { - display: table; - text-align: center; - width: 100%; -} -.equation { - vertical-align: middle; -} -.equation-label { - display: table-cell; - text-align: right; - vertical-align: middle; -} -.inlinetask { - padding: 10px; - border: 2px solid var(--bg); - margin: 10px; - background: var(--task); -} -#org-div-home-and-up { - text-align: right; - font-size: 70%; - white-space: nowrap; -} - -pre.src { - position: relative; - overflow: auto; -} -pre.src:before { - display: none; - position: absolute; - top: -8px; - right: 12px; - padding: 3px; - color: var(--fg); - background-color: var(--bg-lightest-opac); -} -pre.src:hover:before { - display: inline; - margin-top: 14px; -} - -/* Languages per Org manual */ -pre.src-asymptote:before { - content: "Asymptote"; -} -pre.src-awk:before { - content: "Awk"; -} -pre.src-authinfo::before { - content: "Authinfo"; -} -pre.src-C:before { - content: "C"; -} -/* pre.src-C++ doesn't work in CSS */ -pre.src-clojure:before { - content: "Clojure"; -} -pre.src-css:before { - content: "CSS"; -} -pre.src-D:before { - content: "D"; -} -pre.src-ditaa:before { - content: "ditaa"; -} -pre.src-dot:before { - content: "Graphviz"; -} -pre.src-calc:before { - content: "Emacs Calc"; -} -pre.src-emacs-lisp:before { - content: "Emacs Lisp"; -} -pre.src-fortran:before { - content: "Fortran"; -} -pre.src-gnuplot:before { - content: "gnuplot"; -} -pre.src-haskell:before { - content: "Haskell"; -} -pre.src-hledger:before { - content: "hledger"; -} -pre.src-java:before { - content: "Java"; -} -pre.src-js:before { - content: "Javascript"; -} -pre.src-latex:before { - content: "LaTeX"; -} -pre.src-ledger:before { - content: "Ledger"; -} -pre.src-lisp:before { - content: "Lisp"; -} -pre.src-lilypond:before { - content: "Lilypond"; -} -pre.src-lua:before { - content: "Lua"; -} -pre.src-matlab:before { - content: "MATLAB"; -} -pre.src-mscgen:before { - content: "Mscgen"; -} -pre.src-ocaml:before { - content: "Objective Caml"; -} -pre.src-octave:before { - content: "Octave"; -} -pre.src-org:before { - content: "Org mode"; -} -pre.src-oz:before { - content: "OZ"; -} -pre.src-plantuml:before { - content: "Plantuml"; -} -pre.src-processing:before { - content: "Processing.js"; -} -pre.src-python:before { - content: "Python"; -} -pre.src-R:before { - content: "R"; -} -pre.src-ruby:before { - content: "Ruby"; -} -pre.src-sass:before { - content: "Sass"; -} -pre.src-scheme:before { - content: "Scheme"; -} -pre.src-screen:before { - content: "Gnu Screen"; -} -pre.src-sed:before { - content: "Sed"; -} -pre.src-sh:before { - content: "shell"; -} -pre.src-sql:before { - content: "SQL"; -} -pre.src-sqlite:before { - content: "SQLite"; -} -/* additional languages in org.el's org-babel-load-languages alist */ -pre.src-forth:before { - content: "Forth"; -} -pre.src-io:before { - content: "IO"; -} -pre.src-J:before { - content: "J"; -} -pre.src-makefile:before { - content: "Makefile"; -} -pre.src-maxima:before { - content: "Maxima"; -} -pre.src-perl:before { - content: "Perl"; -} -pre.src-picolisp:before { - content: "Pico Lisp"; -} -pre.src-scala:before { - content: "Scala"; -} -pre.src-shell:before { - content: "Shell Script"; -} -pre.src-ebnf2ps:before { - content: "ebfn2ps"; -} -/* additional language identifiers per "defun org-babel-execute" - in ob-*.el */ -pre.src-cpp:before { - content: "C++"; -} -pre.src-abc:before { - content: "ABC"; -} -pre.src-coq:before { - content: "Coq"; -} -pre.src-groovy:before { - content: "Groovy"; -} -/* additional language identifiers from org-babel-shell-names in - ob-shell.el: ob-shell is the only babel language using a lambda to put - the execution function name together. */ -pre.src-bash:before { - content: "bash"; -} -pre.src-csh:before { - content: "csh"; -} -pre.src-ash:before { - content: "ash"; -} -pre.src-dash:before { - content: "dash"; -} -pre.src-ksh:before { - content: "ksh"; -} -pre.src-mksh:before { - content: "mksh"; -} -pre.src-posh:before { - content: "posh"; -} -/* Additional Emacs modes also supported by the LaTeX listings package */ -pre.src-ada:before { - content: "Ada"; -} -pre.src-asm:before { - content: "Assembler"; -} -pre.src-caml:before { - content: "Caml"; -} -pre.src-delphi:before { - content: "Delphi"; -} -pre.src-html:before { - content: "HTML"; -} -pre.src-idl:before { - content: "IDL"; -} -pre.src-mercury:before { - content: "Mercury"; -} -pre.src-metapost:before { - content: "MetaPost"; -} -pre.src-modula-2:before { - content: "Modula-2"; -} -pre.src-pascal:before { - content: "Pascal"; -} -pre.src-ps:before { - content: "PostScript"; -} -pre.src-prolog:before { - content: "Prolog"; -} -pre.src-simula:before { - content: "Simula"; -} -pre.src-tcl:before { - content: "tcl"; -} -pre.src-tex:before { - content: "TeX"; -} -pre.src-plain-tex:before { - content: "Plain TeX"; -} -pre.src-verilog:before { - content: "Verilog"; -} -pre.src-vhdl:before { - content: "VHDL"; -} -pre.src-xml:before { - content: "XML"; -} -pre.src-nxml:before { - content: "XML"; -} -/* add a generic configuration mode; LaTeX export needs an additional - (add-to-list 'org-latex-listings-langs '(conf " ")) in .emacs */ -pre.src-conf:before { - content: "Configuration File"; -} diff --git a/theme/static/gpg.txt b/theme/static/gpg.txt new file mode 100644 index 0000000..93b642d --- /dev/null +++ b/theme/static/gpg.txt @@ -0,0 +1,52 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQINBGN0Z8YBEAC6gWrNuB0nyAVkIuCsErIqpO7ngH0HV2sZD54t0ge9on0Fb+QA +S/oRSK3bcwgR09lnIwPDWpQqlPpzKib2bZ9USBMD0lcgPb0hMr0fafs/+/FCRQV1 +Pvc/e37n2/KHRW2KoiM4sOFT9LYxi7LBGgXffusx6uVBzrNUacTFFd/pMNkPd5uX +/J4IT+QbDh1bKw4CtLNvoh7xTcfdpzdqpHfNkjm+24pEnbrv6QrSpBzol4uulaB+ +5I8JF938/FBHBndVMT9UQcGRtX+ttZTp9U7m0TzCAsyrVV/V8rEbcGTMlU+yyUjR +TDRX4Dwj79IfL+vLZgFGLd8GwO08AirNkHYaZwzvYi42I5Bh8cX1L2IippYL8YYF +ASX26pXC6mxTwC/hjCA7rzyIMD5sf1UailYm5MvrhEujRYOPWDU+kex2t2HJpzvN +vYSVIS0sKi7iHr82VA+/spR6Ii07/84zZPQ1h/sXJLaDolQV2pU7WJBPyFO957Er +BggugSpB1U/blgU+B9vOR+2sMEReRQwVF7aVhQ2Wy5wOZRHlmTZVMNO5SawXkiTp +Bt4IwhThzMcUQstXxf5V44pPsB5uQE3n4WdROfJTOiB2cZJZOiXe3iPiiTsVsBc2 +tcqxJmwplMS4jNddJ9Nh0NTCKNk3Yt0iZzWlQDKAzR1uSGW9fQGAdh/UZQARAQAB +tCVDaHJpc3RpYW4gQ2xlYmVyZyA8aGVsbG9AY2xlYmVyZy5uZXQ+iQJRBBMBCAA7 +FiEEOReXP7FZu7hhlFOFaUUaUXrAyzcFAmN0Z8YCGwMFCwkIBwICIgIGFQoJCAsC +BBYCAwECHgcCF4AACgkQaUUaUXrAyzcrIQ//ZzCvcNKi2exZ4MfH68q9cIrJtHA3 ++FQ/3yTwAMiXmaTctHTcME+4Um12TCJMH/PwOkmxjolln5LfNHC8emcNs9Uaoga7 +1Cy8ihqKbQMaZN1ZHrgaddeTs7+N1+/u8yAZPXo+N6pmLaeuPfn1MMhcejTbo+C/ +c22/yj97ym6Iuc9oodnbHb2rxhGKReQLJmqzBHWd0syFbYDopmhY2MjMawVirPG7 +vt6EbiFHkWLBY08FYbOQWT4bXdSHlLxT3q5m+j0HdVjHxd/vOk+dc3FPtK8ZpTVC +qKa2oQ6dl4fjp8GVbu4f4SMDDJRR1iOoLTNEhKDSZHkZdjH0/LQRLsf49cqbff1Y +mpxJcNv1/RmgzctTmBAoGt2RS8mT97H8AUW7v7PGs3eS/OkrY1e4cuTrmcafEaMy +J2L7aUxDVVUCvRKsONXx+zSLin7ByRHypqRfxGqnpQUDPW4Oty6CewsSXktDjIUx +FXzMwfuNXKS/KHqcUxamE0rL8O2d3CJI4YAbWu2Y0GtBetfuaaOgi56cYqv86zGu +os0oga1ZakiCeRPgEaipPaZZMf6pCvucF2VyaUHwIOMcSVEH5nhHO4McgYLSZucx +na5qcLk06EP+1HjmifGqPmkxHTW/ez5x6m/QT9jOzyRu94p3IG5DT1Lh8kl6gid7 +YntCGrwcsvw8zKi5Ag0EY3RnxgEQANj1c0ZS3npmtj1V5m+vsq1mK2g4K66senuC +Gf+wTudYgcUzBhcTtEwzFJTwFFUMkfpgmkgYrlMB7iH+85YxiDR2sBhMg56haJXn +LGnSaWqHVE4P0yyHI/6QasYxdJWfYkSH9m3B8yW1VKs4eSSL6S/U/qdHzDRRZCEX +lNhvplrWcWv6Ifk/aYJ+njwn+jhXT4j8lbhem5oCbg4olY84bs+rfvWHTrWdGD1N +sHkbLEwLgnmJou7vkVY9vkIMhbgpvNp1CEx0zOGTMhlPrCYBCFUGR7Bnoqwwl/C4 +CTBwZxBE5bNBpsEdySYhmHW+YHRHIxeboLmOyoc0CpT/zhu2y5JxqJBiGEDYhTM/ +V2nNqKGDgUenXqjwoBw5oCNQJ35NNgFgEbphhs71W7VVwEPRdppcem33TcpFBeoE +vTzCfK6xJA82ASJHKz0hajEQchJ5jJZYo4wRZJGFv2jMIhq24DLIqxgjZeBKLEzl +RigfuuCrAsQBIMtTUSUUvxjB/b+UDYssqi9Q+8F7FcwqE9egaj7xVQprTAYcGW7S +zxfjzFSbJSl+b4WQSewFtmFIx62RYemBH+YPxbwOhQAuRWgEg0E6xeuILu22xydf +DEkbk1GEXH3ilYxl4LhFy2EmUbvB8rxh5Vk3A1KVaBe/ndPhwznTe7X9ypRHzQiV +Jkc2vVGjABEBAAGJAjYEGAEIACAWIQQ5F5c/sVm7uGGUU4VpRRpResDLNwUCY3Rn +xgIbDAAKCRBpRRpResDLN60xD/9pEDZK7SXZy/nhVdHMKn2UyF7F8dEXYxILmXp0 +53zDDVN5D7luHjcI5pYynWqlgXWPAaCOthWtexr3r3b8fVSc7yxi497fFa3jiVkn +VNYjDCa4SK5H6Rdf6I5rv+SS1PPmiVFKL7xuWcJ9YucHACdeH0UUmPCMmHHDc9SY +MGUPjadFxjCGtBz8itS+ufDiZsTU9ov7XRE+pVyrDlMSVD1Ex02vMRtr+UD9lkYb +KGs32TEDw28+OgvSZc81P6/BuxmG2XxgvU5OOrlVFOs4VU5P0TnZVxbVuKyO4fkZ +sxSApn+U4lU89dM0M1l1S2NZtvkWTIW2jFvzwXDCPxs5GAXAGtnEO8gjGICo2QV3 +VovHMTmPz7Bo87fqGZkfZatzvAeHW92FIhQBOdgSiCwSDRPVVdPTpQ27BaUrfH8p +aS81RhlCWgKptFKj4+MAqGEf9V6jUIKn5EvdSxCZ5XXHmaBL/kXxTPaDJiK8nMKv +dr/iwtb23SwNrBLQkYcI+6aZj4jcqr5T0H2EsC8h9jQWMG+S9/BzhJOI/QeepHvD +VJQve5jozXbz+iBRLrWbEgbNydL/LT9iQCWaWt2HCPQ7bPrxKqya8fUMPxi3VCZZ +AuXpJzywCyVuzpuChuvdMflHbmx1r8uJjSmUCJf6ngt0TQMXiwL3vsECTV7ZtVge +0jZ4tA== +=pl2G +-----END PGP PUBLIC KEY BLOCK----- diff --git a/theme/static/robots.txt b/theme/static/robots.txt new file mode 100644 index 0000000..a252a5f --- /dev/null +++ b/theme/static/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Disallow: +Allow: / diff --git a/theme/static/styles.css b/theme/static/styles.css new file mode 100644 index 0000000..123db20 --- /dev/null +++ b/theme/static/styles.css @@ -0,0 +1,578 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ + +/* Document + ========================================================================== */ + +/** + * 1. Correct the line height in all browsers. + * 2. Prevent adjustments of font size after orientation changes in iOS. + */ + +html { + line-height: 1.15; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { + margin: 0; +} + +/** + * Render the `main` element consistently in IE. + */ + +main { + display: block; +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { + box-sizing: content-box; /* 1 */ + height: 0; /* 1 */ + overflow: visible; /* 2 */ +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { + border-bottom: none; /* 1 */ + text-decoration: underline; /* 2 */ + text-decoration: underline dotted; /* 2 */ +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { + font-weight: bolder; +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { + font-family: monospace, monospace; /* 1 */ + font-size: 1em; /* 2 */ +} + +/** + * Add the correct font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { + border-style: none; +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; /* 1 */ + font-size: 100%; /* 1 */ + line-height: 1.15; /* 1 */ + margin: 0; /* 2 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { + /* 1 */ + overflow: visible; +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { + /* 1 */ + text-transform: none; +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { + box-sizing: border-box; /* 1 */ + color: inherit; /* 2 */ + display: table; /* 1 */ + max-width: 100%; /* 1 */ + padding: 0; /* 3 */ + white-space: normal; /* 1 */ +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { + vertical-align: baseline; +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { + overflow: auto; +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { + -webkit-appearance: textfield; /* 1 */ + outline-offset: -2px; /* 2 */ +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { + -webkit-appearance: button; /* 1 */ + font: inherit; /* 2 */ +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { + display: block; +} + +/* + * Add the correct display in all browsers. + */ + +summary { + display: list-item; +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { + display: none; +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { + display: none; +} + +/* CUSTOM CSS */ +:root { + --bg: #fff; + --bg-bright: #eee; + --fg: #111; + --link: #00f; + --code: #f00; + --border: #ccc; +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} + +body { + background-color: var(--bg); + color: var(--fg); + font-family: + Menlo, + Consolas, + Monaco, + Liberation Mono, + Lucida Console, + monospace; + font-size: 0.9rem; + line-height: 1.5; + max-width: 50em; + margin: 0 auto; + padding: 0 1rem; +} + +.site-nav, +footer { + border-color: var(--fg); +} + +footer { + border-top: 1px dotted; + padding-top: 1rem; + margin: 1rem 0; +} + +footer p { + margin: 0; +} + +.site-nav { + border-bottom: 1px dotted; +} + +.site-nav ul { + list-style-type: none; + display: flex; + align-items: center; + padding: 0; +} + +.site-nav ul li { + margin-right: 0.5rem; +} + +h1, +h2, +h3, +h4 { + color: var(--fg); +} + +a, +a:visited { + color: var(--link); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +img { + width: 100%; +} + +table { + border-collapse: collapse; + color: var(--fg); + border-color: var(--bg-bright); + font-family: + Menlo, + Consolas, + Monaco, + Liberation Mono, + Lucida Console, + monospace; + font-size: 0.9rem; +} + +thead, +th, +tr, +td { + border: 1px solid var(--border); + padding: 0.25rem; +} + +pre > code, +time, +code { + font-family: + Menlo, + Consolas, + Monaco, + Liberation Mono, + Lucida Console, + monospace; + font-size: inherit; +} + +pre { + background-color: var(--bg-bright) !important; + margin: 0.5rem 0; + padding: 0.5rem; + overflow-x: auto; +} + +:not(pre) > code { + color: var(--code); + font-family: inherit; +} + +aside { + background-color: var(--bg-bright); + padding: 1rem; +} + +blockquote { + background-color: var(--bg-bright); + border-left: 5px solid var(--link); + margin: 1rem 0; + padding: 0.5rem 1rem; +} + +blockquote p { + margin: 0; +} + +.post, +.wiki-post { + display: flex; +} + +.post time { + flex-shrink: 0; + margin-right: 0.5rem; +} + +.wiki-post { +justify-content: space-between; +} + +.wiki-post:first-of-type { +border-bottom: 1px dotted var(--fg); +margin-bottom: 1rem; +} + +.wiki-post p { +margin: 0; +} + +.post-metadata { + border: 1px dotted var(--fg); + border-top: none; + padding: 1rem; +} + +.post-metadata h1 { + margin: 0; +} + +.post-metadata p { + margin: 0; +} + +details { + margin-top: 1rem; +} + +summary { + font-weight: bold; +} + +.footnote-definition { + display: flex; + justify-content: flex-start; + align-items: top; + margin: 1rem 0; +} + +.footnote-definition sup { + font-size: inherit; + top: 0; + line-height: inherit; + padding-right: 0.5rem; +} + +.footnote-definition sup::after { + content: "."; +} + +.footnote-definition p { + display: inline-block; + margin: 0; +} + +@media (prefers-color-scheme: dark) { + :root { + --bg: #141617; + --bg-bright: #191c1d; + --fg: #b2aea9; + /* --link: #2b8ad9; */ + --link: #ff79c6; + --code: #ffb454; + --border: #333; + } +} diff --git a/theme/static/styles.min.css b/theme/static/styles.min.css new file mode 100644 index 0000000..f42cf24 --- /dev/null +++ b/theme/static/styles.min.css @@ -0,0 +1 @@ +/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:initial}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}:root{--bg:#fff;--bg-bright:#eee;--fg:#111;--link:#00f;--code:#f00;--border:#ccc}@media(prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{background-color:var(--bg);color:var(--fg);font-family:Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;font-size:.9rem;line-height:1.5;max-width:50em;margin:0 auto;padding:0 1rem}.site-nav,footer{border-color:var(--fg)}footer{border-top:1px dotted;padding-top:1rem;margin:1rem 0}footer p{margin:0}.site-nav{border-bottom:1px dotted}.site-nav ul{list-style-type:none;display:flex;align-items:center;padding:0}.site-nav ul li{margin-right:.5rem}h1,h2,h3,h4{color:var(--fg)}a,a:visited{color:var(--link);text-decoration:none}a:hover{text-decoration:underline}img{width:100%}table{border-collapse:collapse;color:var(--fg);border-color:var(--bg-bright);font-family:Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;font-size:.9rem}thead,th,tr,td{border:1px solid var(--border);padding:.25rem}pre>code,time,code{font-family:Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;font-size:inherit}pre{background-color:var(--bg-bright)!important;margin:.5rem 0;padding:.5rem;overflow-x:auto}:not(pre)>code{color:var(--code);font-family:inherit}aside{background-color:var(--bg-bright);padding:1rem}blockquote{background-color:var(--bg-bright);border-left:5px solid var(--link);margin:1rem 0;padding:.5rem 1rem}blockquote p{margin:0}.post,.wiki-post{display:flex}.post time{flex-shrink:0;margin-right:.5rem}.wiki-post{justify-content:space-between}.wiki-post:first-of-type{border-bottom:1px dotted var(--fg);margin-bottom:1rem}.wiki-post p{margin:0}.post-metadata{border:1px dotted var(--fg);border-top:none;padding:1rem}.post-metadata h1{margin:0}.post-metadata p{margin:0}details{margin-top:1rem}summary{font-weight:700}.footnote-definition{display:flex;justify-content:flex-start;align-items:top;margin:1rem 0}.footnote-definition sup{font-size:inherit;top:0;line-height:inherit;padding-right:.5rem}.footnote-definition sup::after{content:"."}.footnote-definition p{display:inline-block;margin:0}@media(prefers-color-scheme:dark){:root{--bg:#141617;--bg-bright:#191c1d;--fg:#b2aea9;--link:#ff79c6;--code:#ffb454;--border:#333}}
\ No newline at end of file diff --git a/static/syntax-theme-dark.css b/theme/static/syntax-theme-dark.css index 75cf13b..75cf13b 100644 --- a/static/syntax-theme-dark.css +++ b/theme/static/syntax-theme-dark.css diff --git a/static/syntax-theme-light.css b/theme/static/syntax-theme-light.css index f7dfcb3..f7dfcb3 100644 --- a/static/syntax-theme-light.css +++ b/theme/static/syntax-theme-light.css diff --git a/theme/templates/atom.xml b/theme/templates/atom.xml new file mode 100644 index 0000000..8ff1e30 --- /dev/null +++ b/theme/templates/atom.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<rss version="2.0" + xmlns:content="http://purl.org/rss/1.0/modules/content/" + xmlns:wfw="http://wellformedweb.org/CommentAPI/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:atom="http://www.w3.org/2005/Atom" + xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" + xmlns:slash="http://purl.org/rss/1.0/modules/slash/" + xmlns:georss="http://www.georss.org/georss" + xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" + xmlns:media="http://search.yahoo.com/mrss/"> + <channel> + <title>{{ site_name | default("Simple Blog") }}</title> + <atom:link + href="{{ url_for("rss") }}" + rel="self" type="application/rss+xml" /> + <link>{{ url_for("index") }}</link> + <description><![CDATA[]]></description> + <language>en</language> + <pubDate>{{ posts | first | getattr("date") | strftime("%a, %d %b %Y %H:%M:%S %z") }}</pubDate> + <lastBuildDate>{{ now() | strftime("%a, %d %b %Y %H:%M:%S %z") }}</lastBuildDate> + <generator>{{ meta.generator }}</generator> + <webMaster>{{ site_owner | default("hello@cleberg.net") }}</webMaster> + <image> + <url>{{ url_for("index") }}media/img/8bitme.png</url> + <title>Blog Author</title> + <link>{{ url_for("index") }}</link> + </image> + + {% for post in posts %} + <item> + <title>{{ post.title }}</title> + <link>{{ url_for("blog", slug=post.slug) }}</link> + <author>{{ post.author|default("hello@cleberg.net") }}</author> + <guid isPermaLink="false">{{ url_for("blog", slug=post.slug) }}</guid> + <pubDate>{{ post.date|strftime("%a, %d %b %Y %H:%M:%S %z") }}</pubDate> + <description><![CDATA[{{ post.html|safe }}]]></description> + </item> + {% endfor %} + + </channel> +</rss> diff --git a/theme/templates/base.html b/theme/templates/base.html new file mode 100644 index 0000000..167883c --- /dev/null +++ b/theme/templates/base.html @@ -0,0 +1,41 @@ + +<!doctype html> +<html lang="en-us"> +<head> + {% block head %} + <meta charset="utf-8"> + <title> + {% block subtitle %}{% endblock %} + {% block title %}{{ site_name | default("weblorg website") }}{% endblock %} + </title> + <meta name="viewport" content="width=device-width, initial-scale=1"> + {% if site_owner is defined %}<meta name="author" content="{{ site_owner }}" >{% endif %} + {% if site_description is defined %}<meta name="description" content="{{ site_description }}" >{% endif %} + {% if site_keywords is defined %}<meta name="keywords" content="{{ site_keywords }}" >{% endif %} + <link rel="stylesheet" href="{{ url_for("static", file="styles.min.css") }}" type="text/css"> + {% block meta %}{% endblock %} + {% endblock %} +</head> +<body> + {% block nav %} + <nav class="site-nav" aria-label="site-nav" role="navigation"> + <ul> + <li><a href="/">Home</a></li> + <li><a href="/blog/">Blog</a></li> + <li><a href="/services/">Services</a></li> + <li><a href="/wiki/">Wiki</a></li> + </ul> + </nav> + {% endblock %} + + <main>{% block main %}{% endblock %}</main> + + {% block footer %} + <footer> + <p>Last Build: <{{ now() | strftime("%Y-%m-%d %a %H:%M:%S") }}></p> + <p><a href="https://git.cleberg.net/cleberg.net.git" target="_blank" rel="noopener">Source Code</a></p> + <p><a href="/atom.xml">Atom RSS Feed</a></p> + </footer> + {% endblock %} +</body> +</html> diff --git a/theme/templates/blog.html b/theme/templates/blog.html new file mode 100644 index 0000000..b3b3a3f --- /dev/null +++ b/theme/templates/blog.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} + +{% block subtitle %}Blog | {% endblock %} +{% block main %} + <h1>Blog</h1> + <p>Use <code>Ctrl + F</code> to search blog post titles for keywords.</p> + <p>You can also add the <a href="/feed.xml">RSS Feed</a> to your feed reader.</p> + {% for post in posts %} + <div class="post"> + <time datetime="{{ post.date | strftime("%Y-%m-%d") }}"><{{ post.date|strftime("%Y-%m-%d") }}></time> + <a href="{{ url_for("blog", slug=post.slug) }}">{{ post.title }}</a> + </div> + {% endfor %} +{% endblock %} diff --git a/theme/templates/index.html b/theme/templates/index.html new file mode 100644 index 0000000..924335c --- /dev/null +++ b/theme/templates/index.html @@ -0,0 +1,41 @@ +{% extends "base.html" %} + +{% block main %} +<section> + <h1>cleberg.net</h1> + <blockquote>Do AIs dream in electric sheep?<br>He hoped it had nanosecond nightmares.</blockquote> +</section> +<section> + <h2>Recent Blog Posts</h2> + <div class="post"> + <time datetime="2024-03-15"><2024-03-15></time> + <a href="/blog/self-hosting-ddns-updater.html">Self-Hosting DDNS Updater</a> + </div> + <div class="post"> + <time datetime="2024-03-14"><2024-03-14></time> + <a href="/blog/doom-emacs-org-mode.html">Doom Emacs & Org-Mode</a> + </div> + <div class="post"> + <time datetime="2024-02-21"><2024-02-21></time> + <a href="/blog/self-hosting-an-otter-wiki.html">Self-Hosting An Otter Wiki</a> + </div> + <br> + <a href="/blog/">All Posts →</a> +</section> +<section> + <h2>Everything Else</h2> + <ul> + <li><a href="/salary/">Salary</a></li> + <li><a href="/services/">Services</a></li> + <li><a href="/wiki/">Wiki</a></li> + </ul> +</section> +<section> + <h2>Contact</h2> + <ul> + <li>hello [at] cleberg.net (<a href="/gpg.txt">GPG</a>)</li> + <li><a href="https://matrix.to/#/@cyborg:matrix.tchncs.de" target="_blank" rel="noopener">@cyborg:@matrix.tchncs.de</a></li> + <li><a href="https://git.cleberg.net/cleberg.net.git" target="_blank" rel="noopener">Git</a></li> + </ul> +</section> +{% endblock %} diff --git a/theme/templates/page.html b/theme/templates/page.html new file mode 100644 index 0000000..fb7afa9 --- /dev/null +++ b/theme/templates/page.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} + +{% block subtitle %} + {{ post.title }} | +{% endblock %} +{% block main %} +<article role="article"> + <h1>{{ post.title }}</h1> + <section>{{ post.html | safe }}</section> +</article> +{% endblock %} diff --git a/theme/templates/post.html b/theme/templates/post.html new file mode 100644 index 0000000..d0b76db --- /dev/null +++ b/theme/templates/post.html @@ -0,0 +1,30 @@ +{% extends "base.html" %} + +{% block subtitle %} + {{ post.title }} | +{% endblock %} +{% block meta %} +<meta property="og:title" content="{{ post.title }}"> +<meta property="og:url" content="{{ post.url }}"> +{% if post.description is defined %} +<meta property="og:description" content="{{ post.description }}"> +{% elif project_description is defined %} +<meta property="og:description" content="{{ project_description }}"> +{% endif %} +<link rel="stylesheet" href="/syntax-theme-dark.css" media="(prefers-color-scheme: dark)"> +<link rel="stylesheet" href="/syntax-theme-light.css" media="(prefers-color-scheme: light)"> +{% endblock %} + +{% block main %} +<article role="article"> + <section class="post-metadata"> + <h1 class="post__title">{{ post.title }}</h1> + {% if post.date is defined %} + <time datetime="{{ post.date|strftime("%Y-%m-%d") }}"><{{ post.date|strftime("%Y-%m-%d %a %H:%M:%S") }}></time> + {% endif %} + </section> + <section> + {{ post.html | safe }} + </section> +</article> +{% endblock %} diff --git a/theme/templates/wiki.html b/theme/templates/wiki.html new file mode 100644 index 0000000..3d8b8fd --- /dev/null +++ b/theme/templates/wiki.html @@ -0,0 +1,17 @@ +{% extends "base.html" %} + +{% block subtitle %}Wiki | {% endblock %} +{% block main %} +<h1>Wiki</h1> +<p>Use <code>Ctrl + F</code> to search wiki pages for keywords.</p> +<div class="wiki-post"> + <p>Wiki Page</p> + <p>Last Updated</p> +</div> +{% for post in posts %} + <div class="wiki-post"> + <a href="{{ url_for("wiki", slug=post.slug) }}">{{ post.title }}</a> + <time datetime="{{ post.date | strftime("%Y-%m-%d") }}"><{{ post.date|strftime("%Y-%m-%d") }}></time> + </div> +{% endfor %} +{% endblock %} diff --git a/wiki/index.org b/wiki/index.org deleted file mode 100644 index b1cc4a9..0000000 --- a/wiki/index.org +++ /dev/null @@ -1,145 +0,0 @@ -#+title: Wiki -#+description: An informal wiki of sorts. - -An informal wiki of sorts. - -* Digital Garden - -#+begin_quote -At times, wilderness is exactly what readers want: a rich collection of -resources and links. At times, rigid formality suits readers perfectly, -providing precisely the information they want, no more and no less. -Indeed, individual hypertexts and Web sites may contain sections that -tend toward each extreme. - -#+end_quote - -#+begin_quote -Often, however, designers should strive for the comfort, interest, and -habitability of parks and gardens: places that invite visitors to -remain, and that are designed to engage and delight them, to invite them -to linger, to explore, and to reflect. - -#+end_quote - -[[https://www.eastgate.com/garden/][Hypertext Garden]] - -* Git - -I want to get rid of all local modifications and go back to the working -tree of the most recent commit: - -#+begin_src sh -git restore . -#+end_src - -Revert a specified commit: - -#+begin_src sh -git revert commit-id -#+end_src - -Reset the repository to a specific commit in the git log: - -#+begin_src sh -git reset --mixed commit-id -#+end_src - -I need to commit and push changes to a remote that has been changed -since my most recent pull: - -#+begin_src sh -git pull --rebase -#+end_src - -* Hardware - -** Laptops - -*** macOS - -| Category | Details | -|----------+-----------------| -| Model | Macbook Pro 16” | -| CPU | Apple M2 Pro | -| RAM | 16GB | -| Storage | 512GB SSD | - -*** Linux - -| Category | Details | -|----------+---------------------------------------------| -| Model | Lenovo ThinkPad E15 Gen 4, model 21ED0048US | -| CPU | AMD Ryzen 5 5625U with Radeon Graphics | -| RAM | 16 GB | -| Storage | 256 GB SSD | - -** Servers - -| Category | Details | -|--------------------+----------------------------------------| -| Case | Rosewill RSV-R4100U 4U | -| Motherboard | NZXT B550 | -| CPU | AMD Ryzen 7 5700G with Radeon Graphics | -| RAM | 64GB RAM (2x32GB) | -| Storage (On-board) | Western Digital 500GB M.2 NVME SSD | -| Storage (HDD Bay) | 48TB HDD | -| PSU | Corsair RM850 PSU | - -** Networking Equipment - -- UDM-Pro -- USW-24-PoE -- USW-Lite-8-PoE -- U6-Pro -- U6-Extender -- USP-Plug -- UVC G4 Instant x 3 -- UVC G4 Doorbell Pro -- UP Chime -- USW 24-Port Patch Panel -- USW Switch Lite 8 PoE - -* Software - -** Laptop - -Alpine 3.18.2; no DE. - -I currently run my Alpine laptop via the default login shell - no -desktop environment. From here, I use a mix of byobu and emacs to split -my screen into tabs and panes. All programs run through the shell and do -not use visual libraries such as X or Wayland. - -I have Sway installed and configured, but only launch it when I must. - -- brightnessctl -- byobu -- emacs -- [font-dejavu, font-noto, font-noto-cjk, font-noto-cjk-extra] -- glances -- gnupg -- irssi -- lynx -- nano -- neomutt -- newsboat -- ohmyzsh -- [pango, pango-tools] -- pipewire -- syncthing -- wireguard -- zola -- zsh - -** Server - -Ubuntu 22.04.1; no DE. - -See my services page for a list of the publicly-available services -running on this server. - -- certbot -- [docker, docker-compose] -- nginx -- zsh |