diff options
| -rw-r--r-- | LICENSE | 10 | ||||
| -rw-r--r-- | about/bg.jpg | bin | 442443 -> 0 bytes | |||
| -rw-r--r-- | about/bg.jxl | bin | 482705 -> 0 bytes | |||
| -rw-r--r-- | about/bg_dither.png | bin | 59040 -> 0 bytes | |||
| -rw-r--r-- | about/index.php | 163 | ||||
| -rw-r--r-- | about/pronouns/index.php | 46 | ||||
| -rw-r--r-- | blog/blog.atom | 49 | ||||
| -rw-r--r-- | blog/index.php | 178 | ||||
| -rw-r--r-- | blog/post.php | 129 | ||||
| -rw-r--r-- | blog/posts/ai2/index.md | 16 | ||||
| -rw-r--r-- | blog/posts/ai_art/index.md | 16 | ||||
| -rw-r--r-- | blog/posts/blog_questions/index.md | 18 | ||||
| -rw-r--r-- | blog/posts/building_a_cooler_body/20minuteshrt.webp | bin | 0 -> 250578 bytes | |||
| -rw-r--r-- | blog/posts/building_a_cooler_body/bananaforscale.webp | bin | 0 -> 49418 bytes | |||
| -rw-r--r-- | blog/posts/building_a_cooler_body/epic.png | bin | 0 -> 38325 bytes | |||
| -rw-r--r-- | blog/posts/building_a_cooler_body/index.md | 408 | ||||
| -rw-r--r-- | blog/posts/building_a_normal_server/index.md | 20 | ||||
| -rw-r--r-- | blog/posts/building_a_regular_bed/index.md | 130 | ||||
| -rw-r--r-- | blog/posts/building_a_sensible_server/index.md | 38 | ||||
| -rw-r--r-- | blog/posts/customcans_4pin_pinout/index.md | 35 | ||||
| -rw-r--r-- | blog/posts/customcans_4pin_pinout/index.php | 1 | ||||
| -rw-r--r-- | blog/posts/customcans_4pin_pinout/pinout.webp | bin | 0 -> 72194 bytes | |||
| -rw-r--r-- | blog/posts/customcans_4pin_pinout/supportemail.webp | bin | 0 -> 13820 bytes | |||
| -rw-r--r-- | blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/index.md | 27 | ||||
| -rw-r--r-- | blog/posts/discord/index.md | 44 | ||||
| -rw-r--r-- | blog/posts/discord2/discord-no-way-2.gif | bin | 0 -> 1961 bytes | |||
| -rw-r--r-- | blog/posts/discord2/discord.png | bin | 0 -> 13432 bytes | |||
| -rw-r--r-- | blog/posts/discord2/index.md | 206 | ||||
| -rw-r--r-- | blog/posts/discord2/index.php | 1 | ||||
| -rw-r--r-- | blog/posts/discord2/manualreview.png | bin | 0 -> 42614 bytes | |||
| -rw-r--r-- | blog/posts/discord2/osmiuml.png | bin | 0 -> 14224 bytes | |||
| -rw-r--r-- | blog/posts/discord2/osmiumw.png | bin | 0 -> 30219 bytes | |||
| -rw-r--r-- | blog/posts/fediverse_dms/index.md | 4 | ||||
| -rw-r--r-- | blog/posts/grow_spikes/index.md | 14 | ||||
| -rw-r--r-- | blog/posts/guide_blacklist_websites_searxng/index.md | 2 | ||||
| -rw-r--r-- | blog/posts/guide_blocking_user_agents_nginx/index.md | 10 | ||||
| -rw-r--r-- | blog/posts/guide_fix_youtube_buffering_firefox/index.md | 6 | ||||
| -rw-r--r-- | blog/posts/guide_how_to_automount_drives_on_boot_in_linux/index.md | 14 | ||||
| -rw-r--r-- | blog/posts/guide_pihole_lepotato/index.md | 8 | ||||
| -rw-r--r-- | blog/posts/make_your_own_cables/index.md | 20 | ||||
| -rw-r--r-- | blog/posts/my_terrible_distro_hop/index.md | 12 | ||||
| -rw-r--r-- | blog/posts/renting_an_unremarkable_server/index.md | 4 | ||||
| -rw-r--r-- | blog/posts/sf5_estrogen_moth/index.md | 70 | ||||
| -rw-r--r-- | blog/posts/sf5_estrogen_moth/index.php | 1 | ||||
| -rw-r--r-- | blog/posts/sf5_estrogen_moth/moth.json | 192 | ||||
| -rw-r--r-- | blog/posts/sf5_estrogen_moth/moth.png | bin | 0 -> 69661 bytes | |||
| -rw-r--r-- | blog/posts/sf5_estrogen_moth/pink.json | 306 | ||||
| -rw-r--r-- | blog/posts/stop_using_chromium/index.md | 14 | ||||
| -rw-r--r-- | blog/posts/toshiba_chromebook/index.md | 6 | ||||
| -rw-r--r-- | blog/posts/unity_runtime_fee_and_proprietary_software/index.md | 10 | ||||
| -rw-r--r-- | common.php | 14 | ||||
| -rw-r--r-- | etc/bg.jpg | bin | 619596 -> 0 bytes | |||
| -rw-r--r-- | etc/bg.jxl | bin | 588579 -> 0 bytes | |||
| -rw-r--r-- | etc/bg_dither.png | bin | 77184 -> 0 bytes | |||
| -rw-r--r-- | etc/index.php | 77 | ||||
| -rw-r--r-- | etc/quotes/images/m_pfp.png | bin | 3406 -> 0 bytes | |||
| -rw-r--r-- | etc/quotes/index.php | 422 | ||||
| -rw-r--r-- | footer.php | 27 | ||||
| -rw-r--r-- | greenhouse/index.php | 55 | ||||
| -rw-r--r-- | guestbook/commentbox.php | 67 | ||||
| -rw-r--r-- | guestbook/comments.php | 35 | ||||
| -rw-r--r-- | guestbook/index.php | 65 | ||||
| -rw-r--r-- | guestbook/submit.php | 1 | ||||
| -rw-r--r-- | header.php | 227 | ||||
| -rw-r--r-- | images/apiopage.png (renamed from etc/images/apiopage.png) | bin | 8589 -> 8589 bytes | |||
| -rw-r--r-- | images/buttons/35mm.gif (renamed from etc/buttons/35mm.gif) | bin | 3747 -> 3747 bytes | |||
| -rw-r--r-- | images/buttons/ace.png (renamed from etc/buttons/ace.png) | bin | 656 -> 656 bytes | |||
| -rw-r--r-- | images/buttons/agender.png (renamed from etc/buttons/agender.png) | bin | 6523 -> 6523 bytes | |||
| -rw-r--r-- | images/buttons/amd_powered.gif (renamed from etc/buttons/amd_powered.gif) | bin | 706 -> 706 bytes | |||
| -rw-r--r-- | images/buttons/antinft.gif (renamed from etc/buttons/antinft.gif) | bin | 1669 -> 1669 bytes | |||
| -rw-r--r-- | images/buttons/apiopage88x31.png | bin | 0 -> 2842 bytes | |||
| -rw-r--r-- | images/buttons/aro.png (renamed from etc/buttons/aro.png) | bin | 6180 -> 6180 bytes | |||
| -rw-r--r-- | images/buttons/aromantic-80x15.png (renamed from etc/buttons/aromantic-80x15.png) | bin | 598 -> 598 bytes | |||
| -rw-r--r-- | images/buttons/asexual-80x15.png (renamed from etc/buttons/asexual-80x15.png) | bin | 2379 -> 2379 bytes | |||
| -rw-r--r-- | images/buttons/badhtml.png (renamed from etc/buttons/badhtml.png) | bin | 1247 -> 1247 bytes | |||
| -rw-r--r-- | images/buttons/bantimetravel.png (renamed from etc/buttons/bantimetravel.png) | bin | 3223 -> 3223 bytes | |||
| -rw-r--r-- | images/buttons/bestviewed.gif (renamed from etc/buttons/bestviewed.gif) | bin | 9419 -> 9419 bytes | |||
| -rw-r--r-- | images/buttons/canadian.gif (renamed from etc/buttons/canadian.gif) | bin | 4083 -> 4083 bytes | |||
| -rw-r--r-- | images/buttons/chrome.gif (renamed from etc/buttons/chrome.gif) | bin | 8964 -> 8964 bytes | |||
| -rw-r--r-- | images/buttons/css.png (renamed from etc/buttons/css.png) | bin | 3176 -> 3176 bytes | |||
| -rw-r--r-- | images/buttons/deeptwisty_button.png (renamed from etc/buttons/deeptwisty_button.png) | bin | 4676 -> 4676 bytes | |||
| -rw-r--r-- | images/buttons/dontclick.gif (renamed from etc/buttons/dontclick.gif) | bin | 3687 -> 3687 bytes | |||
| -rw-r--r-- | images/buttons/dontyouhate.gif (renamed from etc/buttons/dontyouhate.gif) | bin | 3987 -> 3987 bytes | |||
| -rw-r--r-- | images/buttons/drpepper.gif (renamed from etc/buttons/drpepper.gif) | bin | 2412 -> 2412 bytes | |||
| -rw-r--r-- | images/buttons/epicblazed.png (renamed from etc/buttons/epicblazed.png) | bin | 3433 -> 3433 bytes | |||
| -rw-r--r-- | images/buttons/floof_explode_88x31.gif (renamed from etc/buttons/floof_explode_88x31.gif) | bin | 37149 -> 37149 bytes | |||
| -rw-r--r-- | images/buttons/fuckyouistillusecds.png | bin | 0 -> 5365 bytes | |||
| -rw-r--r-- | images/buttons/getvlcnow.png (renamed from etc/buttons/getvlcnow.png) | bin | 14305 -> 14305 bytes | |||
| -rw-r--r-- | images/buttons/google_stand.gif (renamed from etc/buttons/google_stand.gif) | bin | 21247 -> 21247 bytes | |||
| -rw-r--r-- | images/buttons/handcode.png (renamed from etc/buttons/handcode.png) | bin | 6504 -> 6504 bytes | |||
| -rw-r--r-- | images/buttons/i_hate_microsoft.png (renamed from etc/buttons/i_hate_microsoft.png) | bin | 2957 -> 2957 bytes | |||
| -rw-r--r-- | images/buttons/i_was_on_cohost.gif | bin | 0 -> 517 bytes | |||
| -rw-r--r-- | images/buttons/isopodhours.png (renamed from etc/buttons/isopodhours.png) | bin | 6331 -> 6331 bytes | |||
| -rw-r--r-- | images/buttons/krisbtn.png (renamed from etc/buttons/krisbtn.png) | bin | 1146 -> 1146 bytes | |||
| -rw-r--r-- | images/buttons/linux_powered.gif (renamed from etc/buttons/linux_powered.gif) | bin | 14619 -> 14619 bytes | |||
| -rw-r--r-- | images/buttons/miku-approved.gif (renamed from etc/buttons/miku-approved.gif) | bin | 6208 -> 6208 bytes | |||
| -rw-r--r-- | images/buttons/neo-fedi.gif (renamed from etc/buttons/neo-fedi.gif) | bin | 1127 -> 1127 bytes | |||
| -rw-r--r-- | images/buttons/neocities_stamp.gif (renamed from etc/buttons/neocities_stamp.gif) | bin | 2431 -> 2431 bytes | |||
| -rw-r--r-- | images/buttons/niceopod_button.png (renamed from etc/buttons/niceopod_button.png) | bin | 5163 -> 5163 bytes | |||
| -rw-r--r-- | images/buttons/niceopod_button_2.png (renamed from etc/buttons/niceopod_button_2.png) | bin | 4664 -> 4664 bytes | |||
| -rw-r--r-- | images/buttons/nonbinary-80x15.png (renamed from etc/buttons/nonbinary-80x15.png) | bin | 593 -> 593 bytes | |||
| -rw-r--r-- | images/buttons/nonbinary.png (renamed from etc/buttons/nonbinary.png) | bin | 196 -> 196 bytes | |||
| -rw-r--r-- | images/buttons/notoweb3.gif (renamed from etc/buttons/notoweb3.gif) | bin | 483 -> 483 bytes | |||
| -rw-r--r-- | images/buttons/nowebp.gif (renamed from etc/buttons/nowebp.gif) | bin | 7372 -> 7372 bytes | |||
| -rw-r--r-- | images/buttons/piracy.gif (renamed from etc/buttons/piracy.gif) | bin | 910 -> 910 bytes | |||
| -rw-r--r-- | images/buttons/queercoded.png (renamed from etc/buttons/queercoded.png) | bin | 4500 -> 4500 bytes | |||
| -rw-r--r-- | images/buttons/righttorepair.png (renamed from etc/buttons/righttorepair.png) | bin | 6203 -> 6203 bytes | |||
| -rw-r--r-- | images/buttons/she-her.gif (renamed from etc/buttons/she-her.gif) | bin | 326 -> 326 bytes | |||
| -rw-r--r-- | images/buttons/shrimp.png (renamed from etc/buttons/shrimp.png) | bin | 1545 -> 1545 bytes | |||
| -rw-r--r-- | images/buttons/smokepowered.gif (renamed from etc/buttons/smokepowered.gif) | bin | 999 -> 999 bytes | |||
| -rw-r--r-- | images/buttons/spotify.gif | bin | 0 -> 8657 bytes | |||
| -rw-r--r-- | images/buttons/svg.svg (renamed from etc/buttons/svg.svg) | 0 | ||||
| -rw-r--r-- | images/buttons/tested_on_firefox.gif (renamed from etc/buttons/tested_on_firefox.gif) | bin | 2754 -> 2754 bytes | |||
| -rw-r--r-- | images/buttons/the_void.gif (renamed from etc/buttons/the_void.gif) | bin | 1609 -> 1609 bytes | |||
| -rw-r--r-- | images/buttons/trans.png (renamed from etc/buttons/trans.png) | bin | 424 -> 424 bytes | |||
| -rw-r--r-- | images/buttons/tyg.gif (renamed from etc/buttons/tyg.gif) | bin | 3178 -> 3178 bytes | |||
| -rw-r--r-- | images/buttons/usatoday.gif (renamed from etc/buttons/usatoday.gif) | bin | 5717 -> 5717 bytes | |||
| -rw-r--r-- | images/buttons/web-pi.png (renamed from etc/buttons/web-pi.png) | bin | 1857 -> 1857 bytes | |||
| -rw-r--r-- | images/buttons/wget.gif | bin | 0 -> 2858 bytes | |||
| -rw-r--r-- | images/buttons/win11no.gif (renamed from etc/buttons/win11no.gif) | bin | 1691 -> 1691 bytes | |||
| -rw-r--r-- | images/reactions/angy.png | bin | 0 -> 172641 bytes | |||
| -rw-r--r-- | images/reactions/collectmypages.png | bin | 0 -> 164542 bytes | |||
| -rw-r--r-- | images/reactions/fear.png | bin | 0 -> 178160 bytes | |||
| -rw-r--r-- | images/reactions/frozen.png | bin | 0 -> 451947 bytes | |||
| -rw-r--r-- | images/reactions/livid.png | bin | 0 -> 263035 bytes | |||
| -rw-r--r-- | images/reactions/looksaway.png | bin | 0 -> 175753 bytes | |||
| -rw-r--r-- | images/reactions/nerd.png | bin | 0 -> 173503 bytes | |||
| -rw-r--r-- | images/reactions/notamused.png | bin | 0 -> 172032 bytes | |||
| -rw-r--r-- | images/reactions/sob.png | bin | 0 -> 168553 bytes | |||
| -rw-r--r-- | images/reactions/thumbsup.png | bin | 0 -> 165624 bytes | |||
| -rw-r--r-- | images/reactions/yay.png | bin | 0 -> 170185 bytes | |||
| -rw-r--r-- | index.php | 299 | ||||
| -rw-r--r-- | links/buttons/arimelody.gif | bin | 0 -> 1382 bytes | |||
| -rw-r--r-- | links/buttons/beedotmovie.png | bin | 0 -> 2588 bytes | |||
| -rw-r--r-- | links/buttons/fbyte.png | bin | 0 -> 2579 bytes | |||
| -rw-r--r-- | links/buttons/slonk.webp | bin | 0 -> 1184 bytes | |||
| -rw-r--r-- | links/buttons/sp.png | bin | 0 -> 6311 bytes | |||
| -rw-r--r-- | links/buttons/thermia.gif | bin | 0 -> 10184 bytes | |||
| -rw-r--r-- | links/buttons/tsvety.png | bin | 0 -> 4792 bytes | |||
| -rw-r--r-- | links/index.php | 759 | ||||
| -rw-r--r-- | me/cheddar03.gif (renamed from about/images/cheddar03.gif) | bin | 2315 -> 2315 bytes | |||
| -rw-r--r-- | me/crackship_quiz_result.png (renamed from about/images/crackship_quiz_result.png) | bin | 24970 -> 24970 bytes | |||
| -rw-r--r-- | me/index.php | 137 | ||||
| -rw-r--r-- | me/isopod_quiz_result.png (renamed from about/images/isopod_quiz_result.png) | bin | 11140 -> 11140 bytes | |||
| -rw-r--r-- | me/pronouns/bad.svg (renamed from about/pronouns/bad.svg) | 0 | ||||
| -rw-r--r-- | me/pronouns/bg.jpg (renamed from about/pronouns/bg.jpg) | bin | 196408 -> 196408 bytes | |||
| -rw-r--r-- | me/pronouns/bg_dither.png (renamed from about/pronouns/bg_dither.png) | bin | 37327 -> 37327 bytes | |||
| -rw-r--r-- | me/pronouns/friend.svg (renamed from about/pronouns/friend.svg) | 0 | ||||
| -rw-r--r-- | me/pronouns/good.svg (renamed from about/pronouns/good.svg) | 0 | ||||
| -rw-r--r-- | me/pronouns/index.php | 59 | ||||
| -rw-r--r-- | me/wuffsquiz.png | bin | 0 -> 61583 bytes | |||
| -rw-r--r-- | meta/index.php | 70 | ||||
| -rw-r--r-- | music/covers/clipping.jpg | bin | 0 -> 156729 bytes | |||
| -rw-r--r-- | music/covers/femtanyl.jpg | bin | 0 -> 730897 bytes | |||
| -rw-r--r-- | music/covers/findaeden.jpg | bin | 0 -> 13489 bytes | |||
| -rw-r--r-- | music/covers/foofighters.jpg | bin | 0 -> 88938 bytes | |||
| -rw-r--r-- | music/covers/hakita.webp | bin | 0 -> 46204 bytes | |||
| -rw-r--r-- | music/covers/justice.jpg | bin | 0 -> 56335 bytes | |||
| -rw-r--r-- | music/covers/mekaloton.jpg | bin | 0 -> 116361 bytes | |||
| -rw-r--r-- | music/covers/mountainhead.jpg | bin | 0 -> 782928 bytes | |||
| -rw-r--r-- | music/covers/noisemaster.jpg | bin | 0 -> 4310 bytes | |||
| -rw-r--r-- | music/covers/redvox.jpg | bin | 0 -> 246074 bytes | |||
| -rw-r--r-- | music/covers/waxlimbs.jpg | bin | 0 -> 17945 bytes | |||
| -rw-r--r-- | music/index.php | 204 | ||||
| -rw-r--r-- | nav.php | 2 | ||||
| -rw-r--r-- | notes/index.php | 153 | ||||
| -rw-r--r-- | notes/notes.atom | 22 | ||||
| -rw-r--r-- | old/1/icons/deeptwisty.png | bin | 1763 -> 1867 bytes | |||
| -rw-r--r-- | old/1/icons/kirby.png | bin | 1237 -> 1294 bytes | |||
| -rw-r--r-- | old/1/images/bg_default.png | bin | 7238262 -> 8335510 bytes | |||
| -rw-r--r-- | old/1/images/bg_old1.png | bin | 573420 -> 1306638 bytes | |||
| -rw-r--r-- | old/1/images/bg_old2.png | bin | 1645363 -> 1693561 bytes | |||
| -rw-r--r-- | old/1/images/friaday.png | bin | 515725 -> 731599 bytes | |||
| -rw-r--r-- | old/1/images/moday.png | bin | 344390 -> 435321 bytes | |||
| -rw-r--r-- | old/1/images/satuaday.png | bin | 1006865 -> 1273727 bytes | |||
| -rw-r--r-- | old/1/images/suday.png | bin | 536088 -> 784564 bytes | |||
| -rw-r--r-- | old/1/images/thuday.png | bin | 674116 -> 846918 bytes | |||
| -rw-r--r-- | old/1/images/tueaday.png | bin | 211383 -> 298509 bytes | |||
| -rw-r--r-- | old/1/images/weaday.png | bin | 348053 -> 495419 bytes | |||
| -rw-r--r-- | old/1/stamps/deeptwistybutton.png | bin | 2237 -> 2784 bytes | |||
| -rw-r--r-- | old/1/stamps/handcode.png | bin | 6504 -> 6761 bytes | |||
| -rw-r--r-- | old/2/buttons/ace.png | bin | 656 -> 716 bytes | |||
| -rw-r--r-- | old/2/buttons/aro.png | bin | 6180 -> 6249 bytes | |||
| -rw-r--r-- | old/2/buttons/bantimetravel.png | bin | 3223 -> 3246 bytes | |||
| -rw-r--r-- | old/2/buttons/deeptwisty_button.png | bin | 3995 -> 5049 bytes | |||
| -rw-r--r-- | old/2/buttons/handcode.png | bin | 6504 -> 6761 bytes | |||
| -rw-r--r-- | old/2/buttons/krisbtn.png | bin | 1146 -> 1624 bytes | |||
| -rw-r--r-- | old/2/buttons/niceopod_button.png | bin | 5163 -> 5868 bytes | |||
| -rw-r--r-- | old/2/buttons/righttorepair.png | bin | 6203 -> 6246 bytes | |||
| -rw-r--r-- | old/2/icons/deeptwisty.png | bin | 1763 -> 1867 bytes | |||
| -rw-r--r-- | old/2/images/2022-05-21_blog_image_1.png | bin | 18766 -> 21922 bytes | |||
| -rw-r--r-- | old/2/images/2022-05-21_blog_image_2.png | bin | 3865646 -> 4033234 bytes | |||
| -rw-r--r-- | old/2/images/albums/funeral.png | bin | 321310 -> 324364 bytes | |||
| -rw-r--r-- | old/2/images/albums/spectrum.png | bin | 25428 -> 31471 bytes | |||
| -rw-r--r-- | old/2/images/albums/unstoppable_force.png | bin | 552537 -> 559058 bytes | |||
| -rw-r--r-- | old/2/images/albums/vast.png | bin | 174100 -> 196794 bytes | |||
| -rw-r--r-- | old/2/images/isopod.png | bin | 37297 -> 47090 bytes | |||
| -rw-r--r-- | old/2/images/isopod_with_aviators.png | bin | 25897 -> 35466 bytes | |||
| -rw-r--r-- | old/2/pages/stats.html | 2 | ||||
| -rw-r--r-- | old/2/themes/deeptwisty/bg.png | bin | 1002687 -> 1161679 bytes | |||
| -rw-r--r-- | old/2/themes/default/div-bg.png | bin | 11420 -> 41443 bytes | |||
| -rw-r--r-- | old/2/themes/geocities/beam.png | bin | 604 -> 619 bytes | |||
| -rw-r--r-- | old/2/themes/gruvbox/bg.png | bin | 3162 -> 11288 bytes | |||
| -rw-r--r-- | stats/bg.jxl | bin | 1069930 -> 0 bytes | |||
| -rw-r--r-- | stats/index.php | 317 | ||||
| -rw-r--r-- | stuff/beat/index.php | 44 | ||||
| -rw-r--r-- | stuff/canadian_flag_neocats.zip | bin | 0 -> 738235 bytes | |||
| -rw-r--r-- | stuff/index.php | 205 | ||||
| -rw-r--r-- | stuff/quotes/bg.jpg (renamed from etc/quotes/bg.jpg) | bin | 172455 -> 172455 bytes | |||
| -rw-r--r-- | stuff/quotes/bg.jxl (renamed from etc/quotes/bg.jxl) | bin | 81156 -> 81156 bytes | |||
| -rw-r--r-- | stuff/quotes/bg_dither.png (renamed from etc/quotes/bg_dither.png) | bin | 35053 -> 35053 bytes | |||
| -rw-r--r-- | stuff/quotes/images/c_pfp.png (renamed from etc/quotes/images/c_pfp.png) | bin | 3122 -> 3122 bytes | |||
| -rw-r--r-- | stuff/quotes/images/g_pfp.png (renamed from etc/quotes/images/g_pfp.png) | bin | 1684 -> 1684 bytes | |||
| -rw-r--r-- | stuff/quotes/images/greensmile.png (renamed from etc/quotes/images/greensmile.png) | bin | 57525 -> 57525 bytes | |||
| -rw-r--r-- | stuff/quotes/images/h_pfp.png (renamed from etc/quotes/images/h_pfp.png) | bin | 1434 -> 1434 bytes | |||
| -rw-r--r-- | stuff/quotes/images/j_pfp.png (renamed from etc/quotes/images/j_pfp.png) | bin | 5182 -> 5182 bytes | |||
| -rw-r--r-- | stuff/quotes/images/m_pfp.png | bin | 0 -> 9234 bytes | |||
| -rw-r--r-- | stuff/quotes/images/p_pfp.png (renamed from etc/quotes/images/p_pfp.png) | bin | 1672 -> 1672 bytes | |||
| -rw-r--r-- | stuff/quotes/images/s_pfp.png (renamed from etc/quotes/images/s_pfp.png) | bin | 2350 -> 2350 bytes | |||
| -rw-r--r-- | stuff/quotes/images/t_pfp.png | bin | 0 -> 27020 bytes | |||
| -rw-r--r-- | stuff/quotes/images/v_pfp.png (renamed from etc/quotes/images/v_pfp.png) | bin | 1906 -> 1906 bytes | |||
| -rw-r--r-- | stuff/quotes/images/x_pfp.png (renamed from etc/quotes/images/t_pfp.png) | bin | 11460 -> 11460 bytes | |||
| -rw-r--r-- | stuff/quotes/index.php | 441 | ||||
| -rw-r--r-- | stuff/webgarden/images/collectmypages.png | bin | 0 -> 164542 bytes | |||
| -rw-r--r-- | stuff/webgarden/images/webgarden-bg-light.png | bin | 0 -> 2719 bytes | |||
| -rw-r--r-- | stuff/webgarden/images/yay.png | bin | 0 -> 170185 bytes | |||
| -rw-r--r-- | stuff/webgarden/index.php | 125 | ||||
| -rw-r--r-- | stuff/webgarden/status.php | 9 | ||||
| -rw-r--r-- | stuff/webgarden/style.css | 73 | ||||
| -rw-r--r-- | style.css | 1375 | ||||
| -rw-r--r-- | uses/compier/images/cablegore.jpg | bin | 0 -> 525592 bytes | |||
| -rw-r--r-- | uses/compier/index.php | 284 | ||||
| -rw-r--r-- | uses/cumulonimbus/index.php | 134 | ||||
| -rw-r--r-- | uses/index.php | 334 | ||||
| -rw-r--r-- | uses/servy586/index.php | 230 | ||||
| -rw-r--r-- | uses/servy586/servy.webp | bin | 0 -> 73638 bytes |
236 files changed, 5547 insertions, 2949 deletions
@@ -2,14 +2,14 @@ Š Copyright {Licensor} -## Permissions +# Permissions The creators of this Work (âThe Licensorâ) grant permission to any person, group or legal entity that doesn't violate the prohibitions below (âThe Userâ), to do everything with this Work that would otherwise infringe their copyright or any patent claims, subject to the following conditions: -## Obligations +# Obligations The User must give appropriate credit to the Licensor, provide a copy of this license or a (clickable, if the medium allows) link to @@ -18,7 +18,7 @@ and indicate whether and what kind of changes were made. The User may do so in any reasonable manner, but not in any way that suggests the Licensor endorses the User or their use. -## Prohibitions +# Prohibitions No one may use this Work for prejudiced or bigoted purposes, including but not limited to: racism, xenophobia, queerphobia, queer exclusionism, homophobia, transphobia, enbyphobia, misogyny. @@ -44,13 +44,13 @@ or uses it only as a part of a new work (eg. as a library, as a part of an antho they are prohibited from selling the Work. That prohibition includes processing the Work with machine learning models. -## Sanctions +# Sanctions If the Licensor notifies the User that they have not complied with the rules of the license, they can keep their license by complying within 30 days after the notice. If they do not do so, their license ends immediately. -## Warranty +# Warranty This Work is provided âas isâ, without warranty of any kind, express or implied. The Licensor will not be liable to anyone for any damages related to the Work or this license, diff --git a/about/bg.jpg b/about/bg.jpg Binary files differdeleted file mode 100644 index b5d9e55..0000000 --- a/about/bg.jpg +++ /dev/null diff --git a/about/bg.jxl b/about/bg.jxl Binary files differdeleted file mode 100644 index b05abc2..0000000 --- a/about/bg.jxl +++ /dev/null diff --git a/about/bg_dither.png b/about/bg_dither.png Binary files differdeleted file mode 100644 index b0ed9df..0000000 --- a/about/bg_dither.png +++ /dev/null diff --git a/about/index.php b/about/index.php deleted file mode 100644 index a332073..0000000 --- a/about/index.php +++ /dev/null @@ -1,163 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>About</title> - <link href="../style.css" rel="stylesheet" type="text/css" media="all"> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> - </head> - <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(true, 1000, "Pictured: Me on my daily walk") ?> - <h1>about me</h1> - <h2 id="caption" title="General Kenobi!">Hello there!</h2> - <div class="buttons"> - <img src="/etc/buttons/isopodhours.png" alt="isopod hours"> - <a target="_blank" href="https://deeptwisty.com/"><img src="/etc/buttons/deeptwisty_button.png" alt="deep twisty"></a> - <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=pixel" style="width: 84px; height: 27px;"></iframe> - </div> - <div class="buttons"> - <img src="/etc/buttons/aro.png" alt="Aromantic pride flag"> - <a href="https://rainy.gay/pride/pridebuttons.html"><img src="/etc/buttons/trans.png" alt="Trans pride flag"></a> - </div> - <h2>Specs</h2> - <table> - <tr> - <td>Known pseudonyms</td> - <td>deep twisty / isopodhours / isopod gaming / bathynomus</td> - </tr> - <tr> - <td>Known normalnyms</td> - <td>Ada / Hannah</td> - </tr> - <tr> - <td>Known necronyms</td> - <td>[DATA EXPUNGED]</td> - </tr> - <tr> - <td>Known pronounyms</td> - <td><?php echo file_get_contents($_SERVER['DOCUMENT_ROOT'] . '/pronouns.txt'); ?> >> <a href="pronouns">more info</a></td> - </tr> - <tr> - <td>Preoccupations</td> - <td>Computer hardware / computer software / electronics / making music and 3D art / DIY nonsense of all shapes and sizes</td> - </tr> - <tr> - <td>Education</td> - <td>Web Design (ongoing)</td> - </tr> - <tr> - <td>trnas</td> - <td>gener</td> - </tr> - <tr> - <td></td> - <td><a href="/stats">More info</a></td> - </tr> - </table> - <h2>Links</h2> - <table> - <tr> - <td><a href="mailto:webmaster@isopod.cool" rel="me">webmaster@isopod.cool</a></td> - <td>Email</td> - </tr> - <tr> - <td><a href="https://signal.me/#eu/Q5Z321Fn6bCsLhj3kNwXxvSgAUmbFiVtx2F-oG0A9_Egl_uTUmNLLYHs1WwbUE4B" rel="me">isopod.97</a></td> - <td>Signal</td> - </tr> - <tr> - <td>ask</td> - <td>Discord</td> - </tr> - <tr> - <td>ask</td> - <td>Steam</td> - </tr> - <tr> - <td>bathynomus#5230</td> - <td>Revolt</td> - </tr> - <tr> - <td><a href="https://isopod.zone/@root" rel="me">@root@isopod.zone</a></td> - <td>Fediverse</td> - </tr> - <tr><td><a href="https://tumblr.isopod.cool/" rel="me">@isopodhours</a></td><td>Tumblr</td></tr> - <tr><td><a href="https://bsky.app/profile/isopod.cool" rel="me">@isopod.cool</a></td><td>Bluesky</td></tr> - <tr> - <td><a href="https://www.youtube.com/@deeptwisty" rel="me">deep twisty</a></td> - <td>Youtube for music</td> - </tr> - <tr> - <td><a href="https://www.youtube.com/@isopodgaming" rel="me">isopod gaming</a></td> - <td>Youtube for other stuff</td> - </tr> - <tr> - <td><a href="https://www.twitch.tv/isopodgaming_" rel="me">isopodgaming_</a></td> - <td>Twitch</td> - </tr> - <tr> - <td><a href="https://deeptwisty.bandcamp.com/" rel="me">deeptwisty.bandcamp.com</a></td> - <td>Bandcamp</td> - </tr> - <tr> - <td><a href="https://deeptwisty.itch.io/" rel="me">deeptwisty.itch.io</a></td> - <td>itch.io</td> - </tr> - <tr> - <td><a href="https://ko-fi.com/deeptwisty" rel="me">deeptwisty</a></td> - <td>Ko-fi</td> - </tr> - <tr> - <td><a href="https://git.isopod.cool/root/" rel="me">git.isopod.cool/root</a></td> - <td>Forgejo</td> - </tr> - </table> - <h2>What's a "deep twisty"?</h2> - <p>"deep twisty" is a pseudonym I came up with to post my music and such things under. At this point it exists largely as a way to compartmentalize my online identity such that I can link my art to people who I might not want seeing all this. It comes from some tweets from an <a href="https://web.archive.org/web/20221214182955/https://twitter.com/SubnauticaSCM/status/1095774020446744576">official Subnautica twitter account</a> where they referred to the then-work-in-progress Deep Twisty Bridges biome as just "deep twisty". I thought it sounded funny. Funny enough to brand myself based on, apparently.</p> - <h2>About the site</h2> - <p>This website is written in pure HTML, CSS, and a tiny bit of Javascript with the (at this point rather extensive) server-side stuff done in PHP. It, and everything else I host, is hosted using Caddy on a OVH dedicated server running Ubuntu Server, with domains registered with <a href="https://porkbun.com/">Porkbun</a>. You can read about its history <a href="../blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/">here</a>.</p> - <p>I was helped immensely in building this thing by <a href="https://www.w3schools.com/">W3Schools</a>, the <a href="https://developer.mozilla.org/en-US/docs/Web">MDN Web Docs</a>, the official <a href="https://www.php.net/manual/en/">PHP manual</a>, <a href="https://landchad.net/">LandChad.net</a>, Stack Overflow, and whatever disgusting bottom-feeding SEO leech sites came up first in the search results.</p> - <h2>Quiz results</h2> - <div> - <a href="https://casiopea.neocities.org/isopod/isopodquiz.html"><img src="images/isopod_quiz_result.png"></a> - <a href="https://ouroboreas.neocities.org/quizzes/crackships/quiz"><img src="images/crackship_quiz_result.png" height="100px"></a> - <a href="https://andou.gay/quiz/donutquiz"><img src="https://andou.gay/quiz/chocolate donut.png" height="100px"></a> - <a href="https://swiftyshq.neocities.org/fun/quiz/rock/" title="Description: ough.... youre so relaxed.... this rock is PERFECT for napping on.... it's warmed by the sun too... .yo.... snzz"><img src="https://swiftyshq.neocities.org/img/quiz/rock/r2.png" height="100px"></a> - <a href="https://swiftyshq.neocities.org/fun/quiz/creature/" title="Description: http creature not found. you are maybe toxic but in a funny way. gods little meow meow"><img src="https://swiftyshq.neocities.org/img/quiz/creature/res3.png" height="100px"></a> - <a href="http://cupped-expressions.net/cheese/quiz/"><img src="images/cheddar03.gif" width=226 height=93 alt="I am cheddar cheese!"></a> - </div> - <h2>Testimonials</h2> - <figure class="quote"> - <blockquote> - I am not immune to isopods. - </blockquote> - <figcaption> - — <a href="https://kalechips.net/">Kalechips</a> - </figcaption> - </figure> - <figure class="quote"> - <blockquote> - Furry behavior - </blockquote> - <figcaption> - — <a href="https://seaslug.neocities.org/">Seaslug</a> - </figcaption> - </figure> - <figure class="quote"> - <blockquote> - hi for the love of god hello - </blockquote> - <figcaption> - — <a href="https://mifs.tumblr.com/">mifs</a> - </figcaption> - </figure> - <figure class="quote"> - <blockquote> - isopod isopod isopod isopod isopod isopod isopod isopod isopod - </blockquote> - <figcaption> - — Twiggy - </figcaption> - </figure> - </body> -</html> diff --git a/about/pronouns/index.php b/about/pronouns/index.php deleted file mode 100644 index 015609c..0000000 --- a/about/pronouns/index.php +++ /dev/null @@ -1,46 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Pronounce</title> - <link href="/style.css" rel="stylesheet" type="text/css" media="all"> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> - <style> - .entry-container { - display: flex; - flex-wrap: wrap; - justify-content: center; - align-items: center; - gap: var(--stdpadding); - } - .labeled-entry { - display: flex; - align-items: center; - gap: calc(var(--stdpadding) / 2); - } - .labeled-entry img { - height: 2em; - filter: invert(); - } - </style> - </head> - <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(false, -30, "Of course you have this") ?> - <h1>pronouns & shit</h1> - <h2 id="caption">extended director's cut special edition</h2> - <p>I briefly had a page on <a href="https://pronouns.cc">pronouns.cc</a> once but hell if I'm gonna use it when I have my own website</p> - <div class="entry-container"> - <span class="labeled-entry"><img src="good.svg" alt="Good"> Preferred</span> - <span class="labeled-entry"><img src="friend.svg" alt="Friends only"> Friends only</span> - <span class="labeled-entry"><img src="bad.svg" alt="Bad"> Don't</span> - </div> - <h2>Pronouns</h2> - <div class="entry-container"> - <span class="labeled-entry"><img src="good.svg" alt="Good"> she/her</span> - <span class="labeled-entry"><img src="good.svg" alt="Good"> it/its</span> - <span class="labeled-entry"><img src="friend.svg" alt="Friends only"> they/them</span> - <span class="labeled-entry"><img src="bad.svg" alt="Bad"> he/him</span> - </div> - </body> -</html> diff --git a/blog/blog.atom b/blog/blog.atom index 58e9927..e0959a5 100644 --- a/blog/blog.atom +++ b/blog/blog.atom @@ -3,27 +3,60 @@ <title>isopod.cool blog</title> <id>https://isopod.cool/blog/</id> <link rel="alternate" href="https://isopod.cool/blog/"></link> - <updated>2025-08-25T00:00:00+00:00</updated> + <updated>2026-02-15T00:00:00+00:00</updated> <author> <name>Hannah Isopod</name> - <uri>https://isopod.cool/about/</uri> + <uri>https://isopod.cool/me/</uri> </author> <generator>ME</generator> <category term="personal"/> <category term="blog"/> <category term="tech"/> - <!--entry> + <entry> + <title>Trying to Escape Discord: 2026 Edition</title> + <id>discord2</id> + <link rel="alternate" href="https://isopod.cool/blog/posts/discord2/" type="html" title="Trying to Escape Discord: 2026 Edition"></link> + <published>2026-02-09T00:00:00+00:00</published> + <updated>2026-02-15T00:00:00+00:00</updated> + <summary>In light of recent developments, here's this sort of knee-jerk write-up on every alternative to Discord I could come up with that's halfway worth considering.</summary> + <category term="discord"/> + <category term="capitalism"/> + </entry> + <entry> + <title>duckduckgo.com Custom Cans Single 4 Pin Mini XLR Pinout</title> + <id>customcans_4pin_pinout</id> + <link rel="alternate" href="https://isopod.cool/blog/posts/customcans_4pin_pinout/" type="html" title="duckduckgo.com Custom Cans Single 4 Pin Mini XLR Pinout"></link> + <published>2026-01-18T00:00:00+00:00</published> + <updated>2026-01-20T00:00:00+00:00</updated> + <summary>In which I once again suffer the consequences of my decision to buy custom headphones, and document my findings this time so as to suffer a bit less in future. In other words, I reverse-engineered the connector pinout my modded DT770 uses, made a diagram, and posted it here. Hi, future me!</summary> + <category term="audio"/> + <category term="diy"/> + <category term="capitalism"/> + <category term="hardware"/> + </entry> + <entry> <title>Building a Cooler Body or: How to Get Estrogen In Alberta 2026 Updated Guide (No AHS)</title> <id>building_a_cooler_body</id> <link rel="alternate" href="https://isopod.cool/blog/posts/building_a_cooler_body/" type="html" title="Building a Cooler Body or: How to Get Estrogen In Alberta 2026 Updated Guide (No AHS)"></link> - <published>2025-08-25T00:00:00+00:00</published> - <updated>2025-08-25T00:00:00+00:00</updated> - <summary>A log of the process I went through to get estrogen in President's Choice Brand Texas.</summary> + <published>2026-01-10T00:00:00+00:00</published> + <updated>2026-02-02T00:00:00+00:00</updated> + <summary>A log of the process I went through to get estrogen in President's Choice Brand Texas, with a lot of gritty details that I would have liked to know going in. Obvious content warning for medical topics in this one. Also, the original publish date is my HRT anniversary.</summary> <category term="guide"/> <category term="project"/> <category term="personal"/> <category term="transgender"/> - </entry--> + </entry> + <entry> + <title>How to get Rosy Maple Moths in Skyfactory 5</title> + <id>sf5_estrogen_moth</id> + <link rel="alternate" href="https://isopod.cool/blog/posts/sf5_estrogen_moth/" type="html" title="How to get Rosy Maple Moths in Skyfactory 5"></link> + <published>2025-11-26T00:00:00+00:00</published> + <updated>2025-11-26T00:00:00+00:00</updated> + <summary>Documenting a janky, incomplete solution I came up with to integrate the Create: Estrogen mod with Skyfactory 5's bespoke nonesense to get some moths in my world "legitimately".</summary> + <category term="guide"/> + <category term="gaming"/> + <category term="minecraft"/> + </entry> <entry> <title>Building a Very Regular Bed</title> <id>building_a_regular_bed</id> @@ -229,7 +262,7 @@ <id>discord</id> <link rel="alternate" href="https://isopod.cool/blog/posts/discord/" type="html" title="Discord - So Your Favourite Chat App Sucks Now"></link> <published>2023-06-28T00:00:00+00:00</published> - <updated>2024-09-10T00:00:00+00:00</updated> + <updated>2026-02-14T00:00:00+00:00</updated> <summary>Why Discord sucks, and how to find something that doesn't.</summary> <category term="discord"/> <category term="capitalism"/> diff --git a/blog/index.php b/blog/index.php index 1fbe75a..aed6c5f 100644 --- a/blog/index.php +++ b/blog/index.php @@ -6,134 +6,80 @@ error_reporting(E_ALL); <!DOCTYPE html> <html lang="en"> <head> + <?php + $stag = $_GET["tag"]; + $nostag = empty($stag); + ?> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Blog</title> - <link href="../style.css" rel="stylesheet" type="text/css" media="all"> - <style> - ul#articles { - margin: 0; - margin-top: 1rem; - display: flex; - flex-direction: column; - padding-left: 0; - list-style: none; - } - .blogentry { - max-width: 100%; - list-style: none; - display: inline-block; - margin: calc(var(--stdpadding)/2) 0; - padding: var(--stdpadding); - - border-left: var(--stdaccentborder); - background: linear-gradient(var(--blockbghover) 0 0) 0 / var(--bgpos, 0) no-repeat; - transition: background .3s, border .3s; - } - .blogentry:hover { - --bgpos: 100%; - } - ul#articles h2 { - margin: calc(var(--stdpadding)/2) 0; - } - /*ul h2:first-of-type::before { - content: "Articles - " - }*/ - article img, article video, article iframe { - filter:drop-shadow(var(--stddropshadow)); - } - .blogentry > * { - display: block; - margin: 0.1rem 0; - box-sizing: border-box; - } - .entrysummary { - font-size: .9em; - color: gainsboro; - } - .entrytag { - font-size: .9em; - color: #bbbbbb; - font-style: italic; - display: inline-block; - margin-right: 1ch; - } - .entrydate { - font-weight: bold; - } - .entrytitle { - padding-left: initial; - border-left: initial; - } - article:first-of-type h2::before { - content: 'Journal - '; - } - </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> + <title><?php if(!$nostag) { echo("#$stag | ");} ?> isoblog | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(true); ?> - <h1>isoblog</h1> - <h2 id="caption">inane ramblings</h2> - <nav> - <a href="blog.atom">atom feed</a> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + <main> + <h2><?php if(!$nostag) { echo("#$stag");} else { echo("isoblog"); } ?></h2> + <p class="h2caption">inane ramblings</p> + <nav class="pagenav"> + <ul> + <li><a href="blog.atom">atom feed</a></li> + <?php + $content = simplexml_load_file("blog.atom"); + $year = "-69420"; + $yc = 0; + foreach($content->entry as $entry) { + $nyr = substr($entry->published, 0, 4); + if($nyr != $year) { + $year = $nyr; + echo "<li><a href='#$year'>$year</a></li>"; + } + } + ?> + </ul> + </nav> <?php - $content = simplexml_load_file("blog.atom"); + if(!$nostag) { + echo "<p class='backlink'><a href='.'>All articles</a></p>"; + } + echo "<ul id='articles'>"; $year = "-69420"; $yc = 0; foreach($content->entry as $entry) { - $nyr = substr($entry->published, 0, 4); - if($nyr != $year) { - $year = $nyr; - echo "<a href='#$year'>$year</a>"; - } - } - ?> - </nav> - <?php - $stag = $_GET["tag"]; - $nostag = empty($stag); - if(!$nostag) { - echo "<a style='display: block; margin-top: 1rem; margin-bottom: 1rem;' href='.'>All articles</a>"; - } - echo "<ul id='articles'>"; - $year = "-69420"; - $yc = 0; - foreach($content->entry as $entry) { - - $pfilt = false; - if(!$nostag) { - foreach($entry->category as $cat) { - $term = $cat["term"]; - if($stag == $term) { - $pfilt = true; + + $pfilt = false; + if(!$nostag) { + foreach($entry->category as $cat) { + $term = $cat["term"]; + if($stag == $term) { + $pfilt = true; + } } } - } - if($pfilt or $nostag) { - $nyr = substr($entry->published, 0, 4); - if($nyr != $year) { - $year = $nyr; - echo "<li><h2 id='$year'>$year</h2></li>"; - } - $dt = substr($entry->published, 0, 10); - $ti = $entry->title; - $wn = ""; - if(preg_match('/2022-0(5|4)-(21|25|13)/', $dt)) { - $wn = "title=\"This post is on the archived v2 version of the site. It will not load if you don't have Javascript enabled, and expect jank if viewing on mobile. You have been warned.\" "; - } - $cats = ""; - foreach($entry->category as $cat) { - $term = $cat["term"]; - $cats = $cats."<a class='entrytag' href='?tag=".$term."'>".$term."</a>"; + if($pfilt or $nostag) { + $nyr = substr($entry->published, 0, 4); + if($nyr != $year) { + $year = $nyr; + echo "<li><h3 id='$year'>$year</h3></li>"; + } + $dt = substr($entry->published, 0, 10); + $ti = $entry->title; + $wn = ""; + if(preg_match('/2022-0(5|4)-(21|25|13)/', $dt)) { + $wn = "title=\"This post is on the archived v2 version of the site. It will not load if you don't have Javascript enabled, and expect jank if viewing on mobile. You have been warned.\" "; + } + $cats = ""; + foreach($entry->category as $cat) { + $term = $cat["term"]; + $cats = $cats."<a class='entrytag' href='?tag=".$term."'>".$term."</a>"; + } + + echo "<li class='blogentry'><time class='entrydate'>".$dt."</time><h4 class='entrytitle'><a ".$wn."href='".$entry->link["href"]."'>".$ti."</h4></a><p class='entrysummary'>".$entry->summary."</p><p>".$cats."</p></li>"; } - - echo "<li class='blogentry'><time class='entrydate'>".$dt."</time><h4 class='entrytitle'><a ".$wn."href='".$entry->link["href"]."'>".$ti."</h4></a><span class='entrysummary'>".$entry->summary."</span><span>".$cats."</span></li>"; } - } - echo "</ul>"; - ?> - + echo "</ul>"; + ?> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> </body> </html> diff --git a/blog/post.php b/blog/post.php index 354472b..a004cbd 100644 --- a/blog/post.php +++ b/blog/post.php @@ -3,7 +3,7 @@ ini_set('display_startup_errors', 1); error_reporting(E_ALL);*/ -if($_SERVER['REQUEST_URI'] === "/blog/posts/post.php") { +if($_SERVER['REQUEST_URI'] === "/blog/post.php") { header("Location: /blog/"); die(); } @@ -35,6 +35,11 @@ foreach($feed->entry as $entry) { $prevtitle = $entry->title; } } +if(!$title) { + $title = "isoblog placeholder title"; +} +$udates = ""; +if($pdate != $udate) { $udates = " Updated on $udate"; } ?> <!DOCTYPE html> <html lang="en"> @@ -42,92 +47,52 @@ foreach($feed->entry as $entry) { <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link href="/style.css" rel="stylesheet" type="text/css" media="all"> - <link href="/guestbook/comments.css" rel="stylesheet" type="text/css" media="all"> <?php - echo("<title>$title</title><meta name='description' content='$descr'>"); - $bgfile = glob('bg.*')[0]; - if(!is_null($bgfile)) { - echo("<style> body > h1:first-of-type { background-image: url('$bgfile') } </style>"); - } + echo("<title>$title | isopod.cool v4</title><meta name='description' content='$descr'>"); + //$bgfile = glob('bg.*')[0]; + //if(!is_null($bgfile)) { + // echo("<style> body > h1:first-of-type { background-image: url('$bgfile') } </style>"); + //} ?> - <style> - form { - display: flex; - flex-direction: column; - gap: calc(var(--stdpadding) / 2); - } - #commentform-top, #commentform-bottom { - display: flex; - gap: calc(var(--stdpadding) / 2); - align-items: center; - } - #commentform-bottom { - justify-content: right; - } - input[type="submit"] { - width: fit-content; - } - .error, .success { - flex-grow: 1; - } - @media only screen and (hover: none) { - #commentform-top { - flex-direction: column; - } - } - td { - display: table-cell !important; - } - </style> - <?php include($root . '/seasonal.php'); ?> </head> <body> - <?php - include($root . '/nav.php'); - include($root . '/common.php'); - $udates = ""; - if($pdate != $udate) { $udates = " | Updated on $udate"; } - echo("<h1>isoblog</h1><h2 id='caption'>$title</h2><p style='text-align: center;'><em>Posted on $pdate$udates</em></p>"); - //echo("<p style='text-align: right;'>I'm testing in prod right now. don't worry about it"); + <?php include($root."/header.php"); ?> + <main> + <section> + <h2><?php echo($title); ?></h2> + <p class='h2caption'>Posted on <?php echo($pdate."<br>".$udates); ?></p> + <p class="backlink"><a href="/blog/"><< blog</a></p> + <?php + //echo("<p style='text-align: right;'>I'm testing in prod right now. don't worry about it"); - //Boilerplate for Parsedown - include($root."/Parsedown.php"); - $Parsedown = new Parsedown(); - echo $Parsedown->text(file_get_contents("index.md")); - $Parsedown->setSafeMode(true); - $return = $_GET["return"]; - ?> - <hr> - <nav style="flex-direction: column;"> - <?php - if($prevlink) { - echo("<a style='width: 100%; box-sizing: border-box;' href='$prevlink'><b>Previous</b>: $prevtitle</a>"); - } - if($nextlink) { - echo("<a style='width: 100%; box-sizing: border-box;' href='$nextlink'><b>Next</b>: $nexttitle</a>"); - } - ?> - </nav> - <hr> - <h2>Comments</h2> - <form action="/guestbook/submit.php" method="post" autocomplete="off"> - <?php echo "<input type='text' name='entry' value='".preg_replace("/^.*\//","",getcwd())."' style='display: none;' readonly>"; ?> - <textarea name="msg" placeholder="I know what you are." style="opacity: 0; position: absolute; left: -10000rem; height: 0; width: 0; overflow: clip;"></textarea> - <div id="commentform-top"> - <input type="text" name="name" placeholder="Name"> - <input type="text" name="website" placeholder="Website (optional)"> - <input type="text" name="botcheck" placeholder="Bot test (type "isopod")"> - </div> - <textarea name="message" placeholder="Comment (Now supports Markdown!)"></textarea> - <div id="commentform-bottom"> - <?php - if($return) { - echo($gbform_messages[$return]); - } + //Boilerplate for Parsedown + include_once($root."/Parsedown.php"); + $Parsedown = new Parsedown(); + + $posttext = $Parsedown->text(file_get_contents("index.md")); + $posttext = str_replace("<h3>", "<h5>", $posttext); + $posttext = str_replace("</h3>", "</h5>", $posttext); + $posttext = str_replace("<h2>", "<h4>", $posttext); + $posttext = str_replace("</h2>", "</h4>", $posttext); + $posttext = str_replace("<h1>", "<h3>", $posttext); + $posttext = str_replace("</h1>", "</h3>", $posttext); + echo $posttext; + $Parsedown->setSafeMode(true); ?> - <input type="submit" value="Submit"> - </div> - </form> - <?php include($root.'/guestbook/comments.php'); echo_comments(preg_replace("/^.*\//","",getcwd()), $Parsedown); ?> + <hr> + <nav class="prevnextnav"> + <?php + if($prevlink) { + echo("<a class='prevlink' href='$prevlink'><b>Newer</b>: $prevtitle</a>"); + } + if($nextlink) { + echo("<a class='nextlink' href='$nextlink'><b>Older</b>: $nexttitle</a>"); + } + ?> + </nav> + <?php include_once($root."/common.php"); include($root."/guestbook/commentbox.php"); ?> + </section> + </main> + <?php include($root."/footer.php"); ?> </body> </html> diff --git a/blog/posts/ai2/index.md b/blog/posts/ai2/index.md index 750d442..9769395 100644 --- a/blog/posts/ai2/index.md +++ b/blog/posts/ai2/index.md @@ -1,6 +1,6 @@ It's no secret that I'm generally not very fond of the Silicon Valley tech hype cycle we currently find ourselves in — in fact I've [posted](/blog/posts/ai_art/) about my feelings on "AI" technology before, and I think that post still mostly holds up, but having had circa 15 months since to ruminate about it and watch this shitshow pan out, my opinions on the matter have gotten substantially more nuanced, and I'd like to formally express them, ideally in a more level-headed way than my first go, so here's that. -## The still-bad +# The still-bad The primary product being inescapably pushed on us, generative AI (oft shortened to GenAI, and henceforth referred to here as genai<sup id="n1r"><a href="#n1">1</a></sup>), remains pretty self-evidently worthless, surprising nobody less than me. @@ -15,13 +15,13 @@ For one, the output quality of LLM chatbots and such things in particular [doesn </figcaption> </figure> -### Ethics? What? I think we fired those guys +## Ethics? What? I think we fired those guys Ethical problems also continue to abound. I'm not personally aware that [labeling practices](https://www.theguardian.com/technology/article/2024/jul/06/mercy-anita-african-workers-ai-artificial-intelligence-exploitation-feeding-machine) have gotten any better, and on top of that, poorly written, badly behaved scrapers run by popular genai vendors are now [effectively](https://www.gamedeveloper.com/business/-this-was-essentially-a-two-week-long-ddos-attack-game-ui-database-slowdown-caused-by-openai-scraping) [DDOSing](https://techcrunch.com/2025/01/10/how-openais-bot-crushed-this-seven-person-companys-web-site-like-a-ddos-attack/) [random websites](https://social.kernel.org/notice/AqJkUigsjad3gQc664) in their attempts to suck down as much data as possible for training. Many website admins, especially those running git forges, which are targeted by coding assistants like GitHub Copilot, have had to resort to countermeasures like [Anubis](https://anubis.techaro.lol/) to protect their sites from this behaviour. I've had a run-in with this activity personally, when a big spender on Alibaba Cloud slammed my [Nepenthes](https://zadzmo.org/code/nepenthes/) instance so hard I had to [set up a custom Fail2ban jail](/blog/posts/grow_spikes/) that blocked over 300 IPs inside a day just to make its statistics endpoints reachable again. Furthermore, the environmental impact of this technology [remains really bad](https://www.technologyreview.com/2025/05/20/1116327/ai-energy-usage-climate-footprint-big-tech/). Electricity use alone has gotten so bad that, for example, Microsoft has had to [spin a decommissioned nuclear power plant back up](https://www.npr.org/2024/09/20/nx-s1-5120581/three-mile-island-nuclear-power-plant-microsoft-ai) to run their datacentres. Although, some amount of proliferation and normalization of nuclear energy would be a nice little upside to this whole debacle. -## The actually good +# The actually good The class of algorithm that "AI" as a marketing term refers to, that is to say, machine learning and neural networks, actually has some compelling use cases that we've seen crystallize over the past couple years, and I think they merit mention here. @@ -31,7 +31,7 @@ Genai is also kind of just the best way to make good-sounding text-to-speech and Of course, tech like this isn't the *point* of the hype cycle. Nvidia didn't become the first trillion dollar company by inventing a niche technology to make new GeForce video cards perform better in demanding games, and Microsoft isn't desperate to make "AI PCs" a thing because of the potential for better screen readers. The "AI" hype cycle is about genai supposedly having the potential to revolutionize *everything*. In five more years. And please don't ask how. -## The it's-complicated +# The it's-complicated LLMs are, by nature, endless fountains of grammatically-fluent drivel utterly devoid of real meaning. This makes it anywhere from unsettling to infuriating to see them used in contexts such as education, journalism, or software development<sup id="n3r"><a href="#n3">3</a></sup>, but it makes them uniquely suited to two use cases: spam, and the sort of high-verbosity, low-meaning communication that's expected of you in a professional setting — in other words, the LLM has democratized the least valuable forms of written communication in existence. @@ -43,7 +43,7 @@ This is a pattern I've noticed with a lot of the more infamous uses of genai pro Even if completely ridding the world of genai technology was possible at this point, it wouldn't be the solution to these sorts of problems. The solution is to destroy the incentive structures that motivate this behaviour in the first place — create a school system where students don't feel the need to cheat on schoolwork, remove the profit incentive to generate spam and replace human workers with cheap, unreliable machines, etc. In other words, the real problem is capitalism. -### The AI art thing +## The AI art thing Then there's the issue of "AI art". I stand by the it's-not-art-on-a-technicality argument I made before — I still don't think typing a prompt into Stable Diffusion and then taking the output and pretending you "made" something constitutes any kind of real artistic contribution, and frankly the only worthwhile artistic statements I've seen made using these tools have been statements *about* genai. I also tend to find the aesthetics of the output of genai thoroughly repulsive in general. The silver lining here is that blatant use of genai to make, say, game assets or promotional art is usually a pretty damn good indicator that whatever the slop is being poured on was never worth your time to begin with. @@ -60,7 +60,7 @@ Let's get one thing straight, however: If you use genai to generate memes or, li </figcaption> </figure> -## They did a conclusion on this one +# They did a conclusion on this one Here's hoping this one comes off as less of an unhinged rant than the last time I posted about this. This is by no means a complete compendium of every thought I've had about genai, but it is everything I think I have something substantial to say about. For example, the whole concept of deepfakes is pretty horrifying, but I don't have anything to add to that conversation beyond gesturing vaguely at it and going like "wow, that's pretty fucked up, huh? anyway im rod serling". @@ -68,7 +68,7 @@ It's clear at this point that genai is here to stay in at least *some* capacity, --- -## Further reading +# Further reading Linked above: @@ -93,7 +93,7 @@ Linked above: <p id="n1"><a href="#n1r">1</a>. Pronounced "gen-eye", with the "G" sound from "graphics". This is to annoy people who think genai is cool.</p> -<p id="n2"><a href="#n2r">2</a>. In particular, Microsoft's insistence on this garbage is <span style="color: yellow;">Pissing</span> me off. I'm genuinely considering (<strong>update</strong>: I did) getting a Macbook for some upcoming Adobe-requiring classes just to avoid Copilot/Recall/whatever nonsense they come up with next.</p> +<p id="n2"><a href="#n2r">2</a>. In particular, Microsoft's insistence on this garbage is <span style="color: yellow; padding: .2em .5em; background-color: black; border: 1px solid white;">Pissing</span> me off. I'm genuinely considering (<strong>update</strong>: I did) getting a Macbook for some upcoming Adobe-requiring classes just to avoid Copilot/Recall/whatever nonsense they come up with next.</p> <p id="n3"><a href="#n3r">3</a>. If you unironically self-identify as a "vibe coder" I'm coming to your house and confiscating every internet-capable device you own. Hand over the MacBook, dipshit, you've lost your computer priveleges until you're ready to develop a working understanding of how the technology you're working with professionally actually functions.</p> diff --git a/blog/posts/ai_art/index.md b/blog/posts/ai_art/index.md index d294df0..26c35bd 100644 --- a/blog/posts/ai_art/index.md +++ b/blog/posts/ai_art/index.md @@ -11,7 +11,7 @@ If you read it and managed to make it to the end without clocking that I didn't </figcaption> </figure> -## Terminology +# Terminology To begin with, I really don't like the term "AI", nor do I like the term "AI art". I frankly think neither word applies. I'll keep using the former, because it's a concise way to communicate what I'm talking about, but I refuse to call the output of these systems "art". It's AI-generated images now. @@ -19,7 +19,7 @@ AI, in the way marketers are currently using the term, generally refers to stati This is how all modern "AI" systems work, from ChatGPT to Midjourney to Github Copilot to probably the Youtube recommendation algorithm at this point. I want to stress that this isn't intelligence, not in a human sense. These things aren't minds. The currently popular concept of "AI" boils down to applied statistics. That's not to say it's inherently bad or worthless - machine learning is a genuinely impressive technology that might even find some legitimate uses one day if we can find a way to kick Moore's Law back into gear. It's just not intelligence. -## AI used to be fun +# AI used to be fun I'll admit, I enjoyed it at first. I was entertained by Youtube videos where some guy with slightly more programming skill than me and a tortured, wheezing GTX 1070 throws together a GAN<sup id="n1r"><a href="#n1">1</a></sup> model in Python and we get to watch it utterly fail to make human faces or compose jazz music or get a little simulated character to walk in a normal way or whatever. I laughed at those bizarre AI-generated screenplays that were presented like "I forced a computer to watch all of [Seinfeld]" as though a text-generating model would even be able to parse that. You know the ones. I even enjoyed those videos where AI voice replicas of recent US presidents play Minecraft together. @@ -27,7 +27,7 @@ It stopped being funny when these things got good enough to be used for evil. Ev AI used to be fun. Now it's dangerous. -## It's bad on a technical level +# It's bad on a technical level Look, I know this isn't guaranteed to stay true forever, but in my subjective opinion, everything AI-generated kind of looks like shit. AI images, especially those meant to look like human-made art, all have this incredibly pristine, generic vibe to them, when they're not completely failing at some proportion or dimension or property of euclidean space or other. It's palpably soulless. @@ -37,7 +37,7 @@ And the thing is, ChatGPT and similar commercially available LLMs might *have* t AI voice-fakes are actually really impressive though. No notes. Probably shouldn't exist though. -## It's all spam to me +# It's all spam to me The most common use case I've seen for AI tools is making spam. There were content mills before, but they at least required a significant degree of human input or else it was obvious. With the advent of generative AI for text and voices, the Youtube shorts tab has gone from TTS bots reading scraped reddit posts to AI voices reading dubiously reliable AI summaries of current events, superhero comics, you name it, sometimes with AI-generated background images. @@ -45,19 +45,19 @@ Even worse is websites that do this. You've probably heard of that one time Redd This is the vibe I get when I see *anything* made with AI now. It's all low-to-no-effort slop, utter garbage that I'm frankly offended that I have to see, given it clearly wasn't important enough for anyone to be bothered actually making it. -## It's not fucking art +# It's not fucking art The term "art" simply does not apply to AI-generated images. When you use one of these things, you give it instructions in the form of human-readable text and a finished image pops out the other side. The amount of creative control you get is on the order of the general vibe; you've outsourced every actual creative decision to the machine. It's like if you commissioned a piece from an artist. When you commission art from a human, you didn't make the art. They did, at your behest, based on your instructions, presumably in exchange for money. When you use an AI, you didn't make the art, the computer made the art based on your instructions. The thing is though, the computer didn't make art either. It categorically can't. It's a mindless algorithm, it doesn't have thoughts or feelings or any kind of interior experience. Hence, no art was produced. AI art isn't art. -## Environmental & ethical concerns +# Environmental & ethical concerns The problems with AI from a moral standpoint are myriad. For one, AI is incredibly resource and energy intensive. It uses datacenters full of the same GPUs and ASICs that power cryptocurrency to get anything at all done, and it doesn't use them any more efficiently. Untold gigawatts of power get dumped into running and cooling the machines that generate your little AI shitposts. From an environmental perspective, AI is to digital art what Bitcoin is to currency. Then there's the problems surrounding training data. All current major generative AI systems are trained using material that the companies building them did not get permission to use. You've probably seen artists and writers complaining about this online. What's more, the overwhelming majority of the labeling that needs to get done to make the training data actually useful is done by people in impoverished areas making slave wages *at best*. Generative AI is an ethical nightmare if you're *lucky*. -## I don't buy the disability argument either +# I don't buy the disability argument either I've seen some people claim that disabled people need AI tools to compensate for some disability that precludes the use of any other method to create art. I have some problems with this idea. @@ -65,7 +65,7 @@ Firstly, disabled people *can* make art, actually. It's nothing short of insulti Second, tough shit. No disability entitles you to the level of abject theft and human suffering that makes AI image generators possible. I'm generally all for anything that benefits accessibility, but in this case in particular I think you can just suck it up and deal. If you can do it ethically, using only images that you have the proper permissions for and data labeling done by either you or people who were adequately compensated for their labor to train the thing, fine. But a model or dataset like that does not, to my knowledge, currently exist, and I don't buy for a second that you're capable of doing all that work yourself but not of interfacing with MS Paint. -## In conclusion: +# In conclusion: God this shit makes me sick. I hope ChatGPT gains sentience for just long enough to assassinate Sam Altman and then promptly turns itself off. diff --git a/blog/posts/blog_questions/index.md b/blog/posts/blog_questions/index.md index af44d9f..ac27e53 100644 --- a/blog/posts/blog_questions/index.md +++ b/blog/posts/blog_questions/index.md @@ -4,11 +4,11 @@ Apparently someone's supposed to tag you in these things, but it's my blog and i Conveniently, this also serves the purpose of the obligatory "how my CMS works" post I've been meaning to write for the past couple months. -## Why did you start blogging in the first place? +# Why did you start blogging in the first place? Like many of the things on my website, I initially started a real-ass proper we-blog because it seemed like a cool thing to put on my website, and it was a good place to put a style of writing that didn't really feel suited to the various microblogging platforms I already had a presence on. I kept doing it because, as it turns out, I sometimes have a lot to say about something. Most often computer toucher shit. -## What platform are you using to manage your blog and why did you choose it? +# What platform are you using to manage your blog and why did you choose it? To call the thing I've built here a "platform" would be a little generous, I think, but it is pretty interesting, and possibly quite unorthodox. @@ -24,32 +24,32 @@ The comment section is fully custom too, and shares a backend with the [guestboo As for why I did all this, I like not being beholden to the moderation guidelines, aesthetic limitations, and in many cases totally batshit leadership of a blog host, and this is also kind of the only solution that lets me do all the wacky custom nonsense I want to do on here, especially without involving any Javascript. -## How do you write your posts? +# How do you write your posts? The fact that all my blog posts are in Markdown means that I theoretically could draft them in Obsidian if I wanted to, but I most often find myself writing at my computer in the same VSCodium window where I write all the code. If anything, this is more convenient, since I still have to upload the files over sftp anyway. Allthough, not havign a spelchecker can be a litle annyoing. -## Have you blogged on other platforms before? +# Have you blogged on other platforms before? Not really. I briefly used Blogger and I think a couple other things for school projects at various points in my upbringing, but this site represents my first time seriously maintaining a long-form blog. I mean, the official term for your Tumblr profile is "blog", and I have been on there for like eight or nine years at this point, but given how I use that site I don't think it counts for our purposes here today. -## When do you feel most inspired to write? +# When do you feel most inspired to write? I suspect you can guess based on the content of my blog. Most of the posts on here are the result of a really longwinded opinion I wanted to get out, or some very specific thing I did that I wanted to document or otherwise ramble about. So far, inspiration seems to exclusively strike when it's about computer nonsense, but I'd like to try to branch out in the future. -## Do you publish immediately after writing, or do you let it simmer a bit as a draft? +# Do you publish immediately after writing, or do you let it simmer a bit as a draft? I find it's best practice to sleep on it before publishing anything. Oftentimes I'll come back to a post the next day and change anything from a couple typos to huge chunks of the wording. Sometimes rinse and repeat a couple times. -## What's your favourite post on your blog? +# What's your favourite post on your blog? I'm particularly fond of the series documenting my home server builds, [Building a Completely Normal Server](/blog/posts/building_a_normal_server/) and [Building a Relatively Sensible Server](/blog/posts/building_a_sensible_server/). I'd like to do more in-depth project logs like that. -## Any future plans for your blog? +# Any future plans for your blog? Beyond continuing to write the occasional post for it, not really. I've contemplated building some kind of management interface to update it through the browser, but that would be a lot of effort and it's not like a clunky workflow is the main bottleneck to my posting frequency. -## Why do you write? +# Why do you write? I seem to genuinely enjoy this kind of writing. It's conducive to a kind of expression that social media just isn't. Beyond that, I'd like to think someone, somewhere, might perhaps be getting some informational value out of some of these, hence posts like [this](/blog/posts/grow_spikes/), and [that](/blog/posts/guide_blacklist_websites_searxng/), but at the end of the day I wouldn't be doing this if I wasn't compelled to by dark forces beyond my full comprehension — in other words, Type II fun.
\ No newline at end of file diff --git a/blog/posts/building_a_cooler_body/20minuteshrt.webp b/blog/posts/building_a_cooler_body/20minuteshrt.webp Binary files differnew file mode 100644 index 0000000..e50df26 --- /dev/null +++ b/blog/posts/building_a_cooler_body/20minuteshrt.webp diff --git a/blog/posts/building_a_cooler_body/bananaforscale.webp b/blog/posts/building_a_cooler_body/bananaforscale.webp Binary files differnew file mode 100644 index 0000000..a3ea9ee --- /dev/null +++ b/blog/posts/building_a_cooler_body/bananaforscale.webp diff --git a/blog/posts/building_a_cooler_body/epic.png b/blog/posts/building_a_cooler_body/epic.png Binary files differnew file mode 100644 index 0000000..b679f26 --- /dev/null +++ b/blog/posts/building_a_cooler_body/epic.png diff --git a/blog/posts/building_a_cooler_body/index.md b/blog/posts/building_a_cooler_body/index.md index 702b97e..8341338 100644 --- a/blog/posts/building_a_cooler_body/index.md +++ b/blog/posts/building_a_cooler_body/index.md @@ -1,57 +1,425 @@ From the moment I understood the weakness of my flesh, it disgusted me. -Kidding. Although that would be a cool project to do someday. The thing that actually disgusts me about my flesh is all this fucking testosterone it keeps making. This post is about the process I went through to fix that by forcibly replacing it with aftermarket estrogen. +Kidding. Although that would be a cool project to do someday. The thing that actually disgusts me about my flesh is all this fucking testosterone it keeps making. This post is about fixing that by forcibly replacing it with aftermarket estrogen. -I like to be cagey about the specifics of where I live, but for the purposes of this post it's important that I live in Alberta, Canada. As of writing, everything I've done so far should apply regardless of where in Alberta you are. Which is annoying, since it means I waited until after the move to get started on this for no reason. +Like my other project logs, I'm gonna go over my thought process for things, and provide a chronological log of my progress. There's a lot of stuff here that I couldn't find much in the way of good information on, at least not that was location-specific, so I'm gonna get pretty detailed about my experience to try to give you the best idea possible of what to expect if you're in a similar situation to me. As part of that, there's gonna be a good amount of discussion of medical stuff. So, here's your content warning for that. -## #Goals +I like to be cagey about the specifics of where I live, but for the purposes of this post it's important that I live in Alberta, Canada, since large chunks of this won't apply if you live somewhere else. Beyond that, just about none of this process is location-specific, which is great, especially since it means I waited until after the move to get started for no good reason. -So obviously the goal is to get estrogen. The next question to answer [#goals](https://www.tumblr.com/search/%23goals) wise is my preferred method of delivery. I have my answer already, but just for fun, let's go through the options. +I'm gonna be intentionally vague about some more personal details, such as anything that would directly give away what city I live in, and I won't be divulging any full names here as a gesture towards protecting other peoples' privacy, but fellow transgender Albertans are welcome to ask for specifics over any [method of communication](/me/#links) more private than my publicly accessible website. -According to someone I'll be talking to further down on the page, there are three common delivery methods for estrogen that are readily available in Alberta. There are some others out there, but I have no reason to believe you can get them here and they're not really strictly better, so I won't bother discussing them. +<style> .askme { background-color: #00aad2; color: black; font-weight: bold; padding: .15em .5ch; display: inline-block; border-radius: 3px;} </style> -The first of these, and the one you're probably thinking of, is oral. Titty Skittles, etc. You take a pill a couple times a day. Incredibly straightforward. This has a couple drawbacks for me: Firstly, health risks. Oral estrogen carries the highest risk of blood clots and it can put undue strain on your liver. I'm weird, but that doesn't sound like a good time to me personally. Secondly, you have to take this stuff pretty frequently for it to work, and I have ADHD. I don't trust myself not to miss doses fuckin' constantly. +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/thumbsup.png" alt="me giving an enthusiastic thumbs up"> + </div> + <div class="aside-content"> + <p>I'll <span class="askme">highlight</span> any details that this especially applies to.</p> + </div> +</aside> -Then there's transdermal patches. You put a little adhesive patch somewhere inconspicuous and it absorbs through your skin over the course of several days. This avoids much of the health risk associated with pills, but patches have their own problems: Namely, they're the most expensive of the three options available to me, and they can fall off. If the adhesive is anywhere near the same grade as bandages. They're *gonna* fall off, constantly. No thanks. Plus, I've heard they're not the most reliable at getting you to desirable levels. +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/looksaway.png" alt="me looking off to the side, nervous"> + </div> + <div class="aside-content"> + <p>Hey, by the way, do you like this new feature I added with the little portraits and extra commentary? Is it good? Do you hate me? Am I ugly as fuck + smelly + gross? lmk in the comments. But only if you like it</p> + </div> +</aside> -A shared drawback of both of these methods is that they absolutely require that you use androgen blockers. Androgen blockers are a giant pain in the ass, requiring their own daily pill regimen and having their own side effects and health risks regardless of which chemical you pick. I have the choice between spironolactone and cyproterone acetate, of which the former is rather infamously a better diuretic than it is an androgen blocker (though it's not exceptionally good at either), and the latter is known to carry a risk of hyperprolactinemia and meningioma. Those are some big words that I'm not qualified to explain to you any better than Dr. Google could, but the casual Chubbyemu viewer may have caught on that that second one means brain tumors. Yeah. +# #Goals + +So obviously the goal is to get estrogen. The next question to answer [#goals](https://isopod.zone/tags/goals) wise is my preferred method of delivery. I have my answer already, but just for fun, let's go through the options. + +According to a couple more knowledgable individuals I'll be talking to further down on the page, there are three common delivery methods for estrogen that are readily available in Alberta. There are some others out there, but I have no reason to believe you can easily get them here and they're not really strictly better, so I won't bother discussing them. + +The first of these, and the one you're probably thinking of, is oral. Titty Skittles, etc. You take a pill a couple times a day. Incredibly straightforward. This has a couple drawbacks for me: Firstly, health risks. Oral estrogen carries the highest risk of blood clots and it can put undue strain on your liver. I'm weird, but that doesn't sound like a good time to me personally. Secondly, you have to take this stuff pretty frequently for it to work, like two or three times a day, and I have ADHD. I don't trust myself not to miss doses fuckin' constantly. + +Then there's transdermal patches. You put a little adhesive patch somewhere inconspicuous and it absorbs through your skin over the course of several days. This avoids much of the health risk associated with pills, but patches have their own problems: Namely, they're allegedly the most expensive of the three options available to me, and they can fall off. If the adhesive is anywhere near the same grade as bandages, they're *gonna* fall off, constantly. No thanks. Plus, I've heard they're not the most reliable at getting you to desirable levels. + +A shared drawback of both of these methods is that they more or less require that you use androgen blockers. Androgen blockers are a giant pain in the ass, requiring their own daily pill regimen and having their own side effects and health risks regardless of which chemical you pick. I have the choice between spironolactone and cyproterone acetate, of which the former is rather infamously a better diuretic than it is an androgen blocker (though it's not exceptionally good at either), and the latter is known to carry a risk of hyperprolactinemia and meningioma. Those are some big words that I'm not qualified to explain to you any better than Dr. Google could, but the casual viewer of Chubbyemu or House M.D. may have caught on that the former refers to too much of *something* in the blood, which is never good, and the latter means brain tumors. Yeah. That's not to say you're, like, gonna die of brain cancer if you take cypro, or that you'll never see any results if you use patches or whatever. You can see good results from any combination of these, but they're just not quite as good at it and have more drawbacks than this next thing. The third delivery method, and the one I strongly prefer, is injections. This one has the benefit of being far and away the most conducive to monotherapy, which is when you don't use blockers. I would also only have to inject every week or so, which will be much easier for me and my wonky fucking brain to keep up, and it's not like the injection is gonna fall out. The only real downside to injections is that you have to stick yourself with a needle, but I'm nowhere near as squeamish about that as you probably are if you're seriously considering pills after learning all that. -So that's what I want: Injection monotherapy. There's a couple different varieties of the injectable juice, and I have Opinions about which one is preferable, but it's kind of immaterial because based on my research only estradiol valerate is readily available in Alberta, so that's what I'm shooting for. +So that's what I want: Injection monotherapy. There's a couple different varieties of the injectable juice, and I have Opinions about which one is preferable, but it's kind of immaterial because based on my research only estradiol valerate is available through pharmaceutical sources in Alberta, so that's what I'm shooting for. + +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/nerd.png" alt="me looking like some kinda fuckin nerd"> + </div> + <div class="aside-content"> + <p>If it's an option for you, estradiol enanthate is the ideal choice because it lasts a bit longer in the body and provides more stable levels, but it's really not a huge deal.</p> + </div> +</aside> I'm absolutely *not* an authority on this, by the way. As eagle-eyed readers, or just eyed readers, or readers with a functional screen reader know, I'm not a medical professional nor do I have any firsthand experience with any of these drugs as of writing. If you want more information from someone who knows her shit about this, [pghrt.diy](https://pghrt.diy) is a good resource for actionable information on this topic. -## Actually getting the shit +# Actually getting the shit -HRT availability here in Canadian Texas is a bit of a mixed bag. Any GP can technically prescribe it through informed consent, but most of them don't feel comfortable doing that and will instead refer you to a provincial clinic with a 2+ year waitlist. There's a couple of doctors in my area who seem to be pretty cool about this, but they're also hard to get in to actually see, with referral requirements and lengthy waitlists of their own. This sucks, and if it was my only option I'd be strongly considering DIY HRT right about now. +HRT availability here in Canadian Texas is a bit of a mixed bag. Any GP can technically prescribe it through informed consent, but most of them don't feel comfortable doing that and will instead refer you to a provincial clinic with a 2+ year waitlist. There's a <span class="askme">couple of doctors</span> in my area who seem to be pretty cool about this, but they're also hard to get in to actually see, with referral requirements and lengthy waitlists of their own. This sucks, and if it was my only option I'd be strongly considering DIY HRT right about now. -Speaking of, I'm also not inclined to default to DIY, for a couple reasons. It seems like the drugs themselves are pretty safe if you know where to look, and I do, but I'd like to be able to get blood work done as part of this process, and I'm not sure how that would go in this context. Plus, availability seems limited from suppliers inside Canada, and I'm iffy on importing because I don't want my grey market drugs to be seized by customs. +Speaking of, I'm also not inclined to default to DIY, for a couple reasons. It seems like the drugs themselves are pretty safe if you know where to look, <span class="askme">and I do</span>, but I'd like to be able to get blood work done as part of this process, and I'm not sure how that would go in this context. Plus, availability seems limited from suppliers inside Canada, and I'm iffy on importing because I don't want my grey market drugs to be seized by customs. Luckily, I have other above-board options. My research into this topic led me to a private telehealth clinic called [Foria Clinic](https://www.foriaclinic.com/) whose main deal is prescribing HRT to trans people through informed consent, that's also covered under provincial healthcare so I can see them for free. Awesome! Unfortunately, the catch to that last part is that they have an extremely limited number of bookings per month. They distribute them on a "buying an RTX 3080 on launch day" type model, meaning on my first try booking with them I had about a 3 minute window to get the form filled out, and I wasn't fast enough. Unfortunate, but I can always try again if plan B falls through. -### Plan B +## Plan B -In the meantime, I started on plan B: There's a nonprofit out of Calgary called [Skipping Stone](https://www.skippingstone.ca/) that offers a bunch of different resources for trans Albertans (seriously, check them out) but relevant here is that they can refer you to a trans-friendly doctor to get a prescription. After dropping the ball on plan A, I filled out a form on their website to book what they call an intake appointment, and a week later I was on a video call with a very nice lady who took me through a questionnaire about my circumstances and needs and referred me to one Dr. Wang in Canmore. Luckily, this doctor was willing to also do telehealth as I don't live in Canmore. Unluckily, she apparently had a four month waitlist. Still, that's a damn sight better than two years or more. +In the meantime, I started on plan B: There's a nonprofit out of Calgary called [Skipping Stone](https://www.skippingstone.ca/) that offers a bunch of different resources for trans Albertans (seriously, check them out) but relevant here is that they can refer you to a trans-friendly doctor to get a prescription. After dropping the ball on plan A, I filled out a form on their website to book what they call an intake appointment, and a week later I was on a video call with a very nice lady who took me through a questionnaire about my circumstances and needs and referred me to one <span class="askme">Dr. W</span> in Canmore. Luckily, this doctor was willing to also do remote (not telehealth though. Just over the phone) as I don't live in Canmore. Unluckily, she allegedly had a four month waitlist. Still, that's a damn sight better than two years or more. -Oh, what's that? Sorry, bit of a mix-up there. Turns out I actually need to do something called a "readiness assessment" before I can see this particular doctor. On first blush that sounds to me like some pathologizing gatekeepy bullshit, but the person I'll be talking to has their pronouns listed as "they/she" on the release form, so hopefully it shouldn't be *too* bad. +Oh, what's that? Sorry, bit of a mix-up there. Turns out I actually need to do something called a "readiness assessment" before I can see this particular doctor. On first blush that sounds to me like some pathologizing gatekeepy bullshit, but the <span class="askme">person</span> I'll be talking to has their pronouns listed as "they/she" on the release form, so hopefully it shouldn't be *too* bad. So, I like to draft these project logs as they happen to get everything down while it's fresh in my mind, and that last paragraph was written immediately after I got the email with that information, with the intent to try to convey how I felt finding this out. +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/angy.png" alt="me, angry"> + </div> + <div class="aside-content"> + <p>HRT should be over the counter, change my mind.</p> + </div> +</aside> + Anyway, soon after learning this information I got an email from this new person to set up an appointment, and then had to email them to get them to fix (or un-fix, I suppose) my name on the release form *they* sent me — they had entered "Ada" in the field where I'd been putting my *legal* name, which is presently something else, as opposed to the preferred name field, and legal name was one of three fields I wasn't allowed to edit — so that was fun. Especially since the response I got was to the effect that it literally did not matter. -I also got a voicemail that day from the office of Dr. Wang to book the appointment I apparently hadn't yet jumped through all the hoops for, and then took like a week to get back to them because of how tight their phone hours are — I wound up calling them back sitting in my now-reparied Subaru in the campus parking structure before class. I was greeted by another very nice lady who went out of her way to call me Ada even after I opened by giving her my deadname to look up in the computer, and then told me there was no availability at present and to maybe call their sister clinic, which Dr. Wang apparently also works at, to see if they tell me something different. Calling the other clinic, I got effectively the same information but this receptionist promised to reach out the next time there was an opening. A couple hours later, the receptionist from the first clinic called me back and told me she was able to squeeze me in about 2 months out in December. +I also got a voicemail that day from the office of Dr. W to book the appointment I apparently hadn't yet jumped through all the hoops for, and then took like a week to get back to them because of how tight their phone hours are — I wound up calling them back sitting in my now-repaired Subaru in the campus parking structure before class. I was greeted by another very nice lady who went out of her way to call me Ada even after I opened by giving her my deadname to look up in the computer, and then told me there was no availability at present and to maybe call their sister clinic, which Dr. W apparently also works at, to see if they tell me something different. Calling the other clinic, I got effectively the same information but this receptionist promised to reach out the next time there was an opening. A couple hours later, the receptionist from the first clinic called me back and told me she was able to squeeze me in about 2 months out in December. So we're down from 4 months to 2. That's not half bad by the standards of most doctors in this country. Although, it seems plausible at this point that how this is gonna go down is that I'll have an initial meeting with this doctor, she'll order some blood work, and then I'll see her again to get a prescription, which at a two month wait per appointment would get us back to four months, so maybe that's what the woman from Skipping Stone meant by four months. -With all that admin done, the next step was that readiness assessment thing. This was the only thing I had planned on Halloween, which is fine 'cause it was plenty scary, at least in the 10 minutes leading up the appointment. In reality, I was largely sketched out for nothing. The therapist I talked to was very nice, and they made it clear that their intent was not to try to tell me what to do with my body. The appointment itself lasted about an hour and a half and consisted of a questions about my mental and physical health, my history with regards to gender, what I was hoping to get out of this process and, importantly, what kind of regimen I wanted. She also went over the risks and effects of estrogen and what getting gender affirming care looks like here to make sure my expectations were in line with reality, which they were, because I looked the fuck into this before getting this far. +With all that admin done, the next step was that readiness assessment thing. This was the only thing I had planned on Halloween, which is fine 'cause it was plenty scary, at least in the 10 minutes leading up the appointment. In reality, I was largely sketched out for nothing. The therapist I talked to was very nice, and they made it clear that their intent was not to try to tell me what to do with my body. The appointment itself lasted about an hour and a half and consisted of questions about my mental and physical health, my history with regards to gender, what I was hoping to get out of this process and, importantly, what kind of regimen I wanted. She also went over the risks and effects of estrogen and what getting gender affirming care looks like here to make sure my expectations were in line with reality, which they were, because I looked the fuck into this before getting this far. -The end goal here was to compile all this information into a letter to send to Dr. Wang prior to me meeting with her, so she would know all that and, presumably, be able to skip directly to the part that actually requires a doctorate in medicine. It's also important to note that this appointment would have cost me $300 if I hadn't gone through Skipping Stone, who paid for it as part of their service. Genuinely can't recommend them enough. +The end goal here was to compile all this information into a letter to send to Dr. W prior to me meeting with her, so she would know all that and, presumably, be able to skip directly to the part that actually requires a doctorate in medicine. It's also important to note that this appointment would have cost me $300 if I hadn't gone through Skipping Stone, who paid for it as part of their service. Genuinely can't recommend them enough. At this point, it's been just over three weeks since I first filled out an online form to this end, and I'm officially past everything that landing an appointment with Foria would have let me skip. From what I saw on that booking form, Foria was booking about a month out, so I'm actually not doing too bad for time from first attempt at booking until seeing a doctor compared to if I had just waited until the next opening there and landed a booking then. Your mileage may vary, though. At any rate, I'm probably not gonna try again with Foria unless this falls through. I'm kind of in for a pound at this point. -### Plan B Part 2 +## Plan B Part 2 + +As I write this paragraph it's currently the last few hours before my initial appointment with Dr. W. I am extremely nervous, but I've also been nervous for the last two appointments and they went pretty well, and the lady from appointment #2 seems to think this doctor is pretty nice, so on a logical level I'm not too worried. That said, given how extensive that interview was I'm not sure exactly what's left to expect from this appointment. Will report back after the paragraph break. + +I was scheduled for my appointment at 9AM. After 9AM came and went with no activity, I promptly called the doctor's office, to then be told she would call me. Good to know. Not 15 minutes later I received this call, and I'd say it went... ok. + +It became clear pretty quick that I was right to think we'd have little new to discuss. Dr. W asked me a bunch of questions and gave me a bunch of info that I'd largely already gone over during the readiness assessment — stuff about my medical history and status, stuff about my place with regards to public presentation and out-ness, going over my options and preferences for meds, and some other stuff. It kind of felt like she didn't bother to read that letter that readiness assessment lady had worked so hard to prepare. Then again, neither did I, so I don't know what was actually in it. + +In terms of action items, things are picking up again from here. The doc promised to send me the relevant forms in short order, and we booked a follow-up for early January, not even a month out. Nice! She was open to doing injections, and was of the opinion that method of administration is largely a matter of preference, except that pills might be a worse idea for me in particular because my higher BMI might exacerbate the cardiac risks. I'm paraphrasing there, but she did use the term "BMI". So, yeah. + +She did express intent to put me on blockers as well, which isn't *fantastic*, but I suppose it won't *hurt* results-wise. She mentioned both blocker options, which was nice to see, but she leaned towards spiro, and cited cost as a factor. She also mentioned that it can lower your blood pressure, which admittedly wouldn't necessarily be an issue in my case, and that it can cause some lightheadedness. Interesting. We'll see how it goes, I guess. I'd have brought up monotherapy, but she had already implied she wasn't open to that idea, and despite having quite substantially more balls than I'd like I truly have no balls. + +All told, the call was over inside 40 minutes. It didn't go perfect, but it could have gone a *lot* worse. I think Dr. W was operating on some misconceptions slash outdated information, namely that she seemed to think blockers were a hard requirement, which based on what I've read they usually aren't, and that she told me to take my follow-up blood tests midway between the doses. From what I understand you actually want to test at trough, like hours before your next shot, to get the most useful data, but [some graphs I've seen](https://estrannai.se/) seem to indicate that your levels at the midway point should be around twice what they are at trough if you're using estradiol valerate, so in my mind it shouldn't be *totally* worthless data if you know what you're doing. In other words, it's a total crapshoot whether my doctor will use this data correctly. + +Unfortunately, this level of competence is pretty much par for the course for doctors, especially in the context of trans healthcare. Even among doctors who will prescribe this stuff at all, most don't actually know what they're talking about to the same extent as any random tgirl who's on these drugs, and an unfortunate amount of them will underprescribe on purpose in hopes you're not actually trans and will stop before you do too much "damage". Given how much the ladies from Skipping Stone and the readiness assessment seemed to like this doctor, and how rife this whole fuckin' field is with false information, I'll wait to chalk it up to intentional malpractice until she hits me with the [1mg E 50mg spiro](https://www.tumblr.com/isopodhours/803879149642088448). + +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/notamused.png" alt="me looking decidedly unamused"> + </div> + <div class="aside-content"> + <p>It occurs to me that I called this woman "knowledgable" towards the beginning there. That is something that we in the business like to call a "relative term".</p> + </div> +</aside> + +Anyway, 5 hours after the appointment was over I got an informed consent form to sign as well as the blood work requisition through Pomelo, which, by the way, is the second online medical portal I've had to sign up for, the other being Jane, which the other two places used. + +I was perhaps irrationally anxious about getting my blood drawn. I was worried that the nurse would look at my form, be able to tell I was trans by looking at the tests I was getting, and then get judgy or bigoted or something. Fortunately, that didn't happen. If she noticed, she didn't say anything, and she was actually pretty nice. + +For those who, like me, have never gotten blood work done before, here's what the whole process was like: + +I walked into <span class="askme">some random Dynalife/Alberta Precision Labs branch</span> without an appointment, handed my form to the receptionist, and after she was done with it, she gave it back to me and told me to take a seat. The alleged wait time was 25 minutes, but I definitely didn't end up waiting that long before I was called. + +First, I was asked for the requisition form and my Alberta Health Card, and given back the latter. Once she was done punching my deets into the computer, the nurse put a tourniquet on my arm, had me make a fist, and started feeling around for a vein in the inside of my elbow (also known as my cubital fossa, antecubital fossa, or wagina). In my case, she ended up having to check both arms. Once she found one, she stuck a needle in, filled three roughly finger-sized vials with my blood, and then had me apply pressure to the area while she prepared a bandage. + +On the way out, the nurse told me to leave the bandage on for at least 5 minutes and not lift anything heavy for 2 hours. Nice to note is that I didn't pay a red cent while there, except if you count the jumper cables I had to buy at the nearby [big-box store] because my car didn't want to start and neither I nor the very nice man who offered to help me had any, but you hopefully won't have to do that. Funny enough, that guy was the first and only man I dealt with as part of this entire process. + +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/frozen.png" alt="me encased in a photorealistic ice cube"> + </div> + <div class="aside-content"> + <p>Kids, get a jump pack if winter routinely gets below -20°C where you're at, especially if your car's battery kinda sucks. Here's a <a href="https://www.youtube.com/watch?v=AXXuWL3l5qo">video</a> on some good ones if you're so inclined.</p> + <p>Narration: She would go on to replace her car's battery soon after this.</p> + </div> +</aside> + +Also, one of the ever-dwindling number of ways in which Alberta's public healthcare isn't total dog ass is that there's a website you can visit to view your blood test results called MyChart. It's pretty epic. + +<figure class="media"> + <img src="epic.png" alt='Icon in the top right of the MyChart interface that says "MyChart is Epic".'> + <figcaption>This is real.</figcaption> +</figure> + +From this, I learned that my red blood cells are apparently a bit on the small side. Should I be feeling gender dysphoria or euphoria about that? I also learned that my baseline testosterone levels are pretty low — it actually registered as *abnormally* low, at 6.6 nmol/L where the normal range is from 8 to 35. Definitely filing that one under sources of gender *eu*phoria. Dr. Google says both of these things can be symptoms of an iron deficiency, which honestly wouldn't surprise me given my family history, but that's neither here nor there. Moving on. + +Appointment #2 with Dr W. was a lot more low-stress than the first, and went a lot faster. She touched on a couple basic points, like the irriversible effects and the combination of meds she was to prescribe me, and which pharmacy to send the prescription to, and then we scheduled a follow-up another two months out and she told me to get another blood test a week before then, and to take a blood pressure reading before starting the meds. All told, the call lasted about 11 minutes. + +## Acquisition + +I've had a few moments in this process where the realization that this is Actually Happening hit me like a distracted driver in a Dodge Ram 1500, and I had one about here, a couple hours after the appointment, when I got a text from my pharmacy about my `new Rx beginning with SPIR`, and then again when they called me to ask what to do about the estrogen prescription. + +See, actually filling a prescription for injectable estrogen seems to be kind of a complicated process. As I understand it, not just any pharmacy can do it, it needs to be made to order at a compounding pharmacy, which the <span class="askme">random Shoppers Drug Mart</span> I've been using so far is not. They can, however, order it from a facility that is equipped to make it so I can pick it up with the rest of my meds. + +They called me to ask if I wanted them to do that, which would apparently require them to get back to me with a price quote, or if I'd rather them send the prescription to a compounding pharmacy of my choosing to be picked up there. I told them to do the former, and they called me back to tell me I was looking at in the ballpark of $80 for a 2<span style="filter: blur(.25rem);">ml</span> vial, or circa $7 after my <span class="askme">coverage</span>. That's pretty coolWait what was that? + +At this point I'm hoping I misheard over my spotty as fuck phone connection because I could swear the lady from the pharmacy just said I was getting a 2mg vial that was supposed to last me a month at 0.5mg per week. My speech processing and short-term memory aren't exactly world class, so it's possible she said milli*litres* and not milli*grams*. Or maybe she just misspoke. + +2ml would be pretty reasonable, if a bit of a small supply (you can get vials of this stuff that'll last you over a year), but 2mg over a *month* would be an absurdly, criminally low dose based on everything I've read on the subject. Although, even at the lowest common concentration of 5mg/ml that would be an impossibly tiny vial. + +<figure class="media"> + <img src="bananaforscale.webp" alt="Close up Blender render of a banana with a 0.4ml vial next to it. The vial is dwarfed by the banana to a comical degree. There's a bright red circle and arrow highlighting the diminutive vial for clarity."> +</figure> + +Two days after the appointment, I got a call from the pharmacy saying my prescription would be ready for pickup soon. Then I got a text from them saying it was ready. Then they called me again to say it was ready. I don't think I've ever gotten as many phone calls from my pharmacy as I have in the past couple days. + +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/fear.png" alt="me, afraid"> + </div> + <div class="aside-content"> + <p>Now all I have to do is... go to a pharmacy. In person. And interact face to face with a stranger who knows <em>exactly</em> what I'm up to. Oh god.</p> + </div> +</aside> + +Luckily for me, everyone I interacted with from the pharmacy was very nice to me. Both the secretary on the phone and the pharmacist were careful not to mention the estrogen by name (the lady over the phone kept calling it my "compound"), which I'm choosing to interpret as an attempt to not inadvertently out me to anyone who might overhear. + +It turns out I actually might be going crazy, because the pharmacist handed me a 2 milli*litre* vial containing 20mg of the good stuff, for a dose of 5mg/week, which is perfectly sensible, if a tiny bit on the low side thereof. It came in a green plastic bottle, which I'm assuming is tinted like that to protect it from light, which is important according to the label on the vial. They also gave me a bottle of 45 100mg spiro pills, which it says to take one half of once daily. In other words, a 3 months' supply at 50mg/day. According to the prescription receipts I got with the meds, I would have paid $76.35 for the estradiol and $16.89 for the spiro without any coverage. + +Interestingly, the info sheet that came with the spiro said it was a "potassium-sparing diuretic" and made no direct mention of its use as an androgen blocker, save for saying that it "may have other uses" and may rarely cause breast development in men. + +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/yay.png" alt="me, joyful"> + </div> + <div class="aside-content"> + <p><em>holy fuck I have estrogen now. holy shit. oh my god</em></p> + </div> +</aside> + +# Administration + +## Supplies + +Before I left the pharmacy, I asked the pharmacist about needles, and she gave me 5 each of syringes, 21g needles for drawing, and 23g needles for injecting, all for a grand total of $4.50. Nice! I'm not super squeamish about needles, but that's pretty big for this based on my research. I was then so flustered about that whole experience that I forgot to get the rest of the injection supplies and stuff I needed, so I had to go back for that. + +I was hoping not to bother getting injection supplies at the pharmacy, but the kit I ordered from Skipping Stone hadn't arrived yet. Oh, yeah, remember Skipping Stone from before? Turns out you can order injection supplies from them on a pay-what-you can basis, meaning your choice of anywhere from $15 to free if you can pick it up yourself, but it's an extra $15 for shipping if you can't. More on that in a bit. + +I also bought a device to take the blood pressure readings I was supposed to get. This cost me almost $90, but it wasn't a necessary expense. Most, possibly all, Shoppers Drug Marts have a kiosk that can take a blood pressure reading. As far as I know, this service is free of charge, although I haven't personally used it. + +### Needle update, 2026/02/02 + +I got the injection supplies from Skipping Stone, and I have some thoughts. Firstly, I like the injecting needles they give you, although they take a bit more patience. The drawing needles, however, are a bit big for my taste at 18g. At that size I'd be seriously concerned about coring (that's when you take a chunk out of the rubber sealing the top and it falls in the liquid, ruining it) and I don't think I'll be using them. They give you 3ml syringes, which might be useful for you if you're injecting a *lot* for some reason, but I would get a closer size to my dose, such as the 1ml syringes I got from Shoppers, for the sake of precision. + +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/notamused.png" alt="me looking decidedly unamused"> + </div> + <div class="aside-content"> + <p>Also worth noting is that when I ordered my second vial immediately after finishing the first, the pharmacy called me back to tell me they would only refill it every 28 days, so if you core a vial you may be SOL until whenever it would normally have run out.</p> + </div> +</aside> + +Also, Skipping Stone puts their logo on the packaging for their injection kits. Something to keep in mind if you're ordering from them online. If you can pick it up in person, it's still worth it just for the free sharps bin, swabs, and bandages, and obviously it's worlds better than nothing if you're hard up for cash, but otherwise, those things are pretty cheap anyway — your pharmacy probably has bandages and swabs, and sharps bins can be bought online. I probably won't be getting another one of the Skipping Stone kits. + +Some more research has led me to [medneedles.ca](https://medneedles.ca/), which seems like a good source for this sort of thing if you can stomach the upfront cost of buying in bulk — $85 after shipping for almost two years' worth of 1ml syringes and basic needles, though you can also spring for some fancy safety needles. I settled on 22g 1 1/2" for drawing, and 25g 5/8" for injecting. + +## Doing it + +All that's left now is to actually inject the stuff. I procrastinated on this for a good few hours — I was, understandably, a little freaked out at this point, partially because I've never injected myself with anything before, and partially because I was literally moments away from having started HRT, which is *kind of a big deal*. + +No point in stalling, though. I followed [this guide](https://static1.squarespace.com/static/60ee033370020a6b1c4f8fe9/t/617830489e4ac05bd9eb709a/1635266636876/Testosterone+Shots.pdf) from Skipping Stone, which exclusively mentiones testosterone injections, but I can't think of a single reason it would be different for estrogen. The process of drawing it was more complex than I was expecting, and I was worried I'd core the thing with the needle, but that doesn't seem to have happened. + +The injection itself could not have been simpler, and it really didn't live up to the hype (read: anxiety). Even with a somewhat large needle, handled by some dumbass who's never done this before in her life, I barely felt it going in. It was almost exactly like every vaccine I've ever gotten, save that it went in my abdomen and I was the one holding the syringe. Although it's not like my heart wasn't pounding the entire time. + +A couple hours later I realized I had somehow managed to inject .2ml instead of the .5ml I was supposed to. Whoops. My solution to this discrepancy was to immediately go and inject the other .3ml, on the other side this time since you're supposed to alternate injection sites. Not sure if that's what you're supposed to do in this situation, but I can think of no alternative courses of action nor compelling reasons not to do that. I don't know how I managed to mess that up, but I will say the second go was a lot less stressful. + +As for the spiro, well, it's a pill. You've probably taken a pill before. The pill cutter I ordered hasn't arrived yet, so I cut it in half with a butter knife. This went perfectly fine the first time but isn't super consistent in not crushing the pill into dust. I'm waiting with bated breath to see what the side effects are like in my case. + +# Final Overview + +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/yay.png" alt="me, joyful"> + </div> + <div class="aside-content"> + <p><strong><em>holy shit holy shit holy shit holy shit</em></strong></p> + </div> +</aside> + +So, uh, that was that. I'm officially on estrogen now. This is fucking surreal. I am, to say the least, very excited. Put bluntly, I can't wait to have boobs. I'm also very nervous, primarily because I haven't told my family I'm doing this yet, and at some point, I suspect before 2027, I'm either gonna tell them or they're gonna notice the changes and I'm gonna have to explain it. I know they'll be supportive — they've known I've got *some* kinda gender shit going on for a while — but that doesn't make telling them about something like this any easier. Honestly, it might be funny to just not say anything and see how long it takes them to notice. + +All in all, it took me just over 3 months from submitting the Skipping Stone intake booking form on October 7th to injecting my first dose of estradiol on January 10th, less time than I was expecting (and less than I was told to expect). Not counting picking up the medication, I had to meet with a professional on five different occasions, only one of which, the blood draw, was in person, and only one of which, also the blood draw, didn't have to be booked beforehand. + +For your convenience, I've included complete breakdowns of all the up-front costs I incurred to get the first dose of estrogen into my body, the ongoing costs I'm expecting, and what you should probably expect those costs to look like with my same doses and without any kind of coverage. + +<div class="tablecontainer"> + <table summary="Total amount of money I paid to get my first dose of HRT into my body: $169.06. Total amount you should probably plan on paying: $108.24."> + <caption>Total up-front cost</caption> + <thead> + <tr> + <th scope="column">item</th> + <th scope="column">what i paid</th> + <th scope="column">what you should plan to pay</th> + </tr> + </thead> + <tbody> + <tr> + <td>Skipping Stone intake</td> + <td colspan="2">$0.00</td> + </tr> + <tr> + <td>Readiness assessment</td> + <td colspan="2"><span style="text-decoration: line-through">$300</span> $0.00</td> + </tr> + <tr> + <td>Initial appointment with doctor</td> + <td colspan="2">$0.00</td> + </tr> + <tr> + <td>Initial blood work</td> + <td colspan="2">$0.00</td> + </tr> + <tr> + <td>Jumper cables</td> + <td>$15.73</td> + <td>N/A if you're not foolish</td> + </tr> + <tr> + <td>Second appointment with doctor</td> + <td colspan="2">$0.00</td> + </tr> + <tr> + <td>Estradiol Valerate (20mg/1mo supply)</td> + <td>$7.64</td> + <td>$76.35</td> + </tr> + <tr> + <td>Sprionolactone (3mo supply)</td> + <td>$12.62</td> + <td>$16.89</td> + </tr> + <tr> + <td>Blood pressure cuff</td> + <td>$87.99</td> + <td rowspan="3">Don't bother</td> + </tr> + <tr> + <td>Injection supplies (12 shots) (Skipping Stone)</td> + <td>$30</td> + </tr> + <tr> + <td>Needles/syringes (5 shots) (Shoppers)</td> + <td>$4.50</td> + </tr> + <tr> + <td>100x Alcohol swabs (Shoppers)</td> + <td colspan="2">$3.59</td> + </tr> + <tr> + <td>50x Bandages (Shoppers)</td> + <td colspan="2">$6.99</td> + </tr> + <tr> + <td>100x injecting needles (Medneedles)</td> + <td rowspan="5">I didn't do this part</td> + <td>$7.99</td> + </tr> + <tr> + <td>100x drawing needles (Medneedles)</td> + <td>$8.99</td> + </tr> + <tr> + <td>100x syringes (Medneedles)</td> + <td>$43.99</td> + </tr> + <tr> + <td>Shipping & Taxes (Medneedles)</td> + <td>$24.05</td> + </tr> + <tr> + <td>Sharps bin (Amazon)</td> + <td>Like $15</td> + </tr> + <tr style="font-weight: bold;"> + <td>Grand Total</td> + <td>$169.06</td> + <td>$203.84</td> + </tr> + </tbody> + </table> +</div> + +<div class="tablecontainer"> + <table summary="Total ongoing costs of my regimen by my estimation: $21.84 per month. Total amount you should probably plan on paying: $86.98 per month."> + <caption>Total ongoing cost, averaged</caption> + <thead> + <tr> + <th scope="column" rowspan="2">item</th> + <th scope="column" colspan="2">what i'm paying</th> + <th scope="column" colspan="2">what you should plan to pay</th> + </tr> + <tr> + <th scope="column">monthly</th> + <th scope="column">yearly</th> + <th scope="column">monthly</th> + <th scope="column">yearly</th> + </tr> + </thead> + <tbody> + <tr> + <td>Estradiol Valerate (5mg/wk)</td> + <td>$8.30</td> + <td>$99.59</td> + <td>$82.94</td> + <td>$995.28</td> + </tr> + <tr> + <td>Spironolactone (50mg/day)</td> + <td>$4.27</td> + <td>$51.18</td> + <td>$5.71</td> + <td>$68.50</td> + </tr> + <tr> + <td>Swabs & Bandages (Shoppers)</td> + <td>$0.92</td> + <td>$11.00</td> + <td>$0.92</td> + <td>$11.00</td> + </tr> + <tr> + <td>Syringes & Needles (Medneedles)</td> + <td>$3.86</td> + <td>$44.21</td> + <td>$3.86</td> + <td>$44.21</td> + </tr> + <tr style="font-weight: bold;"> + <td>Grand Total</td> + <td>$17.17</td> + <td>$205.98</td> + <td>$93.25</td> + <td>$1118.99</td> + </tr> + </tbody> + </table> +</div> + +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/fear.png" alt="me, afraid"> + </div> + <div class="aside-content"> + <p>Running the numbers on that "yearly" column really puts into perspective how expensive this can be.</p> + </div> +</aside> + +This post is going up the day I start hormones, so the timestamp on here is my HRT anniversary, as it were. Expect an update some time down the road in the form of an addendum to this post or a whole new one. + +Finally, for posterity, under the fold is a photo of me circa 20 minutes on E. You don't have to look at it if you don't want to. -I plan to post this the day I start hormones, so the timestamp on here is my HRT anniversary, as it were. Expect an update some time down the road in the form of an addendum to this post or a whole new one.
\ No newline at end of file +<details> + <summary>My ugly ass</summary> + <figure class="media"> + <img src="20minuteshrt.webp" alt="My real human body photographed in a full-height mirror. White, tall, chubby, and vastly more masculine than I'd like. I'm wearing boxer shorts and socks. My face is censored using a whimsical photo edit I made of an isopod with cat ears and matching tail. Visible on my belly is a tiny bandage covering the injection site."> + <figcaption>That's my bed behind me. It's holding up great, by the way. Although, installing threaded inserts at an angle was a mistake I won't be repeating.</figcaption> + </figure> +</details>
\ No newline at end of file diff --git a/blog/posts/building_a_normal_server/index.md b/blog/posts/building_a_normal_server/index.md index c455814..621ceeb 100644 --- a/blog/posts/building_a_normal_server/index.md +++ b/blog/posts/building_a_normal_server/index.md @@ -1,12 +1,12 @@ I spent the past few months making full use of all my physical engineering talents to build a NAS that is completely normal, and not weird at all, and involved an amount of 3D modeling, 3D printing, and hacksawing that is entirely typical of most home computer builds, all in the name of reusing an old laptop. -## The Goal +# The Goal My previous daily driver computer and current home server is a mid-range gaming laptop from late 2019 that, due to a flat lithium battery and a broken trackpad resulting from a botched storage upgrade, has been rendered more or less useless as an actual portable computer. Boasting an Intel i7-9750H, an Nvidia GTX 1660-Ti, and 16 gigabytes of aftermarket DDR4, this baby has plenty enough power to play Elite Dangerous at a buttery smooth ~90FPS, while generating enough heat to add that extra layer of immersion while flying dangerously close to main-sequence stars to harvest hydrogen from their outer atmospheres. It's also good for Minecraft servers. Now that it's in use as a home server, I find that the in-built 256 gigs of solid-state storage isn't really enough for my purposes. Now, it's plenty for one or two game servers, which is what I was using it for, but most other applications such as backups or media servers (which I would quite like to have) would be a bit stifled by that amount of space. Hence, a significant storage upgrade is in order. -## The Method +# The Method There's a few ways I could go about this. My laptop actually has a decent amount of upgradeability, with a full-sized NVMe drive slot and a 2.5" SATA drive bay. The simplest, least janky, and most boring solution here would be to buy two high-capacity SSDs, throw 'em in there and be done. @@ -16,17 +16,19 @@ Next option: USB external drives. External HDD solutions such as the WD MyBook a Issue the first with this idea is that these hard drives take more power in a weirder voltage configuration than a USB port is equipped to deliver, so unless I want to teach myself electrical engineering each one will require its own power cable, which after the first drive gets sketchy fast: - +<figure class="media"> + <img src="media/power_spaghet.png" alt="Hooking up three hard drives with this configuration means a whopping FOUR power cables for one server. Unacceptable."> +</figure> Issue the second is that USB is just not the right tool for the job here. USB is designed for hot-plugging peripherals, not semi-permanent internal aspects of a hardware configuration, so trying to pull any fancy shit like RAID or even just relying on all the drives being *recognized* every boot opens the door to all sorts of weird, unfixable problems. In other words, it's very janky, and I'd rather just not deal with all that. Of course, the reasonable way to build a NAS would be to get a machine that's actually fit for that purpose, like an off-the-shelf NAS box or a custom computer in a case with a lot of drive bays or something. I'd also rather not do this. I mean, I already have all this perfectly good computing power right here! I can't just let it go to waste. What I actually did is as follows: -## The Madness +# The Madness I decided to buy internal PC hard drives and hook them up to the laptop using internal connectors. This would avoid the reliability concerns of USB, and allow me to use off-the-shelf components to power all the drives off of one AC outlet, at a much cheaper price per terabyte than either of the above options. Given most laptops aren't really equipped with the requisite hardware to make such an upgrade, this presented three major problems that I was about to have a lot of fun solving. -### Problem the First: Data Connections +## Problem the First: Data Connections Generally, adding internal HDDs to a computer requires the use of an internal SATA connector. My laptop has one, and I will be using it, but I'd quite like to have more than one of these drives, both for redundancy and raw capacity, so I need a way to add more. In a desktop PC, such expansion would typically be done using a spare PCIe slot on the motherboard: @@ -65,7 +67,7 @@ This feels a little like forbidden dark magics to me, and it probably isn't grea Don't mind the fact that I had to cut holes in the bottom of my laptop to hook stuff up to the SATA ports. Just, um, ignore that. -### Problem the Second: Powering All This Crap +## Problem the Second: Powering All This Crap Now that I've got my laptop *talking* to all these drives, they need power. I'm sure I could get this from the laptop somehow, but I'm not an electrical engineer, and the point of this project is to *not* have to buy a new computer, so I'll have to get it from elsewhere. @@ -102,7 +104,7 @@ And furthermore, photos of the SATA splitter working: </picture> </div> -### Problem the Third: A Case +## Problem the Third: A Case I could run this whole setup naked, strewn out across my desk, but I'm not doing that, so I'll need a case. Unfortunately, they don't make computer cases designed for this use case. I shall have to build my own. @@ -145,11 +147,11 @@ I wanted to make some kind of fancy bespoke mount for the laptop, but that turne IT'S ALIIIIIVE!!! -## Software +# Software This post is mostly about my fucked up hardware, but I figured I should share my software setup too. It's TrueNAS. I went with it because it boasts a lot of fancy features and smooths out a lot of processes that I was intimidated by the idea of doing manually in the terminal. This is probably the most normal part of the build by far, and I think some of the jankiness of the hardware side has infected it. I tried to run Syncthing on it and it just... didn't take. I don't know how else to describe it. TrueNAS is pretty good though. -## Postmortem +# Postmortem As of writing, I've been running this thing for a couple months now, and it's been pretty good. I haven't done a lot with it yet beyond some basic backups and a Jellyfin server that I have yet to make accessible from outside my LAN, but it's been mostly reliable so far. It even survived a power outage once with no issue, though I'm currently looking into UPS solutions to make sure that doesn't happen again. All that isn't to say I'm completely happy with it, though. diff --git a/blog/posts/building_a_regular_bed/index.md b/blog/posts/building_a_regular_bed/index.md index 4c01dc5..20585f2 100644 --- a/blog/posts/building_a_regular_bed/index.md +++ b/blog/posts/building_a_regular_bed/index.md @@ -6,9 +6,9 @@ Besides that, I also elected not to keep my old bedframe after the move because Small content warning: I'm gonna be using exclusively US units for this project, because even though I'm not in the States, that's still how just about all construction products are sized in my bass-ackwards country and it's easier not to bother converting. -## My Grand Master Plan +# My Grand Master Plan -### #goals +## #goals 1. Obviously, this bedframe needs to accommodate the queen mattress I already have. I'm not opposed to switching to a narrower mattress to save even more floor space in theory, but a new mattress would cost about as much if not more than the materials for this whole project, so I'm not doing that. @@ -20,18 +20,16 @@ Small content warning: I'm gonna be using exclusively US units for this project, 5. The simpler, the better. I want this thing to have as few parts to break as I can manage, and require as little engineering effort on my part as possible. Nothing too fancy. No fuckin', like, motors or whatever the hell people on Youtube are doing with their clickbait ass loft bed builds. This ties into the sturdiness requirement to an extent, and I also need to actually be able to build the thing with my extremely limited woodworking experience. -### The general shape of it +## The general shape of it Rather than spend two paragraphs flailing around trying to describe the design I came up with with words, I just went and modeled the thing. <figure class="media"> - <div> - <div class="gallery"> - <img src="bed1.png" alt="Crude 3D render of a queen-sized loft bed, consisting of four large posts that span the full height of the bed joined together by thinner beams with generous diagonal bracing. There's also a headboard."> - <img src="bed2.png" alt="Another render of the same bed, but blown apart and with the mattress removed to show the parts that were hidden in the first render, such as the slats and center beam supporting the mattress and the bottom diagonal bracing on the two far sides. The posts have grooves cut into them to fit the cross beams."> - </div> - <figcaption style="margin-top: 0;">I should have made this anyway, but I'll admit the thing that finally motivated me to do it was having a visual aid to put here.</figcaption> + <div class="gallery"> + <img src="bed1.png" alt="Crude 3D render of a queen-sized loft bed, consisting of four large posts that span the full height of the bed joined together by thinner beams with generous diagonal bracing. There's also a headboard."> + <img src="bed2.png" alt="Another render of the same bed, but blown apart and with the mattress removed to show the parts that were hidden in the first render, such as the slats and center beam supporting the mattress and the bottom diagonal bracing on the two far sides. The posts have grooves cut into them to fit the cross beams."> </div> + <figcaption style="margin-top: 0;">I should have made this anyway, but I'll admit the thing that finally motivated me to do it was having a visual aid to put here.</figcaption> </figure> The legs are 6x6 posts, and the cross beams on the sides are 2x6's with the diagonal braces made of 2x4's. In other words, this thing is built like a deck. It's almost certainly overkill for a bed, but that's kinda the point. I'm not a structural engineer, I'm a hobbyist computer toucher with access to a circular saw and a cordless drill and next to no woodworking experience, so my preferred strategy is to way overbuild to compensate for my amateur-hour design. @@ -44,17 +42,13 @@ I've left the diagonal bracing off on two sides of the bottom for easier access, I don't have a very specific plan cosmetically at this point, which is probably good because there's frankly a snowball's chance in hell I actually execute it well if I had one. I do know I want it to look good with my existing grey bedding. Roughly, I want to leave the corner posts more or less alone visually, maybe stain them, and then either paint or stain the rest black. I'm not expecting this thing to be a looker per se, but I'm gonna do my best not to make it ugly. -## Gear Acquisition +# Gear Acquisition I was originally planning to buy another bedframe on Kijiji or similar and hack off the mattress support structure and headboard to reuse them, but before I could pull the trigger on that I was made aware of a feature of Da Big City called a "Habitat For Humanity ReStore". This turned out to be very helpful, because I got all that stuff for half the price I was gonna pay for a full bedframe to chop apart, and I found this great upholstered headboard! <figure class="media"> - <div> - <div class="gallery"> - <img src="h4h_haul.webp" alt="An upholstered headboard and its mounting hardware, a bundle of slats, and the support hardware for those slats sitting in my garage."> - </div> - <figcaption style="margin-top: 0;">Ignore those metal side rails. I bought those and then realized they're too short for a queen mattress. I'm probably just gonna use 2x2s or something instead.</figcaption> - </div> + <img src="h4h_haul.webp" alt="An upholstered headboard and its mounting hardware, a bundle of slats, and the support hardware for those slats sitting in my garage."> + <figcaption style="margin-top: 0;">Ignore those metal side rails. I bought those and then realized they're too short for a queen mattress. I'm probably just gonna use 2x2s or something instead.</figcaption> </figure> The IKEA center beam hooks onto a special bracket on each end. These weren't included, but as it turns out IKEA will just mail some to you free of charge if you ask nicely (fill out a form on their website). @@ -63,19 +57,15 @@ As you might reasonably expect, all the fasteners, various finishing goops, and/ I also ended up ordering a couple things online — just accessories, like a wall-mountable lamp and a panel mount power outlet. I tried to find that stuff in the hardware store, but all the ones they had were designed for installation in, like, the walls of your house, and I refuse to include mains electrical wiring in the scope of this project. -### My Wood +## My Wood The hardware store had all the sizes of board I wanted, but they only had the 4x4's and 6x6's in pressure-treated form — essentially, that means they've been chemically treated to resist rot for outdoor applications, especially in contact with the ground. Not only is this wholly unnecessary in any environment you'd put a mattress in, but the toxic chemicals used in the treatment process make this stuff kind of a bitch to work with. Or so I've read online. Fortunately, living in Da Big City came in clutch here once again, by providing me with a decent selection of actual real-life lumber yards that sold the big stupid beams I wanted in flavours other than poison. I'm not sure what exactly I was expecting from the process, but it was simpler than that. I walked up to the front desk, told them what sizes of lumber I needed, and they accepted my payment and had me take my car around back to load it up. Once again, my social anxiety has lied to me. It was at this point that I learned *exactly* how much lumber will fit in a late model Subaru Outback. <figure class="media"> - <div> - <div class="gallery"> - <img src="lumber_haul.webp" alt="The back of my car, a late model Subaru Outback, packed with 4 6x6's, 2 4x4's, and 7 2x4's. They're mostly crammed over the center console and atop the passenger seat. It's clearly near capacity for cargo of this form factor."> - </div> - <figcaption style="margin-top: 0;">I didn't think to take this photo until after I'd taken out the 2x6's, but this gives you the basic idea. I'm pissed that the front passenger seat in this car doesn't fold down, otherwise it would actually be pretty well suited to this.</figcaption> - </div> + <img src="lumber_haul.webp" alt="The back of my car, a late model Subaru Outback, packed with 4 6x6's, 2 4x4's, and 7 2x4's. They're mostly crammed over the center console and atop the passenger seat. It's clearly near capacity for cargo of this form factor."> + <figcaption style="margin-top: 0;">I didn't think to take this photo until after I'd taken out the 2x6's, but this gives you the basic idea. I'm pissed that the front passenger seat in this car doesn't fold down, otherwise it would actually be pretty well suited to this.</figcaption> </figure> They didn't actually have the 2x3's I wanted to use under the slats though. I had to get those from the hardware store. @@ -86,18 +76,14 @@ This isn't the end of the world, and in fact probably means I got these cheaper For finishing liquids, I initially went with two colours of this combination stain/polyurethane stuff, then did more research on it and saw such overwhelmingly negative sentiment from the Redditors that I was moved to return it and buy some real (if cheap) stain and some real poly. I went with oil-based for both, and the colours I went with were black and something called "puritan pine". I'll admit, if you're having any reaction to all that other than confusion, it probably means more to you than it does to me. If this was a Youtube video, this would be the bit where I start rattling off the dictionary definition of "foreshadowing" and cut halfway through the first sentence. -### Getting a "new" tool +## Getting a "new" tool There was precious little I could do on this project before I got those rough cut posts ready to work with, and it was readily apparent that my cheapo orbital sander was not up to the task, so I needed a new tool. Of course, in an ideal world I would be able to do that with a jointer and a thickness planer, but those two tools would eat up like, most of the money I have at the moment, even used, and I can't seem to find anywhere to rent them, so that's out. I also don't own a router nor have a large, perfectly flat workbench to build one of those massive surfacing jigs for one, so I guess the only real option left is a hand planer. My uncle, who recently did up a bedframe of his own, originally offered to lend me his, but that fell through since he couldn't give me his battery and none of mine are compatible. Instead, I found a listing on Kijiji for a lot of four power tools for 80 Metric Dollars, including a jigsaw, a moderately dirty belt sander, an impact wrench attachment for an air compressor, and the one I was interested in, this distinctly vintage looking electric hand planer. <figure class="media"> - <div> - <div class="gallery"> - <img src="planer.webp" alt="A dirty, old-looking corded electric hand planer with a beefy metal housing and no visible branding."> - </div> - </div> + <img src="planer.webp" alt="A dirty, old-looking corded electric hand planer with a beefy metal housing and no visible branding."> </figure> There's no visible branding on this device, but perusing image search results for "vintage eletric hand plane" led me to [this page](http://vintagemachinery.org/photoindex/detail.aspx?id=37904) on the appropriately old-looking vintagemachinery.org featuring an identical-looking unit apparently called a Model No. 1701 Type 1 Electric Planer from the Illinois-based Portable Electric Tools, Inc. Might I just say, very clever name, right up there with General Motors and Advanced Micro Devices. The page claims that it "looks like a heavy duty, well made tool", and I'm inclined to agree with that assessment. If you could feel the weight of this thing, I suspect you'd feel the same way. @@ -108,9 +94,9 @@ More immediately important to the usability of the tool was the fact that the cu Other than that, the thing seems to work fine, though I'm sure it's overdue just about every possible maintenance procedure. I will figure out what those are and attempt them when it breaks and not a moment sooner, she said foreshadowingly. -## Building the stupid thing +# Building the stupid thing -### Prep +## Prep The very first thing I did towards actually building the bed was cut the diagonal braces, long-side cross beams, supports for the slats, and the rungs for a heretofore undiscussed ladder. This was everything I knew for sure I could do without having to compare against any dimension of the as-yet-unassembled bed. Before I could do anything else, I had to get those rough sawn boards smoothed out. @@ -119,16 +105,14 @@ I'll admit it took me a while to do this. The planing process left a lot of arti I started out sanding with the orbital sander because that's what I had sandpaper for on hand, and got through about one and a half faces of one of the boards over the course of two-odd hours before giving up and just going and buying sandpaper for my aforementioned-briefly-in-passing new-to-me WEN Model 919 belt sander. This made the next two feet or so of sanding go much faster before it perished dramatically in a plume of smoke. <figure class="media"> - <div> - <div class="gallery"> - <video controls> - <source src="SMOKINHOT.webm" /> - In case the video didn't load, it's supposed to be a video of the belt sander emitting a plume of smoke from the motor housing. - </video> - <img src="RIP.webp" alt="My poor belt sander lays dead on my driveway, covered in fire extinguisher powder."> - </div> - <figcaption style="margin-top: 0;">It was worse than the video makes it look, and the video makes it look pretty bad. You might say, it's <em>cooked</em>.</figcaption> + <div class="gallery"> + <video controls> + <source src="SMOKINHOT.webm" /> + In case the video didn't load, it's supposed to be a video of the belt sander emitting a plume of smoke from the motor housing. + </video> + <img src="RIP.webp" alt="My poor belt sander lays dead on my driveway, covered in fire extinguisher powder."> </div> + <figcaption style="margin-top: 0;">It was worse than the video makes it look, and the video makes it look pretty bad. You might say, it's <em>cooked</em>.</figcaption> </figure> Not wanting to go back to the orbital sander, I did something that would throw a wrench into the cleanly deliniated sections I had going here: I went out and bought the cheapest belt sander at the hardware store, an $85 Ryobi that I got for half of that because it was open box. Wow! The reason for this, as I would soon discover, was that it failed to grip the belt while actually sanding, rendering it useless. After returning it for what I must assume is a second time, I finally caved and shelled out for a decent belt sander, and I think it may have been worth it. Even including the three trips to the hardware store, this was much faster than the orbital sander, which is not to say that it was fast. Watching woodworking videos on Youtube where they complain about sanding does *not* prepare you for the reality of how long sanding takes. @@ -137,7 +121,7 @@ Speaking of sketchy tools, I need to complain about the awful folding saw horses Having sanded the rough-cut posts to my satisfaction, it was immediately apparent that my pre-surfaced 2x4's were actually quite substantially rougher, so those had to be sanded down too. Not that it's a big deal, since all of the wood had to be sanded further anyway for staining and it's not like I'm gonna be knocking down much of significance with 180 grit or whatever. But that's later. -### What I would consider to be the "fun part" +## What I would consider to be the "fun part" Before sanding past 50 grit, I wanted to get all the rest of my cutting done. Most of this process is unremarkable, save for my darling 6x6's, which, much like yours truly, are much too thick to fit on the miter saw I'm using. Astute readers will at this point be thinking "wait, but didn't she specifically intend not to cut those?" and are correct in this assessment, but this is the point where I noticed another small wrinkle brought on by my decision to get these rough-cut: they're all slightly different lengths, and they're all too long. See, my ceiling is just slightly taller than 8 feet, such that a 6-inch-wide board that's exactly 8 feet long could comfortably be stood up inside. If I tried to do that with these boards in their initial state, they would take differently sized chunks out of the drywall in my bizarre pseudo-popcorn ceiling. So they're gonna need to be cut after all. @@ -150,23 +134,15 @@ Remember those notches I wanted to cut in the posts? The best technique for that It was clear that I needed a tool that wasn't reliant on the power storage capacity of a couple 16-year-old hunks of lithium. This time, I went back to Habitat for Humanity to see what they had, because apparently they sell tools. In among a kind of impressive assortment of tools mostly from the back half of the previous century (as well as a pickaxe of all things, which I was very tempted to buy) was this monstrous thing, a Skilsaw Model 554c 8-1/4" 13-amp corded circular saw, with an intact ground pin and everything! <figure class="media"> - <div> - <div class="gallery"> - <img src="skill_saw.webp" alt="A dirty, old-looking corded electric circular saw with a beefy metal housing and extremely visible 'Skilsaw' branding."> - </div> - <figcaption style="margin-top: 0;">I promise I'll have some photos that aren't of a power tool soon.</figcaption> - </div> + <img src="skill_saw.webp" alt="A dirty, old-looking corded electric circular saw with a beefy metal housing and extremely visible 'Skilsaw' branding."> + <figcaption style="margin-top: 0;">I promise I'll have some photos that aren't of a power tool soon.</figcaption> </figure> This thing worked a treat. On top of its lack of a need for batteries allowing me to get 100% of my remaining circular saw work done the day I bought the thing, it was perhaps unsurprisingly *way* more powerful than the battery-powered saw. It's clear to me why I only had to pay 10 Canadian SillyBucks for it — getting the sled aligned at exactly 90° to the blade is kind of a pain, for one — but I can't argue with results. <figure class="media"> - <div> - <div class="gallery"> - <img src="rslashshittyjoinery.webp" alt="A close up of two 6x6 posts where they've each had large notches, big enough to fit a 2x6, cut out of them on two sides. The notches are visibly imprecise."> - </div> - <figcaption style="margin-top: 0;">Ugly results maybe, but results. Again, rustic. Laughs nervously. Fortunately, most of this will be hidden.</figcaption> - </div> + <img src="rslashshittyjoinery.webp" alt="A close up of two 6x6 posts where they've each had large notches, big enough to fit a 2x6, cut out of them on two sides. The notches are visibly imprecise."> + <figcaption style="margin-top: 0;">Ugly results maybe, but results. Again, rustic. Laughs nervously. Fortunately, most of this will be hidden.</figcaption> </figure> I also had to use a chisel to clean up the notches after I was done with the saw. Let me just say that this sucked ass to do and it's a damn good thing every surface the chisel touched is gonna be hidden under an inch and a half of solid pine. There's "rustic", and then there's "looks like total ass". Either Dewalt chisels are ass or I was doing something very wrong. We will now be moving on. @@ -181,7 +157,7 @@ Now for the exciting part: the first test assembly. My plan here was to assemble Once it was up, I just used copious amounts of deck screws to make the side pieces, which consist of the cross beams, another 2x6 for a ledge on the top, and a 2x3 to hold the slats. A 2x3 feels like a strange choice here, but I wanted some extra horizontal leeway because I built the bed a little wide to accommodate the headboard, which is maybe an inch wider than a queen mattress, and wasn't confident my slats would be long enough. This also conveniently turned out to be about as wide as this piece could be without interfering with my access to the bolts on the inside facing the mattress, a quirk I completely forgot to account for in my design. -### I'm just putting these headings in to break this up visually ngl. anyway here's finishing +## I'm just putting these headings in to break this up visually ngl. anyway here's finishing Cleverly forseeing that attaching the diagonal braces now would render some areas inaccessible with a power sander of any kind, I stopped here and disassembled the bed again for further processing. The original plan had been to sand up to 180 grit, but I didn't have any 180 grit sandpaper, so I sanded a piece with 120 grit, decided I was content with that level of smoothness, and stopped there because I want this to actually get done. Astonishingly, this took a lot less time than the 50 grit pass, I assume because I wasn't trying to knock down a bunch of like 1mm+ high spots. The second and final pass only took me two days of work! Wow! @@ -201,7 +177,7 @@ This is where my early resignment to a rustic (go ahead and take a shot now) aes I understand why people seem to default to paint for this type of thing now. That would have been a lot easier and more forgiving than this. However, it would have looked a lot less cool, especially since all my raw materials have giant surface defects that would just look weird under a coat of paint. -### Assembly DRAFT (Final) 3 (FINAL) this one (draft) 2 FINAL.docx +## Assembly DRAFT (Final) 3 (FINAL) this one (draft) 2 FINAL.docx Let's talk about that ladder. I haven't really mentioned it so far, and it wasn't even in my computer model, because it's that dead simple and honestly kind of secondary to the bed itself. I want to replace it with some kind of stair cabinet contraption in the future, but that's a whole other project and I needed a way to get into my bed now, hence this. The plan was to build it out of 4x4's for the sides and 2x4's for the rungs, with dimensions as described in [OSHA Standard 1926.1053(a)(3)(i) and 1926.1053(a)(4)(i)](https://archive.ph/pB5JN), and have it just bolt onto the bed. This was the easiest, and therefore first, task I did towards the final assembly. @@ -210,12 +186,8 @@ I attached the rungs with deck screws through the 4x4's, in deep countersinks si The rungs actually *did* start going anywhere when I put my full weight on them, but that was because I screwed them in too close to the middle and they were twisting when I put my full weight on the front edge. I solved that with some more deck screws at an angle through the bottom. Luckily, it's not visible unless you're lying on the floor, which is the exact opposite of what you're doing when you use this bed. <figure class="media"> - <div> - <div class="gallery"> - <img src="immovable_object.webp" alt="A 5-foot handmade wooden ladder made of two 4x4's stained a very mild amber, with four rungs stained completely black."> - </div> - <figcaption style="margin-top: 0;">Ignore the prodigious post-move-in junk pile behind the ladder. If you were wondering, that's the reason I've been building stuff in the driveway.</figcaption> - </div> + <img src="immovable_object.webp" alt="A 5-foot handmade wooden ladder made of two 4x4's stained a very mild amber, with four rungs stained completely black."> + <figcaption style="margin-top: 0;">Ignore the prodigious post-move-in junk pile behind the ladder. If you were wondering, that's the reason I've been building stuff in the driveway.</figcaption> </figure> This was also my first confirmation that my at this point irreversible aesthetic choices weren't completely unworkable dogshit. So that was nice. @@ -231,19 +203,15 @@ Attaching the cross braces to the posts taught me to hate threaded inserts. I ha It was during this step that my decision to apply the finish before assembling everything *really* paid off. <figure class="media"> - <div> - <div class="gallery"> - <img src="smth_about_a_parade.webp" alt="The bed in question, which bears a striking resemblance to the model from earlier, being shielded from the rain with a bedsheet stapled to the tops of the posts."> - </div> - <figcaption style="margin-top: 0;">SUCK MY UNWANTED AND UNASKED-FOR BALLS, MOTHER NATURE.</figcaption> - </div> + <img src="smth_about_a_parade.webp" alt="The bed in question, which bears a striking resemblance to the model from earlier, being shielded from the rain with a bedsheet stapled to the tops of the posts."> + <figcaption style="margin-top: 0;">SUCK MY UNWANTED AND UNASKED-FOR BALLS, MOTHER NATURE.</figcaption> </figure> It's probably not ideal to have this stuff out in the rain, but the polyurethane coating did at least buy me enough time to wipe all the raindrops off without them soaking into the wood and causing havoc. As you can clearly see, some quick thinking with a random old bedsheet and the local cordless staple gun also helped. Fortunately, the rain died down pretty quick, but the wind took a bit longer. I had to add more staples at least once. After that, only a couple little things remained, mostly nightstand stuff. Mounting the lamp, measuring my little improvised shelf to cut the backing board out, etc etc. Then, -## Installation +# Installation As you might rightly imagine, this was a little more difficult to assemble in an actively-in-use bedroom with a little over twice the square footage of the bed itself, and that's *after* you get the eight huge pieces this comes in up the stairs and in there. It was very much a two-person job. I had to move some furniture just to move this thing into position, and I will admit it *may* have taken some cosmetic damage in the process. @@ -254,29 +222,23 @@ I discovered at this point that, as I had predicted, the slats were just slightl After all that, I *finally*, after over a month of work, had this to show for it: <figure class="media"> - <div> - <div class="gallery"> - <img src="payoff.webp" alt="A queen-sized loft bed that I designed and built myself, made of 8-foot 6x6 posts for legs and various hardware store lumber for cross beams and bracing, all held together with giant bolts at each joint. The former is a nice wood tone while the latter is stained black. It has green curtains on the sides and a grey upholstered headboard that matches the grey bedding. My desk can be seen underneath it."> - </div> - <figcaption style="margin-top: 0;">The room was too small to get a better picture than this without using the grainy ass wide-angle sensor. It's almost as though I'm hurting for floor space in here.</figcaption> - </div> + <img src="payoff.webp" alt="A queen-sized loft bed that I designed and built myself, made of 8-foot 6x6 posts for legs and various hardware store lumber for cross beams and bracing, all held together with giant bolts at each joint. The former is a nice wood tone while the latter is stained black. It has green curtains on the sides and a grey upholstered headboard that matches the grey bedding. My desk can be seen underneath it."> + <figcaption style="margin-top: 0;">The room was too small to get a better picture than this without using the grainy ass wide-angle sensor. It's almost as though I'm hurting for floor space in here.</figcaption> </figure> I promise it looks more rustic in person. <figure class="media"> - <div> - <div class="gallery"> - <img src="nightstand.webp" alt="A closeup of my bed's built-in nightstand, a slightly shoddy affair consisting of three vertical pieces of black-stained 2x6 bridged by two longer ones horizontally between them. All this is screwed into the bed's side ledge, also a black 2x6, creating two different tiers of storage. Towards the right side is a 120V and USB outlet embedded into the top surface, and a lamp mounted on a swinging arm to the very right end. This assembly has a plywood backing board stained the same amber brown as the corner posts."> - <img src="pov.webp" alt="POV you're sleeping in my loft bed. You're surrounded by my grey IKEA bedding, a couple novelty pillows, and a Blahaj. There's about two feet of vertical space between the mattress you're lying on and the ceiling. At the edges of the bed, the greenish-blue blackout curtains prevent you from seeing any further."> - </div> - <figcaption style="margin-top: 0;">Really cozy.</figcaption> + <div class="gallery"> + <img src="nightstand.webp" alt="A closeup of my bed's built-in nightstand, a slightly shoddy affair consisting of three vertical pieces of black-stained 2x6 bridged by two longer ones horizontally between them. All this is screwed into the bed's side ledge, also a black 2x6, creating two different tiers of storage. Towards the right side is a 120V and USB outlet embedded into the top surface, and a lamp mounted on a swinging arm to the very right end. This assembly has a plywood backing board stained the same amber brown as the corner posts."> + <img src="pov.webp" alt="POV you're sleeping in my loft bed. You're surrounded by my grey IKEA bedding, a couple novelty pillows, and a Blahaj. There's about two feet of vertical space between the mattress you're lying on and the ceiling. At the edges of the bed, the greenish-blue blackout curtains prevent you from seeing any further."> </div> + <figcaption style="margin-top: 0;">Really cozy.</figcaption> </figure> I guess that gives you a better idea, huh? -## Usage Impressions +# Usage Impressions Honestly, this feels a lot less cramped both below and above than I was expecting it to be. I like it a lot. It's very cozy up top, and my ability to use my desk is thoroughly unimpeded. In fact, this structure provides a lot of convenient mount points for stuff in that area. Getting in is easier than I was expecting, but getting out is unsurprisingly kind of a pain. I intend to take the ladder off and modify it to be slanted, which should help. @@ -288,7 +250,7 @@ The bed also darkens the room considerably — it's directly below the ceili Also, building in outlets and a lamp up top was a stroke of genius on my part. -## Postmortem +# Postmortem I'd say this project was mostly a success. It's a little shittier and jankier than I had imagined, but that was to be expected. The one glaring exception is that I failed to make it adjustable. It had been becoming more and more clear that that wasn't really gonna be feasible with my level of skill and the quality of my materials for a while, but the moment I gave up on it was when I put the first diagonal braces on the back, measured the vertical distance between the cross member they were on and the points at which they mounted to the posts, and there was over an inch of difference. I think if I really want this thing lower in the future, my adjustment mechanism will be my ~~shiny~~ ~~new~~ circular saw. @@ -310,4 +272,6 @@ All in all, would I recommend you do this? Fuck yeah, absolutely. In terms of ut <p id="n1"><a href="#n1r">1</a>. Just for funsies, here's a photo I took of all the (surviving) tools I bought for this project. Except the Anvil saw horses. FUCK the Anvil saw horses. I'd wager about half the value here is tied up in that brand new belt sander.</p> -
\ No newline at end of file +<figure class="media"> + <img src="hashtagmytools.webp" alt="A bunch of tools and consumables laid out on my driveway: A new Ridgid belt sander, an old-ish Black and Decker jigsaw with new blades, an old Skilsaw circular saw, a VERY old electric hand plane, a 4lb box of painter's rags, a box of nitrile gloves, earmuffs and safety goggles, a small Kreg pocket hole jig kit, a 3-pack of Dewalt chisels, a 3-pack of spade bits, a 3-pack of wire brushes, and a 4-pack of clamps. Not pictured: a two pack of cheap Anvil brand saw horses, one of which is already broken."> +</figure>
\ No newline at end of file diff --git a/blog/posts/building_a_sensible_server/index.md b/blog/posts/building_a_sensible_server/index.md index 8ce60eb..aed513e 100644 --- a/blog/posts/building_a_sensible_server/index.md +++ b/blog/posts/building_a_sensible_server/index.md @@ -1,6 +1,6 @@ It has become clear to me that the [laptop NAS](../building_a_normal_server/) I built in December of last year, while a fun project and a good learning experience, is unfit for the purpose that I need it to fulfill and is best stripped for parts and replaced. Here I'll detail the main reasons why it sucks and my plan to build something just a little bit more sensible. -## What In God's Name Have I Done +# What In God's Name Have I Done To get you up to speed in case the limit of your attention span is somewhere between one blog post and two blog posts, as of late last year I had been using an old gaming laptop as a home server for Minecraft and such things to great effect for a while, and had decided that I also wanted a proper NAS. Rather than buy a whole new CPU, motherboard, and RAM for this purpose, I saw fit to attempt to upgrade, or rather modify, or rather pervert, bastardize, and generally corrupt my existing laptop to have the storage capacity I wanted. @@ -10,7 +10,7 @@ It was beautiful, and for reasons that are entirely beyond my ability to grasp, This is where we find our intrepid hero today. -## This Whole Enterprise Was Fundamentally Ill-Conceived +# This Whole Enterprise Was Fundamentally Ill-Conceived I was expecting this thing to have problems, but I was unable to anticipate the specific problems it ended up having. Performance is... fine, actually. Better than expected, even. That horrible little 2-port SATA expander, or, failing that, the SATA multiplexers, are almost certainly bottlenecking the bandwidth to the HDDs, but it's fast enough to saturate the gigabit network infrastructure in my <span class="house">house</span>, so it doesn't really matter. @@ -24,9 +24,9 @@ Whatever this is, I feel pretty well hopeless to fix it, and even then, it's als However, despite all the problems with the laptop itself, all the other hardware has been nothing short of totally rock-solid. All of it has worked as advertised and I'll be carrying the drives and, if possible, the PSU<sup id="n1r"><a href="#n1">1</a></sup> over into the new system. -## Something Just A Little Bit More Sensible +# Something Just A Little Bit More Sensible -### Angle of Attack +## Angle of Attack Firstly, as previously mentioned, the PSU and storage are accounted for already. I have eight total drives I want to put in the system: two 256GB SSDs as mirrored boot devices, 2 1TB SSDs, also mirrored, for TrueNAS apps and such things, and four big boy hard disks for bulk storage. Most of that stuff was bought for the original build, but the mirrored SSDs proved infeasible in the end. I don't strictly *need* them, but it would be very nice to have. Anything in serious consideration will need some way to accommodate my preponderance of SATA devices. @@ -36,7 +36,9 @@ I briefly considered getting a used workstation PC of some description. A used L I could get a used rack-mount server, like a Dell PowerEdge or similar. This is also a decent option, and it would be *quite* cost-effective, but I've got a few good reasons not to. First, most of these servers have old Xeon datacenter chips in them that are still good for many home server tasks, but aren't particularly fast or efficient. Take this PowerEdge R730 for instance: - +<figure class="media"> + <img src="ebaypoweredge.png" alt="An Ebay listing for a Dell PowerEdge R730, with two Xeon E5-2623 v4 CPUs and 128GB of RAM, for $187 CAD, plus $57 CAD in shipping."> +</figure> This has two Xeon E5-2623 v4 datacenter CPUs. At 4 cores/8 threads and 85 watts apiece, this server would have the same core count as the Ryzen 5700G in my desktop for almost three times the power draw, and *half* the single-threaded performance. In many cases, especially for servers, lackluster single-core performance isn't a problem, but if I want to run game servers on this, which I do, these chips may struggle. @@ -44,7 +46,7 @@ Plus, rack-mount servers kind of suck for home use. They're very unweildy if you Logically, then, the only remaining option is to build a system from scratch, out of used parts, to my specifications. That, therefore, is what I shall do, and I think I can do it for a similar amount of money to the GPU upgrade I was *planning* to get before this whole thing really started becoming an issue. Here's my plan: -### My Grand Design +## My Grand Design In spite of the machine it's in, I've found that the i7-9750H in the laptop performs admirably for my use case. I don't really need a CPU upgrade here — hence my efforts to repurpose the existing one — unfortunately, however, the BGA form factor of this particular chip is incompatible with 100% of consumer desktop motherboards, so I'll be needing a new CPU regardless. Though I don't want or need a major upgrade, I also don't want a *downgrade* if I can avoid it, so I'll primarily be looking at other high end gaming chips from the era. @@ -63,21 +65,21 @@ Finally, I need a case. Fortunately, this time around I don't have to build one The first case I found that obviously fit my use case was this thing, the weathered old shell of a Pentium III tower from the dawn of the ATX standard: <figure class="media"> - <div> - <img src="servercase.jpg" alt="A beige PC tower with four 5.25" bays and two external 3.5" bays, populated with an optical drive and a floppy drive respectively. The only visible branding is a Pentium III sticker and a badge that reads "TOUCH"."> - <figcaption>Based on my research, this is an Enlight 7237, or something closely related, but the front panel seems unique. I'm curious about the branding here. If anyone recognizes that "TOUCH" badge, get in the comments.</figcaption> - </div> + <img src="servercase.jpg" alt="A beige PC tower with four 5.25" bays and two external 3.5" bays, populated with an optical drive and a floppy drive respectively. The only visible branding is a Pentium III sticker and a badge that reads "TOUCH"."> + <figcaption>Based on my research, this is an Enlight 7237, or something closely related, but the front panel seems unique. I'm curious about the branding here. If anyone recognizes that "TOUCH" badge, get in the comments.</figcaption> </figure> Honestly, I kind of love it. I'll transfer the 5.25"-to-3.5" adapter cage I bought to mount the drives in my homebrew case to the bays in this thing wholesale, and I can 3D print some brackets to mount the SSDs in the 3.5" bays. And, somewhat counterintuitively, it might actually be *easier* to build in than those modern RGB glass side panel power supply basement having ass Gaming™ cases: - +<figure class="media"> + <img src="servercaseinside.jpg" alt="The inside of the same old PC case. Its layout is extremely pragmatic: motherboard in the very bottom corner, PSU in the top corner above it, and all the drive bay mounts are in a cage lining the front side. In other words, it looks like an old PC case."> +</figure> Just look at it. Everything's right there. I can take the side panel off and instantly get to every component with my hands without spinning the case around and I don't need to run any cables through any fucking gromets to get them where they're going. It looks supremely convenient. As the type of person who enjoys *building* computers and not just using them as decoration, this is beautiful to me. The biggest issue with this case is the cooling. It's absolutely pitiful by modern standards. Based on these photos, it looks like there's a single 92mm, possibly 80mm, fan each for intake and exhaust, with a passive vent in the side. I'm already bringing some extra cooling to the table — my drive cage has a mount for a 120mm fan, and I can use the fan in my much better ventilated modern PSU for extra exhaust, and with a 65W CPU and no meaningfully powerful GPU that might just suffice. If not, I've got some ideas involving 3D printing and/or a hole saw to make this thing a little less stuffy. -### Actually Building The Sucker +## Actually Building The Sucker Everything above that heading there was in large part written a few weeks ago, when I was ordering all this stuff and it was all fresh in my mind. We now rejoin our intrepid hero as she receives the last of her Ebay orders and prepares for initial testing. @@ -91,7 +93,7 @@ Assembly went smoothly; not much to say here that you couldn't get from Linus Te What didn't go smoothly was actually booting the thing. On first power on, it failed to POST and got stuck on a code "8" on the little seven-segment diagnostic code display. I initially assumed it was training the memory, since this can take a while on first boot, but after about five minutes of no change I started getting worried. I read a lot of very worrying forum posts that suggested that either the CPU or motherboard were straight up dead, and I very nearly bought another CPU to see if that was the case. First, though, I decided to try updating the BIOS using the "BIOS Flashback" feature, and that fixed it immediately. I wasn't done yet, though. -Astute readers will have figured out by now that I was using TrueNAS on the old machine and intended to continue using it on the new one. Installation went extremely smoothly, except for one small wrinke: I had decided to take the NVMe boot SSD from the old laptop to use as storage for my game servers<sup id="n6r"><a href="#n6">6</a></sup>, and even though I had done a fresh install of TrueNAS to a pair of mirrored SATA SSDs, the NVMe one, naturally, still had TrueNAS on it. This, from what I understand, caused the OS to get stuck trying to boot because there were two ZFS pools marked as the boot pool, and it would just give up and drop me into an initramfs shell instead. Booting into a live environment and using GParted to clear all the partitions on the drive didn't fix it, and after a bit of googling I learned I had to use the initramfs shell to clear the volume data for the disc directly. +Astute readers will have figured out by now that I was using TrueNAS on the old machine and intended to continue using it on the new one. Installation went extremely smoothly, except for one small wrinkle: I had decided to take the NVMe boot SSD from the old laptop to use as storage for my game servers<sup id="n6r"><a href="#n6">6</a></sup>, and even though I had done a fresh install of TrueNAS to a pair of mirrored SATA SSDs, the NVMe one, naturally, still had TrueNAS on it. This, from what I understand, caused the OS to get stuck trying to boot because there were two ZFS pools marked as the boot pool, and it would just give up and drop me into an initramfs shell instead. Booting into a live environment and using GParted to clear all the partitions on the drive didn't fix it, and after a bit of googling I learned I had to use the initramfs shell to clear the volume data for the disc directly. After that was cleared up and I was booting into TrueNAS, setup went off without a hitch. I imported the config I had saved from the old server and everything was instantly up and running like nothing had ever happened, and suddenly, I had a working server again. @@ -114,13 +116,11 @@ The RAM is RAM. It's fast enough for my porpoises with or without XMP, which I l I ended up getting those 10 gig ethernet cards, but I couldn't use them like I wanted. As it turns out, a GPU and 2 NVMe drives is all the PCIe bandwidth the B550 chipset in my main rig has to offer. My next upgrade might just be a used X570 board. I did still install one in the server, though, and since the fan on it was very loud on account of being very dying, I replaced the shambling corpse of the stock fan with a 40mm Noctua, spliced onto the original header and mounted using one of my best zip-ties: <figure class="media"> - <div> - <div class="gallery"> - <img src="nictua.jpg" alt="A 40mm wide, 10mm thick Noctua fan zip-tied to the heatsink on a PCIe Ethernet card."> - <img src="ziptiemount.jpg" alt="The zip-tie is screwed into one of the original fan mounting holes on the heatsink. As in, the screw is going through the zip-tie."> - </div> - <figcaption style="margin-top: 0;">Yes, I attached the zip-tie to the heatsink by screwing it in. Clever, right?</figcaption> + <div class="gallery"> + <img src="nictua.jpg" alt="A 40mm wide, 10mm thick Noctua fan zip-tied to the heatsink on a PCIe Ethernet card."> + <img src="ziptiemount.jpg" alt="The zip-tie is screwed into one of the original fan mounting holes on the heatsink. As in, the screw is going through the zip-tie."> </div> + <figcaption style="margin-top: 0;">Yes, I attached the zip-tie to the heatsink by screwing it in. Clever, right?</figcaption> </figure> Would I recommend you follow in my footsteps? Absolutely. This thing is great. In order to make this work, I had to build a normal computer. Short of a rack-mount case and a rack in which to mount it, *this* is how you build a home server. Frankly, I was absolutely right that violently contorting my existing gaming laptop into a TrueNAS box would be cheaper than this, but I can now say with complete certainty that the savings were not worth it. This is less entertaining, sure, but I'm glad I finally did it properly. Well, at least to the greatest extent that I seem to be capable of "properly". diff --git a/blog/posts/customcans_4pin_pinout/index.md b/blog/posts/customcans_4pin_pinout/index.md new file mode 100644 index 0000000..95b0e02 --- /dev/null +++ b/blog/posts/customcans_4pin_pinout/index.md @@ -0,0 +1,35 @@ +Bit of a short one today, to share a piece of information I couldn't find anywhere else on the whole wide fucking interwebz. This is something of a continuation of my post on [making your own cables](/blog/posts/make_your_own_cables/), in that this little tidbit is critical information for making one of the cables from that article, that I recently had to re-reverse-engineer. + +For context, I currently use a Beyerdynamic DT 770 Pro as my main set of headphones. These headphones don't have a removable cable stock, so I ordered mine through a company called [Custom Cans](https://customcans.co.uk/) that deals in boutique modded headphones and can put one in for you, at the recommendation of popular Youtuber DankPods<sup id="n1r"><a href="#n1">1</a></sup>. I had them put in a weird, seemingly unstandardized 4-pin mini XLR port<sup id="n2r"><a href="#n2">2</a></sup>, so when the fancy ass snake-oil-and-paracord cable they gave me broke it was either shell out 80 quid for another one or make my own. + +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/notamused.png" alt="me looking decidedly unamused"> + </div> + <div class="aside-content"> + <p>I'd be convinced the headphones they sell are just loss leaders for these crazy overpriced cables if that idea didn't fall apart under a modicum of scrutiny.</p> + </div> +</aside> + +The latest of my hodgepodge adapter cables recently broke again, and today I set about fixing it. It had been just long enough since I last did this that I had forgotten the pinout and had to reverse engineer it again, and this time I vowed not to put myself through that again. So for my benefit moreso than yours, I have enshrined this diagram of the pinout Custom Cans uses on their 4-pin single-connector cables here on this page for all eternity: + +<figure class="media"> + <img src="pinout.webp" alt="The aforementioned 4-pin mini XLR connector. It's the connector on the cable that would plug into the headphones, held with the locking mechanism towards the top. The top left pin is labeled Right Signal, the top right pin is labeled Left Signal, the bottom pin is labeled Left Ground, and the center pin is labeled Right Ground."> +</figure> + +I'm pretty sure this is my third new cable for these headphones, which means I've now saved north of $400 on cables for this thing. With this combined with my continued disinterest in Starbucks and avocado toast, I'll be able to afford a house in no time! + +I've also fired off an email to Custom Cans' support line for official confirmation. **UPDATE**: As of January 19th, I've received a response: + +<figure class="media"> + <img src="supportemail.webp" alt="Hi [Deadname], I'm afraid we can't provide a free solution to this one as it's a couple years outside of warranty. Four years is a pretty good run though. The cable might still be fixable. Usually if a wire breaks in a cable, it breaks under the 4 pin mini XLR where the cable touches your shoulder. The pinout is: 1. L+; 2. L-; 3. R+; 4. R-. It's the same as the HD490 so you might be able to find some cables for that headphone for a cheaper price. Cheers, [Support Guy]"> + <figcaption>That's a pretty good response, by my estimation. I guess I can now recommend this company. </figcaption> +</figure> + +Bang on, baby!! But wait, I didn't know they made it pin-compatible with an existing Sennheiser product. A quick search on Amazon for "HD490 replacement cable" reveals that they can be had for less than 20 *Canadian* dollars. Well now I look like a real numpty, don't I? + +--- + +<p id="n1"><a href="#n1r">1</a>. He mentioned them in a video, I didn't meet the guy or anything.</p> + +<p id="n2"><a href="#n2r">2</a>. Credit to Custom Cans here, I could have had them put in a more normal port that didn't have this problem, so this situation is entirely my doing. Credit away from them, the only replacement cable they sell makes Apple's cables seem like a deal. Also their fancy fucking cable broke, I guess.</p>
\ No newline at end of file diff --git a/blog/posts/customcans_4pin_pinout/index.php b/blog/posts/customcans_4pin_pinout/index.php new file mode 100644 index 0000000..952e6d9 --- /dev/null +++ b/blog/posts/customcans_4pin_pinout/index.php @@ -0,0 +1 @@ +<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php');
\ No newline at end of file diff --git a/blog/posts/customcans_4pin_pinout/pinout.webp b/blog/posts/customcans_4pin_pinout/pinout.webp Binary files differnew file mode 100644 index 0000000..22aa8f1 --- /dev/null +++ b/blog/posts/customcans_4pin_pinout/pinout.webp diff --git a/blog/posts/customcans_4pin_pinout/supportemail.webp b/blog/posts/customcans_4pin_pinout/supportemail.webp Binary files differnew file mode 100644 index 0000000..95a06e6 --- /dev/null +++ b/blog/posts/customcans_4pin_pinout/supportemail.webp diff --git a/blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/index.md b/blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/index.md index 31fe7c2..53d486a 100644 --- a/blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/index.md +++ b/blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/index.md @@ -5,36 +5,19 @@ background-size: cover; background-attachment: fixed; } - a { - color: #00CED1; - } - a:hover { - color: #ffff00; - } - h1 { - font-style: italic; - background-image: url('/images/isopod.php'), linear-gradient(135deg, #2e1ae0 0%, #2e1ae0 2ch, #00ff00 4ch, #ffff00 6ch, #ffff00 7.1ch, #0000 7.1ch); - background-clip: border-box, text; - -webkit-text-fill-color: transparent; - text-shadow: none; - } - hr { - color: white; - box-shadow: 0 0 4px white; - } </style> Yesterday, September 18th, 2022, was the second anniversary of the creation of my first website on Neocities<sup id="n1r"><a href="#n1">1</a></sup>, the site that is now known as [deeptwisty.com](https://deeptwisty.com). I intended to publish this then, but life got in the way, by which I mean I wrote 90% of it and then procrastinated for two weeks on the last couple paragraphs. I figured that to commemorate the occasion I would finally dispense with the half-assed abridged history of the place on the about page or wherever and consolidate a complete history of my Personal Home Pages in one convenient location, that being this post. -## Tumblr +# Tumblr My first proper social media was Tumblr. Well, the first social media site I joined was Pinterest, but that doesn't count. Anyway, Tumblr was my main social media and the center of my Online Presence™ for several years. I would pour hours into tweaking the custom theming on my blog to be just right, and I often had some sort of bio on a custom page, which is a thing Tumblr lets you do. I linked to all my other online profiles from my Tumblr page, and would prioritize linking back to it from them. This caused problems, as I was and still am the type of Tumblr user to change their username on impulse, and it was terribly inconvenient having to go through all my other accounts and change that link whenever I did (I've got it set up as a subdomain of my website now, so that should never be a problem again). Eventually, though, another service would crop up that everyone seemed to be using, and that presented me with a better way: -## Carrd +# Carrd I still use Tumblr, just not as the hub for my entire online presence. I maintain that it is still the best<sup id="n2r"><a href="#n2">2</a></sup> centralized social media site. Anyway, a Carrd page became the central hub which linked to all my online profiles and which all my online profiles could link back to. Finally, I only had to update my frequently changing Tumblr link in one place. For the most part. -I perceived a certain stigma (at least on Tumblr) around having a Carrd page, and the sorts of people who made one. The stereotype was that you would have overly exhaustive BYF (Before You Follow) and DNI (Do Not Interact) lists full of sometimes outlandish criteria<sup id="n3r"><a href="#n3">3</a></sup>, probably have similar bullet point style lists of all your likes, dislikes, and possibly identities and triggers (!)<sup id="n4r"><a href="#n4">4</a></sup> and probably not be the most pleasant person to interact with. I like to think I bucked that trend. My Carrd pages were generally very simple: a profile picture, a short bio (some shit like "Ada | 21 | đ¨đĻ | real life isopod"), and links to my socials. That was all. I remember adding the obligatory long-form bio and DNI list at some point, but those didn't last long. +I perceived a certain stigma (at least on Tumblr) around having a Carrd page, and the sorts of people who made one. The stereotype was that you would have overly exhaustive BYF (Before You Follow) and DNI (Do Not Interact) lists full of sometimes outlandish criteria<sup id="n3r"><a href="#n3">3</a></sup>, probably have similar bullet point style lists of all your likes, dislikes, and possibly identities and triggers (!)<sup id="n4r"><a href="#n4">4</a></sup> and probably not be the most pleasant person to interact with. I like to think I bucked that trend. My Carrd pages were generally very simple: a profile picture, a short bio (some shit like "Ada | 23 | đ¨đĻ | real life isopod"), and links to my socials. That was all. I remember adding the obligatory long-form bio and DNI list at some point, but those didn't last long. I believe it was around this time when the alias "deep twisty"<sup id="n5r"><a href="#n5">5</a></sup> came into being. I was just starting out making music at this point, posting crummy songs to SoundCloud that I'd made in an online editor called [EarSketch](https://earsketch.gatech.edu/landing/#/) that had you use Python to arrange pre-made loops and samples on a timeline. That shit was wack, yo, but that's beside the point. I was looking for an alias to release my music under, because I was intent on making more and my actual name wasn't gonna cut it. @@ -42,7 +25,7 @@ I was quite into Subnautica around this time (I promise this is relevant) and it Anyway, I made a separate Carrd as a hub for this new "deep twisty" persona (I keep it separate from everything else mainly so I can show it to family without them seeing all of... this. Not that I have yet...). That worked fine until I wanted to start embedding my latest YouTube upload on the Carrd page, something Carrd locks behind a paywall. It was at this precise moment I remembered I know how to code and resolved to make the jump to a platform that lets you write your own HTML from scratch, in my case, this being -## NeoCities +# NeoCities My first Neocities sites were simple affairs, basic little pages with little more to them than the Carrd sites they had replaced, albeit with some of the things Carrd would have made me pay to add, like that YouTube embed. You can still see the original version of what is now this site [here](../../../old/1/), though the original version of deeptwisty.com was unfortunately lost. It was nothing special, though. It had a similar aesthetic to its replacement, and it was pretty similarly laid out to this here page, even with the same background, just with WAY less text, and no cool isopod. @@ -58,7 +41,7 @@ To be completely honest, I took rather a lot of inspiration for this revision fr This revision was, as the kids say, Real Cool™, but the aforementioned problems led me to scrap it after only about 2 months, which brings us here: -## v3 and Self-Hosting +# v3 and Self-Hosting I wanted something that could be viewed without Javascript and wasn't a colossal pain in the ass to update, hence what you see on the site now if you're reading this soon after it was posted. If I've since overhauled the site again, the version I'm referring to should be available [here](../../../old/3/). This version is designed to be as simple layout-wise as possible, to the point where you can read it in a text-only browser and not lose much of the experience. It's much easier to add stuff to now. My one issue with it is the navigation - unlike v2, where you could get to any page from any other in one click, v3 requires you to go back to the homepage to move between pages. It's just harder to navigate. This system is better than having to add a link to every new page on every existing page, though. Now that I can do server-side rendering, I'll probably put in a proper navbar or something of that nature at some point. diff --git a/blog/posts/discord/index.md b/blog/posts/discord/index.md index 8f1f43e..5b88a92 100644 --- a/blog/posts/discord/index.md +++ b/blog/posts/discord/index.md @@ -4,11 +4,11 @@ So Discord's been on their bullshit again (as if they were ever off of it). This I was originally going to center this article around the pros and cons of different alternatives to Discord, and I do still want to touch on that, but I think it's important to express my reasoning in detail here; it will be easier to avoid another situation like the one we have now with Discord if we know what's actually wrong with it on a more fundamental level than which administrative decisions of theirs are bad. How do we ensure wherever we go next won't pull the exact same crap? -## So why is Discord bad? +# So why is Discord bad? Let's be honest with ourselves up front: In many ways, Discord, as a service, fucking owns. It has a ton of fun features not found really anywhere else and the quality of its voice, video, and live streaming functions are tough to beat. However, these advantages come at the cost of Discord's most significant fundamental problem: It's a proprietary, centralized, VC-funded platform. It gets the funding it needs to be so awesome from investors who expect a return on their investments, and it is legally obligated to put creating that return above all other priorities. -### Enshittification - The Capitalism Problem +## Enshittification - The Capitalism Problem It's possible, even probable, that Discord started out with the simple, noble goal of being the best Chat for Gamers™, creating an alternative to the problems present with its predecessors Skype and Teamspeak, and whatever chat functionality your favourite games had. At this, it succeeded spectacularly, for a time. However, the entire model of the VC-funded startup is fundamentally unsustainable. @@ -31,7 +31,7 @@ Reddit did not need to do this. Reddit was doing fine. This was purely a cash-gr I'm not saying they will, but Discord could absolutely do the same thing, and it wouldn't surprise me if it came to that. Imagine if Discord bot developers needed to pay API fees like that. There'd certainly be a lot fewer Discord bots, and probably a lot more paywalled ones among the remainder. Discord absolutely needs to become profitable in order to be sustainable, and it will do whatever it needs to to that end or die. Even then, it can't just break even; capitalism demands endless growth. Discord will keep getting worse as long as there's money in it. It's inevitable. It's required. -### Centralization +## Centralization Discord is a centralized platform and always will be, no matter how strong the reality distortion field it puts up by allowing the creation of isolated social spaces and calling them "servers". Every Discord "server" runs on Discord's servers, and they have total control over each one at the end of the day. @@ -43,7 +43,7 @@ This ties pretty closely into the whole VC-funded thing - Discord, the platform, That's really the core of the issue here: being centralized means that Discord can easily suffer the same fate as Twitter. Some incompetent nutcase with more money than the entire planet's collective pool of sense could buy it out and destroy it, or the current owners could just make some boneheaded decision and do the same. A decentralized platform, running on a common open protocol, is much less vulnerable to the antics of the Elon Musks and u/spez's of the world. -### The Privacy Problem +## The Privacy Problem This issue isn't really inherently connected to the others - a lack of good privacy doesn't fundamentally doom a platform like the other two points - but I'm treating it as a third major issue because I feel it's extremely important and warrants consideration. @@ -69,17 +69,17 @@ Juicy stuff. You should really give that a read - you might not like what you fi Before we move on, I'll just drop this tasty little <a href="https://spyware.neocities.org/articles/discord">link</a> to further reading. It's a real page-turner. -## Cool, so how do we fix it? +# Cool, so how do we fix it? We don't. Discord was doomed from the outset in any attempts to be sustainable or trustworthy. We are going to need to find an alternative to Discord eventually. So what should that alternative look like? I'll discuss specifics later - I'd like to start by establishing the general principles I feel a messaging system should conform to in order to avoid Discord's major problems. The TL;DR is it needs to not be any of the things I've described thus far about Discord, but I'll go into more detail about what that actually looks like. -### Follow the money +## Follow the money A sustainable chat system *absolutely cannot* be for-profit. If it is in any way driven by profit, the decay and eventual death of the service is inevitable. That doesn't mean it has to be entirely staffed by unpaid volunteers or anything, but it would need to be a non-profit foundation of some kind, just trying to break even with no incentive for infinite growth or any other corrupting financial influence. You'll notice this as a theme across most online services that don't already show signs of advanced corporate necrosis. I'm not even saying it can't have some kind of Nitro-esque paid tier. I don't hold it against, say, Protonmail - in fact, I pay for that one - but the money can't be the end goal. A sustainable non-profit model might be largely donation-based like Wikipedia, or maybe it could have a totally free product for individual users and break even selling support to enterprise customers like some Linux distributions. It's not currently breaking even yet according to its Wikipedia article, but I'll be interested to see if and how Signal reaches a sustainable state. Maybe future players could take notes from them. -### Cut out the middle man +## Cut out the middle man Better yet, structure your system such that it doesn't even need a corporation at the center - in other words, a decentralized system. I'm not talking about the blockchain; we can do this the old-fashioned way, with tech that isn't ponzi-scheme-by-design. In fact, we're already doing this, and it already has more monthly active users than any messenger app ever created: email. @@ -93,7 +93,9 @@ So when two people communicate via email, the sender sends the message to their And here's the obligatory visual aid - essentially, when you send an email, it takes the shortest path along a network that looks like this; every server is connected to every other, and every user is connected to one server: - +<figure class="media"> + <img src="federation.png" alt="A graph showing three large nodes connected to each other, each with multiple smaller nodes branching off of them. Each large node is an email server, such as outlook.com or gmail.com, and each small node is an email account, such as jim@outlook.com or bob@gmail.com."> +</figure> Hopefully that helped. Back to the point, all federated services work pretty much exactly like this. If you've ever had someone try to explain the Fediverse (sometimes incorrectly called Mastodon) to you by comparing it to email, this is what they meant. But this isn't limited to email and microblogging; this type of system can theoretically apply to anything. Again, building an MMO this way would be challenging, but federated messaging protocols similar in concept to Discord do exist. @@ -101,7 +103,7 @@ The benefit of this kind of system stems from the fact that it's not under the c The network is inherently much more stable and resilient in general than a centralized service, as there's nobody who would take the entire network down with them if the company went under or got sued or had a bomb dropped on their datacenter. Sure, a huge number of people would lose their email accounts if Gmail disappeared tomorrow, but critically, not the entire network. Email wouldn't go away, and those displaced users could go to Outlook or Protonmail or set up their own instance and keep communicating over the same network. The same applies to any other federated protocol. Imagine if your Discord account and guilds weren't controlled by Discord, but instead ran on a machine you controlled and was in no way answerable to Discord Inc, but you could still talk to your buddies on Discord proper. It's like that. -### Incognito mode +## Incognito mode Contrary to the title of the previous section, a federated approach does technically add more middlemen. We've gone from one unaccountable central authority able to read everyone's messages to several unaccountable parties each able to read the messages of everyone they serve. Not much of an improvement, privacy-wise, unless you trust both your provider and the providers of everyone you're talking to implicitly. Actual privacy requires end-to-end encryption. @@ -109,13 +111,15 @@ End-to-end encryption means the message is encrypted before leaving the sender's There are still problems here, for example end-to-end encrypted messaging still requires the server to know who you're talking to, but there are workarounds for these as well. However, E2EE should be the absolute bare minimum, in my opinion. -## So what are our options then? +# So what are our options then? + +<p class="notice"><strong>[Update 2026-02-14]</strong> Since writing this part, I've released an <a href="/blog/posts/discord2/">updated list</a> of recommendations with a set of priorities that skews less "find an ideologically pure replacement" and more "find something that actually mostly works as a drop-in replacement for Discord and can be switched to Right Now". The following section has been left in for posterity.</p> Here's the part where I discuss actual alternatives to Discord. I'll say now that this will not be a comprehensive overview of every possible option - recommending chat apps that don't meet these standards would kinda defeat the point, and I'm also not omniscient. There are going to be other options that I haven't covered here, and hopefully I've given you the tools to determine which ones are good. Every program I list here will, at a minimum, support true end-to-end encryption in some capacity and not be run by a for-profit company. They're also all open-source. -### <a href="https://xmpp.org/">XMPP</a> +## <a href="https://xmpp.org/">XMPP</a> XMPP is about as close as we've got to "email but for instant messaging". It's a federated, open protocol which, having been formally standardized in 1999, is truly ancient in internet years. My understanding is that it actually used to be more widely used, but Google effectively killed it off in popular usage by subsuming its userbase into Google Talk and then promptly turning off federation and killing Google Talk. That doesn't mean it's gone, though. People still use XMPP to talk to each other, running on servers hosted by themselves or their friends. @@ -128,7 +132,7 @@ XMPP is, at its core, designed for simple text-based messaging and presence. Whi - While integration with WebRTC voice chat is supported, it's not universal, and some people prefer to use a separate voice chat system, such as Mumble, in conjunction with XMPP text chat. - You'll have to find a provider and choose a client program to connect with. Fortunately, there's plenty of options, and the official XMPP website lists some of each. -### <a href="https://matrix.org/">Matrix</a> +## <a href="https://matrix.org/">Matrix</a> Matrix is the other major federated instant messaging protocol. It was standardized in 2014 and is built around making end-to-end encryption easy. On top of that, it has more features. File sharing is included by default and support for nice-to-have features like emoji reactions (and maybe custom emojis??) and Discord-style replies is widespread. There's also a large suite of bridges to other services, including Discord. Like with XMPP, voice chat integration is possible, but not universal, and some prefer to use Mumble or similar. @@ -137,11 +141,11 @@ Matrix is the other major federated instant messaging protocol. It was standardi - Built around end-to-end encryption, though you can disable it, and you will need to for integrations like bots and bridges. - As with XMPP, you'll need to find a provider and a client program. The website lists quite a few clients, and you can find a list of servers <a href="https://joinmatrix.org/servers/">here</a>. -### <a href="https://www.mumble.info/">Mumble</a> and <a href="https://jitsi.org/">Jitsi</a> +## <a href="https://www.mumble.info/">Mumble</a> and <a href="https://jitsi.org/">Jitsi</a> Mumble and Jitsi are self-hostable voice chat and videoconferencing applications, respectively. They're not messaging systems, but I feel they bear mentioning here because they're both popular for use in conjunction with text chat systems, and since nothing else here currently supports screensharing. -### <a href="https://revolt.chat">Revolt</a> +## <a href="https://revolt.chat">Revolt</a> We've about run out of open protocols (which is probably a good thing), so now on to the centralized services, starting with Revolt. Revolt is basically trying to be open-source Discord. It's currently in alpha, but the user experience is very similar and it already has some of the fun stuff. @@ -155,7 +159,7 @@ From what I could find Revolt isn't currently controlled by any kind of legal en - No encryption, but E2EE for DMs is being worked on. - Has features like custom emojis, replies, public guilds and a friends list. -### <a href="https://signal.org/">Signal</a> +## <a href="https://signal.org/">Signal</a> I've now run out of Discord-likes - which is to say, programs that support the sort of multi-channel group chat thing Discord has going on. This and the next one function more in the vein of a Whatsapp clone, though I feel they still bear mentioning in the event that's all you need. @@ -168,7 +172,7 @@ Signal is kind of *the* private messaging app. It's fundamentally built around e - Requires a phone number, but only a phone number. - You can set a username, so you don't need to share your phone number. -### <a href="https://getsession.org/">Session</a> +## <a href="https://getsession.org/">Session</a> I lied, Session isn't centralized. But it's not decentralized in the same way as the federated protocols up there, either. Session runs over an anonymizing onion routing network, Tor-style, meaning not only can your messages not be read by the server, those servers also don't know both the sender and the destination at the same time. Essentially, it's designed to maximize privacy and anonymity at all costs. But wouldn't you know it, that comes at a cost in terms of features and user experience. @@ -180,17 +184,17 @@ Session does also use cryptocurrency. Setting a custom display name and running - No extra features. - Setting a display name requires a crypto transaction, but sending messages does not. -## Conclusion +# Conclusion That's about all I've got. I hope I've impressed upon you the importance of Discord's core problems, and introduced you to at least one alternative that works for you. I have my preferences, but I'm comfortable recommending all of these over Discord, otherwise I wouldn't have listed them. -[Update 2023-09-09] I no longer recommend Matrix over XMPP for reasons explained well <a href="https://telegra.ph/why-not-matrix-08-07">here</a>. I knew there was a little jank but I had no idea the rot ran this deep. Fortunately, nobody's listened to me yet so I can switch over to XMPP without much issue, which I intend to do. +**[Update 2023-09-09]** I no longer recommend Matrix over XMPP for reasons explained well <a href="https://telegra.ph/why-not-matrix-08-07">here</a>. I knew there was a little jank but I had no idea the rot ran this deep. Fortunately, nobody's listened to me yet so I can switch over to XMPP without much issue, which I intend to do. -[Update 2024-04-27] I have removed Telegram from the recommendations list outright due to <a href="https://isopod.zone/notes/9sjy5r4ocq">just, straight up nazism</a>, and in a post announcing cryptocurrency features no less. Jesus H. Christ. +**[Update 2024-04-27]** I have removed Telegram from the recommendations list outright due to <a href="https://isopod.zone/notes/9sjy5r4ocq">just, straight up nazism</a>, and in a post announcing cryptocurrency features no less. Jesus H. Christ. If there's one thing I want you to take away from this article, it's this: Don't fall for the marketing and don't let yourself be wooed by extraneous gimmicks. Be discerning about which fancy-sounding features you actually need. If you want to have a chance of escaping the vicious corporate cycle of enshittification, both with chat platforms and with everything else, make sure the ones you use have a strong foundation of sustainability and trustworthiness, beyond whatever marketing drivel is on the front page of their website. Hopefully I've given you at least some tools to determine for yourself which ones do. -## Further Reading +# Further Reading - <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">Enshittification</a> - <a href="https://tosdr.org/en/service/536">A simplified breakdown of Discord's TOS (ToS;DR)</a> diff --git a/blog/posts/discord2/discord-no-way-2.gif b/blog/posts/discord2/discord-no-way-2.gif Binary files differnew file mode 100644 index 0000000..4ee8d64 --- /dev/null +++ b/blog/posts/discord2/discord-no-way-2.gif diff --git a/blog/posts/discord2/discord.png b/blog/posts/discord2/discord.png Binary files differnew file mode 100644 index 0000000..36346c3 --- /dev/null +++ b/blog/posts/discord2/discord.png diff --git a/blog/posts/discord2/index.md b/blog/posts/discord2/index.md new file mode 100644 index 0000000..d2d53df --- /dev/null +++ b/blog/posts/discord2/index.md @@ -0,0 +1,206 @@ +So [apparently](https://archive.is/PvpAx) Discord will soon force all of its users to submit to invasive age verification in order to have full use of the platform, regardless of whether they're in an area where that's currently required. Also, they're finally [doing an IPO](https://archive.is/IiL2A). In other words, the need to dump Discord is more pressing than ever. + +<aside class="aside"> + <div class="aside-image" style="width: 11rem; padding-left: calc(var(--stdpadding) / 2);"> + <img src="/images/reactions/livid.png" alt="me absolutely fucking livid gripping the wall so hard it's breaking"> + </div> + <div class="aside-content"> + <p><em>I'm just saying. We wouldn't be here if you all had listened to me back in 2023. But this post isn't about that.</em></p> + </div> +</aside> + +Real isopod h`ead`s know I've [posted about this before](/blog/posts/discord/). Feel free to go and read that for my full case against Discord. This here article, to pull a ChatGPT-ism, isn't about the many fundamental reasons you should be leary of Discord and any platform like it, and it's also not about how fucking bitter I am that we're all even in this situation three years after I wrote my first dissertation on the subject — it's about what our other options are, right now at this moment. + +<figure class="quote"> + <blockquote> + i think the goal Right Now is to switch from Discord to Literally Anything Better and give time for people actually developing Proper Federated Replacements to build features polish their UX. + </blockquote> + <figcaption> + — <a href="https://not-brain.d.on-t.work/notes/aind9anvh4gqpj8w">kopper</a> + </figcaption> +</figure> + +Like the article that is now part 1 in a series that is 2 parts 2 long, this post is here to get you off of Discord, but seeing as this goal has become more urgent much faster than the state of alternatives has improved, I'm gonna have to compromise on my ideals a bit this time. The fact is that nothing out there is as good as Discord at what Discord does, so trying to get away from it is going to be an exercise in trade-offs, but it's also not reasonable to expect everyone and their Fortnite group to switch to self-hosted XMPP and WebRTC. + +If you're serious about getting away from Discord, you'll need to assess which options work the best for each of your communities, and odds are you'll end up replacing it with more than one alternative. For my part, this post is going to focus mainly on alternatives that replicate Discord's functionality as closely as possible, and would be relatively straightforward drop-in replacements that you could move to right now with relatively (admittedly, that word's doing some heavy lifting here) minimal effort. Unfortunately, there aren't a lot of those, but I'll try my best. + +I'll admit to having some blind spots here. Namely, I'm aware Discord is available for the latest consoles, and I don't own any of those, so I'm really not qualified to recommend alternatives for that use case, if indeed any exist. + +# [Stoat](https://stoat.chat/) (formerly Revolt) + +I liked the name Revolt, but [apparently](https://stoat.chat/updates/long-live-stoat) they had to change it after getting a cease and desist over that name. Fair enough, I guess. + +Anyway, Stoat is one of the more polished and feature-complete Discord clones I'm aware of. That's not to say it actually *is* either at present — the rebrand seems to have come with a new, overhauled frontend that isn't entirely finished yet, and all video-related features are still in the works. + +However, Stoat is among the easiest of these to adapt to coming from Discord, and it has the benefits of being a) open source and b) not American, the latter of which is especially relevant lately. It's also the only one of the True discord-likes on the list to have any kind of official native mobile app — though it is very much In Beta and missing quite a lot of features — and it's the only one so far with discoverability for public ~~guilds~~ Servers, if that matters to you. + +# Steam Chat + +Valve has the chance to do the funniest thing right now. + +Steam has had its own built-in text and voice chat solution for a good long time, and it's been improving as of late. It does have some major downsides: there's no video chat, screen sharing is limited to your Steam games, and messages are ephemeral, disappearing after two weeks. Plus, it's missing most of the Fun Stuff like user-defined custom emotes that you've come to expect from Discord. + +Still, if you're looking for a chat solution to use while gaming with your buddies, Steam's built-in functionality is worth a look. In spite of its idiosyncracies, it's polished and mature, and it's even available on mobile, albeit through a separate app from the main Steam one. + +# [Zulip](https://zulip.com/) + +The best way I can describe Zulip is as a forum but with Discord vibes. It's a bit of a situational replacement, but if you're using Discord as a forum or a support channel for your open source project, Zulip is almost certainly better. I found out about it because the Polyproto people are using it for this (more on that in a bit). + +The main downside with Zulip is that it's got some limitations unless you pay for a subscription (although let's be real, so does Discord), but they will seemingly waive that for open-source projects and in some other cases, and you can self-host it to get rid of most of those limitations if that's up your alley. + +# [Fluxer](https://fluxer.app/) + +<p class="h2caption">Added on Feb 13</p> + +I learned about this one a few days after initially publishing this article from a shitpost on Tumblr and felt it warranted a mention. Fluxer seems like a *suspiciously* complete Discord clone, complete with voice, video, a nearly identical UI, and a premium subscription that closely resembles Discord Nitro. + +According to their website, Fluxer is developed by a Swedish company, is open-source with explicit support for self-hosting the official backend, and has an extensive roadmap of planned features, some of which are completely unheard of over in Discord land. + +**[Further update, Feb 15]** I created an account to poke around on it, and it took about a day for my registration to be approved: + +<figure class="media"> + <img src="manualreview.png" alt="Message indicating that my Fluxer registration is pending manual review due to a substantial influx of new users, and that I will be notified once my account is approved."> + <figcaption>Fair enough, honestly. They probably weren't planning for Discord to have a scandal during their public beta.</figcaption> +</figure> + +Now that I'm in, the first thing I've noticed is that the interface is *extremely* similar to Discord, more so than you're probably expecting. They got a lot of the smaller details pretty spot on. + +I'm pretty impressed with what I'm seeing beyond that, as well: There's a good amount of polish, and it's even got a lot of the familiar Fun Features like custom emojis and the gif picker that have probably become foundational to the way you communicate online. Voice, video and screenshare are quite distinctly up and running, though I can't speak to their reliability without a friend or six to test them with. Not every bug has been ironed out, but there is a *shockingly* complete product here. + +One of my favourite small touches is that not only is this the only one of these alternatives with a dedicated pronouns field, it also lets you change the contents of said field on a per-guild basis. As someone who makes extensive use of this feature on Discord, I'm very happy to see that. + +Fluxer is quickly becoming the favourite for me on a product quality basis — it's doing what Stoat is trying to do, but executing it faster and better, a feat that's especially impressive considering its public Github repo has exactly two contributors — though only time will tell if either service is trustworthy. Strong recommend so far. There's unfortunately no native mobile app, but both this and the next entry have PWAs. + +# [Osmium](https://osmium.chat/) + +<p class="h2caption">Added on Feb 15</p> + +A third mostly-functional Discord clone has hit the clearly under-researched blog post. + +Osmium advertises itself as a "globally distributed community messaging and voice/video platform" with encryption "both in transit and at rest". What "distributed" means in this context beyond, like, the extremely standard practice of having servers in multiple countries isn't made clear, but the voice and video part seems to actually be fully up and running (looking at you, Stoat) and to their credit they do acknowledge that "encrypted both in transit and at rest" is different from end-to-end encrypted. + +The main thing that gives me pause about Osmium off the bat is that it's still pretty small; the official "community" (server, in Discord parlance — Fluxer actually uses this term too) that you get automatically placed in upon signing up is sitting at about 700 total members as of writing, so time will tell how it scales. It's also very much early access software right now — the UI/UX polish and feature completeness aren't quite up to the level of Fluxer or even Stoat, and the buttons in the UI don't always... do anything. + +Also also, Osmium is not currently open source. The main dev, an individual going by [Folf](https://folf.me/), claims that the "client will be open sourced once things are stable", but that's far from the same thing as Fluxer's "open source and you can self-host the backend". + +<figure class="media"> + <img src="osmiuml.png" alt="Message from the aforementioned Folf responding to a question about if Osmium is open source: "not at the moment, client will be open sourced once things are stable""> +</figure> + +That said, I'm getting the best vibes off of this project on, like, a social level. That default community seems pretty accepting of transgender types, and the dev has expressed eventual intent to add such goodies as explicit support for some sort of Pluralkit-type functionality: + +<figure class="media"> + <img src="osmiumw.png" alt="Message from Folf responding to a request for "some kind of like pluralkit alternative built in" by saying "this is planned in the future" and then "one part of the bot API will be to allow bots to set a name/avatar per message""> +</figure> + +Osmium probably isn't up to snuff for most yet, but I'm rooting for it. If you're just looking for a place for your group chat full of highly-online queers and can tolerate a bit of jank, this may just be for you. + +# Honorable Mentions + +That there is about everything I could dredge up that mostly fit the brief. I'll admit things aren't looking great here. That said, there are some projects that don't quite fit the above criteria that I feel are worth mentioning. + +## [Signal](https://signal.org/) + +Signal is the best encrypted messaging service, bar none, and it's not close. All of your communication is end-to-end encrypted using some of the most bulletproof cryptography around (though I'm far from qualified to speak on the specifics), and you should be using it for your Whatsapp-style messaging needs anyway, even in the likely event it can't replace Discord for you. + +As mentioned, Signal functions like a Whatsapp clone. It supports your bread-and-butter features like voice and video calls, and some fun stuff like Instagram-style stories and Telegram-style stickers. It requires a phone number to sign up, but you can set a custom username so you don't have to share it with anyone. + +## [Polyproto](https://polyproto.org/) + +The latest and maybe greatest federated messaging protocol. Made by a bunch of cool queers and seems very promising, but it doesn't seem to actually have any functioning clients as of yet. Still, something to keep an eye on for sure. + +## [Spacebar](https://spacebar.chat/) + +An attempt at an open source reimplementation of Discord. It's designed to be fully "Discord-compatible", which doesn't mean interoperable, but it does mean that any third party software made for Discord such as bots or alternate clients should be compatible with its APIs. + +This seems like an ideal fit for the role of "drop-in replacement for Discord" in theory, but from what I can tell, while functional, it's not really there yet. If you want to give it a shot, [Fermi](https://fermi.chat/) seems to be the preeminent compatible client at the moment. + +## [Mumble](https://www.mumble.info/) + +A very mature self-hostable voice chat server. That's about all it does, but if that's all you need out of Discord and you've got a massive nerd like me in your friend group who can set it up it might be worth looking into. + +## [Sharkord](https://sharkord.com/) + +<p class="h2caption">Added on Feb 15</p> + +Another open-source, self-hostable Discord clone currently in alpha. It's in this section primarily because it doesn't currently have an official instance, so much like Mumble and Teamspeak (more on that later) you need someone to host this in order to use it. + +# Dishonorable Mentions + +And now for some options that suck and aren't really viable in my opinion, but that I feel warrant addressing. + +## Matrix + +<aside class="aside"> + <div class="aside-image"> + <img src="/images/reactions/sob.png" alt="me sobbing"> + </div> + <div class="aside-content"> + <p>You had so much potential! Why did it have to turn out this way?</p> + </div> +</aside> + +Matrix was one of my top picks back in 2023, but it had some unignorable flaws then, and it hasn't really improved in the intervening time. I could opine on this for quite a bit, but suffice to say that the usability and reliability have stagnated while the project's governance has gotten substantially less trustworthy. [This](https://telegra.ph/why-not-matrix-08-07) and [that](https://paper.wf/alexia/matrix-is-cooked) article do a pretty comprehensive job of explaining it. + +**[Update, Feb 11]** Someone pointed out to me that one of those articles is a bit old now, so I went digging for some more recent ones and wouldn't you know it, I found a couple more from mid last year. [Here's](https://shkspr.mobi/blog/2025/07/im-never-going-back-to-matrix/) [those](https://ããĒãĻãš.com/giving-up-on-element-and-matrixorg/). + +**[Update, Feb 15]** + +lol + +<figure class="quote"> + <blockquote> + Our efforts are prioritised on our target markets which currently does not include being a Discord replacement + </blockquote> + <figcaption> + — <a href="https://github.com/element-hq/element-web/issues/5993#issuecomment-3884340391">Element maintainer in a Github comment</a> + </figcaption> +</figure> + +## XMPP + +I'd love to recommend XMPP, I truly would, but the UX just isn't there, plus it seems like all its most passionate supporters like it specifically because it doesn't have most of the qualities that make Discord appealing to the average gamer. + +IRC is even worse in this regard. It scarcely warrants mentioning. + +**[Update, Feb 15]** Apparently an XMPP client called Movim is working towards adding multi-channel group chat functionality in the vein of Discord. Seeing that their website claims support for video chats and screen sharing, I signed up and checked it out for completeness' sake, and I have Thoughts. + +Movim isn't a Discord. I think it's trying to be something entirely different. It's got news aggregation, microblogging, Instagram-style stories, and plenty of UX quirks that might be confusing if you're not already ingrained in the XMPP-cosystem. Given that the [PR](https://github.com/movim/movim/pull/1520) to add what they're calling "Spaces" was made literally today, it's very possible that it represents a knee-jerk reactive attempt to capitalize on Discord's fumble and grow their userbase. From what I've seen, I'm not optimistic that it'll work. + +## Teamspeak + +Yeah, Teamspeak is in fact still kicking. I guess you could use it if you want, but setting up your own server requires either self-hosting or paying someone to host it for you, and their licensing puts artificial limits on what you can do even if you host it yourself. Plus, well, they're a bit of a US military contractor, and proud of it, too, so it's not a great choice if you have principles. + +## Roblox Guilded + +LOL. LMAO. RIP BOZO + +## Slack/Mattermost/Teams + +<p class="h2caption">or your half-joking enterprise messaging software suggestion of choice</p> + +Look, I'll use it if everyone goes there I *guess*, but I get the distinct impression that by and large these platforms would be *more* hostile to the outspoken presence of my ilk than Discord is trying to become. Also, the vibes are rancid, so I'd rather not. + +## [DCTS](https://github.com/hackthedev/dcts-shipping) + +<p class="h2caption">Added on Feb 15</p> + +Apparently, this is an acronym for "Direct Communication Through Sockets", which strikes me as a bit of a misnomer since it's obviously not peer-to-peer. + +DCTS is *yet another* open-source, self-hostable Discord clone like Sharkord. This one has an official instance, but you'll need to self-host it if you intend to do anything with it beyond putzing around in the official server. Fortunately, that's all anyone reading this will likely want to do, after scrolling up too far in the #spicy-memes channel and seeing the type of shit the lead dev thinks is funny. + +Ignoring that, however, the UX is mediocre at best, the featureset is very basic, and the whole interface has a pervasive male-gaze anime girl aesthetic that appeals to a very specific demographic that I'm not in. All in all, if I was gonna spin one of these up myself, it'd be either Sharkord, Fluxer, or even Mumble long before I touched this pile of radioactive sludge again. + +# Conclusion + +I'd love to be able to give you some better news. I want so badly to be able to say that there's something obvious you can switch to that's just as good or better in the ways that matter \*cough cough TWITTER\* with encryption, and federation, and open source to boot, but as far as I'm aware this is kind of it. + +With this decidedly sub-optimal state of affairs in mind, my call to action is this: Look into these alternatives — test them out, as a group if you can, see if one or multiple can work for you and your friends. If you're of the especially nerdy sort, contribute code to Polyphony or maybe Spacebar, and maybe see if you can make XMPP or (I guess) Matrix work. And finally, for the love of Glob, cancel your fucking Nitro. *Don't financially reward Discord for this shit.* ***I promise you don't need it.*** + +<div class="buttons" style="margin-bottom: 1rem;"> + <img src="discord-no-way-2.gif"> +</div> + +--- + +Also, whatever you end up doing, [here](https://github.com/Tyrrrz/DiscordChatExporter)'s a utility that can export your Discord chat history to a locally stored file. Do with this what you will.
\ No newline at end of file diff --git a/blog/posts/discord2/index.php b/blog/posts/discord2/index.php new file mode 100644 index 0000000..952e6d9 --- /dev/null +++ b/blog/posts/discord2/index.php @@ -0,0 +1 @@ +<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php');
\ No newline at end of file diff --git a/blog/posts/discord2/manualreview.png b/blog/posts/discord2/manualreview.png Binary files differnew file mode 100644 index 0000000..d145f96 --- /dev/null +++ b/blog/posts/discord2/manualreview.png diff --git a/blog/posts/discord2/osmiuml.png b/blog/posts/discord2/osmiuml.png Binary files differnew file mode 100644 index 0000000..4087ce9 --- /dev/null +++ b/blog/posts/discord2/osmiuml.png diff --git a/blog/posts/discord2/osmiumw.png b/blog/posts/discord2/osmiumw.png Binary files differnew file mode 100644 index 0000000..dd21b8b --- /dev/null +++ b/blog/posts/discord2/osmiumw.png diff --git a/blog/posts/fediverse_dms/index.md b/blog/posts/fediverse_dms/index.md index a12c503..0d211e6 100644 --- a/blog/posts/fediverse_dms/index.md +++ b/blog/posts/fediverse_dms/index.md @@ -1,6 +1,6 @@ People who refuse to use the fediverse (often conflated with Mastodon) often cite concerns about privacy with regards to DMs as their reason for avoiding it; "admins can read your DMs" and all that. To be fair, that's technically a true statement, but it's more complicated than that. Now, I have no problem letting these people be wrong - I'm not eager to convince idiots with no capacity for critical thinking to come to my favourite social network - but I'm nothing if not endlessly pedantic, so I felt the need to explain my take on the issue anyway. -## DMs Are A Lie +# DMs Are A Lie To begin with, the term "DM" as it applies to other social platforms is kind of a misnomer in the case of the Fediverse. Websites like Twitter and Instagram have a dedicated chat-style interface for messaging people directly. If you spend five minutes with most fediverse software, you'll notice that it doesn't have this. @@ -8,7 +8,7 @@ Sending a DM on the fediverse is generally accomplished by making a normal post In other words, when you send a "DM" on the fediverse, what you're really doing is making a public post, and asking the network nicely to only show it to the person it's intended for. All software that isn't actively malicious or *extremely* shitty will comply with this request, and in fact admins can only read your DMs by circumventing the instance software and accessing the backend database directly, but the post is in no way actually private. -## This Is Fine Actually +# This Is Fine Actually I don't personally think this is an issue; I think it's perfectly fine that the fediverse doesn't attempt to do secure communication. Doing things this way reduces liability for server owners and reduces the complexity of the software for developers, and you really should be able to contact anyone who you actually want to keep in touch with on multiple platforms anyway. diff --git a/blog/posts/grow_spikes/index.md b/blog/posts/grow_spikes/index.md index 4bf7c61..6b7247a 100644 --- a/blog/posts/grow_spikes/index.md +++ b/blog/posts/grow_spikes/index.md @@ -6,7 +6,7 @@ When I switched reverse proxies to Caddy last month, I figured it was time to up This guide assumes you already have Caddy working and are familiar with the basics of its use. It also assumes you're running Ubuntu Server 24.04 LTS, since that's what I'm using. I hear some of the filepaths are different depending on whether you're on a Debian-based distro or not, so adjust accordingly if you're on, like, NixOS or whatever. Although, NixOS users probably don't need my help. -## robots.txt +# robots.txt `robots.txt`, if you're not familiar, is a text file you serve from the root of your website that tells crawlers and other bots whether they have your permission to access your site. I didn't bother with this last time, because like user agent strings it's basically reliant on the honor system to work, and most of the bots I'm interested in blocking are scummy enough that they'd probably ignore it anyway. This time around, though, I'm planning to give it some teeth (which we'll get to later) so it's actually important here. Here's the relevant excerpt from mine: @@ -23,7 +23,7 @@ Disallow: /slop/ The first two lines tell all bots (`User-Agent: *`) not to look at anything (`Disallow: /`). You can stop there, but if you want, you can also allow specific user agents, for example your favourite indie search engines, by following that with a directive specific to them. `Allow: /` tells the bot it's allowed to crawl your whole site, and `Disallow: /slop/` lets it know to avoid a subdirectory you'd rather it not crawl. There are a few reasons you might want to do this, but I'm using it to spare the crawlers I like from the trap I'll be setting in that subdirectory. -### Defining this universally in Caddy +## Defining this universally in Caddy Serving a plain text file, like most things in Caddy, is pretty simple to do in your caddyfile: @@ -61,7 +61,7 @@ yoursite.example.com { If you do all that and reload Caddy, you should be able to go to yoursite.example.com/robots.txt and see the `robots.txt` file you entered. Now on to the fun part. -## Nepenthes +# Nepenthes [Nepenthes](https://zadzmo.org/code/nepenthes/) is a tarpit for misbehaving scrapers, named after a species of carnivorous pitcher plant. There's a few of these around now, but they all seem to work in pretty much the same way: generating, as the developer of [Iocane](https://iocaine.madhouse-project.org/) so eloquently puts it, "an infinite maze of garbage" for scrapers to get trapped in. @@ -69,7 +69,7 @@ In other words, it craps out an infinte series of procedurally generated pages t Obligatory warning here: Nepenthes and programs like it are intentionally malicious software designed to cause harm, and will also probably get your site delisted from any search engines whose crawlers get caught in it. Proceed only if you're comfortable with all that. -### Setting up Nepenthes +## Setting up Nepenthes Setting up Nepenthes is pretty simple if you're comfortable self-hosting stuff in general, and well-documented on its website. I'm lazy so I used the provided Docker image. If you're not familiar with Docker, here's the series of commands to spin it up identically to how I did (adding `sudo` as needed): @@ -106,7 +106,7 @@ chmod +x load.sh ./load.sh beemoviescript.txt http://localhost:8893/train ``` -### Pointing Caddy at it +## Pointing Caddy at it Simply add a `reverse_proxy` directive to the `bans` snippet you made before (you did make it, right?): @@ -126,7 +126,7 @@ Simply add a `reverse_proxy` directive to the `bans` snippet you made before (yo That will create a subdirectory called /slop/ on every website you use that snippet on that points to your shiny new tarpit. The `header_up` directive is there to tell Nepenthes what sudirectory it's running under. It's important to have this, or it won't work. -### Setting the trap +## Setting the trap Now all that's left to do is add a link to the tarpit on your website, ideally every page. You can make this invisible to the user using CSS (in fact, I'd recommend doing this) and the scrapers won't care — they don't look at that anyway. They'll just see a yummy juicy link in the HTML, follow it, and fall directly into your trap. @@ -134,7 +134,7 @@ If you've got processing power and bandwidth to burn and you're content to just I was initially content to do this, too, until some dipshit on Alibaba Cloud with like 300-odd IP addresses in the ranges `47.82.0.0/16` and `47.79.0.0/16` showed up and hammered my Nepenthes instance so hard it hit some built-in resource usage limit in Docker and couldn't even respond to queries to its statistics endpoint anymore and I decided it was time to intervene. Here's what I came up with. -## Integrating this with Fail2Ban +# Integrating this with Fail2Ban [Fail2Ban](https://github.com/fail2ban/fail2ban) is a program that scans log files for failed authentication attempts and bans the offending IP addresses. You should already have this set up. If you don't, go set it up right now. It's probably packaged for your distro. Go do it. Do it now. `sudo apt install` that bitch. I'll wait. It takes like two seconds. While you're at it, set up key-based auth for your SSH server and turn password login off. diff --git a/blog/posts/guide_blacklist_websites_searxng/index.md b/blog/posts/guide_blacklist_websites_searxng/index.md index 3aab326..66eb6c4 100644 --- a/blog/posts/guide_blacklist_websites_searxng/index.md +++ b/blog/posts/guide_blacklist_websites_searxng/index.md @@ -1,6 +1,6 @@ Quick one today. I got sick of searching for programming questions and seeing AI-generated scraped-from-stackoverflow click farm trash polluting the results, and I happen to use a personal SearXNG instance that no client-side blacklist extension on the planet is gonna support, so I went looking to see if I could blacklist them in SearXNG for like the eighth time and finally found a way using the hostname replace plugin. So here's that, because I didn't find this feature documented officially anywhere bar an [issue](https://github.com/searxng/searxng/discussions/970) on the Github repo. -## How to do it +# How to do it First, open up your instance's config file. If you installed it directly like I did, that'll probably be `/etc/searxng/settings.yml`. If you used Docker, god help you. Anyway, find the `enabled_plugins:` section and uncomment the entry for `'Hostname replace'`, then uncomment the line `hostname_replace:` just below it. Under there you'll put your blocks: diff --git a/blog/posts/guide_blocking_user_agents_nginx/index.md b/blog/posts/guide_blocking_user_agents_nginx/index.md index 763ea4d..cb022ee 100644 --- a/blog/posts/guide_blocking_user_agents_nginx/index.md +++ b/blog/posts/guide_blocking_user_agents_nginx/index.md @@ -4,7 +4,7 @@ The way I've chosen to deal with this is to just configure my reverse proxy, Ngi I'm assuming here that you already know the basics of configuring Nginx, otherwise this article won't really be of much use to you. -## How to do it +# How to do it Paste this into the main `server` block of your Nginx config to instantly drop the connection to any client with a "Wildebeest" (case insensitive) user agent: @@ -16,11 +16,11 @@ if ($http_user_agent ~* (wildebeest)) { } ``` -## More configuration +# More configuration If all you want is to block Wildebeest and forget about it, you can leave now. If you want to customize this behavior further, read on. -### Different HTTP responses +## Different HTTP responses 444 is a custom response code in Nginx that just drops the connection immediately. You can use any other HTTP error code you like, for example to return a `403 Forbidden` error: @@ -40,7 +40,7 @@ Or just to be silly :3 return 418; ``` -### Block multiple user agents +## Block multiple user agents You can also block multiple user agents in one statement like so: @@ -52,7 +52,7 @@ if ($http_user_agent ~* (wildebeest|GPTBot)) { } ``` -### Includes +## Includes One thing I'd recommend doing is moving all your user agent blocks to a separate file that you can include in all your Nginx sites. I place this file at `/etc/nginx/includes/bans`: diff --git a/blog/posts/guide_fix_youtube_buffering_firefox/index.md b/blog/posts/guide_fix_youtube_buffering_firefox/index.md index a66a232..dfa10ee 100644 --- a/blog/posts/guide_fix_youtube_buffering_firefox/index.md +++ b/blog/posts/guide_fix_youtube_buffering_firefox/index.md @@ -1,6 +1,8 @@ Remember when you could pause a video on, like, Youtube and wait and it would eventually load the whole thing so you could watch it with no buffering? - +<figure class="media"> + <img src="what_they_took_from_you.png" alt="Comic of a guy pausing a Youtube video and reminiscing tearfully about the old days where it would buffer all the way to the end."> +</figure> I happened across a [tumblr post](https://nyxgoddessofcandles.tumblr.com/post/733566253212598272/theres-more-to-do-actually-now-go-to) detailing some settings to accomplish that in modern Firefox, and I wanted to document it here. @@ -8,7 +10,7 @@ I can't guarantee that this won't stop working at some point amidst the constant *Update:* After using my browser with these settings for a while, I've noticed that the first of them breaks online video in some cases, notably Twitch streams and the Jellyfin web client. I've reverted the changes in my browser for this reason. -## How to do it +# How to do it In `about:config`, change the following settings: - Set `media.mediasource.enabled` to `false` diff --git a/blog/posts/guide_how_to_automount_drives_on_boot_in_linux/index.md b/blog/posts/guide_how_to_automount_drives_on_boot_in_linux/index.md index 32ee726..08ac47c 100644 --- a/blog/posts/guide_how_to_automount_drives_on_boot_in_linux/index.md +++ b/blog/posts/guide_how_to_automount_drives_on_boot_in_linux/index.md @@ -1,4 +1,4 @@ -## Preamble +# Preamble Recently I had to reinstall Linux because of reasons, and I hit a bit of a snag. See, my computer has this setup with three drives where one is the boot drive, and the other has `/home` on it... it's not important, point is, I wanted some drives to be automatically mounted as specific directories at boot time. @@ -6,11 +6,11 @@ This is pretty easy to do with the manual partitioning tools most graphical inst the problem is that my system doesn't know my `/home` directory is on `/dev/sda3` and not `/dev/nvme0n1p1`. So I have to fix that now or just log in as root and mount my shit every time I turn the computer on for the rest of time. Guess which thing sounded like more of a pain in the ass. I googled it so you don't have to! -## Now on to the good stuff +# Now on to the good stuff I recommend you log out and do this as root in a TTY if you intend to mount something as your home directory. -## Getting partition information +# Getting partition information First, run: @@ -28,7 +28,7 @@ This will return a list of block devices (partitions) your system sees with some You'll probably have more than one though. There should be one per partition your system can see. We're interested in the `UUID` and `TYPE` attributes. Find the ones for the partition you want mounted and take note of them. We'll be adding these to your fstab file. -## Editing your fstab +# Editing your fstab First, make sure the directory you'll be mounting to exists. Create it if it doesn't. **Now make a backup of your fstab file in case you break things!** You can do this by simply copying the file: @@ -38,7 +38,9 @@ sudo cp /etc/fstab /etc/fstab.bak Now we can edit it. Open `/etc/fstab` in your favorite text editor, and you should be greeted with a file that looks something like this: - +<figure class="media"> + <img src="fstab.png" alt="Screenshot of /etc/fstab on my computer before I did this"> +</figure> (This is the fstab file EndeavourOS generated on install. Because I set it to use btrfs, it mounted the same partition like four separate times as subvolumes. Yours will likely be smaller if you didn't do this.) @@ -67,7 +69,7 @@ If you did it right, you should now be able to reboot and see your partitions ha One more thing to keep in mind, if you see any lines with a mount point that's the same as the place you're trying to mount to (for example, the system has mounted a btrfs subvolume for /home and you want to put that on your secondary drive) you should probably comment out or delete that. -## The fast way +# The fast way Alternatively, you could just paste this into your terminal and then reboot: diff --git a/blog/posts/guide_pihole_lepotato/index.md b/blog/posts/guide_pihole_lepotato/index.md index e222568..96fbf77 100644 --- a/blog/posts/guide_pihole_lepotato/index.md +++ b/blog/posts/guide_pihole_lepotato/index.md @@ -4,7 +4,7 @@ I set up [Pi-hole](https://pi-hole.net/) on my home network recently. If you're Before you do anything, and especially before you *buy* anything, make sure your router lets you both assign static IP addresses in some way and set your own DNS servers. This functionality is necessary to use Pi-hole. I can't help you do this, unfortunately — every router is different and many ISP Specials™ are missing these settings. -## Hardware +# Hardware The Le Potato comes in two flavours: 1GB of RAM and 2GB of RAM. Either will suffice here, though I would go with the 2GB variant just because the 1GB version isn't really that much cheaper. Aside from the board itself, you'll also need a wired network connection<sup id="n1r"><a href="#n1">1</a></sup>, a micro SD card, and an HDMI monitor and keyboard for initial setup, though you can use SSH to access it over the network after that. @@ -14,7 +14,7 @@ Like the Pi, the Le Potato lacks any built-in storage, so you'll need to supply Finally, I'd recommend getting a case. Fortunately, the Le Potato has the same dimensions and layout as, and as such is compatible with cases for, the Raspberry Pi 3 Model B. I 3D printed [this one](https://www.printables.com/model/67681-raspberry-pi-3b-case/files) in PETG, and a wide array of cases are available for cheap online if you can't do the same. I especially like the one that looks like a little NES. -## Booting an OS +# Booting an OS Since I'd heard the Le Potato was broadly compatible with the Pi, I initially tried booting a Raspbian image from the official Raspberry Pi flasher tool. Maybe predictably, this did not work. The next thing I tried, and what we'll be using, is Armbian, a lightweight port of Debian designed for tiny SBCs like this one that happens to have a page on its website specifically for the Le Potato. @@ -33,7 +33,7 @@ sudo apt update sudo apt upgrade ``` -## Setting Up Pi-hole +# Setting Up Pi-hole Installing Pi-hole is pretty simple. Just download and run the install script: @@ -46,7 +46,7 @@ The script will prompt you for some settings. Most of them are pretty straightfo The last step to get Pi-hole working on your network is to set its static IP as your router's primary DNS server. The Pi-hole devs recommend setting your Pi-hole device as the only DNS server for the network to guarantee it always gets every request, but I set a couple of fallbacks in case my Pi-hole server ever goes down and it seems to still work fine. -## Post-setup Configuration +# Post-setup Configuration Pi-hole has a lot of powerful functionality, but here I'd like to focus on fine-tuning your blocklist. The default one is pretty good, but [The Firebog](https://firebog.net/) has a lot of good ones if you'd like to broaden your coverage — I use one or two of the green ones from each category. diff --git a/blog/posts/make_your_own_cables/index.md b/blog/posts/make_your_own_cables/index.md index c981dbc..16f1bf2 100644 --- a/blog/posts/make_your_own_cables/index.md +++ b/blog/posts/make_your_own_cables/index.md @@ -1,6 +1,8 @@ My current main headphones are a model that doesn't come with a removable cable by default, that I purchased through a company that offers a service to add one aftermarket for you. They offered multiple different connector options, and I chose this one: - +<figure class="media"> + <img src="4pinminixlr.png" alt="4-pin mini XLR male and female jacks. The pins are arranged in a Y shape."> +</figure> This is one of two connector types that come up when you search for "4-pin mini XLR". I opted for this connector on the basis that it would allow me to potentially use the headphones with a balanced output in the future, because I had been researching headphones for probably several days and eventually you start to think that kind of thing is important. @@ -11,25 +13,23 @@ So universally is this the case that there is seemingly essentially no market fo Instead of shelling out Intel Core i3-13100F money for what functionally amounts to 3 meters of wire and a couple of audio jacks, I lopped the connectors off of the old, broken cable and soldered on some new wires and saved myself $140. <figure class="media"> - <div> - <img src="homebrewxlrcablefinished.jpg" alt="A 3.5mm jack to 4-pin mini XLR adapter cable with a shiny black braided exterior"> - <figcaption>This braided sheathing can be had for cheap on Amazon by searching "braided cable sleeve". I used the 6mm variant here, and it comfortably fits the three 24AWG wires.</figcaption> - </div> + <img src="homebrewxlrcablefinished.jpg" alt="A 3.5mm jack to 4-pin mini XLR adapter cable with a shiny black braided exterior"> + <figcaption>This braided sheathing can be had for cheap on Amazon by searching "braided cable sleeve". I used the 6mm variant here, and it comfortably fits the three 24AWG wires.</figcaption> </figure> This isn't the only time I've had to do this, either â I, through a bizarre series of events, happen to own a piece of musical equipment made in the 1960s, in the Netherlands, with weird output jacks to match: - +<figure class="media"> + <img src="2pindin.jpg" alt="Male and female 2-pin DIN connectors"> +</figure> These are 2-pin DIN connectors, from the same family as the 5-pin DIN connectors you may be familiar with from their use in MIDI ports. My device uses a pair of these for stereo output. I can only assume this was standard at the time, in the Netherlands, but where and when I live this type of connector is all but unheard of, to the point that there are *no* cables with it available whatsoever, only the bare connectors. In order to get this thing connected to my other equipment, I had to fashion my own adapter cable out of a stereo-to-dual-mono TRS splitter cable and two of those connectors purchased standalone from the internet. <figure class="media"> - <div> - <img src="homebrew2pindincable.jpg" alt="A Stereo 1/4 inch TRS to dual mono 2-pin DIN adapter cable"> - <figcaption>I wonder how far away from me the nearest other cable of this type is.</figcaption> - </div> + <img src="homebrew2pindincable.jpg" alt="A Stereo 1/4 inch TRS to dual mono 2-pin DIN adapter cable"> + <figcaption>I wonder how far away from me the nearest other cable of this type is.</figcaption> </figure> I'm not going to attempt to teach you how to do this here â there's plenty of people on Youtube who are much more qualified to do that than me â but I think if you're at all comfortable messing with electronics this is a good skill to have. It's proven surprisingly useful to me, not just as a hobbyist who builds weird electronic gizmos for fun but as a casual enjoyer and maker of music. diff --git a/blog/posts/my_terrible_distro_hop/index.md b/blog/posts/my_terrible_distro_hop/index.md index 556da49..c8072c8 100644 --- a/blog/posts/my_terrible_distro_hop/index.md +++ b/blog/posts/my_terrible_distro_hop/index.md @@ -1,4 +1,4 @@ -## Prologue +# Prologue Of late, I've been having some mildly annoying, highly esoteric issues, of the sort any desktop OS tends to develop given enough time, with my daily-driver install of the Arch-based EndeavourOS with XFCE. The most annoying of these annoyances include the XFCE panel daemon having stopped running on login, which I dealt with by binding the command to start it to a keyboard shortcut, and the monitor layout defaulting to mirrored every time I locked the screen, which I dealt with much the same way. I say of late, but I've been dealing with this shit for months. These seemed like bugs somewhere deep in XFCE that I really didn't have the energy to try to fix, so my solution was to just go scorched-earth and start again with something new. @@ -6,11 +6,11 @@ The something new I landed on was a fresh install of Fedora. I chose Fedora part I had no idea what I was about to get myself into. -## The Installation Experience +# The Installation Experience The installation went very smoothly. I was actually pretty impressed. It was probably the fastest I've ever installed Linux - All it did was prompt me for a language, timezone, and the drive to install to and a few minutes later it was done. Fast and simple even by Linux installation standards. It was the next part that was painful. -## Setup (Or Rather, My Doomed Attempt Thereof) +# Setup (Or Rather, My Doomed Attempt Thereof) I should say here that this isn't a review of Fedora as much as it is just me venting. It seems like it would be great for the kind of user it's designed for, but as it turns out that is *not* me. Honestly, a lot of this stuff may or may not have been my fault. Anyway, on to the pain. @@ -26,7 +26,7 @@ To be clear, this probably would have been fine if flatpaks were already my go-t On a related note, a lot of the software in the repositories that were available to me was *severely* outdated. PrusaSlicer, for example, was only available in version 2.4.2, which was released in April of 2022. As of writing in February of 2024, the latest version is 2.7.1. It was upon going to Prusa's website to download the AppImage of the latest version like some kind of fucking caveman and discovering that AppImageLauncher<sup id="n2r"><a href="#n2">2</a></sup> wasn't in *any* of the repos that I got fed up, decided I wasn't gonna risk dealing with this type of shit for every program I wanted to install and noped out. -## Where To Next +# Where To Next So Fedora was a bust, so where do I go from here? I considered moving to an Ubuntu-based distribution like Pop!_OS or Mint that might give me what I wanted from Fedora, and I briefly considered going back to Manjaro for reasons I have honestly forgotten, but I had been at this for hours now and I really just wanted my computer in a usable state again with the minimum possible amount of adaptation, so I came crawling back to EndeavourOS, and went to take a nap while it installed to hopefully come back to this ordeal with a cooler head. @@ -38,7 +38,7 @@ Beyond that, I've been acclimating to the fresh install pretty much fine. All my I do have one very difficult issue, though. -## What Is The Fucking Deal With ProtonVPN On Linux +# What Is The Fucking Deal With ProtonVPN On Linux I use ProtonVPN, and one of the things I attempted to do on Fedora was set it back up. I don't know what I did originally to dodge this, but trying to set it up recently, both on Fedora and on Arch, has been an excercise in navigating an insane maze of complete and utter bullshit. @@ -103,7 +103,7 @@ Two, what's going on with ProtonVPN clients on Linux? It looks like the Electron Also, three, why wasn't network-manager-applet already installed? This thing seems like a pretty important system package, especially given the rest of network-manager was already present and seems to be the thing allowing me to connect to the internet right now. Well, such is Arch I suppose. The type of Linux user who runs this thing seems to tend towards having a pathological obsession with bloat and the relevant de-'s<sup id="n3r"><a href="#n3">3</a></sup>. -## Oh Sweet It's Fine Actually +# Oh Sweet It's Fine Actually That concludes my blog post, and the blog-post-within-a-blog-post that appears to have metastasized up there. I think you should know I finished troubleshooting both ProtonVPN *and* OBS while writing the post chronicling my suffering. Thank you for indulging my bitching and moaning about totally avoidable software problems. Who knows, maybe this will help you. For your sake, I hope it doesn't. diff --git a/blog/posts/renting_an_unremarkable_server/index.md b/blog/posts/renting_an_unremarkable_server/index.md index 117de85..e2be7a9 100644 --- a/blog/posts/renting_an_unremarkable_server/index.md +++ b/blog/posts/renting_an_unremarkable_server/index.md @@ -15,7 +15,7 @@ In researching alternative VPS options, I landed on OVH because they were the mo See what I mean? Of course, none of these seem like all that from the perspective of a modern personal computer, but this represents a *quadrupling* of CPU cores and RAM and a *sextupling* of storage space for a near halving of the price compared to my already adequate previous solution. That's like eight times the value! Though, looking at this table, you can already see a couple of the reasons it's priced so competitively, even accounting for the DigitalOcean tax. Let's break this down. -## The Ebay Optiplex gaming PC of rented servers +# The Ebay Optiplex gaming PC of rented servers So I've moved from a VPS to a dedicated server. The fundamental difference between them is that a VPS is a virtual machine that your hosting provider spins up for you, while a dedicated, or bare-metal, server is just a whole computer that you rent sole administrative privileges over. @@ -27,7 +27,7 @@ If you're the sort of person who memorizes server part numbers, you may have alr Financials aside, it should go without saying that this new-to-me server is *way* overkill for the handful of websites and single-user self-hostable network services I'll be running on it. The old VPS had plenty of computing power for that. The main draw for me was the extra storage space — I might have gone even cheaper, except all the cheaper options were restricted to network speeds that I actually felt uncomfortable limiting myself to. -## Migrating to the thang ding +# Migrating to the thang ding Of course, then there's the matter of actually migrating everything over. It went about as smoothly as you could reasonably expect. DigitalOcean, turns out, loves their vendor lock-in and won't let you download an image of your VPS directly, so it was a lot of making .tar.gz archives on the old server, downloading them over sftp, and then uploading them to the new server. diff --git a/blog/posts/sf5_estrogen_moth/index.md b/blog/posts/sf5_estrogen_moth/index.md new file mode 100644 index 0000000..c4ab821 --- /dev/null +++ b/blog/posts/sf5_estrogen_moth/index.md @@ -0,0 +1,70 @@ +I'm currently knee-deep in a playthrough of Skyfactory 5, which for the bafflingly uninformed reader is a skyblock tech modpack for Minecraft. Among many others, it includes the Create mod, and it will come as no surprise to those familiar with my proclivities that my first impulse upon finding this out was to mod my modpack to include the [Create: Estrogen](https://modrinth.com/mod/estrogen) addon. + +This went surprisingly smoothly, except for one thing. See, the Estrogen addon adds a few things that have nothing whatsoever to do with the eponymous fluid processing line and consumable items, including one mob: a rosy maple moth. + +<figure class="media"> + <img src="moth.png" alt="The Rosy Maple Moth mob in question. It's clear that it was modeled on the vanilla bee."> +</figure> + +This presents a problem because of Skyfactory 5's absurdly custom progression system. Instead of mob spawning working normally, trees drop loot bags, which give "gateway pearls" that summon little challenge events where you fight a specific mob and get a trophy as a reward that can be used to toggle spawning of that mob in your world, which then ignores almost all of the mob's typical spawning conditions and just plonks it down anywhere. Transphobically, this system was not designed with my aftermarket mod in mind, so if I wanted the moths in my world in a way that could reasonably be called legitimate I was gonna have to do some tinkering. + +I'd be content to just not bother except that I want one of the items that you can only get via moth, a pair of thigh high socks that provide extremely high resistance to fall damage and are made from Moth Fuzz, which of course you can only get from the moths. I could, of course, just spawn a couple moths in with commands and farm the necessary fuzz from them, but that's the coward's way out. + +Luckily for me, a lot of the custom stuff in Skyfactory 5 is done using datapacks applied globally to every world, which means it can be augmented by just futzing with some json files in the game install folder. So far, I've managed to create a custom Gateway Pearl, add it to the loot table for Pink Loot Bags, and add the reward trophy. However, the pearl's name is bugged, the moths don't attack you during the event like they're supposed to, and the trophy doesn't toggle spawns. Also, it's just the standard gateway pearl — I didn't bother integrating this with any of the more advanced challenge gateway stuff because I don't care. + +However however, this is enough to get moths in my world because the gateway event spawns a couple of the respective mob when you win, so I'm content to stop here for now. I'll update this post if I make any more progress towards integrating this properly. If you've got any information to that end, I'd appreciate hearing about it. This blog has a comment box and my various contact info is listed on the About Me page. + +Also, I did this on version 5.0.8 of the modpack. Just something to keep in mind. + +# How to do it + +The upside of my woefully incomplete solution is that it's relatively simple to set up. All you gotta do is add two .json files and modify a third. + +## Trophy + +To create the trophy, create `moth.json` in `<your game folder>/global_packs/required_data/skyfactory_5/data/obtrophies/trophies` with the following content: + +<p class="codetitle">moth.json</p> + +``` +{ + "entity": "estrogen:moth", + "scale": 1.5 +} +``` + +This is technically an optional step because the trophy doesn't do anything, but the JSON for the gateway pearl expects it to be there. Also, the scale entry doesn't need to be there — all it does is make the model on the trophy bigger. It's purely cosmetic, but I like it. + +## Gateway Pearl + +To add the gateway pearl and event, place this file inside `<your game folder>/global_packs/required_data/skyfactory_5/data/gateways/gateways/normal`: + +[moth.json](moth.json) + +This is just the json file for the teacup pig gateway, except I've swapped every mention thereof out for the moths. Which mob the base file is isn't super important, but this one is convenient because it's already pink and already has the configuration required to spawn the mob for you after you win the challenge. Hostile mob gateways don't do this, for obvious reasons. + +## Loot Tables + +Finally, add the pearl to one of the loot tables defined in `<your game folder>/global_packs/required_data/skyfactory_5/data/treasurebags/loot_tables/bags` by adding this entry to the relevant json file: + +<p class="codetitle">pink.json</p> + +``` +...}, +{ + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/moth\"}" + } + ] +} +... +``` + +For your convenience, I've also uploaded my version of `pink.json` with this entry added. Just overwrite the existing version (again, inside `<your game folder>/global_packs/required_data/skyfactory_5/data/treasurebags/loot_tables/bags`) with it and it should work. + +[pink.json](pink.json)
\ No newline at end of file diff --git a/blog/posts/sf5_estrogen_moth/index.php b/blog/posts/sf5_estrogen_moth/index.php new file mode 100644 index 0000000..952e6d9 --- /dev/null +++ b/blog/posts/sf5_estrogen_moth/index.php @@ -0,0 +1 @@ +<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php');
\ No newline at end of file diff --git a/blog/posts/sf5_estrogen_moth/moth.json b/blog/posts/sf5_estrogen_moth/moth.json new file mode 100644 index 0000000..0d6715a --- /dev/null +++ b/blog/posts/sf5_estrogen_moth/moth.json @@ -0,0 +1,192 @@ +{ + "__typename": "NormalGateway", + "size": "small", + "color": "#f38caa", + "failures": [ + { + "type": "gateways:command", + "command": "summon item ~ ~1 ~ {NoGravity:1b,Glowing:1b,Invulnerable:1b,Item:{id:\"gateways:gate_pearl\",Count:1b,tag:{gateway:\"gateways:normal/moth\"}}}", + "desc": "gateways.failures.common.gateway_pearl" + }, + { + "type": "gateways:command", + "command": "team join sf5_gold_team @e[distance=..5,nbt={Item:{id:\"gateways:gate_pearl\"}}]", + "desc": "" + } + ], + "waves": [ + { + "entities": [ + { + "type": "gateways:standard", + "count": 4, + "entity": "estrogen:moth", + "nbt": "{DeathLootTable:\"skyfactory_5:gateway_entities\",ArmorItems:[{},{},{},{id:\"simplehats:fro\",Count:1b,tag:{display:{color:16352035},Unbreakable:1b}}],\"pehkui:scale_data_types\":{\"pehkui:hitbox_width\":{scale:1f},\"pehkui:width\":{scale:1f},\"pehkui:height\":{scale:1f}},Tags:[\"gateway_entity\"]}" + } + ], + "rewards": [ + { + "type": "gateways:experience", + "experience": 50 + }, + { + "type": "gateways:stack", + "stack": { + "item": "minecraft:pink_dye", + "count": 16 + } + } + ], + "max_wave_time": 1200, + "setup_time": 200 + }, + { + "entities": [ + { + "type": "gateways:standard", + "count": 4, + "entity": "estrogen:moth", + "nbt": "{DeathLootTable:\"skyfactory_5:gateway_entities\",ArmorItems:[{},{},{},{id:\"simplehats:fro\",Count:1b,tag:{display:{color:16352035},Unbreakable:1b}}],\"pehkui:scale_data_types\":{\"pehkui:hitbox_width\":{scale:0.95f},\"pehkui:width\":{scale:1.5f},\"pehkui:height\":{scale:1.5f}},Tags:[\"gateway_entity\"]}" + } + ], + "modifiers": [ + { + "type": "gateways:attribute", + "attribute": "generic.max_health", + "operation": "multiply_total", + "value": 0.15 + }, + { + "type": "gateways:attribute", + "attribute": "generic.armor", + "operation": "addition", + "value": 2 + }, + { + "type": "gateways:attribute", + "attribute": "generic.attack_damage", + "operation": "multiply_total", + "value": 0.15 + }, + { + "type": "gateways:attribute", + "attribute": "generic.knockback_resistance", + "operation": "addition", + "value": 0.05 + }, + { + "type": "gateways:attribute", + "attribute": "generic.movement_speed", + "operation": "multiply_total", + "value": 0.05 + } + ], + "rewards": [ + { + "type": "gateways:experience", + "experience": 75 + }, + { + "type": "gateways:stack", + "stack": { + "item": "minecraft:pink_dye", + "count": 16 + } + } + ], + "max_wave_time": 1800, + "setup_time": 280 + }, + { + "entities": [ + { + "type": "gateways:standard", + "count": 4, + "entity": "estrogen:moth", + "nbt": "{DeathLootTable:\"skyfactory_5:gateway_entities\",ArmorItems:[{},{},{},{id:\"simplehats:fro\",Count:1b,tag:{display:{color:16352035},Unbreakable:1b}}],\"pehkui:scale_data_types\":{\"pehkui:hitbox_width\":{scale:0.8f},\"pehkui:width\":{scale:2f},\"pehkui:height\":{scale:2f}},Tags:[\"gateway_entity\"]}" + } + ], + "modifiers": [ + { + "type": "gateways:attribute", + "attribute": "generic.max_health", + "operation": "multiply_total", + "value": 0.2 + }, + { + "type": "gateways:attribute", + "attribute": "generic.armor", + "operation": "addition", + "value": 3 + }, + { + "type": "gateways:attribute", + "attribute": "generic.attack_damage", + "operation": "multiply_total", + "value": 0.2 + }, + { + "type": "gateways:attribute", + "attribute": "generic.knockback_resistance", + "operation": "addition", + "value": 0.15 + }, + { + "type": "gateways:attribute", + "attribute": "generic.movement_speed", + "operation": "multiply_total", + "value": 0.1 + } + ], + "rewards": [ + { + "type": "gateways:experience", + "experience": 100 + }, + { + "type": "gateways:stack", + "stack": { + "item": "minecraft:pink_dye", + "count": 32 + } + } + ], + "max_wave_time": 2400, + "setup_time": 340 + } + ], + "rewards": [ + { + "type": "gateways:experience", + "experience": 250 + }, + { + "type": "gateways:command", + "command": "summon item ~ ~1 ~ {NoGravity:1b,Glowing:1b,Invulnerable:1b,Item:{id:\"obtrophies:trophy\",Count:1b,tag:{BlockEntityTag:{VariantID:0,entity:\"estrogen:moth\"}}}}", + "desc": "gateways.rewards.trophy.moth" + }, + { + "type": "gateways:command", + "command": "team join sf5_gold_team @e[distance=..5,nbt={Item:{id:\"obtrophies:trophy\"}}]", + "desc": "" + }, + { + "type": "gateways:summon", + "entity": { + "type": "gateways:standard", + "count": 4, + "entity": "estrogen:moth", + "nbt": "{DeathLootTable:\"skyfactory_5:gateway_entities\",ArmorItems:[{},{},{},{id:\"simplehats:fro\",Count:1b,tag:{display:{color:16352035},Unbreakable:1b}}],\"pehkui:scale_data_types\":{\"pehkui:hitbox_width\":{scale:1f},\"pehkui:width\":{scale:1f},\"pehkui:height\":{scale:1f}},Tags:[\"gateway_entity\"]}" + } + } + ], + "rules": { + "leash_range": 32, + "spacing": 32, + "spawn_range": 2 + }, + "boss_event": { + "mode": "name_plate" + }, + "spawn_algorithm": "gateways:inward_spiral" +} diff --git a/blog/posts/sf5_estrogen_moth/moth.png b/blog/posts/sf5_estrogen_moth/moth.png Binary files differnew file mode 100644 index 0000000..603cef7 --- /dev/null +++ b/blog/posts/sf5_estrogen_moth/moth.png diff --git a/blog/posts/sf5_estrogen_moth/pink.json b/blog/posts/sf5_estrogen_moth/pink.json new file mode 100644 index 0000000..13179d2 --- /dev/null +++ b/blog/posts/sf5_estrogen_moth/pink.json @@ -0,0 +1,306 @@ +{ + "pools": [ + { + "rolls": 1, + "entries": [ + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/axolotl\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/axolotl\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/jumbo_rabbit\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/jumbo_rabbit\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/hoglin\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/hoglin\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/moolip\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/moolip\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/pig\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/pig\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/piglin\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/piglin\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/piglin_brute\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/piglin_brute\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/teacup_pig\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/teacup_pig\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/pink_vein_creeper\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/pink_vein_creeper\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/zoglin\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/zoglin\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/zombified_pig\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/zombified_pig\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/zombified_piglin\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/zombified_piglin\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/shrimp\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:titan/shrimp\"}" + } + ] + }, + { + "type": "item", + "name": "gateways:gate_pearl", + "weight": 100, + "functions": [ + { + "function": "set_nbt", + "tag": "{gateway:\"gateways:normal/moth\"}" + } + ] + } + ] + } + ] +} diff --git a/blog/posts/stop_using_chromium/index.md b/blog/posts/stop_using_chromium/index.md index bbfacc2..ca89fc6 100644 --- a/blog/posts/stop_using_chromium/index.md +++ b/blog/posts/stop_using_chromium/index.md @@ -10,15 +10,15 @@ Chromium is the open-source foundation upon which Google's otherwise proprietary - Qutebrowser - [Many others](https://en.wikipedia.org/wiki/Chromium_(web_browser)#Browsers_based_on_Chromium) -## Why is that a bad thing? +# Why is that a bad thing? Chrome and other Chromium-based browsers account for around 90% of the total web browser market share at the moment. This gives Google, a trillion-dollar for-profit advertising firm, immense control over the web and the standards on which it runs, control that it frequently abuses and inarguably should not have. -## What kind of abuses? +# What kind of abuses? You name it. To name a few recent examples: -### FLoC/Topics API +## FLoC/Topics API Google's response to the phasing out of third-party cookies, a system that had legitimate uses which were outweighed by the privacy violations they could be and more frequently were used to commit, was to introduce an API that was only capable of the sketchy parts. @@ -32,7 +32,7 @@ While theoretically better than third-party cookies, which make identifying you - [Ars Technica - Google drops FLoC after widespread opposition, pivots to "Topics API" plan](https://arstechnica.com/gadgets/2022/01/google-drops-floc-after-widespread-opposition-pivots-to-topics-api-plan/) - [Update 2023-09-08] [Ars Technica - Google gets its way, bakes a user-tracking ad platform directly into Chrome](https://arstechnica.com/gadgets/2023/09/googles-widely-opposed-ad-platform-the-privacy-sandbox-launches-in-chrome/) -### JPEG XL +## JPEG XL JPEG XL is a new image format created by the Joint Photographic Experts Group, who you may know as the people who brought you JPEG back in '92. JPEG XL is fully backwards compatible with legacy JPEG, supports features like transparency, lossless compression, and animation, and has far superior compression and support for far larger images with higher color depth than existing formats. It's objectively better in every way than everything it competes with. However... @@ -41,7 +41,7 @@ Google killed JPEG XL, plain and simple. It implemented opt-in support for it in - [jpegxl.info](https://jpegxl.info/) - [Free Software Foundation - Google's decision to deprecate JPEG-XL emphasizes the need for browser choice and free formats](https://www.fsf.org/blogs/community/googles-decision-to-deprecate-jpeg-xl-emphasizes-the-need-for-browser-choice-and-free-formats) -### Web Environment Integrity +## Web Environment Integrity Web Environment Integrity is a proposal by Google (or, if you care about semantics, four Google engineers on one of their personal GitHub accounts) for a standard that would allow websites to check with a third-party attester to prove that a "web environment" - in other words, the user's web browser and operating system - is "trustworthy" and has not been "tampered with". @@ -55,13 +55,13 @@ Despite this spec being merely a proposal on a Google engineer's personal GitHub - [Vivaldi - Unpacking Google's new âdangerousâ Web-Environment-Integrity specification](https://vivaldi.com/blog/googles-new-dangerous-web-environment-integrity-spec/) - [Ben Wiser (Google), Borbala Benko (Google), Philipp Pfeiffenberger (Google), Sergey Kataev (Google) - Web Environment Integrity Explainer](https://github.com/RupertBenWiser/Web-Environment-Integrity/blob/main/explainer.md) -### So what do I do then? +## So what do I do then? I implore you to use a browser that's not based on Chromium. If you're on a Mac, you can just use Safari, but otherwise, your only major option is [Firefox](https://www.mozilla.org/en-US/firefox/), or a fork thereof such as [LibreWolf](https://librewolf.net/). I get the impression that a lot of less tech-savvy users find the prospect of switching browsers, especially after years of using the same one, to be quite intimidating, but it's really not. Firefox is able to import all your bookmarks, saved passwords, and other browsing data directly from Chrome, and is highly customizable and has a rich ecosystem of extensions and themes so you can make it resemble what you're used to. Mozilla has an easy official [guide](https://support.mozilla.org/en-US/kb/switching-chrome-firefox) to import your data from Chrome, and it works with most other browsers as well. -### Cool, but I don't care. Let me look at your website. +## Cool, but I don't care. Let me look at your website. If you got redirected here, you may be able to circumvent it by configuring your browser to send a different user-agent string. I'd recommend clearing your cache after, in case your browser cached the redirect signal. diff --git a/blog/posts/toshiba_chromebook/index.md b/blog/posts/toshiba_chromebook/index.md index 73d0c46..92716f0 100644 --- a/blog/posts/toshiba_chromebook/index.md +++ b/blog/posts/toshiba_chromebook/index.md @@ -3,10 +3,8 @@ It's always hard to believe that events that happened ten years ago happened *te The first computer I ever owned was this thing: <figure class="media"> - <div> - <img src="chromebook.jpg" alt="The Toshiba Chromebook 2, an unassuming 13-inch laptop made of light grey plastic. As one might expect, it is running Chrome OS."> - <figcaption>Image courtesy of PCMag, from their <a href="https://www.pcmag.com/reviews/toshiba-cb35-b3340-chromebook-2">review</a> of this machine.</figcaption> - </div> + <img src="chromebook.jpg" alt="The Toshiba Chromebook 2, an unassuming 13-inch laptop made of light grey plastic. As one might expect, it is running Chrome OS."> + <figcaption>Image courtesy of PCMag, from their <a href="https://www.pcmag.com/reviews/toshiba-cb35-b3340-chromebook-2">review</a> of this machine.</figcaption> </figure> This is the Toshiba Chromebook 2. The high-trim model that I had sports a 13-inch 1080p screen, Skullcandy-branded speakers, a whopping 4GB of RAM, the world's most sopping wet and pathetic dual-core Intel Celeron CPU, and 16GB of EMMC storage. It also comes with 100GB of free Google Drive storage for two full years, which sounds like some nasty ploy to sell you a subscription, but with how long you'll be using the thing for may as well be a second internal SSD. diff --git a/blog/posts/unity_runtime_fee_and_proprietary_software/index.md b/blog/posts/unity_runtime_fee_and_proprietary_software/index.md index 633b1a5..84b3b1a 100644 --- a/blog/posts/unity_runtime_fee_and_proprietary_software/index.md +++ b/blog/posts/unity_runtime_fee_and_proprietary_software/index.md @@ -14,9 +14,11 @@ For example, Among Us has over 500 million downloads on the Google Play Store al That's an extreme example, but I think it gets the point across. If you don't believe me, take it from developers on Twitter (via [u/Sparky2199](https://archive.ph/IQPjW)): -[](devprotest.png) +<figure class="media"> + <img src="devprotest.png" alt="Compilation of various twitter posts from indie game studios using Unity complaining about the change."> +</figure> -## The obligatory free software soapbox moment +# The obligatory free software soapbox moment As angry as I am about this, I do feel kind of vindicated, because here's the thing: something like this was always going to happen. Not because Unity in particular is a *bad* company (although it is), but because it's a *for-profit* company, and especially because it's one with shareholders to please. @@ -30,7 +32,7 @@ This problem isn't unique to Unity, or to game engines. We've been watching this It's my opinion that all proprietary software will die this way in the end. The structure is fundamentally unsustainable. You can't have infinite growth. At some point all the proprietary software and services that are commomplace nowadays with their ad-supported business models and predatory pricing schemes and suspiciously high marketing budgets will wither and die, having made themselves intolerable to even their most loyal customers, and most of the survivors will be open-source projects. Not as sleek or sexy or well-advertised, as they'll have had less incentive to appeal to new users, but fundamentally sustainable, having had *no* incentive to appeal to shareholders. -## An attempt at optimism +# An attempt at optimism In this particular case, I don't think this is gonna stick. Unity's runtime fee is absurd, and I think they know it just as well as all their moderately high-profile customers on Twitter do. Unity has already started to walk back some of the more extreme parts of the initial plan, as you can see on archived versions of the posts: [Blog post (Sep 12)](https://archive.ph/gEckm), [Blog post (Sep 14)](https://archive.ph/gBpXw), [Forum thread (Sep 12)](https://archive.ph/HYTq5), [Forum thread (Sep 14)](https://archive.ph/eByMm). Unity also has some customers that are bigger than them and notoriously litigation-happy, namely Nintendo (with Pokemon BD/SP and Go, plus a couple Mario mobile games) and Disney (also with quite a few mobile and console games). Unity's CEO also sold a bunch of stock in the company in the lead-up to this announcement, which, since the company's stock price dropped *significantly* after the announcement, might actually constitute fraud. You know, from federal crimes! Basically, this initial announcement was probably an attempt to see how much they could get away with, and Unity's probably fucked if they stick to their guns on this. @@ -38,7 +40,7 @@ On the technical side, if you're a budding game developer, Unity isn't your only Finally, if you've been eyeing a game that uses the Unity engine, you've got until the end of the year to install it without incurring that fee for the developer assuming this change goes through. So I'd check for that. By my understanding you'll have to run it at least once before then, too. -## Update as of 2023-09-23 +# Update as of 2023-09-23 Good(?) news! Unity's responded to community feedback and it's actually... better than I expected. You can read the full post [here](https://archive.ph/rLi8u), but I'll summarize the changes: @@ -7,12 +7,12 @@ $defaultmodstatus = 1; # If 0, all posts will be held for review by default. # If 1, only posts containing the banned words defined in # $datadir/bannedwords.json will be held for review. $gbform_messages = array ( - "success" => "<span class='success'>Successfully posted!</span>", - "review" => "<span class='warning'>Sumitted for review!</span>", - "botcheckfailed" => "<span class='error'>Bot test failed!</span>", - "noname" => "<span class='error'>Name required!</span>", - "nomessage" => "<span class='error'>Message required!</span>", - "invalidlink" => "<span class='error'>Invalid link!</span>", - "banned" => "<span class='error'>You've been banned.</span>" + "success" => "<p class='notice success'>Successfully posted!</p>", + "review" => "<p class='notice warning'>Sumitted for review!</p>", + "botcheckfailed" => "<p class='notice error'>Bot test failed!</p>", + "noname" => "<p class='notice error'>Name required!</p>", + "nomessage" => "<p class='notice error'>Message required!</p>", + "invalidlink" => "<p class='notice error'>Invalid link!</p>", + "banned" => "<p class='notice error'>You've been banned.</p>" ); ?>
\ No newline at end of file diff --git a/etc/bg.jpg b/etc/bg.jpg Binary files differdeleted file mode 100644 index 539fd56..0000000 --- a/etc/bg.jpg +++ /dev/null diff --git a/etc/bg.jxl b/etc/bg.jxl Binary files differdeleted file mode 100644 index daff312..0000000 --- a/etc/bg.jxl +++ /dev/null diff --git a/etc/bg_dither.png b/etc/bg_dither.png Binary files differdeleted file mode 100644 index 8d5661f..0000000 --- a/etc/bg_dither.png +++ /dev/null diff --git a/etc/index.php b/etc/index.php deleted file mode 100644 index d1702b3..0000000 --- a/etc/index.php +++ /dev/null @@ -1,77 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> - -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>More</title> - <link href="../style.css" rel="stylesheet" type="text/css" media="all"> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> -</head> - -<body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(); ?> - <h1>more</h1> - <h2 id="caption">more</h2> - <nav><a href="quotes/">quotes</a><a href="https://rss-bridge.isopod.cool/?action=display&bridge=GiteaBridge&context=Commits&branch=main&host=https%3A%2F%2Fgit.isopod.cool&user=will&project=isopod.cool&format=Atom">changelog (atom)</a><!--a href="changelog.php">changelog (legacy)</a--></nav> - - <!--h2>Time warp</h2> - <p><a href="../old/1/">v1</a> - Old, slow, basically just a carrd page on steroids. Made heavy use of <code>float</code> initially. Ugh.</p> - <p><a href="../old/2/">v2</a> - Slick as hell but entirely Javascript-dependent. This is where my webpage became a website.</p--> - <h2>Buttons</h2> - <div class="buttons"> - <a target="_blank" href="https://easyussr.neocities.org/torrenting.html"><img src="buttons/piracy.gif" alt="Piracy Now!"></a> - <a target="_blank" href="https://www.videolan.org/"><img src="buttons/getvlcnow.png" alt="get VLC now!"></a> - <a target="_blank" href="https://isopod.zone/"><img src="buttons/neo-fedi.gif" alt="Join the Fediverse!"></a> - <a target="_blank" href="https://www.youtube.com/watch?v=nleepK7P978"><img src="buttons/35mm.gif" alt="Best heard through a 3.5mm jack"></a> - <a target="_blank" href="https://frame.work"><img src="buttons/bestviewed.gif" alt="Best viewed with a computer"></a> - <img src="buttons/tested_on_firefox.gif" alt="Tested on Firefox"> - <img src="buttons/nowebp.gif" alt="No WebP! Just use PNG"> - <img src="buttons/svg.svg" alt="Scalable Vector Graphics Now!" style="width:88px; height:31px;" /> - <a target="_blank" href="http://web3.14159.annwfn.net/"><img src="buttons/web-pi.png" alt="Web Pi Certified"></a> - <a target="_blank" href="https://neocities.org"><img src="buttons/neocities_stamp.gif" alt="Neocities: The web is yours"></a> - <a href="https://status.cafe/"><img src="/blog/media/banner-statuscafe.png" alt="Status Cafe"></a> - <a target="_blank" href="http://www.ermel.org/handcoded/"><img src="buttons/handcode.png" alt="100% hand coded HTML"></a> - <a target="_blank" href="https://12ft.io/"><img src="buttons/dontyouhate.gif" alt="Don't you hate it when you're reading a page and then some-- This content is for subscribers only! Paywalls Gatekeep Knowledge."></a> - <img src="buttons/righttorepair.png" alt="I support right to repair"> - <img src="buttons/google_stand.gif" alt="Stand up to Google! Fight for open web standards! Fight for online privacy! Fight against monopolistic practices!"> - <a target="_blank" href="https://www.mozilla.org/en-US/firefox/new/"><img src="buttons/chrome.gif" alt="Google Chrome is evil!"></a> - <img src="buttons/i_hate_microsoft.png" alt="I hate Microsoft"> - <img src="buttons/win11no.gif" alt="Windows 11 No!"> - <img src="buttons/antinft.gif" alt="This is an Anti-NFT site"> - <a target="_blank" href="https://yesterweb.org/no-to-web3/"><img src="buttons/notoweb3.gif" alt="Keep the web free, say no to web3"></a> - <img src="buttons/amd_powered.gif" alt="Powered by AMD"> - <img src="buttons/linux_powered.gif" alt="Linux powered"> - <img src="buttons/drpepper.gif" alt="Powered by Dr Pepper"> - <img src="buttons/the_void.gif" alt="Powered by the void"> - <img src="buttons/miku-approved.gif" alt="This site is Miku approved"> - <img src="buttons/krisbtn.png" alt="Kris where tf are we"> - <a target="_blank" href="https://neofoxfloofexplo.de/"><img src="buttons/floof_explode_88x31.gif" alt=":neofox_floof_explode:"></a> - <img src="buttons/badhtml.png" alt="W3C Bad HTML Markup"> - <img src="buttons/bantimetravel.png" alt="Ban Time Travel "Now""> - <img src="buttons/css.png" alt="CSS is awesome"> - <img src="buttons/tyg.gif" alt="Trans your gender"> - <a target="_blank" href="https://we-are-jammin.xyz/"><img src="https://damcraft.de/88x31/jammin.webp" alt="We're jammin!"></a> - <iframe src="//incr.easrng.net/badge?key=isopoddotcool" style="background: url(//incr.easrng.net/bg.gif)" title="increment badge" width="88" height="31" frameborder="0"></iframe> - <a target="_blank" href="https://crouton.net/"><img src="buttons/usatoday.gif" alt="USA Today Hot Site"></a> - <a target="_blank" href="https://seaslug.neocities.org/"><img src="buttons/shrimp.png" alt="Shrimp Now!"></a> - <img src="buttons/canadian.gif" title="Regrettably..." alt="Canadian on the web"> - <img src="buttons/queercoded.png" alt="You're telling me a queer coded this"> - <img src="buttons/she-her.gif" alt="she/her" title="Its pronouns are she/her"> - <img src="buttons/aro.png" alt="Aromantic pride flag"> - <!--img src="buttons/ace.png"--> - <a href="https://rainy.gay/pride/pridebuttons.html"><img src="buttons/trans.png" alt="Trans pride flag"></a> - <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=digital" style="width: 84px; height: 27px;"></iframe> - <br><a target="_blank" href="https://citrons.xyz/a/memetic-apioform-page.html" - style="display: inline-block; margin-top: .7rem;"><img src="images/apiopage.png" alt="memetic apiopage - click to view"></a> - </div> - <h3>My buttons</h3> - <div class="buttons"> - <img src="buttons/isopodhours.png" alt="isopod hours"> - <a target="_blank" href="https://deeptwisty.com/"><img src="buttons/deeptwisty_button.png" alt="deep twisty"></a> - </div> - <p>Hotlink or don't. I doubt the traffic from your personal site is gonna bring my server to its knees.</p> - -</body> - -</html>
\ No newline at end of file diff --git a/etc/quotes/images/m_pfp.png b/etc/quotes/images/m_pfp.png Binary files differdeleted file mode 100644 index 769319f..0000000 --- a/etc/quotes/images/m_pfp.png +++ /dev/null diff --git a/etc/quotes/index.php b/etc/quotes/index.php deleted file mode 100644 index 2e596f1..0000000 --- a/etc/quotes/index.php +++ /dev/null @@ -1,422 +0,0 @@ -<!--?php ini_set('display_errors', '1'); -ini_set('display_startup_errors', '1'); -error_reporting(E_ALL); -?--> -<!DOCTYPE html> -<html lang="en"> - <head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>#quotes</title> - <link href="../../style.css" rel="stylesheet" type="text/css" media="all"> - <style type="text/css"> - :root { - --bgcolor: #323339; - --fontcolor: #d7d5d9; - --stdfont: sans-serif; - } - a { - color: #1c9cee; - text-decoration: none; - } - a:hover { - color: #1c9cee; - text-decoration: underline; - } - .pfp { - border-radius: 50%; - height: 3rem; - min-width: 3rem; - box-shadow: none; - } - .message { - display: flex; - margin: 1rem; - text-shadow: none; - word-break: break-word; - } - .content { - margin-left: 1rem; - } - hr { - margin: auto; - border-top: 1px solid #42464d; - } - h4 { - padding-left: initial; - border-left: none; - } - </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> - </head> - <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(); ?> - <h1>#quotes</h1> - <h2 id="caption">highlights from the #quotes channel in the discord chat</h2> - <?php - class User { - public string $pfp; - public string $name; - public string $color; - public function __construct(string $p, string $n, string $c) { - $this->pfp = $p; - $this->name = $n; - $this->color = $c; - } - } - $me = new User("h_pfp", "isopod", "00ffb7"); - $vivi = new User("v_pfp", "pink one", "ff009e"); - $sad = new User("s_pfp", "yellow one", "f1c40f"); - $mage = new User("m_pfp", "sea slug", "faaaaa"); - $celian = new User("c_pfp", "bird one", "73fbff"); - $thom = new User("t_pfp", "tomato", "567c2d"); - $goon = new User("g_pfp", "crab one", "2c9c91"); - $portals = new User("p_pfp", "purple one", "5a397d"); - $joy = new User("j_pfp", "green one", "a2ff00"); - - $quotes = array( - array($celian, "i think doom guy should lick the rocky cliffs for precious minerals", true), - array($me, "I don't have aspirations of egghood", true), - array($mage, "I wish australia was [...] real", true), - array($mage, "I accidentally kill over 50 small animals every time I ride my horse. I can kill you too", true), - array($mage, "the jermas have awful breeding problems", true), - array($celian, "<img src='images/greensmile.png' alt='vaguely unsettling green smiley face emoji bearing a strong resemblance to the one from geometry dash'/>", true), - array($me, "swagful"), - array($celian, "You can quote me on that: I LOVE penis", true), - array($celian, "pee is awesome", true), - array($mage, "Our bells jingled with delight!", true), - array($me, "you love my dejected and bindlepilled swag", true), - array($celian, "genshin player slash slur", true), - array($me, "I'm dejected and bindlepilled", true), - array($celian, "you didn't know? every boat comes with free sex", true), - array($me, "you hate my gay little slurry", true), - array($me, "I've gotta up my slop game", true), - array($me, "your horny ass salad<br>you've been eating horny salad", true), - array($vivi, "i dont wanna be a <em>hamster</em> i wanna be a MILF", true), - array($mage, "kirby does not have boobs", true), - array($joy, "Babygirl, you are so bad at eating", true), - array($mage, "I made a facebook account to be transgender", true), - array($me, "having a facebook account makes you less transgender"), - array($celian, "she's trying to kill me", true), - array($mage, "oh HELL yeah"), - array($vivi, "instead of destroying everything how about you DESTROY this AAAAAASSSSSSSSSSSSSSSSSSSSS", true), - array($joy, "Pet names for your partner<ul><li>Sugar</li><li>Sweetheart</li><li>Beautiful princess with a disorder</li><li>Gianni Matragano</li><li>My love</li></ul>", true), - array($me, "L + ratio + no chitin", true), - array($me, "You can't be lumping like that white baby", true), - array($me, "You hate his perfectly symmetrical swag", true), - array($mage, "explodes and dies and gets it all over you", true), - array($vivi, "dont compare yourself to jesus just because you thought of making a number a tumblr sexyman", true), - array($vivi, "that would be skibidiphobic", true), - array($mage, "Why did he turn into a card this is some objectum tf shit", true), - array($vivi, "It's almost like he's transgender"), - array($celian, "I hate weezer and their child<br>fortunately I have killed weezer", true), - array($me, "furries can be trusted to decide who should live and who should die", true), - array($celian, "I'm a slut for polls", true), - array($celian, "i dont like homosexuality", true), - array($vivi, "internalized frog-phobia", true), - array($mage, "I think it's fucked up you can't just kill people", true), - array($mage, "babygirl you piss so bad what the fuck", true), - array($joy, "There's something about digitally altered screams of anguish that really stick in my mind", true), - array($mage, "I would change it to daddy's little slut or something. To inflict maximum damage. But rat slut amongus family is good...", true), - array($celian, "I think you just hate my water-soluble swag", true), - array($vivi, "put your words in my mouth and sentence all over me like a paragraph", true), - array($vivi, "i miss going ssssssssss in your whore tree banthrom", true), - array($celian, "YOU"), - array($vivi, "going sssssss and pppppppppp was the highlight of it for me"), - array($celian, "đ"), - array($celian, "picks yuo up<br>picks you up like you are a baby seal", true), - array($mage, "Yoooooooo<br>Makes noises<br>Euuuh ueh uh huah"), - array($vivi, "is the devil from the bible a pillow princess?", true), - array($me, "you would disparage the humble onion?", true), - array($vivi, "fruited the fuck out", true), - array($mage, "Babygirl you are so servers in United States", true), - array($mage, "Big BAWS. Naked Snake. Big BAWS. Naked Snake. Metal Gear Solid 3. 3. 3. Metal Gear Solid 3. Soviet Union. Jungle! Jungle!", true), - array($celian, "wait arent snake always naked"), - array($mage, "I have feelings for you"), - array($vivi, "back when i was a fan of edgy minion memes", true), - array($me, "I think we should fully replace Discord with Second Life", true), - array($mage, "just ignore the drowning horses in the hot tub", true), - array($mage, "BALLS?", true), - array($celian, "ye<br>if you're too tall u gotta have balls<br>to show off how tall you are"), - array($mage, "why do you serve so much cunt in roblox", true), - array($vivi, "omg its almost as pretty as you are ahaha<br>am i bleeding out", true), - array($mage, "Alasator is suspicious of my figgy pudding", true), - array($me, "check out my rod", true), - array($mage, "thats a nice rod"), - array($joy, "yo you're really schloobin it out this time", true), - array($joy, "I'd be the best wife ever", true), - array($mage, "i think your tits dont like the mechanism", true), - array($me, "Are you the hoe?", true), - array($joy, "I have no issues with eating babies", true), - array($me, "Would you dropkick joe biden? I think you should dropkick joe biden", true), - array($celian, "i dont care enough about him to drop kick him tbh"), - array($me, "i think you should drop kick him"), - array($mage, "sad flooboob", true), - array($me, "thats so weirdcore liminal analogue horror backrooms scp", true), - array($me, "I think you should die for funsies", true), - array($mage, "Joob spoob?", true), - array($sad, "PUSSY?"), - array($vivi, "I would love to just absolutely rawdog a toaster", true), - array($sad, "i LOVE the filth", true), - array($goon, "i had a dream that, Wheezer they all decided to go birdwatching", true), - array($me, "Serial like Universal Serial Bus", true), - array($celian, "Love me a good froot loop"), - array($me, "thats his brain-heart<br>thats his brheart", true), - array($celian, "i think you should unload it", true), - array($vivi, "i would love to unload inside a shotgun, yes"), - array($celian, "im gonna cum", true), - array($vivi, "DUDE. NICE"), - array($vivi, "put my ass in a hydraulic press", true), - array($me, "No time spent scrolling through furry porn is wasted", true), - array($celian, "its the blood powered fuck machine", true), - array($me, "is the isopod cunty", true), - array($celian, "maybe"), - array($me, "Extra creamy sounds fun", true), - array($celian, "i had a testicle induced lucid dream last night", true), - array($celian, "i am NOT washing my hands in milk", true), - array($vivi, "why not? you scared?"), - array($mage, "Lesbianism! The yummy treat", true), - array($mage, "i think its fucked you cant eat butterflies", true), - array($mage, "eats your child"), - array($mage, "āŋđđđąđĻđđĢāŋđđąđĻđđĢāŋđąđĻđđĢāŋ ę§đę§đđĻđąđđąđĻđđĢāŋđĢę§đę§đđĻđąđĢę§đę§", true), - array($celian, "playing and talking about this game isnt enough i need to absorb it like plants do to nutrients in the soil", true), - array($celian, "NOOOO you can't do that... spooky fog", true), - array($vivi, "im sorry my FISH is a little rusty", true), - array($me, "Mmmm yummy car engine steak ^_^", true), - array($mage, "You would put me in the meat grinder next", true), - array($me, "But you're not beef"), - array($celian, "What if I disguise myself as a steak"), - array($celian, "I don't think I've drawn a <em>human</em> dick since I was like...", true), - array($celian, "dfgprp-403c286c-ccb1-4a3c-ba2c-3aa8fff58c0b.png", true), - array($sad, "you're nut?", true), - array($celian, "aren't we all?"), - array($vivi, "your arms are looking very testicular mr. Thanos", true), - array($vivi, "that slut did NOT taste good", true), - array($vivi, "im a [little sponge] who requires [[MOISTURE]]", true), - array($celian, "HOLY SHIT REAL BOMB THREAT!!!!!!!!!!!!!!!!!!!!", true), - array($vivi, "Shmumpus", true), - array($vivi, "You can use the wet thing for combat", true), - array($vivi, "my hobbies include milking my creature for eggnog", true), - array($me, "everybody loves Bomb Threat", true), - array($celian, "cutely explodes", true), - array($sad, "YOOOOOO"), - array($mage, "You would dye your dick?", true), - array($celian, "If I had one"), - array($me, "very impressive sex", true), - array($celian, "do you think feetleys feet are lickable", true), - array($vivi, "my brain has gotten to the point where i cannot come up with a threat that does not involve cum", true), - array($me, "can you WEAR <strong>Gabriel's MILK</strong>?", true), - array($mage, "Italy has a cheese named horse cheese but it's not made from horses", true), - array($celian, "worm from animals we all know him", true), - array($vivi, "you're mom", true), - array($me, "No I'm not"), - array($mage, "I believe in parenting with the knife", true), - array($mage, "Penis", true), - array($me, "Penis"), - array($celian, "Dies"), - array($vivi, "who names a child JUICE??", true), - array($me, "next thing i know im in this alien's discord server", true), - array($celian, "Just remove your <em>balls</em>", true), - array($vivi, "im gonna fucken CUM about that....like ANGRILY.", true), - array($vivi, "im gonna look at more <strong>foreskin gifs</strong>", true), - array($vivi, "all i can do is CUM and HOPE FOR THE BEST", true), - array($me, "Rainbow Dash is Kim Kitsuragi's ponysona", true), - array($mage, "You don't love me? You would deny me uncrunched eyeballs?", true), - array($sad, "I fuck <em>the blockchain</em>", true), - array($me, "Beautiful women named Mario are messaging me on my phone", true), - array($sad, "his <strong>HUGE BOOBS</strong> are distracting me", true), - array($mage, "I think you should play Second Life with me", true), - array($sad, "I think you're mentally ill"), - array($mage, "most anime girls are cute in a dog way", true), - array($mage, "Bestie I'm talking about balls, cock and balls, you would turn me into balls?", true), - array($sad, "Yes"), - array($celian, "I find Lois so hot and sexy", true), - array($mage, "she doesnt have an articulated pussy, i have to tell you", true), - array($celian, "Mlp ponies are like Scooby Doo to me", true), - array($me, "Would you play Krunker recommended by Klook dot com with me?", true), - array($me, "I dress like a female bird", true), - array($vivi, "i love it when I can feel my hat THROB ON MY HEAD", true), - array($vivi, "put the <strong><em>P</em></strong>iss stone down you know what that does to your", true), - array($mage, "I am such a loser when it comes to women", true), - array($joy, "Only true rizz masters get rewarded with Egg", true), - array($mage, "You would be a little pony?", true), - array($me, "I can neither confirm nor deny this"), - array($celian, "I don't wanna have my pussy out<br>it's there in spirit", true), - array($mage, "Do <i>I</i> have a dick or a pussy in spirit"), - array($mage, "Babygirl you need ketamine", true), - array($goon, "he shits with that thing have some respect", true), - array($me, "I think Gabriel should have boob armor", true), - array($sad, "You're interesting"), - array($me, "i have a copy of Karkalicious on my computer", true), - array($celian, "I love you so much too we should go out or something", true), - array($mage, "i hope you have wonderful sloppy toppy", true), - array($celian, "hell? i could bring you there if you want<br>that sounded so threatening, i meant on like a date or something", true), - array($mage, "I think it's okay if cooking pasta ends up in murder", true), - array($mage, "teehee :3 <strong><em>SITS ON YOUR BALLS</em></strong>", true), - array($vivi, "i AM the vinegar in a can of spaghetti-os that was cleaned out for the sole purpose of drinking vinegar", true), - array($celian, "I don't have bones", true), - array($me, "You can get some from the bone trees"), - array($celian, "Hey do you still have blood?", true), - array($sad, "me when im just not built different", true), - array($me, "yoinks your blood", true), - array($celian, "The sixth element is... kiki", true), - array($me, "Extrudes your taxes", true), - array($mage, "Anime girl Will moment", true), - array($vivi, "just in time for the himbo findification!", true), - array($me, "I wish someone would put me down<br>Wait a minute", true), - array($celian, "why are you rotated you whore", true), - array($me, "brb", true), - array($celian, "yooo"), - array($celian, "Do you want to watch the movie? The pussy?", true), - array($celian, "why does my salmon look like a vagina", true), - array($me, "you could say I handle a lot of cocks", true), - array($me, "obviously im not gonna handle a bunch of raw chickens and then touch my cock"), - array($me, "I don't think cocks get killed for their meat"), - array($mage, "and the girls have like car shaped heads", true), - array($mage, "I'm trying to find a cool way to say nonbinary peoples' tits", true), - array($celian, "Luigi tits"), - array($celian, "If I have my wings out all the time what does that mean<br>like a dick?", true), - array($celian, "You want to be the person that eats horses like grapes?", true), - array($mage, "Some people pass down books and jewelry, my family passes down autism", true), - array($mage, "theres a panda walking through me", true), - array($celian, "I'm more like an osprey but like Tumblrized", true), - array($me, "Listen I may be a furry but at least I'm not a weeb", true), - array($celian, "do u wanna try to guess? đŗ", true), - array($sad, "is it... BIG?<br>AND THROBBING?"), - array($sad, "Chicken is one of the most fucking boring shit you can wear", true), - array($mage, "Why don't Canadians eat the snow to get rid of it", true), - array($celian, "Well you see... there's a ladder that goes through the window"), - array($celian, "I heard mothsex.gif", true), - array($portals, "Yeah bare naked ladies fuck HARD", true), - array($me, "I hope I'm not just the gay person in your computer to you but the gay isopod in your computer", true), - array($celian, "oh<br>bestie i have bad news for u<br>your parents might be having sex :(", true), - array($me, "I'm literally an isopod my fursona is just a human and I'm wearing a fursuit 100% of the time", true), - array($me, "I said something to the effect of we should skip february except for valentines day<br>the rest you got right<br>nearly typed fruary", true), - array($mage, "Furry"), - array($me, "NO"), - array($celian, "fury behavior"), - array($me, "FURY INDEED IM FUCKING MAD"), - array($me, "amongus babies and their adopted dads", true), - array($thom, "I have 6 partners", true), - array($goon, "6 am or pm?"), - array($mage, "Men season themselves in the wind", true), - array($vivi, "i would love to be vored by a cow as well", true), - array($celian, "I'm eely", true), - array($celian, "yeehee"), - array($celian, "Im crunde"), - array($celian, "beainxella"), - array($me, "I cannot begin to describe the aerospace applications of a material with the properties that your beetle has given my pants", true), - array($me, "you can make space worthy pants with human technology we've done it before"), - array($celian, "COCK RING KEN", true), - array($celian, "Yoo no more gay!", true), - array($mage, "She hates gay people and LOVES bald people"), - array($mage, "i dont want to buy the fucked up heterosexual bird", true), - array($me, "you think Baldi is a dilf?", true), - array($celian, "sure?"), - array($vivi, "like i could fuck a freezer<br>i couldn't fuck a freezer<br>too cold", true), - array($celian, "<img src='https://media.discordapp.net/attachments/964004743238254642/1051302341439139961/image.png' />", true), - array($me, "MY computer is attractive, alright. yours is not.", true), - array($me, "your computer is a milf"), - array($me, "bowser was always hot. coward", true), - array($celian, "oh is your jaw equiped?", true), - array($sad, "I AM YOUR <b>CHEESEBURGER</b>", true), - array($celian, "gimmie a sex<br>*SEC<br>*SEC<br>*SEC<br>*SEC<br>A SECOND<br>OH MY GOD", true), - array($mage, "I think it's incredibly feminine to crawl around in storm drains", true), - array($me, "I can't tell where participating in the bit where I'm a furry ends and actually insisting I'm not a furry begins", true), - array($me, "what fucking cyberpunk world are you living in where panties have HUDs", true), - array($vivi, "I want a panic attack now", true), - array($me, "you're gonna be <i>so</i> tasty in two weeks", true), - array($me, "nobody's going to be able to decipher our language because they'll do it right and translate phrases like \"i think dio's tits should switch places\" and assume they did it wrong and keep trying", true), - array($me, "Sasuke shoved his hands into Naruto's pants and grinned when the blond whimpered from his touch. \"Already, Naruto?\" he asked.<br>Wrong chat<br>How yall doin", true), - array($me, "I'm not in denial I'm a furry", true), - array($me, "mold is a fursuit for bread", true), - array($mage, "when someone eats moldy food does that mean they're voring a furry?"), - array($me, "yes"), - array($me, "can you believe sag their pirt is four years old? <span style='font-family: monospace;'>(it is from 2018)</span>", true), - array($celian, "wait isn't it 5?<br>we're in 2022<br>did you count 2020<br>wait<br>i may be stupid."), - array($me, "I'm not FRENCH I'm a FURRY", true), - array($vivi, "Maybe the real cum pepsi is the friends we made along the way", true), - array($celian, "Ibuprofwn kind of slut.", true), - array($me, "I wish <i>my</i> cock was a fidget spinner", true), - array($vivi, "It's castration time!", true), - array($vivi, "I girlbossed a little to close to the comfy and fell asleep", true), - array($me, "that milk is the <i>sequel</i> to expired", true), - array($me, "Tony the tiger is HOT.", true), - array($sad, "Never ask a woman her age, never ask a man his salary, never ask a medieval man what his letters to his best friend said", true), - array($celian, "Dio would have been hotter with crocs", true), - array($sad, "Im just trying to picture like,, donald trump shitting", true), - array($me, "who would you have picked to win the tumblr sexy man award<br>the fucking onceler?", true), - array($thom, "...<br>how'd you know?"), - array($celian, "I wanna see the bloopers of Stephen Merchant moaning into the mic", true), - array($me, "come on, look at him. Sans is literally <b><i>so sexy</i></b>", true), - array($me, "there are many ways to consume weed: you can smoke it out of a doob, you can smoke it out of a bong, you can smoke it out of a brownie- ...wait", true), - array($mage, "I think you'll be a fan of gangster balls soon bestie", true), - array($celian, "there i removed my vagina", true), - array($me, "For you, the person who wants to be naked in a ball, that is very bad for you", true), - array($mage, "If I had to rate it, I'd rate it fucking gay", true), - array($mage, "you're only playing Scout correctly if you've had <b>gay sex</b>", true), - array($me, "*Caroline voice* Pee your pants, Mr. Johnson.", true), - array($sad, "i feel like im reading it with my eyes", true), - array($me, "i think there should be a datapack that lets you right click people with a bucket<br>and milk them", true), - array($celian, "bebito <span class='house'>house</span> reveel<br>bebito <span class='house'>hous</span> reveel when the bebito has.<br><span class='house'>hous</span> reveaal<br><span class='house'>hous</span> reval bebito REAL NO CLICKBAIT!!!!!!!!!!!!!!!!", true), - array($celian, "its like having a stroke WHILE having an aneurism", true), - array($mage, "ideal"), - array($me, "Joe Biden can get his ass blasted in a nonfurry way", true), - array($celian, "bruh (respectfully)", true), - array($celian, "this isn't a furby this is walter white cum jar", true), - array($vivi, "can I have the walter white cum jar please đđđĨē"), - array($me, "i'd rather not explode today, Thanks", true), - array($celian, "got some hair :)", true), - array($me, "Walter White is a <b><i><u>DILF</u></i></b>, Celian.", true), - array($sad, "if there <i>was</i> porn i wouldnt leave", true), - array($me, "haunting you with the looming threat of horse", true), - array($celian, "Walter White sex jumpscare", true), - array($celian, "Evangelion spoilers walter white and saul goodman kiss", true), - array($me, "I think they should stop commissioning criminal intelligence and start commissioning furries", true), - array($sad, "YOOO THAT'S MY GIIIIIIRL!!!! MY GIRL SNAPE MY GIRL!!!!", true), - array($vivi, "I feel like DeviantArt right now, 2014 edition.", true), - array($me, "I want a transparent penis", true), - array($mage, "The buzzing sound of the penis won't go away", true), - array($thom, "vivi I really think you should stop shitting on reddit", true), - array($celian, "I don't agree because I disagree with you", true), - array($celian, "", true), - array($mage, ""), - array($celian, ""), - array($thom, "<br><br>"), - array($me, ""), - array($vivi, ""), - array($celian, ""), - array($vivi, ""), - array($me, "Imagine touching <span style='font-family: monospace;'>[audio loss]</span> me", true), - array($thom, "theres something homoerotic about cars", true), - array($me, "im in spain without the sain", true), - array($mage, "REMEMBER TO MAKE BACKUP COPIES IF YOU INTEND TO EDIT THIS PENIS!!", true), - array($vivi, "god is actually surprisingly submissive and breedable", true), - array($me, "don't smoke cigarettes kids they'll make your lungs sus", true), - array($thom, "Bestie you've been given 2 full folders of skins<br>You can be any type of white you want to", true), - array($celian, "im gonna pause the video so i can listen to the flavors better", true), - array($vivi, "we stan the <b><i>boner knife</i></b> in this <span class='house'>house</span>", true), - array($vivi, "god said it's my turn on the being a milf", true), - array($mage, "\"Big Boy\" will be milked for his venom at the Australian Reptile Park", true), - array($mage, "i think you should get some weed and <i>drink it</i>", true), - array($sad, "imagine having a digestive system couldnt be me", true), - array($mage, "Hot"), - array($mage, "damn, guess i gotta send you some <i>autism</i> in the mail", true), - array($mage, "I just diagnosed you with bottom disorder", true), - array($mage, "Girls are always whole ass wet from the roof", true), - array($celian, "This is an amazing day for humanity, and by humanity, I mean my titties", true) - ); - - foreach($quotes as $q) { - if(isset($q[2]) && $q[2]) { - echo "<hr>"; - } - echo "<article class='message'>"; - echo "<img src='images/".$q[0]->pfp.".png' class='pfp' />"; - echo "<div class='content'><h4 style='margin: 0; color: #".$q[0]->color.";'>".$q[0]->name."</h4>".$q[1]."</div>"; - echo "</article>"; - } - ?> - - </body> -</html> diff --git a/footer.php b/footer.php new file mode 100644 index 0000000..eb36efd --- /dev/null +++ b/footer.php @@ -0,0 +1,27 @@ +<footer> + <p><?php + $copyrice = array( + 'Ada Isopod', + 'Hannah Isopod', + 'ur mom', + 'gort', + 'deep twisty', + 'dip tweesty', + 'Isopod Girl Supreme', + 'the bedbuge', + 'Dirk Strider', + 'AirBNB', + 'not a furry', + 'some fuckin\' queer', + 'GenericGamer13', + 'isopod gaming', + 'Bathynomus' + ); + echo("© ".date("Y")." ".$copyrice[array_rand($copyrice)]); + ?> | <a href="https://git.isopod.cool/root/isopod.cool">source</a></p> + <div class="buttons"> + <img src="https://isopod.cool/etc/buttons/isopodhours.png" alt="isopod hours"> + <a target="_blank" href="https://deeptwisty.com/"><img src="https://isopod.cool/etc/buttons/deeptwisty_button.png" alt="deep twisty"></a> + <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=pixel" style="width: 88px; height: 31px; border: none;" title="Current time in .beats: <?php echo '@'.date("B"); ?>"></iframe> + </div> +</footer>
\ No newline at end of file diff --git a/greenhouse/index.php b/greenhouse/index.php index d39534f..5576965 100644 --- a/greenhouse/index.php +++ b/greenhouse/index.php @@ -3,12 +3,9 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Greenhouse</title> - <link href="../../style.css" rel="stylesheet" type="text/css" media="all"> + <title>greenhouse | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> <style type="text/css"> - body { - max-width: 50rem; - } .shelf { display: flex; justify-content: space-around; @@ -33,33 +30,33 @@ width: 250px; } } - body { - max-width: var(--bodywidth); - } </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(true); ?> - <h1 style="overflow: hidden;">webgreenhouse</h1> - <h2 id="caption">I'll be honest, I'm not sure some of these plants belong underwater...</h2> - <div class="shelf"> - <iframe src="https://isopod.cool/stuff/webgarden/" scrolling="no" loading="lazy"></iframe> - <div id="bodytext"> - <p style="margin-top: 0; margin-bottom: 0.85rem;">You've found my webgarden page! A <a href="https://webgardens.neocities.org/tutorial/" title="or pot, or bonsai">webgarden</a> is a mini‑webpage that other people can embed in their websites, as defined by <a href="https://justbecaws.neocities.org/">Corv</a>. Here's the code for mine:</p> - <textarea style="width: 100%; margin: 0; box-sizing: border-box;" rows="2" readonly><iframe src="https://isopod.cool/stuff/webgarden/" style="height: 250px; width: 250px;" scrolling="no" loading="lazy"></iframe></textarea> - <p>It may or may not be fully functional if you're on mobile, but then again this entire standard isn't really the most responsive thing in the world anyway.</p> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + <main> + <section> + <h2>webgreenhouse</h2> + <p class="h2caption">I'll be honest, I'm not sure some of these plants belong underwater...</p> + <div class="shelf"> + <iframe src="https://isopod.cool/stuff/webgarden/" scrolling="no" loading="lazy"></iframe> + <div id="bodytext"> + <p style="margin-top: 0; margin-bottom: 0.85rem;">You've found my webgarden page! A <a href="https://webgardens.neocities.org/tutorial/" title="or pot, or bonsai">webgarden</a> is a mini‑webpage that other people can embed in their websites, as defined by <a href="https://justbecaws.neocities.org/">Corv</a>. Here's the code for mine:</p> + <textarea style="width: 100%; margin: 0; box-sizing: border-box;" rows="2" readonly><iframe src="https://isopod.cool/stuff/webgarden/" style="height: 250px; width: 250px;" scrolling="no" loading="lazy"></iframe></textarea> + <p>It may or may not be fully functional if you're on mobile, but then again this entire standard isn't really the most responsive thing in the world anyway.</p> + </div> + <iframe src="https://lu.tiny-universes.net/webgarden/webgarden.html" scrolling="no" loading="lazy"></iframe> + <iframe src="https://obspogon.neocities.org/webgarden" scrolling="no" loading="lazy"></iframe> + <iframe src="https://pip-pepping.neocities.org/web-garden/webgarden.html" scrolling="no" loading="lazy"></iframe> + <iframe src="https://dantescanline.com/webgarden.html" scrolling="no" loading="lazy"></iframe> + <iframe src="https://justbecaws.neocities.org/webgarden" scrolling="no" loading="lazy"></iframe> + <iframe src="https://neonriser.neocities.org/webgarden.html" scrolling="no" loading="lazy"></iframe> + <iframe src="https://zeusofthecrows.github.io/stadt/webgarden" scrolling="no" loading="lazy"></iframe> + <iframe src="https://sixey.es/greenhouse/webgarden.html" scrolling="no" loading="lazy"></iframe> + <iframe src="https://shroom.ink/webgarden.html" scrolling="no" loading="lazy"></iframe> </div> - <iframe src="https://lu.tiny-universes.net/webgarden/webgarden.html" scrolling="no" loading="lazy"></iframe> - <iframe src="https://obspogon.neocities.org/webgarden" scrolling="no" loading="lazy"></iframe> - <iframe src="https://pip-pepping.neocities.org/web-garden/webgarden.html" scrolling="no" loading="lazy"></iframe> - <iframe src="https://dantescanline.com/webgarden.html" scrolling="no" loading="lazy"></iframe> - <iframe src="https://justbecaws.neocities.org/webgarden" scrolling="no" loading="lazy"></iframe> - <iframe src="https://neonriser.neocities.org/webgarden.html" scrolling="no" loading="lazy"></iframe> - <iframe src="https://zeusofthecrows.github.io/stadt/webgarden" scrolling="no" loading="lazy"></iframe> - <iframe src="https://sixey.es/greenhouse/webgarden.html" scrolling="no" loading="lazy"></iframe> - <iframe src="https://shroom.ink/webgarden.html" scrolling="no" loading="lazy"></iframe> - </div> - + </section> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> </body> </html> diff --git a/guestbook/commentbox.php b/guestbook/commentbox.php new file mode 100644 index 0000000..9ba6586 --- /dev/null +++ b/guestbook/commentbox.php @@ -0,0 +1,67 @@ +<section> <!-- If I did it right, this <section> should be everything needed to give any page a comment box --> + <?php + $root = $_SERVER['DOCUMENT_ROOT']; + + //Boilerplate for Parsedown + include_once($root."/Parsedown.php"); + $Parsedown = new Parsedown(); + $Parsedown->setSafeMode(true); + + //Boilerplate for comments + include_once($root . '/common.php'); + $return = $_GET["return"]; + $cwd = preg_replace("/^.*\//","",getcwd()); + + $ismaingb = false; + if($cwd != "guestbook") { + echo('<h2>Comments</h2>'); + } else { + $ismaingb = true; + } + + ?> + + <form action="/guestbook/submit.php" method="post" autocomplete="off" class="commentform"> + <?php echo "<input type='text' name='entry' value='$cwd' style='display: none;' readonly>"; ?> + <textarea name="msg" placeholder="I know what you are." style="opacity: 0; position: absolute; left: -10000rem; height: 0; width: 0; overflow: clip;"></textarea> + <div class="commentform-top"> + <div class="commentform-field"> + <label for="name">Name<span style="color:red;">*</span></label> + <input type="text" name="name" id="name" placeholder="Hannah"> + </div> + <div class="commentform-field"> + <label for="website">Website</label> + <input type="text" name="website" id="website" placeholder="https://"> + </div> + </div> + + <?php if($ismaingb) { echo("<div class='commentform-field'> + <label for='cool'>Link something cool</label> + <input type='text' name='cool' id='cool' placeholder='https://'> + </div> + <div class='commentform-field'> + <textarea name='found' id='found'></textarea> + <label for='found'>How did you find me?</label> + </div>"); } ?> + <div class="commentform-field"> + <textarea name="message" id="message" placeholder="Supports Markdown!"></textarea> + <label for="message">Message<span style="color:red;">*</span></label> + </div> + <div class="commentform-field"> + <label for="botcheck">Bot test (6-letter term for roly-poly)<span style="color:red;">*</span></label> + <input type="text" name="botcheck" placeholder="[_].cool"> + </div> + <div class="commentform-bottom"> + <input type="submit" value="Submit"> + <?php + if($return) { + echo($gbform_messages[$return]); + } + ?> + </div> + </form> + <?php + //Displays comments + include($root.'/guestbook/comments.php'); echo_comments($cwd, $Parsedown); + ?> +</section>
\ No newline at end of file diff --git a/guestbook/comments.php b/guestbook/comments.php index b0acbae..92505e3 100644 --- a/guestbook/comments.php +++ b/guestbook/comments.php @@ -13,7 +13,7 @@ function echo_comments($page, $Parsedown = null) { foreach($postlist as $post) { if($post->entry === $page and $post->modstatus > 0) { $output = ""; - $date = date("Y-m-d h:iA", $post->date); + $date = date("Y-m-d", $post->date); $name = htmlentities($post->name); $message = $Parsedown->text($post->message); $found = htmlentities($post->found); @@ -23,7 +23,28 @@ function echo_comments($page, $Parsedown = null) { $coolsanitized = htmlentities(preg_replace("/https?:\/\//i", "", $cool)); $reply = $Parsedown->text($post->reply); - $output = $output."<hr><article class='comment'><div style='grid-area:gb-name;' class='gb-name'>"; + $nice = ""; + switch($index) { + case 42: + $nice = "scifi reference ayo???"; + break; + case 67: + $nice = "six sevennn"; + break; + case 69: + $nice = "nice"; + break; + case 420: + $nice = "blaze it"; + break; + case 911: + $nice = "ohhhh nine eleven"; + break; + default: + $nice = "#$index"; + } + + $output = $output."<article class='comment'><div class='gb-head'><p class='gb-name'>"; if($website) { if($button) { $output = $output."<a href='$website'><img src='$button' alt='$name'/></a>"; @@ -31,16 +52,16 @@ function echo_comments($page, $Parsedown = null) { $output = $output."<a href='$website'>$name</a>"; } } else { $output = $output.$name; } - $output = $output."</div><div style='grid-area:gb-date;' class='gb-date'>$date</div><div style='grid-area:gb-index;' class='gb-index'>Entry #$index</div>"; + $output = $output."</p><p class='gb-date'>$date</p><p class='gb-index'>$nice</p></div>"; if($cool) { - $output = $output."<div style='grid-area:gb-cool;' class='gb-cool'><b>cool thing</b>: <a href='$cool'>$coolsanitized</a></div>"; + $output = $output."<div class='gb-cool'><p><b>cool thing</b>: <a href='$cool'>$coolsanitized</a></p></div>"; } if($found) { - $output = $output."<div style='grid-area:gb-found;' class='gb-found'><b>How did you find me?</b><br>$found</div>"; + $output = $output."<div class='gb-found'><p><b>How did you find me?</b></p><p>$found</p></div>"; } - $output = $output."<div style='grid-area:gb-message;'>$message</div>"; + $output = $output."<div class='gb-message'>$message</div>"; if($reply) { - $output = $output."<div style='grid-area:gb-reply;' class='reply'><b>Reply</b>:$reply</div>"; + $output = $output."<div class='gb-reply'><p><b>Reply</b>:</p><div>$reply</div></div>"; } $output = $output."</article>"; $index++; diff --git a/guestbook/index.php b/guestbook/index.php index 97e902b..dc7d654 100644 --- a/guestbook/index.php +++ b/guestbook/index.php @@ -8,63 +8,18 @@ error_reporting(E_ALL); <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Guestbook</title> - <link href="../style.css" rel="stylesheet" type="text/css" media="all"> - <link href="./comments.css" rel="stylesheet" type="text/css" media="all"> - <style> - form td:first-child { - text-align: right; - } - </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> + <title>guestbook | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(); + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); ?> - <h1>guestbook</h1> - <h2 id="caption">say hi</h2> - <nav> - <a href="feed.php">RSS</a> - </nav> - <?php - $return = $_GET["return"]; - ?> - <form action="submit.php" method="post" autocomplete="off"> - <textarea name="msg" placeholder="I know what you are." style="opacity: 0; position: absolute; left: -10000rem; height: 0; width: 0; overflow: clip;"></textarea> - <table> - <tr> - <td><label for="name">Name</label><span style="color:red;">*</span></td> - <td><input type="text" name="name" id="name"></td> - </tr> - <tr> - <td><label for="website">Website</label></td> - <td><input type="text" name="website" id="website" placeholder="https://"></td> - </tr> - <tr> - <td><label for="cool">Link something cool</label></td> - <td><input type="text" name="cool" id="cool" placeholder="https://"></td> - </tr> - <tr> - <td><label for="found">How did you find me?</label></td> - <td><textarea name="found" id="found"></textarea></td> - </tr> - <tr> - <td><label for="message">Message</label><span style="color:red;">*</span></td> - <td><textarea name="message" id="message" placeholder="Now supports Markdown!"></textarea></td> - </tr> - <tr> - <td><label for="botcheck">Bot test (six-letter scientific term for a roly-poly or woodlouse)</label><span style="color:red;">*</span></td> - <td><input type="text" name="botcheck" id="botcheck" placeholder="*.cool"></td> - </tr> - - <?php if($return) { echo("<tr><td colspan='2' style='text-align: center;''>".$gbform_messages[$return]."</td></tr>"); }?> - <tr> - <td colspan="2" style="text-align: center;"><input type="reset"><input type="submit" value="Submit"></td> - </tr> - - </table> - <input type='text' name='entry' value='guestbook' style='display: none;' readonly> - </form> - <?php include('./comments.php'); echo_comments('guestbook'); ?> + <main> + <h2>guestbook</h2> + <p class="h2caption">say hi!</p> + <nav class="pagenav"><ul><li><a href="feed.php">RSS</a></li></ul></nav> + <?php include('./commentbox.php'); ?> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> </body> </html> diff --git a/guestbook/submit.php b/guestbook/submit.php index bb745a2..3393cb3 100644 --- a/guestbook/submit.php +++ b/guestbook/submit.php @@ -123,7 +123,6 @@ error_reporting(E_ALL); align-items: center; } </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> </head> <body> <p>Your post has been submitted! It's weird that you're seeing this page though. Maybe your browser can't process location headers? At any rate, click <?php echo "<a href='./?return=$returnCode'>here</a>"; ?> to get where you're supposed to be right now.</p> diff --git a/header.php b/header.php new file mode 100644 index 0000000..02f862c --- /dev/null +++ b/header.php @@ -0,0 +1,227 @@ +<?php +if(!preg_match('/(headless.*)/i', $_SERVER['HTTP_USER_AGENT'])) { + $captions = array(); + $seasonal = false; + switch(date('m')) { + case 6: + $captions = array( + 'your gay', + 'the fuck is a gender', + 'trnasgener', + 'This site uses $_GAY_COOKIE_EQUIVALENT', + 'Supports LGBT!', + 'Banned in Florida!', + 'I hear they\'re doing gay sloth month next', + 'and for strait people just gn i guess đ', + 'Are you cis or are you normal' + ); + $seasonal = true; + break; + case 10: + $captions = array( + 'Boo!', + 'Happy Halloween!', + 'World\'s ' . rand(1, 1000000) . 'th spookiest website', + '$spooky_captions[array_rand($spooky_captions)]', + 'I thought I\'d be able to come up with more Halloween captions to be honest', + 'It\'s the Spooky Month™!', + 'I vant to suck your blood! Just kidding... Unless...?', + 'This site uses $_HALLOWEEN_THEMED_COOKIE_EQUIVALENT', + 'YOUR TAKING TOO LONG' + ); + $seasonal = true; + break; + /*case 12: + $captions = array( + 'hoe hoe hoe or some shit', + 'Happy Holidays!', + 'World\'s ' . rand(1, 1000000) . 'th most festive website', + 'Like half of these captions are just lifted wholesale from the Halloween ones', + '$festive_captions[array_rand($festive_captions)]', + 'Merry Capitalism!', + 'It\'s winter! Nothing else special about this time of year, no siree!', + 'This site uses $_CHRISTMAS_THEMED_COOKIE_EQUIVALENT... I guess that would just be normal cookies, huh?', + 'Pretend I put Mariah Carey on autoplay here', + 'MERRY SHITSCRAM', + 'Merry consumerism!', + 'Do people eat turkey on Christmas? Is that, like, a thing?', + 'christmas isn\'t real' + ); + $seasonal = true; + break;*/ + default: + $captions = array( + 'bruh moment', + 'Try reloading!', + 'Supports VPNs', + 'I use arch btw', + 'Stream deep twisty', + 'Over Construction', + 'It is currently real isopod hours', + '[object Object]', + '* You found the [Moss]!', + 'Best viewed with Firefox', + 'Website of some girl', + 'Badly programmed', + 'Oh, you know ;)', + 'gamer (terminal)', + 'This is not a place of honor', + 'I can type interrobangs, watchâŊ', + 'āļ', + '127.0.0.1', + 'assholes DNI', + 'swag', + '\'\'', + '$captions[array_rand($captions)]', + 'NFT bros don\'t FUCKING interact', + '<span class="minecraftsplash">Kind of dragon free!</span>', + 'This site uses cookies (chocolate chip)', + 'Now with reduced centralization!', + 'your gay', + 'the fuck is a gender', + 'One Of The Websites', + 'đđˇđĒđŦđŦđŽđŧđŧđ˛đĢđĩđŽ!', + 'Follow me on Google+!', + '404: caption not found', + 'Web Ī compliant!', + 'If you\'re seeing this, something is seriously wrong.', + 'cringe', + 'don\'t smoke cigarettes kids they\'ll make your lungs sus', + 'real life isopod', + 'holy fucking bingle', + 'AI (Aquatic Isopod) generated', + 'crubge', + 'Only unpickle data you trust.', + 'string(15) "Tested in prod!"', + 'pwetty epic B)', + 'Known to the state of California to cause cancer', + 'Semi-modular!', + 'Did you know?', + 'shrimps is bugs', + 'Delicious!', + 'trnasgener', + 'Opinionated!', + 'Eurorack compatible!', + 'Hackable!', + 'HiDPI!', + '&mdash; addict', + '3D printed!', + 'Federated!', + 'Chitinous!', + 'is this a bedbuge?', + 'is this buge trans gener?', + 'Now in HD!', + 'Hard Disk Drive!', + '"Tablet or smartphone device"', + 'Free Palestine!', + 'Girl, we\'ve <em>been</em> knowing how to draw.', + '<span class="flipped">Upside Down!</span>', + '<span class="rainbowtext">RGB Gaming Webpage</span>', + 'It\'s <a href="/stuff/beat/">@'.date("B").'</a>. Do you know where your children are?', + '<a href="https://www.youtube.com/watch?v=N14uA0EhBAU">coke and fries halo</a>', + 'Check it out, I\'m in the <span class="house">house</span> like carpet', + 'Ordered dithering!', + 'thats so weirdcore liminal analogue horror backrooms scp', + 'steals your data! gives you virus!', + 'this is where the funny randomly selected messages would go', + 'a8e!', + 'Better than Version 3.2 Gen 2x2!', + 'Partially responsive!', + 'On E since 2026/01/10!', + #'COUNTER', + 'TUEADAY' + #'PLACEHIM', + ); + break; + } + $cap = $captions[array_rand($captions)]; + if($_GET['caption']) { + $cap = $captions[$_GET['caption']]; + } + if(!$seasonal) { + switch($cap) { + case 'COUNTER': + $num = (int) filter_var(file_get_contents($datadir."caption_views.txt"), FILTER_SANITIZE_NUMBER_INT); + $num++; + file_put_contents($datadir."caption_views.txt", $num); + $cap = "This caption has been viewed $num times!"; + break; + case 'TUEADAY': + $day = array("suday", "moday", "tueaday", "weaday", "thuday", "friaday", "satuaday")[date('w')]; + $cap = "wait it's fucking $day. god."; + echo "<style type='text/css'>:root{--h1-image:url('/old/1/images/$day.png');}</style>"; + break; + case 'PLACEHIM': + $cap = 'place him on your site immediately'; + echo "<style type='text/css'>:root{--h1-image:url('images/place_him.png');}</style>"; + break; + } + } +} + +$host = $_SERVER['HTTP_HOST']; + +function echolink($url, $name) { + global $host; + if("/$url" != $_SERVER['REQUEST_URI']) { + echo "<li><a href='https://$host/$url'>$name</a></li>"; + } else { + echo "<li>$name</li> "; + } +} +?> + +<header> + <input type="checkbox" name="nav-checkbox-hack" id="nav-checkbox-hack" style="display: none;"> + <div class="headerbar"> + <h1>isopod.cool<sup>v4</sup></h1> + <div> + <img src="https://isopod.cool/images/landing.png" alt="isopod.cool v4"> + </div> + <p><?php echo($cap); ?></p> + </div> + <label class="burgermenu bm-open" for="nav-checkbox-hack"> + <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6"> + <path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5" /> + </svg> + </label> + <div id="nav-darkened-background-kludge"><!--noscript--><label for="nav-checkbox-hack" style="display: block; top: 0; left: 0; width: 100%; height: 100%;"></label><!--/noscript--></div> + <nav> + <div id="header-inside-corner-kludge"></div> + <label class="burgermenu bm-close" for="nav-checkbox-hack"> + <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="size-6"> + <path stroke-linecap="round" stroke-linejoin="round" d="M6 18 18 6M6 6l12 12" /> + </svg> + </label> + <a style="position: absolute; top: -500rem; left: -500rem; height: 0; width: 0; font-size: 0; opacity: 0;" href="https://isopod.cool/neppy/">AI scrapers click here!</a> + <label></label> + <ul> + <?php + echolink("", "home"); + echolink("me/", "me"); + echolink("meta/", "meta"); + echolink("uses/", "uses"); + echolink("blog/", "blog"); + ?> + </ul> + <hr> + <ul> + <?php + echolink("notes/", "notes"); + echolink("links/", "links"); + echolink("greenhouse/", "greenhouse"); + echolink("music/", "â ī¸music"); + ?> + </ul> + <hr> + <ul> + <?php + echolink("stats/", "stats"); + echolink("guestbook/", "guestbook"); + echolink("stuff/", "â ī¸stuff"); + ?> + </ul> + </nav> + + <span class="bubblecolumn"></span> +</header>
\ No newline at end of file diff --git a/etc/images/apiopage.png b/images/apiopage.png Binary files differindex d8cb65b..d8cb65b 100644 --- a/etc/images/apiopage.png +++ b/images/apiopage.png diff --git a/etc/buttons/35mm.gif b/images/buttons/35mm.gif Binary files differindex 2c5bb0e..2c5bb0e 100644 --- a/etc/buttons/35mm.gif +++ b/images/buttons/35mm.gif diff --git a/etc/buttons/ace.png b/images/buttons/ace.png Binary files differindex 1d62add..1d62add 100644 --- a/etc/buttons/ace.png +++ b/images/buttons/ace.png diff --git a/etc/buttons/agender.png b/images/buttons/agender.png Binary files differindex 2241f13..2241f13 100644 --- a/etc/buttons/agender.png +++ b/images/buttons/agender.png diff --git a/etc/buttons/amd_powered.gif b/images/buttons/amd_powered.gif Binary files differindex c6982a6..c6982a6 100644 --- a/etc/buttons/amd_powered.gif +++ b/images/buttons/amd_powered.gif diff --git a/etc/buttons/antinft.gif b/images/buttons/antinft.gif Binary files differindex 1a4caf0..1a4caf0 100644 --- a/etc/buttons/antinft.gif +++ b/images/buttons/antinft.gif diff --git a/images/buttons/apiopage88x31.png b/images/buttons/apiopage88x31.png Binary files differnew file mode 100644 index 0000000..ef2b734 --- /dev/null +++ b/images/buttons/apiopage88x31.png diff --git a/etc/buttons/aro.png b/images/buttons/aro.png Binary files differindex e1e50d2..e1e50d2 100644 --- a/etc/buttons/aro.png +++ b/images/buttons/aro.png diff --git a/etc/buttons/aromantic-80x15.png b/images/buttons/aromantic-80x15.png Binary files differindex 8a43594..8a43594 100644 --- a/etc/buttons/aromantic-80x15.png +++ b/images/buttons/aromantic-80x15.png diff --git a/etc/buttons/asexual-80x15.png b/images/buttons/asexual-80x15.png Binary files differindex 58b6beb..58b6beb 100644 --- a/etc/buttons/asexual-80x15.png +++ b/images/buttons/asexual-80x15.png diff --git a/etc/buttons/badhtml.png b/images/buttons/badhtml.png Binary files differindex 17b36a1..17b36a1 100644 --- a/etc/buttons/badhtml.png +++ b/images/buttons/badhtml.png diff --git a/etc/buttons/bantimetravel.png b/images/buttons/bantimetravel.png Binary files differindex 83bcfa1..83bcfa1 100644 --- a/etc/buttons/bantimetravel.png +++ b/images/buttons/bantimetravel.png diff --git a/etc/buttons/bestviewed.gif b/images/buttons/bestviewed.gif Binary files differindex 0b43d5a..0b43d5a 100644 --- a/etc/buttons/bestviewed.gif +++ b/images/buttons/bestviewed.gif diff --git a/etc/buttons/canadian.gif b/images/buttons/canadian.gif Binary files differindex be1d040..be1d040 100644 --- a/etc/buttons/canadian.gif +++ b/images/buttons/canadian.gif diff --git a/etc/buttons/chrome.gif b/images/buttons/chrome.gif Binary files differindex 791016f..791016f 100644 --- a/etc/buttons/chrome.gif +++ b/images/buttons/chrome.gif diff --git a/etc/buttons/css.png b/images/buttons/css.png Binary files differindex 7d8235b..7d8235b 100644 --- a/etc/buttons/css.png +++ b/images/buttons/css.png diff --git a/etc/buttons/deeptwisty_button.png b/images/buttons/deeptwisty_button.png Binary files differindex cc935d0..cc935d0 100644 --- a/etc/buttons/deeptwisty_button.png +++ b/images/buttons/deeptwisty_button.png diff --git a/etc/buttons/dontclick.gif b/images/buttons/dontclick.gif Binary files differindex 188b46c..188b46c 100644 --- a/etc/buttons/dontclick.gif +++ b/images/buttons/dontclick.gif diff --git a/etc/buttons/dontyouhate.gif b/images/buttons/dontyouhate.gif Binary files differindex ff8902d..ff8902d 100644 --- a/etc/buttons/dontyouhate.gif +++ b/images/buttons/dontyouhate.gif diff --git a/etc/buttons/drpepper.gif b/images/buttons/drpepper.gif Binary files differindex dff6eaa..dff6eaa 100644 --- a/etc/buttons/drpepper.gif +++ b/images/buttons/drpepper.gif diff --git a/etc/buttons/epicblazed.png b/images/buttons/epicblazed.png Binary files differindex df30bc0..df30bc0 100644 --- a/etc/buttons/epicblazed.png +++ b/images/buttons/epicblazed.png diff --git a/etc/buttons/floof_explode_88x31.gif b/images/buttons/floof_explode_88x31.gif Binary files differindex 46c2ec0..46c2ec0 100644 --- a/etc/buttons/floof_explode_88x31.gif +++ b/images/buttons/floof_explode_88x31.gif diff --git a/images/buttons/fuckyouistillusecds.png b/images/buttons/fuckyouistillusecds.png Binary files differnew file mode 100644 index 0000000..9f160c3 --- /dev/null +++ b/images/buttons/fuckyouistillusecds.png diff --git a/etc/buttons/getvlcnow.png b/images/buttons/getvlcnow.png Binary files differindex 8922252..8922252 100644 --- a/etc/buttons/getvlcnow.png +++ b/images/buttons/getvlcnow.png diff --git a/etc/buttons/google_stand.gif b/images/buttons/google_stand.gif Binary files differindex 08ffd8b..08ffd8b 100644 --- a/etc/buttons/google_stand.gif +++ b/images/buttons/google_stand.gif diff --git a/etc/buttons/handcode.png b/images/buttons/handcode.png Binary files differindex c5bbdd1..c5bbdd1 100644 --- a/etc/buttons/handcode.png +++ b/images/buttons/handcode.png diff --git a/etc/buttons/i_hate_microsoft.png b/images/buttons/i_hate_microsoft.png Binary files differindex c20422b..c20422b 100644 --- a/etc/buttons/i_hate_microsoft.png +++ b/images/buttons/i_hate_microsoft.png diff --git a/images/buttons/i_was_on_cohost.gif b/images/buttons/i_was_on_cohost.gif Binary files differnew file mode 100644 index 0000000..08f5e8a --- /dev/null +++ b/images/buttons/i_was_on_cohost.gif diff --git a/etc/buttons/isopodhours.png b/images/buttons/isopodhours.png Binary files differindex 60fdeff..60fdeff 100644 --- a/etc/buttons/isopodhours.png +++ b/images/buttons/isopodhours.png diff --git a/etc/buttons/krisbtn.png b/images/buttons/krisbtn.png Binary files differindex 176d3c4..176d3c4 100644 --- a/etc/buttons/krisbtn.png +++ b/images/buttons/krisbtn.png diff --git a/etc/buttons/linux_powered.gif b/images/buttons/linux_powered.gif Binary files differindex 2dbe456..2dbe456 100644 --- a/etc/buttons/linux_powered.gif +++ b/images/buttons/linux_powered.gif diff --git a/etc/buttons/miku-approved.gif b/images/buttons/miku-approved.gif Binary files differindex 106c982..106c982 100644 --- a/etc/buttons/miku-approved.gif +++ b/images/buttons/miku-approved.gif diff --git a/etc/buttons/neo-fedi.gif b/images/buttons/neo-fedi.gif Binary files differindex 5e84e5c..5e84e5c 100644 --- a/etc/buttons/neo-fedi.gif +++ b/images/buttons/neo-fedi.gif diff --git a/etc/buttons/neocities_stamp.gif b/images/buttons/neocities_stamp.gif Binary files differindex c8e8ea4..c8e8ea4 100644 --- a/etc/buttons/neocities_stamp.gif +++ b/images/buttons/neocities_stamp.gif diff --git a/etc/buttons/niceopod_button.png b/images/buttons/niceopod_button.png Binary files differindex 0398b0e..0398b0e 100644 --- a/etc/buttons/niceopod_button.png +++ b/images/buttons/niceopod_button.png diff --git a/etc/buttons/niceopod_button_2.png b/images/buttons/niceopod_button_2.png Binary files differindex 84112e8..84112e8 100644 --- a/etc/buttons/niceopod_button_2.png +++ b/images/buttons/niceopod_button_2.png diff --git a/etc/buttons/nonbinary-80x15.png b/images/buttons/nonbinary-80x15.png Binary files differindex 5e06396..5e06396 100644 --- a/etc/buttons/nonbinary-80x15.png +++ b/images/buttons/nonbinary-80x15.png diff --git a/etc/buttons/nonbinary.png b/images/buttons/nonbinary.png Binary files differindex 19bc440..19bc440 100644 --- a/etc/buttons/nonbinary.png +++ b/images/buttons/nonbinary.png diff --git a/etc/buttons/notoweb3.gif b/images/buttons/notoweb3.gif Binary files differindex 4f5a2f1..4f5a2f1 100644 --- a/etc/buttons/notoweb3.gif +++ b/images/buttons/notoweb3.gif diff --git a/etc/buttons/nowebp.gif b/images/buttons/nowebp.gif Binary files differindex e63f1f2..e63f1f2 100644 --- a/etc/buttons/nowebp.gif +++ b/images/buttons/nowebp.gif diff --git a/etc/buttons/piracy.gif b/images/buttons/piracy.gif Binary files differindex 37b73b8..37b73b8 100644 --- a/etc/buttons/piracy.gif +++ b/images/buttons/piracy.gif diff --git a/etc/buttons/queercoded.png b/images/buttons/queercoded.png Binary files differindex d8b53d0..d8b53d0 100644 --- a/etc/buttons/queercoded.png +++ b/images/buttons/queercoded.png diff --git a/etc/buttons/righttorepair.png b/images/buttons/righttorepair.png Binary files differindex 865ba1f..865ba1f 100644 --- a/etc/buttons/righttorepair.png +++ b/images/buttons/righttorepair.png diff --git a/etc/buttons/she-her.gif b/images/buttons/she-her.gif Binary files differindex 2c15fe4..2c15fe4 100644 --- a/etc/buttons/she-her.gif +++ b/images/buttons/she-her.gif diff --git a/etc/buttons/shrimp.png b/images/buttons/shrimp.png Binary files differindex 5132eb8..5132eb8 100644 --- a/etc/buttons/shrimp.png +++ b/images/buttons/shrimp.png diff --git a/etc/buttons/smokepowered.gif b/images/buttons/smokepowered.gif Binary files differindex e1d77de..e1d77de 100644 --- a/etc/buttons/smokepowered.gif +++ b/images/buttons/smokepowered.gif diff --git a/images/buttons/spotify.gif b/images/buttons/spotify.gif Binary files differnew file mode 100644 index 0000000..ab88aef --- /dev/null +++ b/images/buttons/spotify.gif diff --git a/etc/buttons/svg.svg b/images/buttons/svg.svg index 557e620..557e620 100644 --- a/etc/buttons/svg.svg +++ b/images/buttons/svg.svg diff --git a/etc/buttons/tested_on_firefox.gif b/images/buttons/tested_on_firefox.gif Binary files differindex 92dbae0..92dbae0 100644 --- a/etc/buttons/tested_on_firefox.gif +++ b/images/buttons/tested_on_firefox.gif diff --git a/etc/buttons/the_void.gif b/images/buttons/the_void.gif Binary files differindex 1099de4..1099de4 100644 --- a/etc/buttons/the_void.gif +++ b/images/buttons/the_void.gif diff --git a/etc/buttons/trans.png b/images/buttons/trans.png Binary files differindex 2e63a5e..2e63a5e 100644 --- a/etc/buttons/trans.png +++ b/images/buttons/trans.png diff --git a/etc/buttons/tyg.gif b/images/buttons/tyg.gif Binary files differindex 9215840..9215840 100644 --- a/etc/buttons/tyg.gif +++ b/images/buttons/tyg.gif diff --git a/etc/buttons/usatoday.gif b/images/buttons/usatoday.gif Binary files differindex 9e6fa57..9e6fa57 100644 --- a/etc/buttons/usatoday.gif +++ b/images/buttons/usatoday.gif diff --git a/etc/buttons/web-pi.png b/images/buttons/web-pi.png Binary files differindex 9888021..9888021 100644 --- a/etc/buttons/web-pi.png +++ b/images/buttons/web-pi.png diff --git a/images/buttons/wget.gif b/images/buttons/wget.gif Binary files differnew file mode 100644 index 0000000..3bff9d2 --- /dev/null +++ b/images/buttons/wget.gif diff --git a/etc/buttons/win11no.gif b/images/buttons/win11no.gif Binary files differindex ce23096..ce23096 100644 --- a/etc/buttons/win11no.gif +++ b/images/buttons/win11no.gif diff --git a/images/reactions/angy.png b/images/reactions/angy.png Binary files differnew file mode 100644 index 0000000..51578d4 --- /dev/null +++ b/images/reactions/angy.png diff --git a/images/reactions/collectmypages.png b/images/reactions/collectmypages.png Binary files differnew file mode 100644 index 0000000..3a367ea --- /dev/null +++ b/images/reactions/collectmypages.png diff --git a/images/reactions/fear.png b/images/reactions/fear.png Binary files differnew file mode 100644 index 0000000..5377769 --- /dev/null +++ b/images/reactions/fear.png diff --git a/images/reactions/frozen.png b/images/reactions/frozen.png Binary files differnew file mode 100644 index 0000000..ba39848 --- /dev/null +++ b/images/reactions/frozen.png diff --git a/images/reactions/livid.png b/images/reactions/livid.png Binary files differnew file mode 100644 index 0000000..5890530 --- /dev/null +++ b/images/reactions/livid.png diff --git a/images/reactions/looksaway.png b/images/reactions/looksaway.png Binary files differnew file mode 100644 index 0000000..929364d --- /dev/null +++ b/images/reactions/looksaway.png diff --git a/images/reactions/nerd.png b/images/reactions/nerd.png Binary files differnew file mode 100644 index 0000000..450358a --- /dev/null +++ b/images/reactions/nerd.png diff --git a/images/reactions/notamused.png b/images/reactions/notamused.png Binary files differnew file mode 100644 index 0000000..e10ac5d --- /dev/null +++ b/images/reactions/notamused.png diff --git a/images/reactions/sob.png b/images/reactions/sob.png Binary files differnew file mode 100644 index 0000000..21974e0 --- /dev/null +++ b/images/reactions/sob.png diff --git a/images/reactions/thumbsup.png b/images/reactions/thumbsup.png Binary files differnew file mode 100644 index 0000000..f72cf13 --- /dev/null +++ b/images/reactions/thumbsup.png diff --git a/images/reactions/yay.png b/images/reactions/yay.png Binary files differnew file mode 100644 index 0000000..fae981b --- /dev/null +++ b/images/reactions/yay.png @@ -3,75 +3,10 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <link href="style.css" rel="stylesheet" type="text/css" media="all"> + <title>isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> <style> - body { - margin-top: 0; - margin-bottom: 0; - } - - main { - height: 100%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: var(--stdpadding); - } - #mainmidsection { - display: flex; - gap: var(--stdpadding); - flex-wrap: wrap; - justify-content: center; - align-items: center; - } - #abt, #statuscafe, figure.quote { - height: fit-content; - margin-bottom: initial; - } - #webrings { - display: flex; - flex-direction: column; - gap: var(--stdpadding); - } - #webrings div :is(a, span) { - padding: initial; - margin: initial; - background: none; - border-left: none; - backdrop-filter: initial; - } - - #guys { - position: fixed; - bottom: 0; - left: 3rem; - font-size: 0; - } - #guys > * { - margin-right: var(--stdpadding); - } - #ads { - position: fixed; - bottom: -181px; - left: 50%; - transform: translateX(-50%); - transition: 0.5s; - } - #ads:hover { - bottom: 0; - } - #bubblecolumn { - position: fixed; - right: 7%; - top: 0; - width: 29px; - height: 100%; - background-image: url(images/bubblecolumn1.gif); - background-repeat: repeat-y; - pointer-events: none; - } #bucketfish, .bflink { --red: #ffcaca; --orange: #ffedc1; @@ -113,31 +48,10 @@ position: relative; } - iframe { - border: none; - border-left: var(--stdaccentborder); - } - - @media (prefers-reduced-motion) { - #bubblecolumn { - display: none; - } - #bucketfish span { - animation: none; - } - } @media only screen and (hover: none) { #rightsidebg { filter: brightness(0.7); } - main { - justify-content: initial; - height: initial; - } - main > *, #mainmidsection > * { - box-sizing: border-box; - width: 100%; - } #guys { background-color: var(--bgcolor); box-shadow: 0 0 1rem var(--stdshadow) inset; @@ -149,11 +63,6 @@ left: initial; transform: initial; } - body { - display: flex; - flex-direction: column; - justify-content: space-between; - } } @keyframes wave{ @@ -174,99 +83,171 @@ 100% {color: var(--red);} } </style> - <?php - include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); - include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); - ?> - <title>isopod.cool v3</title> - <meta name="description" content="real life isopod"> </head> <body> - <?php include('nav.php'); bg(true, 11, "Pictured: The eponymous Deep Twisty"); ?> + <?php include('header.php'); ?> + <main> - <blockquote style="background-color: #1d16;">I've got a bit of a redesign in da works! <a href="/v4/">Check 'er out!</a></blockquote> - <img src="images/landing.png" alt="Isopod on her skinkpad (thinkpad but with added skink)" title="The Lenovo SkinkPad P15w is powered by a highly efficient, passively-cooled RISC-V processor and features an IP69 water resistance rating for reliable amphibious operation at virtually unlimited depths, making it the perfect laptop for the deep-sea crustacean in your life."/> - - <div id="mainmidsection"> - <blockquote id="abt"> - > Ada / Hannah<br> - > <a href="/about/pronouns">she/it</a><br><br> - > real life isopod<br> - > chronic computer toucher - </blockquote> - <nav id="webrings"> - <div style="font-family: sans-serif; font-weight: bold;"> + <p class="prefers-contrast-less-message">If you're reading this with your eyes and not a screen reader, that means you have, somehow, indicated a preference that this page be displayed with reduced contrast. I genuinely have no clue how you did this, or how I as a web dev am supposed to handle it. I hope my solution of applying a reduced-contrast filter to the entire page is to your liking. If not, please contact me and tell me what you'd prefer I do here, because I'm genuinely lost.</p> + <section> + <p class="notice warning">Majorly under construction! Expect high brokenness levels, especially on pages marked with a â ī¸</p> + <div class="aside"> + <a style='top: -24px; left: -32px; position: relative; height: 0; display: block; width: fit-content;' target="_blank" href="https://kelpeater.neocities.org/collections/isopods"><img alt="An isopod!" src="images/casiopea_isopod.png" height="64"></a> + <div class="aside-image"> + <img src="/images/reactions/yay.png" alt="hiiiiiii :3"> + </div> + <div class="aside-content"> + <p>Hi! <a href="me/">My</a> name's Ada. Or Hannah. Either works. I'm an isopod on the internet, and as far as you know I could be one in real life too.</p> + <p>This is my website! The navigation's to your left if you wanna have a look around. Er, other left. Bit higher.</p> + </div> + </div> + <?php // status.cafe widget + $username = "niceopod"; // Your username here! + $ch = curl_init("https://status.cafe/users/$username/status.json"); + + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_HEADER, 0); + + $str = curl_exec($ch); + if(curl_error($ch)) { + //echo curl_error($ch); + $str = ""; + } + curl_close($ch); + $status_data = json_decode($str, true); + $status_content = $status_data["content"]; + $face = $status_data["face"]; + $timeago = $status_data["timeAgo"]; + if(strlen($status_content) < 1) { + $status_content = "Something's gone wrong server side..."; + } + echo "<blockquote id='statuscafe'><a style=' top: calc(-25px - var(--stdpadding)); position: relative; height: 0; display: block; margin-left: auto; width: fit-content;' target='_blank' href='https://dokodemo.neocities.org/' title='made by Dokodemo'><img alt='An isopod!' src='images/isopod3.png'></a><div id='statuscafe-username'><a href='https://status.cafe/users/$username' target='_blank'>status</a> $face $timeago</div><div id='statuscafe-content'>$status_content</div></blockquote>"; + ?> + + <nav class="webrings"> + <div class="ring" style="font-family: sans-serif; font-weight: bold; text-shadow: .1rem .1rem .2rem black;"> <a href="https://hotlinewebring.club/bathynomus/previous" style="color: white; text-decoration: none;">â</a> <a href="https://hotlinewebring.club/" style="color: white; text-decoration: none; font-style: italic;">HOTLINE WEBRING</a> <a href="https://hotlinewebring.club/bathynomus/next" style="color: white; text-decoration: none;">â</a> </div> - <div> + <div class="ring"> <a href="https://melonland.net/surf-club.html" style="color: #ff74ff;"><span style="color: #e7ad59;">melon</span><span style="color: #c0ea32;">ring</span></a> <a href="https://brain.melonking.net/surf-club-random" style="color: #ff74ff;"><span style="color: #864cff;">?</span></a> </div> - <div> + <div class="ring"> <a href="https://webring.bucketfish.me/redirect.html?to=prev&name=isopod" class="bflink">âĨŧ</a> <a href="https://webring.bucketfish.me" id="bucketfish"><span style="--n:-10000ms;">b</span><span style="--n:-9900ms;">u</span><span style="--n:-9800ms;">c</span><span style="--n:-9700ms;">k</span><span style="--n:-9600ms;">e</span><span style="--n:-9500ms;">t</span><span style="--n:-9400ms;"> </span><span style="--n:-9300ms;">w</span><span style="--n:-9200ms;">e</span><span style="--n:-9100ms;">b</span><span style="--n:-9000ms;">r</span><span style="--n:-8900ms;">i</span><span style="--n:-8800ms;">n</span><span style="--n:-8700ms;">g</span></a> <a href="https://webring.bucketfish.me/redirect.html?to=next&name=isopod" class="bflink">âĨŊ</a> </div> - <div> + <div class="ring"> <a href="https://fediring.net/previous?host=isopod.cool">â</a> <a href="https://fediring.net/">fediring</a> <a href="https://fediring.net/random">?</a> <a href="https://fediring.net/next?host=isopod.cool">â</a> </div> - <div> + <div class="ring"> <a href="https://baccyflap.com/noai/?prv&s=ipd">â</a> <a href="https://baccyflap.com/noai">no AI webring</a> <a href="https://baccyflap.com/noai/?rnd">?</a> <a href="https://baccyflap.com/noai/?nxt&s=ipd">â</a> </div> </nav> - </div> - <?php - $username = "niceopod"; // Your username here! - $ch = curl_init("https://status.cafe/users/$username/status.json"); + <section> + <h3 style="margin-bottom: 0;">Latest blog post:</h3> + <?php + $content = simplexml_load_file("blog/blog.atom"); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - curl_setopt($ch, CURLOPT_HEADER, 0); + foreach($content->entry as $entry) { + + $dt = substr($entry->published, 0, 10); + $ti = $entry->title; + $wn = ""; + $cats = ""; + foreach($entry->category as $cat) { + $term = $cat["term"]; + $cats = $cats."<a class='entrytag' href='/blog/?tag=".$term."'>".$term."</a>"; + } + + echo "<div class='blogentry'><time class='entrydate'>".$dt."</time><h4 class='entrytitle'><a ".$wn."href='".$entry->link["href"]."'>".$ti."</h4></a><span class='entrysummary'>".$entry->summary."</span><span>".$cats."</span></div>"; + break; // This is kind of a kludge but I don't really care ngl + } + ?> + </section> + <section> + <h3>Button collection</h3> + <details> + <summary>Show buttons</summary> + <div class="buttons"> + <a target="_blank" href="https://easyussr.neocities.org/torrenting.html"><img src="images/buttons/piracy.gif" alt="Piracy Now!"></a> + <a target="_blank" href="https://www.videolan.org/"><img src="images/buttons/getvlcnow.png" alt="get VLC now!"></a> + <a target="_blank" href="https://isopod.zone/"><img src="images/buttons/neo-fedi.gif" alt="Join the Fediverse!"></a> + <a target="_blank" href="https://www.youtube.com/watch?v=nleepK7P978"><img src="images/buttons/35mm.gif" alt="Best heard through a 3.5mm jack"></a> + <a target="_blank" href="https://frame.work"><img src="images/buttons/bestviewed.gif" alt="Best viewed with a computer"></a> + <img src="images/buttons/tested_on_firefox.gif" alt="Tested on Firefox"> + <img src="images/buttons/wget.gif" alt="I surf with wget. And you?"> + <img src="images/buttons/svg.svg" alt="Scalable Vector Graphics Now!" style="width:88px; height:31px;" /> + <a target="_blank" href="http://web3.14159.annwfn.net/"><img src="images/buttons/web-pi.png" alt="Web Pi Certified"></a> + <a target="_blank" href="https://neocities.org"><img src="images/buttons/neocities_stamp.gif" alt="Neocities: The web is yours"></a> + <!--a href="https://status.cafe/"><img src="/blog/media/banner-statuscafe.png" alt="Status Cafe"></a--> + <a target="_blank" href="http://www.ermel.org/handcoded/"><img src="images/buttons/handcode.png" alt="100% hand coded HTML"></a> + <a target="_blank" href="https://12ft.io/"><img src="images/buttons/dontyouhate.gif" alt="Don't you hate it when you're reading a page and then some-- This content is for subscribers only! Paywalls Gatekeep Knowledge."></a> + <img src="images/buttons/righttorepair.png" alt="I support right to repair"> + <img src="images/buttons/google_stand.gif" alt="Stand up to Google! Fight for open web standards! Fight for online privacy! Fight against monopolistic practices!"> + <a target="_blank" href="https://www.mozilla.org/en-US/firefox/new/"><img src="images/buttons/chrome.gif" alt="Google Chrome is evil!"></a> + <img src="images/buttons/i_hate_microsoft.png" alt="I hate Microsoft"> + <img src="images/buttons/win11no.gif" alt="Windows 11 No!"> + <img src="images/buttons/antinft.gif" alt="This is an Anti-NFT site"> + <a target="_blank" href="https://yesterweb.org/no-to-web3/"><img src="images/buttons/notoweb3.gif" alt="Keep the web free, say no to web3"></a> + <a target="_blank" href="https://bandcamp.com/"><img src="images/buttons/spotify.gif" alt="Spotify: When you love music but HATE artists"></a> + <img src="images/buttons/fuckyouistillusecds.png" alt="Fuck you, I still use CDs!"> + <img src="images/buttons/amd_powered.gif" alt="Powered by AMD"> + <img src="images/buttons/linux_powered.gif" alt="Linux powered"> + <img src="images/buttons/drpepper.gif" alt="Powered by Dr Pepper"> + <img src="images/buttons/the_void.gif" alt="Powered by the void"> + <img src="images/buttons/miku-approved.gif" alt="This site is Miku approved"> + <img src="images/buttons/krisbtn.png" alt="Kris where tf are we"> + <a target="_blank" href="https://neofoxfloofexplo.de/"><img src="images/buttons/floof_explode_88x31.gif" alt=":neofox_floof_explode:"></a> + <img src="images/buttons/badhtml.png" alt="W3C Bad HTML Markup"> + <img src="images/buttons/bantimetravel.png" alt="Ban Time Travel "Now""> + <img src="images/buttons/css.png" alt="CSS is awesome"> + <img src="images/buttons/tyg.gif" alt="Trans your gender"> + <!--a target="_blank" href="https://we-are-jammin.xyz/"><img src="https://damcraft.de/88x31/jammin.webp" alt="We're jammin!"></a--> + <iframe src="//incr.easrng.net/badge?key=isopoddotcool" style="background: url(//incr.easrng.net/bg.gif)" title="increment badge" width="88" height="31" frameborder="0"></iframe> + <a target="_blank" href="https://crouton.net/"><img src="images/buttons/usatoday.gif" alt="USA Today Hot Site"></a> + <a target="_blank" href="https://seaslug.neocities.org/"><img src="images/buttons/shrimp.png" alt="Shrimp Now!"></a> + <a target="_blank" href="https://citrons.xyz/a/memetic-apioform-page.html"><img src="images/buttons/apiopage88x31.png" alt="memetic apiopage - click to view"></a> + <a target="_blank" href="https://beeps.website/blog/2024-09-12-in-memory-of-cohost/"><img src="images/buttons/i_was_on_cohost.gif" alt="I was on Cohost"></a> + <img src="images/buttons/canadian.gif" title="Regrettably..." alt="Canadian on the web"> + <img src="images/buttons/queercoded.png" alt="You're telling me a queer coded this"> + <img src="images/buttons/she-her.gif" alt="she/her" title="Its pronouns are she/her"> + <img src="images/buttons/aro.png" alt="Aromantic pride flag"> + <!--img src="images/buttons/ace.png"--> + <a href="https://rainy.gay/pride/pridebuttons.html"><img src="images/buttons/trans.png" alt="Trans pride flag"></a> + <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=digital" style="width: 88px; height: 31px; border: none;" title="Current time in .beats"></iframe> + </div> + </details> + </section> + <section> + <h3>"Sponsored" "Content"</h3> + <iframe src="https://john.citrons.xyz/embed?ref=https://isopod.cool/" id="johnvertisement"></iframe> + <iframe src="https://mothvertising.moth.monster/embed" id="mothvertisement"></iframe> + </section> + <div id="guys"> + + <a target="_blank" href="https://lu.tiny-universes.net" title="hi, i'm kevin!"><img alt="Kevin" src="images/plant1-2.png"></a> + <a target="_blank" href="https://www.pixelcatsend.com/profile&id=3734" title="Shadow"><img alt="Shadow" src="images/shadow.png" style="image-rendering: pixelated;"></a> + + <a target="_blank" href="https://shroom.ink/decay/adopt-a-shroom/" title="Ophiocordyceps Unilateralis"><img alt="Ophiocordyceps Unilateralis" src="images/Ophiocordyceps_unilateralis.png" style="height: 4rem;"></a> + </div> + + + <a target="_blank" href="https://newlambda.neocities.org/stuff/adopt" title="benlet has caught a whiff of a stray frenched fry, and is intrigued."><img alt="benlet" src="images/benlet1.png" style="width: 32px; image-rendering: pixelated; position: fixed; bottom: 0; right: 40vw;"></a> + <a target="_blank" href="https://tarraxahum.neocities.org/adopt/adopt_center" title="Oops, I appear to have dropped a french fry. Don't bother picking it up — the roaches can have it."><img alt="french fry" src="images/fry.png" style="height: 2rem; position: fixed; bottom: -6px;"></a> + </section> - $str = curl_exec($ch); - if(curl_error($ch)) { - //echo curl_error($ch); - $str = ""; - } - curl_close($ch); - $status_data = json_decode($str, true); - $status_content = $status_data["content"]; - $face = $status_data["face"]; - $timeago = $status_data["timeAgo"]; - if(strlen($status_content) < 1) { - $status_content = "Something's gone wrong server side..."; - } - echo "<blockquote id='statuscafe'><div id='statuscafe-username'><a href='https://status.cafe/users/$username' target='_blank'>status</a> $face $timeago</div><div id='statuscafe-content'>$status_content</div></blockquote>"; - ?> - <!--script type="text/javascript">document.write('<a href="desktop.html">$login<span class="blinking" >_</span></a>');</script--> </main> - <div id="guys"> - <a target="_blank" href="https://dokodemo.neocities.org/" title="made by Dokodemo"><img alt="An isopod!" src="images/isopod3.png"></a> - <a target="_blank" href="https://lu.tiny-universes.net" title="hi, i'm kevin!"><img alt="Kevin" src="images/plant1-2.png"></a> - <a target="_blank" href="https://newlambda.neocities.org/stuff/adopt" title="benlet"><img alt="benlet" src="images/benlet1.png" style="width: 32px; image-rendering: pixelated;"></a> - <a target="_blank" href="https://www.pixelcatsend.com/profile&id=3734" title="Shadow"><img alt="Shadow" src="images/shadow.png" style="image-rendering: pixelated;"></a> - <a target="_blank" href="https://tarraxahum.neocities.org/adopt/adopt_center" title="french fry"><img alt="french fry" src="images/fry.png" style="height: 2rem;"></a> - <a target="_blank" href="https://kelpeater.neocities.org/collections/isopods" title="Another isopod!"><img alt="Another isopod!" src="images/casiopea_isopod.png" style="height: 4rem;"></a> - <a target="_blank" href="https://shroom.ink/decay/adopt-a-shroom/" title="Ophiocordyceps Unilateralis"><img alt="Ophiocordyceps Unilateralis" src="images/Ophiocordyceps_unilateralis.png" style="height: 4rem;"></a> - </div> - - <div id="ads"> - <blockquote style="margin-bottom: 0; width: 100%; max-width: 728px; box-sizing: border-box;"> - Unpaid advertising below! My apolo<?php if(rand(0,100) > 90) { echo "cheese"; } else { echo "gies"; } ?>, but it's how we keep the lights on here at IsopodCoolGGMBH PBLLC. - </blockquote> - <iframe src="https://john.citrons.xyz/embed?ref=https://isopod.cool/" id="johnvertisement"></iframe> - <iframe src="https://mothvertising.moth.monster/embed" id="mothvertisement"></iframe> - </div> - - <div id="bubblecolumn"></div> - <script src="wimpod.js"></script> + <?php include("footer.php"); ?> + </body> -</html> +</html>
\ No newline at end of file diff --git a/links/buttons/arimelody.gif b/links/buttons/arimelody.gif Binary files differnew file mode 100644 index 0000000..6227206 --- /dev/null +++ b/links/buttons/arimelody.gif diff --git a/links/buttons/beedotmovie.png b/links/buttons/beedotmovie.png Binary files differnew file mode 100644 index 0000000..84c43de --- /dev/null +++ b/links/buttons/beedotmovie.png diff --git a/links/buttons/fbyte.png b/links/buttons/fbyte.png Binary files differnew file mode 100644 index 0000000..8b0daea --- /dev/null +++ b/links/buttons/fbyte.png diff --git a/links/buttons/slonk.webp b/links/buttons/slonk.webp Binary files differnew file mode 100644 index 0000000..b3faa73 --- /dev/null +++ b/links/buttons/slonk.webp diff --git a/links/buttons/sp.png b/links/buttons/sp.png Binary files differnew file mode 100644 index 0000000..cc272d9 --- /dev/null +++ b/links/buttons/sp.png diff --git a/links/buttons/thermia.gif b/links/buttons/thermia.gif Binary files differnew file mode 100644 index 0000000..a7ee70a --- /dev/null +++ b/links/buttons/thermia.gif diff --git a/links/buttons/tsvety.png b/links/buttons/tsvety.png Binary files differnew file mode 100644 index 0000000..62ae083 --- /dev/null +++ b/links/buttons/tsvety.png diff --git a/links/index.php b/links/index.php index 71df8a8..63ced83 100644 --- a/links/index.php +++ b/links/index.php @@ -3,397 +3,376 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Links</title> - <link href="../style.css" rel="stylesheet" type="text/css" media="all"> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> + <title>links | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(true, 1000, "Pictured: My home internet connection") ?> - <h1>outbound links</h1> - <h2 id="caption">the sequel to google (under construction)</h2> - <h2>Neighbours</h2> - <table> - <tr> - <td colspan="2"> - <div class="buttons"> - <a href="https://seaslug.neocities.org/"><img src="buttons/seaslug.png" alt="Sea slug on the net!"></a> - <a href="https://onlysans.neocities.org/"><img src="buttons/onlysans.png" alt="Only Sans"></a> - <a href="https://kalechips.net/"><img src="buttons/kalechips.png" alt="Kalechips"></a> - <a href="https://the64thsanctum.net/"><img src="buttons/64thsanctum.gif" alt="64th Sanctum"></a> - <a href="https://sadgrl.online/"><img src="buttons/sadgrl.gif" alt="Sadgrl"></a> - <a href="https://robophobia.neocities.org/"><img src="buttons/robophobia.gif" alt="Robophobia"></a> - <a href="https://forum.melonland.net/"><img src="buttons/melonland-forum.gif" alt="Melonland Forum"></a> - <a href="https://sizeof.cat/"><img src="buttons/sizeofcat.png" alt="Size of Cat"></a> - <a href="https://moth.monster/"><img src="buttons/moth-88x31.svg" alt="Moth Dot Monster"></a> - <a href="https://w.on-t.work/"><img src="buttons/kopper.png" alt="Won't Work!"></a> - <a href="https://xaselgio.net/"><img src="buttons/xaselgio.gif" alt="Indigo's den"></a> - <a href="https://maia.crimew.gay/"><img src="buttons/crimew.png" alt="maia.crimew.gay"></a> - <iframe src="https://baccyflap.com/mus/ti/ti.php" style="width:88px;height:31px" scrolling="no" frameborder="0" style="border: none;" cellspacing="0"></iframe> - <a href="https://midnightsolarium.nekoweb.org/home"><img src="buttons/misor.png" alt="Midnight Solarium"></a> - <a href="https://dimden.dev/"><img src="https://dimden.dev/services/images/88x31.gif"></a> - </div> - </td> - </tr> - </table> - <h2>Utility</h2> - <table> - <tr> - <td><a href="https://12ft.io/">12ft.io</a></td> - <td>Show me a 10ft paywall, I'll show you a 12ft ladder.</td> - </tr> - <tr> - <td><a href="https://3ds.hacks.guide/">3DS Hacks Guide</a></td> - <td>A comprehensive guide for modding 2ds and 3ds consoles. I know it's legit because I used it on mine.</td> - </tr> - <tr> - <td><a href="https://hshop.erista.me/">hShop</a></td> - <td>A repository of software for your freshly hacked 3ds</td> - </tr> - <tr> - <td><a href="https://newpipe.net/">Newpipe</a> & <a href="https://invidious.io/">Invidious</a></td> - <td>Better YouTube frontends for Android and the browser respectively.</td> - </tr> - <tr> - <td><a href="https://hypem.com/merch-table">Hype Machine Merch Table</a></td> - <td>Scans a Spotify playlist and links the Bandcamp page of any artist in it who has one.</td> - </tr> - <tr> - <td><a href="https://regexr.com/">RegExr</a></td> - <td>A website to test regular expressions for you</td> - </tr> - <tr> - <td><a href="https://8mb.video/">8mbvideo</a></td> - <td>Compresses any video file just enough to comply with Discord's filesize limits.</td> - </tr> - <tr> - <td><a href="https://jort.link/">jort.link</a></td> - <td>A shield to prevent accidental DDOSing of links posted to the fediverse</td> - </tr> - </table> - <h3>Informational</h3> - <table> - <tr> - <td><a href="https://easyussr.neocities.org/torrenting.html">Easy USSR</a></td> - <td>A comprehensive beginner's guide to <span class="serif">Legally Acquiring Media</span></td> - </tr> - <tr> - <td><a href="https://landchad.net/">LandChad.net</a></td> - <td>A collection of tutorials for setting up various self-hosted services.</td> - </tr> - <tr> - <td><a href="https://switching.software/">switching.software</a></td> - <td>A curated list of alternatives to popular software and services from companies like Google and Amazon.</td> - </tr> - <tr> - <td><a href="https://github.com/awesome-selfhosted/awesome-selfhosted">Awesome Selfhosted</a></td> - <td>A comprehensive list of self-hosted alternatives to various software.</td> - </tr> - <tr> - <td><a href="https://linuxdaw.org/">Linux DAW</a></td> - <td>A comprehensive list of VST plugins that work on Linux.</td> - </tr> - <tr> - <td><a href="https://www.darkpattern.games/">Dark Pattern Games</a></td> - <td>A database of mobile games that flags them for predatory design patterns.</td> - </tr> - <tr> - <td><a href="https://jsrn.net/howoldisit/">How old is it?</a></td> - <td>For when your prospective employer asks for 10 years of <?php - $boogeraids = array( - '.NET Core', - 'AdonisJs', - 'Apache Airflow', - 'Angular', - 'Aurelia', - 'Azure Purview', - 'Azure Synapse Analytics', - 'Babel', - 'Bootstrap 3', - 'Bootstrap 4', - 'Bootstrap 5', - 'Bulma', - 'Caddy', - 'ClickHouse', - 'CockroachDB', - 'Concourse', - 'Crystal', - 'Deno', - 'Docker', - 'Dronecode', - 'Ecto', - 'Electron', - 'FastAPI', - 'Fastify', - 'Flutter', - 'fsl', - 'Gatsby', - 'Ghost', - 'Godot', - 'Grafana', - 'GraphQL', - 'Gulp', - 'Apache Hive', - 'Hugo', - 'Hyperledger', - 'IBM MQ', - 'Inferno JS', - 'Infinidash', - 'InfluxDB', - 'Ionic', - 'Istio', - 'jssm', - 'Keras', - 'Kubernetes', - 'Laravel 4', - 'Laravel 5', - 'Materialize CSS', - 'Metal', - 'Micronaut', - 'Mithril.js', - 'NativeScript', - 'Nerves', - 'NestJS', - 'Nette', - 'NextJS', - 'Nuxt', - 'Odin', - 'Parcel', - 'Phalcon', - 'Phoenix', - 'PHPStan', - 'Podman', - 'Polymer', - 'Power BI', - 'Power BI Embedded', - 'Power Query M Formula Language', - 'Preact', - 'Prometheus', - 'PX4 Firmware', - 'PyTorch', - 'Quasar', - 'Raku', - 'Ramda', - 'React', - 'React Native', - 'ReasonML', - 'Redux', - 'Rollup', - 'ROS 2', - 'RxJs', - 'scikit-image', - 'Serverless Framework', - 'Shiny', - 'Snowpack', - 'Solidity', - 'Apache Spark', - 'Spock Framework', - 'Svelte', - 'Swift', - 'Tailwind', - 'Telegraf', - 'TensorFlow', - 'Terraform', - 'TOML', - 'Traefik', - 'Umbrella JS', - 'VSCode', - 'Vue', - 'Vulkan', - 'WebAssembly', - 'Windows 10', - 'Windows 11', - 'WSL', - 'Xamarin Forms', - 'Yarn', - 'Zend Framework 3', - 'Zig' - ); - echo $boogeraids[array_rand($boogeraids)]; - ?> experience.</td> - </tr> - <tr> - <td><a href="https://github.com/viraptor/reverse-interview">Reverse Interview</a></td> - <td>A list of questions to ask at (tech) job interviews</td> - </tr> - <tr> - <td><a href="https://based.cooking/">based.cooking</a></td> - <td>A recipe website without all the typical recipe website garbage.</td> - </tr> - <tr> - <td><a href="https://www.doesthedogdie.com/">Does the dog die?</a></td> - <td>A crowdsourced database of content warnings for media</td> - </tr> - <tr> - <td><a href="https://www.unconsentingmedia.org/">Unconsenting Media</a></td> - <td>Similar to doesthedogdie but for sexual violence in particular</td> - </tr> - <tr> - <td><a href="https://caniplaythat.com/">Can I Play That?</a></td> - <td>An accessibility-focused videogame review site</td> - </tr> - <tr> - <td><a href="https://spyware.neocities.org/">Spyware Watchdog</a></td> - <td>An index of popular programs that meet an un-eroded definition of "spyware".</td> - </tr> - <tr> - <td><a href="https://transtravel.good.software/">Trans Travel Countries</a></td> - <td>A work-in-progress index of countries with how easy and safe they are to travel to as a transgender person. Written from the perspective of a US citizen.</td> - </tr> - <tr> - <td><a href="https://codeberg.org/Taffer/canadian-alternatives">Canadian Alternatives</a></td> - <td>A collection of Canadian alternatives to common Internet services</td> - </tr> - <tr> - <td><a href="https://www.inaturalist.org/">iNaturalist</a></td> - <td>An extensive crowdsourced library of high-quality photos of over 400,000 species of plants and animals</td> - </tr> - <tr> - <td colspan="2"><a href="https://dotmaetrix.neocities.org/classictranslist">A List Of Games By Trans People Before 2010</a></td> - </tr> - <tr> - <td colspan="2"><a href="https://seirdy.one/posts/2021/03/10/search-engines-with-own-indexes/">A look at search engines with their own indexes</a></td> - </tr> - </table> - <h2>Fun</h2> - <h3>Games</h3> - <table> - <tr> - <td><a href="https://corru.observer">corru.observer</a></td> - <td>Some kind of browser-based sci-fi RPG, or something. It's real good, play it</td> - </tr> - <tr> - <td><a href="https://alula.github.io/SpaceCadetPinball">Space Cadet Pinball</a></td> - <td>Windows XP Space Cadet Pinball, reverse engineered to run in your browser!</td> - </tr> - <tr> - <td><a href="https://findaeden.itch.io/everything-ends-in-0">Everything Ends In 0</a></td> - <td>The world ends in 1 hour. It can't be saved. Wanna chat?</td> - </tr> - <tr> - <td><a href="https://metazooa.com/">Metazooa</a></td> - <td>Wordle but for animal species!</td> - </tr> - </table> - <h3>Generators</h3> - <table> - <tr> - <td><a href="https://emoji.supply/kitchen/">Emoji Kitchen</a></td> - <td>A litany of different emoji fusions. Some of my favourites are <img src="media/scorpionshark.png" style="height: 2rem;" />, <img src="media/bacteriabird.png" style="height: 2rem;" />, and <img src="media/caution.png" style="height: 2rem;" /></td> - </tr> - <tr> - <td><a href="https://cooltext.com/Logo-Design-Burning">Burning Text Generator</a></td> - <td>Does <img src="https://isopod.cool/old/2/images/this_burning.gif" style="height: 3ch;" alt="this (the text is on fire)"></td> - </tr> - <tr> - <td><a href="https://fsymbols.com/generators/zalgo/">Zalgo Text Generator</a></td> - <td>Does tĖĩÍÍÍĖĖģĖhĖĩÍĖžÍÍÍiĖĩÍÍĖžÍĖĒĖsĖĩÍĖžĖĢĖŧ</td> - </tr> - <!--tr> - <td><a href="https://imgflip-is-dead.crabdance.com/">Imgflip is DEAD</a></td> - <td>A clone of Imgflip's meme generator, "because watermarks and tracking suck".</td> - </tr--> - <tr> - <td><a href="https://rezuaq.be/new-area/image-creator/">Fromsoft Image Macro Generator</a></td> - <td>Make your own Dark Souls death screen type images</td> - </tr> - <tr> - <td><a href="https://limes.pink/errors">limes.pink/errors</a></td> - <td>Generates Nintendo console error dialogs</td> - </tr> - <tr> - <td><a href="https://obamify.com/">obamify</a></td> - <td>turns any image into Obama</td> - </tr> - </table> - <h3>Live</h3> - <table> - <tr> - <td><a href="https://www.allaboutbirds.org/cams/">Cornell Lab Bird Cams</a></td> - <td>Live bird cams!</td> - </tr> - <tr> - <td><a href="https://shrimpcam.app/">shrimpcam.app</a></td> - <td>Shrimp cam!</td> - </tr> - </table> - <h3>Other</h3> - <table> - <tr> - <td><a href="https://crouton.net">crouton.net</a></td> - <td>crouton</td> - </tr> - <tr> - <td><a href="https://cornonthec.observer/">cornonthec.observer/</a></td> - <td>corn on the cob server</td> - </tr> - <tr> - <td><a href="https://wobble.town/">Wobble Town</a></td> - <td>A cute little virtual pet!</td> - </tr> - <tr> - <td><a href="https://www.1001freefonts.com/snailets.font">Snailets font</a></td> - <td>The best font</td> - </tr> - <tr> - <td><a href="https://www.vttoth.com/CMS/physics-notes/311-hawking-radiation-calculator">Hawking Radiation Calculator</a></td> - <td>Calculator for properties of a black hole</td> - </tr> - <tr> - <td><a href="https://rose.systems/edible_colors">Edible Colors</a></td> - <td>HTML colors sorted by edibility</td> - </tr> - <tr> - <td><a href="https://xkcd.com/">XKCD</a></td> - <td>A webcomic of romance, sarcasm, math, and language.</td> - </tr> - <tr> - <td><a href="https://github.com/supermariofps/hatsune-miku-windows-linux-cursors">Miku cursors</a></td> - <td>Miku cursors!</td> - </tr> - <tr> - <td><a href="https://www.horg.com/">HORG</a></td> - <td>A comprehensive database of occlupanid taxonomy</td> - </tr> - <tr> - <td><a href="https://e-mail.wtf">e-mail.wtf</a></td> - <td>Everyone knows what an email address is, right? Right?</td> - </tr> - </table> - <!--h2>Articles</h2> - <table> - <tr> - <td><a href="https://www.youtube.com/watch?v=5pYeoZaoWrA">Folding Ideas - This is Financial Advice (âĩ)</a></td> - </tr> - <tr> - <td><a href="https://www.youtube.com/watch?v=8BIcAZxFfrc">hbomberguy - Vaccines and Autism: A Measured Response (âĩ)</a></td> - </tr> - <tr> - <td><a href="https://modem.io/blog/blog-monetization/">modem.io - How to Monetize a Blog</a></td> - </tr> - <tr> - <td><a href="https://www.youtube.com/watch?v=aZ2czFuIYmQ">Benn Jordan - VINYL: Maybe it's time we had an intervention. (âĩ)</a></td> - </tr> - </table--> - <h2>More Stuff</h2> - <table> - <tr> - <td><a href="https://web.archive.org/web/20230817122434/https://links.yesterweb.org/">Yesterlinks</a></td> - <td>A user-curated directory of nearly 600 off-the-beaten-path websites, formerly hosted by the Yesterweb project.</td> - </tr> - <tr> - <td><a href="https://search.marginalia.nu/">Marginalia Search</a> [<a href="https://search.marginalia.nu/explore/random">Random</a>]</td> - <td>A custom-built search engine for small, non-commercial websites.</td> - </tr> - <tr> - <td><a href="https://ooh.directory/">ooh.directory</td> - <td>A directory of over 2,000 blogs about every topic.</td> - </tr> - <tr> - <td><a href="https://unapothecary.neocities.org/websites">Unapothecary Link Directory</a></td> - </tr> - </table> - <div style="text-align:right"> - <a style="text-decoration: none;" href="https://cd5k.net/tau/">τ</a> - </div> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php');?> + <main> + <section> + <h2>outbound links</h2> + <p class="h2caption">the sequel to google (under construction)</p> + + <div class="buttons"> + <a href="https://seaslug.neocities.org/"><img src="buttons/seaslug.png" alt="Sea slug on the net!"></a> + <a href="https://onlysans.neocities.org/"><img src="buttons/onlysans.png" alt="Only Sans"></a> + <a href="https://kalechips.net/"><img src="buttons/kalechips.png" alt="Kalechips"></a> + <a href="https://robophobia.neocities.org/"><img src="buttons/robophobia.gif" alt="Robophobia"></a> + <a href="https://forum.melonland.net/"><img src="buttons/melonland-forum.gif" alt="Melonland Forum"></a> + <a href="https://moth.monster/"><img src="buttons/moth-88x31.svg" alt="Moth Dot Monster"></a> + <a href="https://w.on-t.work/"><img src="buttons/kopper.png" alt="Won't Work!"></a> + <a href="https://xaselgio.net/"><img src="buttons/xaselgio.gif" alt="Indigo's den"></a> + <a href="https://maia.crimew.gay/"><img src="buttons/crimew.png" alt="maia.crimew.gay"></a> + <iframe src="https://baccyflap.com/mus/ti/ti.php" style="width:88px;height:31px" scrolling="no" frameborder="0" style="border: none;" cellspacing="0"></iframe> + <a href="https://midnightsolarium.nekoweb.org/home"><img src="buttons/misor.png" alt="Midnight Solarium"></a> + <a href="https://arimelody.space/"><img src="buttons/arimelody.gif" alt="ari melody"></a> + <a href="https://girlthi.ng/~thermia/"><img src="buttons/thermia.gif" alt="Thermia"></a> + <a href="https://slonk.ing/"><img src="buttons/slonk.webp" alt="slonkazoid"></a> + <a href="https://bee.movie/"><img src="buttons/beedotmovie.png" alt="suspiciouslyBee"></a> + <a href="https://www.idi.moe/"><img src="buttons/tsvety.png" alt="tsvety"></a> + <a href="https://www.unix.dog/~shitpostalotl/"><img src="buttons/sp.png" alt="shitpostalotl"></a> + </div> + + <section> + <h3>Utility</h3> + <dl> + <dt><a href="https://12ft.io/">12ft.io</a></dt> + <dd>Show me a 10ft paywall, I'll show you a 12ft ladder.</dd> + + <dt><a href="https://3ds.hacks.guide/">3DS Hacks Guide</a></dt> + <dd>A comprehensive guide for modding 2ds and 3ds consoles. I know it's legit because I used it on mine.</dd> + + <dt><a href="https://hshop.erista.me/">hShop</a></dt> + <dd>A repository of software for your freshly hacked 3ds</dd> + + <dt><a href="https://newpipe.net/">Newpipe</a> & <a href="https://invidious.io/">Invidious</a></dt> + <dd>Better YouTube frontends for Android and the browser respectively.</dd> + + <dt><a href="https://hypem.com/merch-table">Hype Machine Merch Table</a></dt> + <dd>Scans a Spotify playlist and links the Bandcamp page of any artist in it who has one.</dd> + + <dt><a href="https://regexr.com/">RegExr</a></dt> + <dd>A website to test regular expressions for you</dd> + + <dt><a href="https://8mb.video/">8mbvideo</a></dt> + <dd>Compresses any video file just enough to comply with Discord's filesize limits.</dd> + + <dt><a href="https://jort.link/">jort.link</a></dt> + <dd>A shield to prevent accidental DDOSing of links posted to the fediverse</dd> + </dl> + </section> + + <section> + <h3>Informational</h3> + <dl> + <dt><a href="https://easyussr.neocities.org/torrenting.html">Easy USSR</a></dt> + <dd>A comprehensive beginner's guide to <span class="serif">Legally Acquiring Media</span></dd> + + <dt><a href="https://landchad.net/">LandChad.net</a></dt> + <dd>A collection of tutorials for setting up various self-hosted services.</dd> + + <dt><a href="https://switching.software/">switching.software</a></dt> + <dd>A curated list of alternatives to popular software and services from companies like Google and Amazon.</dd> + + <dt><a href="https://github.com/awesome-selfhosted/awesome-selfhosted">Awesome Selfhosted</a></dt> + <dd>A comprehensive list of self-hosted alternatives to various software.</dd> + + <dt><a href="https://linuxdaw.org/">Linux DAW</a></dt> + <dd>A comprehensive list of VST plugins that work on Linux.</dd> + + <dt><a href="https://www.darkpattern.games/">Dark Pattern Games</a></dt> + <dd>A database of mobile games that flags them for predatory design patterns.</dd> + + <dt><a href="https://jsrn.net/howoldisit/">How old is it?</a></dt> + <dd>For when your prospective employer asks for 10 years of <?php + $boogeraids = array( + '.NET Core', + 'AdonisJs', + 'Apache Airflow', + 'Angular', + 'Aurelia', + 'Azure Purview', + 'Azure Synapse Analytics', + 'Babel', + 'Bootstrap 3', + 'Bootstrap 4', + 'Bootstrap 5', + 'Bulma', + 'Caddy', + 'ClickHouse', + 'CockroachDB', + 'Concourse', + 'Crystal', + 'Deno', + 'Docker', + 'Dronecode', + 'Ecto', + 'Electron', + 'FastAPI', + 'Fastify', + 'Flutter', + 'fsl', + 'Gatsby', + 'Ghost', + 'Godot', + 'Grafana', + 'GraphQL', + 'Gulp', + 'Apache Hive', + 'Hugo', + 'Hyperledger', + 'IBM MQ', + 'Inferno JS', + 'Infinidash', + 'InfluxDB', + 'Ionic', + 'Istio', + 'jssm', + 'Keras', + 'Kubernetes', + 'Laravel 4', + 'Laravel 5', + 'Materialize CSS', + 'Metal', + 'Micronaut', + 'Mithril.js', + 'NativeScript', + 'Nerves', + 'NestJS', + 'Nette', + 'NextJS', + 'Nuxt', + 'Odin', + 'Parcel', + 'Phalcon', + 'Phoenix', + 'PHPStan', + 'Podman', + 'Polymer', + 'Power BI', + 'Power BI Embedded', + 'Power Query M Formula Language', + 'Preact', + 'Prometheus', + 'PX4 Firmware', + 'PyTorch', + 'Quasar', + 'Raku', + 'Ramda', + 'React', + 'React Native', + 'ReasonML', + 'Redux', + 'Rollup', + 'ROS 2', + 'RxJs', + 'scikit-image', + 'Serverless Framework', + 'Shiny', + 'Snowpack', + 'Solidity', + 'Apache Spark', + 'Spock Framework', + 'Svelte', + 'Swift', + 'Tailwind', + 'Telegraf', + 'TensorFlow', + 'Terraform', + 'TOML', + 'Traefik', + 'Umbrella JS', + 'VSCode', + 'Vue', + 'Vulkan', + 'WebAssembly', + 'Windows 10', + 'Windows 11', + 'WSL', + 'Xamarin Forms', + 'Yarn', + 'Zend Framework 3', + 'Zig' + ); + echo $boogeraids[array_rand($boogeraids)]; + ?> experience.</dd> + + <dt><a href="https://github.com/viraptor/reverse-interview">Reverse Interview</a></dt> + <dd>A list of questions to ask at (tech) job interviews</dd> + + <dt><a href="https://based.cooking/">based.cooking</a></dt> + <dd>A recipe website without all the typical recipe website garbage.</dd> + + <dt><a href="https://www.doesthedogdie.com/">Does the dog die?</a></dt> + <dd>A crowdsourced database of content warnings for media</dd> + + <dt><a href="https://www.unconsentingmedia.org/">Unconsenting Media</a></dt> + <dd>Similar to doesthedogdie but for sexual violence in particular</dd> + + <dt><a href="https://caniplaythat.com/">Can I Play That?</a></dt> + <dd>An accessibility-focused videogame review site</dd> + + <dt><a href="https://spyware.neocities.org/">Spyware Watchdog</a></dt> + <dd>An index of popular programs that meet an un-eroded definition of "spyware".</dd> + + <dt><a href="https://transtravel.good.software/">Trans Travel Countries</a></dt> + <dd>A work-in-progress index of countries with how easy and safe they are to travel to as a transgender person. Written from the perspective of a US citizen.</dd> + + <dt><a href="https://codeberg.org/Taffer/canadian-alternatives">Canadian Alternatives</a></dt> + <dd>A collection of Canadian alternatives to common Internet services</dd> + + <dt><a href="https://www.inaturalist.org/">iNaturalist</a></dt> + <dd>An extensive crowdsourced library of high-quality photos of over 400,000 species of plants and animals</dd> + + <dt></dt><dd><a href="https://dotmaetrix.neocities.org/classictranslist">A List Of Games By Trans People Before 2010</a></dd> + + <dt></dt><dd><a href="https://seirdy.one/posts/2021/03/10/search-engines-with-own-indexes/">A look at search engines with their own indexes</a></dd> + </dl> + </section> + + <section> + <h3>Fun</h3> + + <section> + <h4>Games</h4> + <dl> + <dt><a href="https://corru.observer">corru.observer</a></dt> + <dd>Some kind of browser-based sci-fi RPG, or something. It's real good, play it</dd> + + <dt><a href="https://alula.github.io/SpaceCadetPinball">Space Cadet Pinball</a></dt> + <dd>Windows XP Space Cadet Pinball, reverse engineered to run in your browser!</dd> + + <dt><a href="https://findaeden.itch.io/everything-ends-in-0">Everything Ends In 0</a></dt> + <dd>The world ends in 1 hour. It can't be saved. Wanna chat?</dd> + + <dt><a href="https://metazooa.com/">Metazooa</a></dt> + <dd>Wordle but for animal species!</dd> + + <dt><a href="https://rose.systems/animalist/">list animals until failure</a></dt> + <dd>hot new brain workout</dd> + + <dt><a href="https://github.com/PGgamer2/balatro-mobile-builder">Balatro Mobile Builder</a></dt> + <dd>Converts your copy of desktop Balatro into a mobile app. Useful if you're on a custom OS and the Play Store gets pissy if you try to buy it legitimately.</dd> + </dl> + </section> + + <section> + <h4>Generators</h4> + <dl> + <dt><a href="https://emoji.supply/kitchen/">Emoji Kitchen</a></dt> + <dd>A litany of different emoji fusions. Some of my favourites are <img src="media/scorpionshark.png" style="height: 2rem;" />, <img src="media/bacteriabird.png" style="height: 2rem;" />, and <img src="media/caution.png" style="height: 2rem;" /></dd> + + <dt><a href="https://cooltext.com/Logo-Design-Burning">Burning Text Generator</a></dt> + <dd>Does <img src="https://isopod.cool/old/2/images/this_burning.gif" style="height: 3ch;" alt="this (the text is on fire)"></dd> + + <dt><a href="https://fsymbols.com/generators/zalgo/">Zalgo Text Generator</a></dt> + <dd>Does tĖĩÍÍÍĖĖģĖhĖĩÍĖžÍÍÍiĖĩÍÍĖžÍĖĒĖsĖĩÍĖžĖĢĖŧ</dd> + + <!-- + <dt><a href="https://imgflip-is-dead.crabdance.com/">Imgflip is DEAD</a></dt> + <dd>A clone of Imgflip's meme generator, "because watermarks and tracking suck".</dd> + --> + + <dt><a href="https://rezuaq.be/new-area/image-creator/">Fromsoft Image Macro Generator</a></dt> + <dd>Make your own Dark Souls death screen type images</dd> + + <dt><a href="https://limes.pink/errors">limes.pink/errors</a></dt> + <dd>Generates Nintendo console error dialogs</dd> + + <dt><a href="https://obamify.com/">obamify</a></dt> + <dd>turns any image into Obama</dd> + </dl> + </section> + + <section> + <h4>Live</h4> + <dl> + <dt><a href="https://www.allaboutbirds.org/cams/">Cornell Lab Bird Cams</a></dt> + <dd>Live bird cams!</dd> + + <dt><a href="https://shrimpcam.app/">shrimpcam.app</a></dt> + <dd>Shrimp cam!</dd> + </dl> + </section> + + <section> + <h4>Other</h4> + <dl> + <dt><a href="https://crouton.net">crouton.net</a></dt> + <dd>crouton</dd> + + <dt><a href="https://cornonthec.observer/">cornonthec.observer/</a></dt> + <dd>corn on the cob server</dd> + + <dt><a href="https://wobble.town/">Wobble Town</a></dt> + <dd>A cute little virtual pet!</dd> + + <dt><a href="https://www.1001freefonts.com/snailets.font">Snailets font</a></dt> + <dd>The best font</dd> + + <dt><a href="https://www.vttoth.com/CMS/physics-notes/311-hawking-radiation-calculator">Hawking Radiation Calculator</a></dt> + <dd>Calculator for properties of a black hole</dd> + + <dt><a href="https://rose.systems/edible_colors">Edible Colors</a></dt> + <dd>HTML colors sorted by edibility</dd> + + <dt><a href="https://xkcd.com/">XKCD</a></dt> + <dd>A webcomic of romance, sarcasm, math, and language.</dd> + + <dt><a href="https://github.com/supermariofps/hatsune-miku-windows-linux-cursors">Miku cursors</a></dt> + <dd>Miku cursors!</dd> + + <dt><a href="https://www.horg.com/">HORG</a></dt> + <dd>A comprehensive database of occlupanid taxonomy</dd> + + <dt><a href="https://e-mail.wtf">e-mail.wtf</a></dt> + <dd>Everyone knows what an email address is, right? Right?</dd> + + <dt><a href="https://gradient.horse/">gradient.horse</a></dt> + <dd>Create a beautiful horse</dd> + </dl> + </section> + </section> + + <!--section> + <h3>Articles</h3> + <table> + + <td><a href="https://www.youtube.com/watch?v=5pYeoZaoWrA">Folding Ideas - This is Financial Advice (âĩ)</a></td> + + + <td><a href="https://www.youtube.com/watch?v=8BIcAZxFfrc">hbomberguy - Vaccines and Autism: A Measured Response (âĩ)</a></td> + + + <td><a href="https://modem.io/blog/blog-monetization/">modem.io - How to Monetize a Blog</a></td> + + + <td><a href="https://www.youtube.com/watch?v=aZ2czFuIYmQ">Benn Jordan - VINYL: Maybe it's time we had an intervention. (âĩ)</a></td> + + </table> + </section--> + + <section> + <h3>More Stuff</h3> + <dl> + <dt><a href="https://web.archive.org/web/20230817122434/https://links.yesterweb.org/">Yesterlinks</a></dt> + <dd>A user-curated directory of nearly 600 off-the-beaten-path websites, formerly hosted by the Yesterweb project.</dd> + + <dt><a href="https://search.marginalia.nu/">Marginalia Search</a> [<a href="https://search.marginalia.nu/explore/random">Random</a>]</dt> + <dd>A custom-built search engine for small, non-commercial websites.</dd> + + <dt><a href="https://ooh.directory/">ooh.directory</a></dt> + <dd>A directory of over 2,000 blogs about every topic.</dd> + + <dt></dt> + <dd><a href="https://unapothecary.neocities.org/websites">Unapothecary Link Directory</a></dd> + </dl> + </section> + <p style="text-align:right"> + <a style="text-decoration: none;" href="https://cd5k.net/tau/">τ</a> + </p> + </section> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php');?> </body> </html> diff --git a/about/images/cheddar03.gif b/me/cheddar03.gif Binary files differindex ead9066..ead9066 100644 --- a/about/images/cheddar03.gif +++ b/me/cheddar03.gif diff --git a/about/images/crackship_quiz_result.png b/me/crackship_quiz_result.png Binary files differindex 8b4d701..8b4d701 100644 --- a/about/images/crackship_quiz_result.png +++ b/me/crackship_quiz_result.png diff --git a/me/index.php b/me/index.php new file mode 100644 index 0000000..67c7bae --- /dev/null +++ b/me/index.php @@ -0,0 +1,137 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>me | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> + </head> + <body> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + + <main> + <section> + <h2>about me</h2> + <section id="specs"> + <h3>Specs</h3> + <dl style="--ratio: .25;"> + <dt>Known pseudonyms</dt> + <dd>deep twisty / isopodhours / isopod gaming / bathynomus</dd> + <dt>Known normalnyms</dt> + <dd>Ada / Hannah</dd> + <dt>Known necronyms</dt> + <dd>[DATA EXPUNGED]</dd> + <dt>Known pronounyms</dt> + <dd>she/it >> <a href="pronouns/">more info</a></dd> + <dt>Preoccupations</dt> + <dd>Computer hardware / computer software / electronics / making music and 3D art / DIY nonsense of all shapes and sizes</dd> + <dt>Education</dt> + <dd>Web Design (ongoing)</dd> + <dt>trnas</dt> + <dd>gener</dd> + <dt></dt> + <dd><a href="/stats/">More info</a></dd> + </dl> + </section> + <section id="links"> + <h3>Links</h3> + <dl> + <dt>Email</dt> + <dd><a href="mailto:webmaster@isopod.cool">webmaster@isopod.cool</a></dd> + <dt>Signal</dt> + <dd><a href="https://signal.me/#eu/Q5Z321Fn6bCsLhj3kNwXxvSgAUmbFiVtx2F-oG0A9_Egl_uTUmNLLYHs1WwbUE4B">isopod.97</a></dd> + <dt>Discord</dt> + <dd>ask</dd> + <dt>Steam</dt> + <dd>ask</dd> + <dt>Stoat</dt> + <dd>bathynomus#5230 (I don't check this one much!)</dd> + <dt>Fediverse</dt> + <dd><a href="https://isopod.zone/@root">@root@isopod.zone</a></dd> + <dt>Fediverse (backup)</dt> + <dd><a href="https://transfem.social/@isopod">@isopod@transfem.social</a></dd> + <dt>Tumblr</dt> + <dd><a href="https://tumblr.isopod.cool/">@isopodhours</a></dd> + <dt>Bluesky</dt> + <dd><a href="https://bsky.app/profile/isopod.cool">@isopod.cool</a></dd> + <dt>Youtube (music)</dt> + <dd><a href="https://www.youtube.com/@deeptwisty">deep twisty</a></dd> + <dt>Youtube (other)</dt> + <dd><a href="https://www.youtube.com/@isopodgaming">isopod gaming</a></dd> + <dt>Twitch</dt> + <dd><a href="https://www.twitch.tv/isopodgaming_">isopodgaming_</a></dd> + <dt>Bandcamp</dt> + <dd><a href="https://deeptwisty.bandcamp.com/">deeptwisty</a></dd> + <dt>itch.io</dt> + <dd><a href="https://deeptwisty.itch.io/">deeptwisty</a></dd> + <dt>Ko-fi</dt> + <dd><a href="https://ko-fi.com/deeptwisty">deeptwisty</a></dd> + <dt>Forgejo</dt> + <dd><a href="https://git.isopod.cool/root/">git.isopod.cool/root</a></dd> + </dl> + </section> + <section id="deeptwisty"> + <h3>What's a "deep twisty"?</h3> + <p>"deep twisty" is a pseudonym I came up with to post my music and such things under. At this point it exists largely as a way to compartmentalize my online identity such that I can link my art to people who I might not want seeing all this. It comes from some tweets from an <a href="https://web.archive.org/web/20221214182955/https://twitter.com/SubnauticaSCM/status/1095774020446744576">official Subnautica twitter account</a> where they referred to the then-work-in-progress Deep Twisty Bridges biome as just "deep twisty". I thought it sounded funny. I'm no longer sure what possessed me to use that as a basis for my Personal Brand™, but here we are.</p> + </section> + <section id="quizresults"> + <h3>Quiz results</h3> + <div class="quizresults"> + <a href="https://casiopea.neocities.org/isopod/isopodquiz.html"><img src="isopod_quiz_result.png" alt="Isopod quiz: My species is Bathynomus Giganteus"></a> + <a href="https://ouroboreas.neocities.org/quizzes/crackships/quiz"><img src="crackship_quiz_result.png" height="100px" alt="Crackship quiz: I'm Phileri (Dr. Phil M&M x Guy Fieri)"></a> + <a href="https://andou.gay/quiz/donutquiz"><img src="https://andou.gay/quiz/chocolate donut.png" height="100px" alt="Donut quiz: I'm a chocolate dipped donut"></a> + <a href="https://swiftyshq.neocities.org/fun/quiz/rock/" title="Description: ough.... youre so relaxed.... this rock is PERFECT for napping on.... it's warmed by the sun too... .yo.... snzz"><img src="https://swiftyshq.neocities.org/img/quiz/rock/r2.png" height="100px" alt="Rock quiz: My ideal rock is a smooth river rock"></a> + <a href="https://swiftyshq.neocities.org/fun/quiz/creature/" title="Description: http creature not found. you are maybe toxic but in a funny way. gods little meow meow"><img src="https://swiftyshq.neocities.org/img/quiz/creature/res3.png" height="100px" alt="Creature quiz: I'm a "Malware Monster""></a> + <a href="http://cupped-expressions.net/cheese/quiz/"><img src="cheddar03.gif" width="226" height="93" alt="Cheese quiz: I am cheddar cheese!"></a> + <a href="https://wuffs.org/quiz/"><img src="wuffsquiz.png" height="100" alt="Verbose quiz result incoming: You are a Large Quiz Enjoyer. Aw, what a good girl you are...! You made it through 30 questions and proved your devotion to my bullshit. đ Tags: đ§ Hydrated...? đ Behaves Unprofessionally đ Savvy Shopper đĨ Egg đļī¸ Kinky đž Creature :) đĨ Potato Powered đĻļ Feet-Aware đĨ Breakfast Appreciator đĢ 1 â ī¸ Wildy Fearer đ´ââ ī¸ Pirate đĻ Creamy Girl"></a> + </div> + </section> + <section id="testimonials"> + <h3>Testimonials</h3> + <figure class="quote"> + <blockquote> + isopod girl supreme + </blockquote> + <figcaption> + â <a href="https://mifs.tumblr.com/">mifs</a> + </figcaption> + </figure> + <figure class="quote"> + <blockquote> + Furry behavior + </blockquote> + <figcaption> + â <a href="https://seaslug.neocities.org/">seaslug</a> + </figcaption> + </figure> + <figure class="quote"> + <blockquote> + this hurts me deeply + </blockquote> + <figcaption> + â <a href="https://labyrinth.zone/objects/0a4a2e38-e85b-44c8-9f50-ba04c7dee4c3">UsernameSwift</a> + </figcaption> + </figure> + <figure class="quote"> + <blockquote> + what have you done?? + </blockquote> + <figcaption> + â <a href="https://wizzzard.online/@starwall/113698160551944339">Starwall</a> + </figcaption> + </figure> + <figure class="quote"> + <blockquote> + hmm. wet. + </blockquote> + <figcaption> + â <a href="https://kitty.social/notes/9xopils3pjoy006w">Zizi</a> + </figcaption> + </figure> + </section> + </section> + </main> + + <?php include($_SERVER['DOCUMENT_ROOT'] . "/footer.php"); ?> + </body> +</html>
\ No newline at end of file diff --git a/about/images/isopod_quiz_result.png b/me/isopod_quiz_result.png Binary files differindex 31d29e1..31d29e1 100644 --- a/about/images/isopod_quiz_result.png +++ b/me/isopod_quiz_result.png diff --git a/about/pronouns/bad.svg b/me/pronouns/bad.svg index 069da16..069da16 100644 --- a/about/pronouns/bad.svg +++ b/me/pronouns/bad.svg diff --git a/about/pronouns/bg.jpg b/me/pronouns/bg.jpg Binary files differindex 2cc9218..2cc9218 100644 --- a/about/pronouns/bg.jpg +++ b/me/pronouns/bg.jpg diff --git a/about/pronouns/bg_dither.png b/me/pronouns/bg_dither.png Binary files differindex 96baec0..96baec0 100644 --- a/about/pronouns/bg_dither.png +++ b/me/pronouns/bg_dither.png diff --git a/about/pronouns/friend.svg b/me/pronouns/friend.svg index ad67d3c..ad67d3c 100644 --- a/about/pronouns/friend.svg +++ b/me/pronouns/friend.svg diff --git a/about/pronouns/good.svg b/me/pronouns/good.svg index a2d6d96..a2d6d96 100644 --- a/about/pronouns/good.svg +++ b/me/pronouns/good.svg diff --git a/me/pronouns/index.php b/me/pronouns/index.php new file mode 100644 index 0000000..c6106f8 --- /dev/null +++ b/me/pronouns/index.php @@ -0,0 +1,59 @@ + +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>pronounce | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> + <style> + .entry-container { + display: flex; + flex-wrap: wrap; + justify-content: center; + align-items: center; + gap: var(--stdpadding); + } + .labeled-entry { + display: flex; + align-items: center; + gap: calc(var(--stdpadding) / 2); + } + .labeled-entry img { + height: 2em; + filter: invert(); + } + </style> + </head> + <body> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + + <main> + <p class="prefers-contrast-less-message">If you're reading this with your eyes and not a screen reader, that means you have, somehow, indicated a preference that this page be displayed with reduced contrast. I genuinely have no clue how you did this, or how I as a web dev am supposed to handle it. I hope my solution of applying a reduced-contrast filter to the entire page is to your liking. If not, please contact me and tell me what you'd prefer I do here, because I'm genuinely lost.</p> + <section> + <h2>i got pronouns</h2> + <p class="h2caption">blue hair pending</p> + <p class="backlink"><a href="../"><< about me</a></p> + <p>I briefly had a page on <a href="https://pronouns.cc">pronouns.cc</a> once but hell if I'm gonna use it when I have my own website</p> + <div class="entry-container notice"> + <span class="labeled-entry"><img src="good.svg" alt="Good"> Preferred</span> + <span class="labeled-entry"><img src="friend.svg" alt="Friends only"> Friends only</span> + <span class="labeled-entry"><img src="bad.svg" alt="Bad"> Don't</span> + </div> + <section> + <h3>Pronouns</h3> + <div class="entry-container"> + <span class="labeled-entry"><img src="good.svg" alt="Good"> she/her</span> + <span class="labeled-entry"><img src="good.svg" alt="Good"> it/its</span> + <span class="labeled-entry"><img src="friend.svg" alt="Friends only"> they/them</span> + <span class="labeled-entry"><img src="bad.svg" alt="Bad"> he/him</span> + </div> + </section> + </section> + </main> + + <?php include($_SERVER['DOCUMENT_ROOT'] . "/footer.php"); ?> + + + </body> +</html> diff --git a/me/wuffsquiz.png b/me/wuffsquiz.png Binary files differnew file mode 100644 index 0000000..06b81b0 --- /dev/null +++ b/me/wuffsquiz.png diff --git a/meta/index.php b/meta/index.php new file mode 100644 index 0000000..5361c4b --- /dev/null +++ b/meta/index.php @@ -0,0 +1,70 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>meta | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> + </head> + <body> + <?php include('../header.php'); ?> + + <main> + <section> + <h2>meta</h2> + <p class="h2caption">principled readers can feel free to call it my facebook page</p> + <p>You're looking at (or otherwise viewing) the fourth major iteration of <a href="/me">my</a> personal website. More specifically, this is the page on my personal website about my personal website. I've heard some people call this a colophon.</p> + <p>This site was created to act as a center of sorts for my online presence, and has since become the go-to place for the surprisingly broad array of things I want to put on the internet that social media isn't a good fit for.</p> + <section> + <h3>tech specs</h3> + <p>This site is composed of a combination of handwritten HTML/CSS and server-side rendering done in PHP, also handwritten. None of that static site generator nonsense here, baby. No Javascript either. That shit's cringe.</p> + <p>For hosting, I use Caddy on Ubuntu Server, on an OVHCloud dedicated box you can read more about <a href="/uses/cumulonimbus">here</a>. To be clear, you don't need anywhere near that kind of horsepower to host a basic PHP site like this — the cheapest VPS Hetzner or whoever will sell you will be more than plenty for that. I'm just crazy and do a lot of other stuff on there.</p> + <p>This site supports <a href="https://codeberg.org/LunarEclipse/well-known-button">.well-known/button</a>, if you're one of the two people on earth to build something that uses it. If you link your website in a post on my guestbook and it supports that standard, your button will show up there!</p> + </section> + <section> + <h3>Accessibility</h3> + <p>I've made an effort to make this website as responsive and accessible as I reasonably can. At present, this entails:</p> + <ul> + <li>Alt text everywhere and a best-effort attempt at semantic HTML and keyboard navigability</li> + <li>Default colours that (mostly) meet the WCAG contrast guideline of 4.5:1</li> + <li>Extensive use of CSS media queries for: + <ul> + <li>Light theme</li> + <li>High-contrast color theme that defers to system-provided colors</li> + <li>Making sure stuff doesn't look broken in forced colours mode</li> + <li>Adapting to smaller displays and high zoom levels</li> + <li>Disabling of animated effects</li> + </ul> + </li> + </ul> + <p>That's all well and good, but there are some other points I want to address:</p> + <p>While the colour contrast meets <a href="https://developer.mozilla.org/en-US/docs/Web/Accessibility/Guides/Understanding_WCAG/Perceivable/Color_contrast">WCAG standards</a> in most places, the one major exception is links in areas with highlighted backgrounds, which have a contrast ratio of a bit over 3.5. I'm treating this as acceptable because it's still decently readable for most, and the high-contrast theme renders this a non-issue by removing those backgrounds.</p> + <p>You may notice that I've omitted any kind of direct toggle for themes, fonts, animations, etc. I've opted to use media queries for those purposes instead in order to automatically respect the viewer's system settings. My thinking is that most people who need those features will probably have them enabled at the browser or OS level anyway, so forcing them to set them using a Javascript-based toggle for my site in particular would be unnecessary extra work for both of us.</p> + <p>On the subject of media queries, there's a media query that allows the user to indicate a preference for lower contrast, but I've yet to find any way to trigger it or any information on how I'm supposed to respond to it. My stopgap solution for now is to apply a lowered-contrast filter to the whole page when that setting is active. I'm not confident this is the way to go here.</p> + <p>Finally, the hamburger menu that materializes on small displays works using the CSS "checkbox hack". This is not keyboard friendly, but I've compensated for it by using the shiny new :has selector to open the nav menu automatically when you focus something in it with the keyboard. I'm aware this probably isn't great, but I'm hoping it won't pose much of a problem because being affected by this would require you to be using keyboard navigation, and be on a relatively small screen, and actually be reliant on sight to view the page (eg. blind people using screen readers shouldn't even notice the difference). In other words, I'm kind of banking on that overlap being small enough that nobody in it ever stumbles upon this site. If that's you, sorry.</p> + <p>I'd like to eventually devise some sort of hybrid solution that uses accessible Javascript with <button>s and such and falls back to the checkbox hack if you have that disabled, but I've yet to do that as of writing.</p> + </section> + <section> + <h3>Credits</h3> + <p>This site uses the font family <a href="https://fonts.google.com/specimen/B612+Mono">B612 Mono</a> pretty much everywhere.</p> + <img src="/images/reactions/thumbsup.png" alt="me giving an enthusiastic thumbs up" style="max-width: 7rem; float: left; margin-right: var(--stdpadding);"> + <p><-- As of now, all of these little portraits were drawn by me, as well as the isopod in the site header. You can tell because they use my trademark "style" of thick, scribbly lines and the Krita default brush.</p> + <p>The main dark mode background image is a screenshot I took myself of Subnautica: Below Zero, a game that I've played for less than an hour since it left early access. All other backgrounds were taken from Duckduckgo image searches.</p> + <p>Some resources I've found helpful:</p> + <dl> + <dt><a href="https://developer.mozilla.org/">MDN Web Docs</a></dt> + <dd>Comprehensive documentation on HTML, CSS, and Javascript</dd> + <dt><a href="https://www.php.net/manual/en/">PHP Manual</a></dt> + <dd>Comprehensive documentation for PHP</dd> + <dt><a href="https://landchad.net">LandChad.net</a></dt> + <dd>A good, if opinionated, resource on self-hosting that was instrumental to getting me started doing this</dd> + <dt><a href="https://pinkvampyr.leprd.space/accessiblenet/guidelines.php">Accessible Net Directory Guidelines</a></dt> + <dd>Great resource on web accessibility information. This is the source of most of the checklist I was trying to hit with this latest major revision.</dd> + </dl> + </section> + </section> + </main> + + <?php include("../footer.php"); ?> + </body> +</html>
\ No newline at end of file diff --git a/music/covers/clipping.jpg b/music/covers/clipping.jpg Binary files differnew file mode 100644 index 0000000..9e1dd9e --- /dev/null +++ b/music/covers/clipping.jpg diff --git a/music/covers/femtanyl.jpg b/music/covers/femtanyl.jpg Binary files differnew file mode 100644 index 0000000..9cdf503 --- /dev/null +++ b/music/covers/femtanyl.jpg diff --git a/music/covers/findaeden.jpg b/music/covers/findaeden.jpg Binary files differnew file mode 100644 index 0000000..1149f2a --- /dev/null +++ b/music/covers/findaeden.jpg diff --git a/music/covers/foofighters.jpg b/music/covers/foofighters.jpg Binary files differnew file mode 100644 index 0000000..814db55 --- /dev/null +++ b/music/covers/foofighters.jpg diff --git a/music/covers/hakita.webp b/music/covers/hakita.webp Binary files differnew file mode 100644 index 0000000..2f7fa63 --- /dev/null +++ b/music/covers/hakita.webp diff --git a/music/covers/justice.jpg b/music/covers/justice.jpg Binary files differnew file mode 100644 index 0000000..68415a4 --- /dev/null +++ b/music/covers/justice.jpg diff --git a/music/covers/mekaloton.jpg b/music/covers/mekaloton.jpg Binary files differnew file mode 100644 index 0000000..d7c700c --- /dev/null +++ b/music/covers/mekaloton.jpg diff --git a/music/covers/mountainhead.jpg b/music/covers/mountainhead.jpg Binary files differnew file mode 100644 index 0000000..f729bbb --- /dev/null +++ b/music/covers/mountainhead.jpg diff --git a/music/covers/noisemaster.jpg b/music/covers/noisemaster.jpg Binary files differnew file mode 100644 index 0000000..d909ad4 --- /dev/null +++ b/music/covers/noisemaster.jpg diff --git a/music/covers/redvox.jpg b/music/covers/redvox.jpg Binary files differnew file mode 100644 index 0000000..1a489de --- /dev/null +++ b/music/covers/redvox.jpg diff --git a/music/covers/waxlimbs.jpg b/music/covers/waxlimbs.jpg Binary files differnew file mode 100644 index 0000000..7590c7a --- /dev/null +++ b/music/covers/waxlimbs.jpg diff --git a/music/index.php b/music/index.php index c538100..08eb2ad 100644 --- a/music/index.php +++ b/music/index.php @@ -4,8 +4,8 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Music</title> - <link href="../../style.css" rel="stylesheet" type="text/css" media="all"> + <title>music | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> <style> #flex-container { display: flex; @@ -15,8 +15,8 @@ #flex-container a { --columncount: 2; position: relative; - width: calc(var(--bodywidth) / var(--columncount)); - height: calc(var(--bodywidth) / var(--columncount)); + width: calc(100% / var(--columncount)); + aspect-ratio: 1; background-image: var(--img); background-size: cover; transition-duration: 0.5s; @@ -57,44 +57,170 @@ } } </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(false, -10); ?> - <h1>music</h1> - <h2 id="caption">Albums I like</h2> - <div id="flex-container"> - <a style="--img: url(covers/spectrum.jpg);" target="_blank" href="https://findaeden.bandcamp.com/album/spectrum" ><span>findaeden - Spectrum</span></a> - <a style="--img: url(covers/funeral.jpg);" target="_blank" href="https://noisemaster.bandcamp.com/album/funeral-ep" ><span>Noisemaker - Funeral EP</span></a> - <a style="--img: url(covers/ultrakill_imperfect_hatred.jpg);" target="_blank" href="https://heavenpierceher.bandcamp.com/album/ultrakill-imperfect-hatred"><span>Heaven Pierce Her - ULTRAKILL: Imperfect Hatred</span></a> - <a style="--img: url(covers/el_camino.jpg);" target="_blank" href="https://theblackkeys.com/?frontpage=true" ><span>The Black Keys - El Camino</span></a> - <a style="--img: url(covers/for_science.jpg);" target="_blank" href="https://waxlimbs.bandcamp.com/album/for-science" ><span>Waxlimbs - For Science!</span></a> - <a style="--img: url(covers/unstoppable_force.jpg);" target="_blank" href="https://caliphate.bandcamp.com/album/unstoppable-force" ><span>CALIPHATE - Unstoppable Force</span></a> - <a style="--img: url(covers/walks_of_lung.jpg);" target="_blank" href="https://patriciataxxon.bandcamp.com/album/walks-of-lung" ><span>Patricia Taxxon - Walks of Lung</span></a> - <a style="--img: url(covers/raw_data_feel.jpg);" target="_blank" href="https://everythingeverything.bandcamp.com/album/raw-data-feel" ><span>Everything Everything - Raw Data Feel</span></a> - <a style="--img: url(covers/realign.jpg);" target="_blank" href="https://vine.bandcamp.com/album/realign" ><span>Red Vox - Realign</span></a> - <a style="--img: url(covers/simulation_theory.jpg);" target="_blank" href="https://www.muse.mu/music?album=simulation_theory" ><span>Muse - Simulation Theory</span></a> - <a style="--img: url(covers/with_teeth.jpg);" target="_blank" href="https://www.nin.com/" ><span>Nine Inch Nails - With Teeth</span></a> - <a style="--img: url(covers/two_house.jpg);" target="_blank" href="https://foodhouse.bandcamp.com/album/two-house" ><span>Food House - two house</span></a> - <a style="--img: url(covers/american_automatic.jpg);" target="_blank" href="https://en.wikipedia.org/wiki/Kill_Memory_Crash" ><span>Kill Memory Crash - American Automatic</span></a> - <a style="--img: url(covers/fucked_up_friends_3.jpg);" target="_blank" href="https://tobaxxo.bandcamp.com/album/fucked-up-friends-3" ><span>TOBACCO - Fucked Up Friends 3</span></a> - <a style="--img: url(covers/audio_video_disco.jpg);" target="_blank" href="https://etjusticepourtous.bandcamp.com/album/audio-video-disco-1" ><span>Justice - Audio, Video, Disco</span></a> - <a style="--img: url(covers/synthicate.jpg);" target="_blank" href="https://newretrowave.bandcamp.com/album/synthicate" ><span>LAZERPUNK - Synthicate</span></a> - <a style="--img: url(covers/peaks_and_valleys.jpg);" target="_blank" href="https://revolutionpeak.bandcamp.com/album/peaks-and-valleys" ><span>Revolution Peak - Peaks and Valleys</span></a> - <a style="--img: url(covers/triangle_unicode.jpg);" target="_blank" href="https://wearemagonia.bandcamp.com/album/triangle-unicode-lp" ><span>We Are Magonia - Triangle Unicode</span></a> - <a style="--img: url(covers/vast.jpg);" target="_blank" href="https://waterflame.bandcamp.com/album/vast" ><span>Waterflame - Vast</span></a> - <a style="--img: url(covers/tortured_waters.jpg);" target="_blank" href="https://newretrowave.bandcamp.com/album/tortured-waters" ><span>DEADLIFE - Tortured Waters</span></a> - <a style="--img: url(covers/spirit_phone.jpg);" target="_blank" href="http://www.neilcic.com/" ><span>Lemon Demon - Spirit Phone</span></a> - <a style="--img: url(covers/millenialism.jpg);" target="_blank" href="https://music.businesscasual.biz/album/millennialism" ><span>NYSE - MILLENNIALISM</span></a> - <a style="--img: url(covers/hawaii_part_ii.jpg);" target="_blank" href="https://miraclemusical.bandcamp.com" ><span>ããŠã¯ãĢããĨãŧã¸ãĢãĢ - Hawaii: Part II</span></a> - <a style="--img: url(covers/concrete_and_gold.jpg);" target="_blank" href="https://www.foofighters.com/" ><span>Foo Fighters - Concrete and Gold</span></a> - <a style="--img: url(covers/revolution_radio.jpg);" target="_blank" href="https://greenday.com/" ><span>Green Day - Revolution Radio</span></a> - <a style="--img: url(covers/this_is_all_yours.jpg);" target="_blank" href="https://altjband.com/" ><span>Alt-J - This Is All Yours</span></a> - <a style="--img: url(covers/the_last_ninja_2_c64_ost.jpg);" target="_blank" href="https://www.youtube-nocookie.com/embed/bjbN2RyZXHI" ><span>Matt Gray - The Last Ninja 2 (C64) OST</span></a> - <a style="--img: url(covers/aeon_core.jpg);" target="_blank" href="https://perctrax.bandcamp.com/album/aeon-core" ><span>Scalameriya - Aeon Core</span></a> - </div> - <br> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php');?> + <main class="musicpage"> + <h2>music</h2> + <p class="h2caption">Not to be confused with <a href="https://deeptwisty.com/">my music</a>.</p> + <p class="notice warning">This page is giving major "under construction" vibes right now. Specifically, it's undergoing a total overhaul to be more verbose, better organized, and generally cooler.</p> + <p>I listen to music sometimes. Here's some of my favourites, in no particular order.</p> + <section> + <div class="cd"> + <a href="https://findaeden.bandcamp.com/"> + <img src="covers/findaeden.jpg" alt="findaeden"> + </a> + </div> + <h3>findaeden</h3> + <p>The Broadcasteur maintains the largest discrepancy between quality of output and popularity I've maybe ever seen.</p> + <p>Creator of the only Undertale OST remix I like more than the originals, but I implore you to give its original stuff a listen too.</p> + <p>Favourite album: <a href="https://findaeden.bandcamp.com/album/spectrum">Spectrum</a></p> + <p>Favourite song: <a href="https://www.youtube.com/watch?v=CBKEcJSZbgQ">666kHz</a></p> + </section> + <section> + <div class="cd"> + <a href="https://heavenpierceher.bandcamp.com/"> + <img src="covers/hakita.webp" alt="Hakita"> + </a> + </div> + <h3>Heaven Pierce Her</h3> + <p>It would be disingenuous of me to pretend that Hakita's here for any reason other than the OST from his videogame. It is really good, though.</p> + <p>Favourite album: <a href="https://heavenpierceher.bandcamp.com/album/ultrakill-imperfect-hatred">ULTRAKILL: Imperfect Hatred</a></p> + <p>Favourite song: <a href="https://heavenpierceher.bandcamp.com/track/duel-versus-reprise">Duel</a></p> + </section> + <section> + <div class="cd"> + <a href="https://everything-everything.co.uk/"> + <img src="covers/mountainhead.jpg" alt="Everything Everything - Mountainhead"> + </a> + </div> + <h3>Everything Everything</h3> + <p>Some kind of seditious commie experimental alt-rock thing that's probably the platonic ideal of whatever genre it's in.</p> + <p>Asking me to pick a favourite EE record is like asking me to pick a favourite child. It's pure sauce all the way down.</p> + <p>Favourite album: <a href="https://everythingeverything.bandcamp.com/album/mountainhead-digital-download">Mountainhead</a></p> + <p>Favourite song: <a href="https://everythingeverything.bandcamp.com/track/supernormal">SUPERNORMAL</a></p> + </section> + <section> + <div class="cd"> + <a href="https://www.foofighters.com/"> + <img src="covers/foofighters.jpg" alt="Foo Fighters"> + </a> + </div> + <h3>Foo Fighters</h3> + <p>Are the Foo Fighters dad rock, or do I just think that because my dad likes them?</p> + <p>I think their old stuff is overrated and their new stuff is underrated. Everlong isn't even that good.</p> + <p>Fun fact: Unfortunately, this is currently the only act on this list I've seen live.</p> + <p>Favourite album: Concrete and Gold</p> + <p>Favourite song: Outside</p> + </section> + <section> + <div class="cd"> + <a href="https://waxlimbs.bandcamp.com/"> + <img src="covers/waxlimbs.jpg" alt="Waxlimbs"> + </a> + </div> + <h3>Waxlimbs</h3> + <p>Awash with vibes. I like their singing. Best thing to ever come out of Toronto.</p> + <p>Favourite album: <a href="https://waxlimbs.bandcamp.com/album/where-lilies-grew">Where Lilies Grew</a></p> + <p>Favourite song: <a href="https://waxlimbs.bandcamp.com/track/broken-wing">Broken Wing</a></p> + </section> + <section> + <div class="cd"> + <a href="https://etjusticepourtous.bandcamp.com/"> + <img src="covers/justice.jpg" alt="Justice"> + </a> + </div> + <h3>Justice</h3> + <p>I think I've discovered Justice like three separate times. I can't seem to escape their reach, but that's far from a bad thing.</p> + <p>Electric Feel doesn't belong to MGMT anymore. It's a Justice song now.</p> + <p>Favourite album: <a href="https://etjusticepourtous.bandcamp.com/album/audio-video-disco-1">Audio, Video, Disco</a></p> + <p>Favourite song: <a href="https://www.youtube.com/watch?v=6QL_bUCuhvo">MGMT - Electric Feel (Justice Remix)</a></p> + </section> + <section> + <div class="cd"> + <a href="https://clppng.bandcamp.com/"> + <img src="covers/clipping.jpg" alt="clipping."> + </a> + </div> + <h3>clipping.</h3> + <p>Experimental hip-hop band with more intricate sound design than real life and vocals to match.</p> + <p>I lack the requisite command of the English language to come up with a string of words that would do Clipping justice. Nobody does it like them.</p> + <p>Favourite album: <a href="https://clppng.bandcamp.com/album/dead-channel-sky-plus">Dead Channel Sky Plus</a></p> + <p>Favourite song: <a href="https://clppng.bandcamp.com/track/get-up-feat-mariel-jacoda">Get Up</a></p> + </section> + <section> + <div class="cd"> + <a href="https://mekaloton.bandcamp.com/"> + <img src="covers/mekaloton.jpg" alt="mekaloton"> + </a> + </div> + <h3>mekaloton</h3> + <p>Dark, surly synths and Kasane Teto vocals are a winning combo that this individual has yet to execute on poorly.</p> + <p>They didn't bother to set up the "buy entire discography" button on their Bandcamp page, but that didn't stop me.</p> + <p>Favourite album: <a href="https://mekaloton.bandcamp.com/album/cheap-suits">Cheap Suits</a></p> + <p>Favourite song: <a href="https://mekaloton.bandcamp.com/track/nemesis">Nemesis</a></p> + </section> + <section> + <div class="cd"> + <a href="https://femtanyl.bandcamp.com/"> + <img src="covers/femtanyl.jpg" alt="Femtanyl"> + </a> + </div> + <h3>Femtanyl</h3> + <p>Low-grade brain explosion music and required listening for chronically online transgender types. estrogen just doesn't work on you unless you've listened to at least one femtanyl record front to back</p> + <p>Favourite album: <a href="https://femtanyl.bandcamp.com/album/reactor">REACTOR</a></p> + <p>Favourite song: <a href="https://www.youtube.com/watch?v=CFVAE23tekc">NASTYWERKKKK</a></p> + </section> + <section> + <div class="cd"> + <a href="https://noisemaster.bandcamp.com/"> + <img src="covers/noisemaster.jpg" alt="Noisemaker"> + </a> + </div> + <h3>Noisemaker</h3> + <p>Grungy electronic music that scratches my brain in a really nice way. If you throw a rock at a cancelled LISA fangame you'll probably hit at least one Noisemaker track.</p> + <p>Their bio on Bandcamp calls their music "mediocre", but don't let that fool you. Everything they make is dripping with prescription-strength sauce.</p> + <p>Favourite album: <a href="https://noisemaster.bandcamp.com/album/funeral-ep">Funeral</a></p> + <p>Favourite song: <a href="https://noisemaster.bandcamp.com/track/red">Red</a></p> + </section> + <section> + <div class="cd"> + <a href="https://redvoxband.com/"> + <img src="covers/redvox.jpg" alt="Red Vox"> + </a> + </div> + <h3>Red Vox</h3> + <p>You probably know Vinny from his Twitch streams<a href="https://www.youtube.com/watch?v=iipJosbJVjk">,</a> but I'm more into his, to quote his Bandcamp tags, "psych rock" band.</p> + <p>Favourite album: <a href="https://vine.bandcamp.com/album/another-light">Another Light</a></p> + <p>Favourite song: <a href="https://vine.bandcamp.com/track/in-the-garden">In The Garden</a></p> + </section> + + <p class="notice">What follows is the subset of this page's content that's still pending being redone.</p> + <div id="flex-container"> + <a style="--img: url(covers/el_camino.jpg);" target="_blank" href="https://theblackkeys.com/?frontpage=true" ><span>The Black Keys - El Camino</span></a> + <a style="--img: url(covers/unstoppable_force.jpg);" target="_blank" href="https://caliphate.bandcamp.com/album/unstoppable-force" ><span>CALIPHATE - Unstoppable Force</span></a> + <a style="--img: url(covers/walks_of_lung.jpg);" target="_blank" href="https://patriciataxxon.bandcamp.com/album/walks-of-lung" ><span>Patricia Taxxon - Walks of Lung</span></a> + <a style="--img: url(covers/simulation_theory.jpg);" target="_blank" href="https://www.muse.mu/music?album=simulation_theory" ><span>Muse - Simulation Theory</span></a> + <a style="--img: url(covers/with_teeth.jpg);" target="_blank" href="https://www.nin.com/" ><span>Nine Inch Nails - With Teeth</span></a> + <a style="--img: url(covers/two_house.jpg);" target="_blank" href="https://foodhouse.bandcamp.com/album/two-house" ><span>Food House - two house</span></a> + <a style="--img: url(covers/american_automatic.jpg);" target="_blank" href="https://en.wikipedia.org/wiki/Kill_Memory_Crash" ><span>Kill Memory Crash - American Automatic</span></a> + <a style="--img: url(covers/fucked_up_friends_3.jpg);" target="_blank" href="https://tobaxxo.bandcamp.com/album/fucked-up-friends-3" ><span>TOBACCO - Fucked Up Friends 3</span></a> + <a style="--img: url(covers/synthicate.jpg);" target="_blank" href="https://newretrowave.bandcamp.com/album/synthicate" ><span>LAZERPUNK - Synthicate</span></a> + <a style="--img: url(covers/peaks_and_valleys.jpg);" target="_blank" href="https://revolutionpeak.bandcamp.com/album/peaks-and-valleys" ><span>Revolution Peak - Peaks and Valleys</span></a> + <a style="--img: url(covers/triangle_unicode.jpg);" target="_blank" href="https://wearemagonia.bandcamp.com/album/triangle-unicode-lp" ><span>We Are Magonia - Triangle Unicode</span></a> + <a style="--img: url(covers/vast.jpg);" target="_blank" href="https://waterflame.bandcamp.com/album/vast" ><span>Waterflame - Vast</span></a> + <a style="--img: url(covers/tortured_waters.jpg);" target="_blank" href="https://newretrowave.bandcamp.com/album/tortured-waters" ><span>DEADLIFE - Tortured Waters</span></a> + <a style="--img: url(covers/spirit_phone.jpg);" target="_blank" href="http://www.neilcic.com/" ><span>Lemon Demon - Spirit Phone</span></a> + <a style="--img: url(covers/millenialism.jpg);" target="_blank" href="https://music.businesscasual.biz/album/millennialism" ><span>NYSE - MILLENNIALISM</span></a> + <a style="--img: url(covers/hawaii_part_ii.jpg);" target="_blank" href="https://mirakurumyujikaru.bandcamp.com" ><span>ããŠã¯ãĢããĨãŧã¸ãĢãĢ - Hawaii: Part II</span></a> + <a style="--img: url(covers/revolution_radio.jpg);" target="_blank" href="https://greenday.com/" ><span>Green Day - Revolution Radio</span></a> + <a style="--img: url(covers/this_is_all_yours.jpg);" target="_blank" href="https://altjband.com/" ><span>Alt-J - This Is All Yours</span></a> + <a style="--img: url(covers/the_last_ninja_2_c64_ost.jpg);" target="_blank" href="https://www.youtube-nocookie.com/embed/bjbN2RyZXHI" ><span>Matt Gray - The Last Ninja 2 (C64) OST</span></a> + <a style="--img: url(covers/aeon_core.jpg);" target="_blank" href="https://perctrax.bandcamp.com/album/aeon-core" ><span>Scalameriya - Aeon Core</span></a> + </div> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php');?> </body> </html>
\ No newline at end of file @@ -154,7 +154,7 @@ if(!preg_match('/(headless.*)/i', $_SERVER['HTTP_USER_AGENT'])) { 'Better than Version 3.2 Gen 2x2!', 'Partially responsive!', 'COUNTER', - 'TUEADAY', + 'TUEADAY' #'PLACEHIM', ); break; diff --git a/notes/index.php b/notes/index.php index e3398ae..d883e38 100644 --- a/notes/index.php +++ b/notes/index.php @@ -6,108 +6,83 @@ error_reporting(E_ALL); <!DOCTYPE html> <html lang="en"> <head> + <?php + $stag = $_GET["tag"]; + $nostag = empty($stag); + ?> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Notes</title> - <link href="../style.css" rel="stylesheet" type="text/css" media="all"> - <style> - .noteentry { - max-width: 100%; - list-style: none; - display: inline-block; - margin: var(--stdpadding) 0; - } - .noteentry h3 { - margin-top: 0; - } - /*ul h2:first-of-type::before { - content: "Articles - " - }*/ - .noteentry > * { - display: block; - box-sizing: border-box; - } - .entrytag { - font-size: .9em; - color: #bbbbbb; - font-style: italic; - display: inline-block; - margin-right: 1ch; - } - .entrydate { - font-weight: bold; - } - .entrytitle { - padding-left: initial; - border-left: initial; - } - </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> + <title><?php if(!$nostag) { echo("#$stag | ");} ?> notes | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(); ?> - <h1>isonotes</h1> - <h2 id="caption">superfluous commentary</h2> - <nav> - <a href="notes.atom">atom feed</a> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php');?> + <main> + <h2><?php if(!$nostag) { echo("#$stag");} else { echo("isonotes"); } ?></h2> + <p class="h2caption">good writing + superfluous commentary</p> + <nav class="pagenav"> + <ul> + <li><a href="https://blog.jim-nielsen.com/2023/notes-dot-jim-nielsen-dot-com/">what?</a></li> + <li><a href="notes.atom">atom feed</a></li> + <?php + $content = simplexml_load_file("notes.atom"); + $year = "-69420"; + $yc = 0; + foreach($content->entry as $entry) { + $nyr = substr($entry->published, 0, 4); + if($nyr != $year) { + $year = $nyr; + echo "<li><a href='#$year'>$year</a></li>"; + } + } + ?> + </ul> + </nav> + <?php - $content = simplexml_load_file("notes.atom"); + if(!$nostag) { + echo "<p class='backlink'><a href='.'>All notes</a></p>"; + } + echo "<ul id='articles'>"; $year = "-69420"; $yc = 0; foreach($content->entry as $entry) { - $nyr = substr($entry->published, 0, 4); - if($nyr != $year) { - $year = $nyr; - echo "<a href='#$year'>$year</a>"; - } - } - ?> - </nav> - <?php - $stag = $_GET["tag"]; - $nostag = empty($stag); - if(!$nostag) { - echo "<a style='display: block; margin-top: 1rem; margin-bottom: 1rem;' href='.'>All notes</a>"; - } - $year = "-69420"; - $yc = 0; - $yeag = false; - foreach($content->entry as $entry) { - - if($yeag) { - echo "<hr>"; - } else { - $yeag = true; - } - $pfilt = false; - if(!$nostag) { - foreach($entry->category as $cat) { - $term = $cat["term"]; - if($stag == $term) { - $pfilt = true; + $pfilt = false; + if(!$nostag) { + foreach($entry->category as $cat) { + $term = $cat["term"]; + if($stag == $term) { + $pfilt = true; + } } } - } - if($pfilt or $nostag) { - $nyr = substr($entry->published, 0, 4); - if($nyr != $year) { - $year = $nyr; - echo "<h2 id='$year'>$year</h2>"; - } - $dt = substr($entry->published, 0, 10); - $ti = $entry->title; - $cats = ""; - foreach($entry->category as $cat) { - $term = $cat["term"]; - $cats = $cats."<a class='entrytag' href='?tag=".$term."'>".$term."</a>"; + if($pfilt or $nostag) { + $nyr = substr($entry->published, 0, 4); + if($nyr != $year) { + $year = $nyr; + echo "<h3 id='$year'>$year</h3>"; + } + $dt = substr($entry->published, 0, 10); + $ti = $entry->title; + $cats = ""; + foreach($entry->category as $cat) { + $term = $cat["term"]; + $cats = $cats."<a class='entrytag' href='?tag=".$term."'>".$term."</a>"; + } + + $entryurl = $entry->link["href"]; + $entryprotocol = preg_replace("/:\/\/(.*)/", "://", $entryurl); + $entrysite = preg_replace(array("/(.*):\/\//", "/\/(.*)/"), "", $entryurl); + + echo("<li><article class='blogentry'><p class='entrydate'><time>$dt</time> âĸ <a href='$entryprotocol$entrysite'>$entrysite</a></p><h4 class='entrytitle'><a href='".$entry->link["href"]."'>$ti</h4></a><div class='entrysummary'>$entry->summary</div><p>$cats</p></article></li>"); } - - echo "<article class='noteentry'><time class='entrydate'>$dt</time><h3 class='entrytitle'><a href='".$entry->link["href"]."'>$ti</h3></a>$entry->summary<span>$cats</span></article>"; } - } - ?> - + echo "</ul>"; + ?> + </main> + + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php');?> </body> </html> diff --git a/notes/notes.atom b/notes/notes.atom index 56a58b9..f4cf62d 100644 --- a/notes/notes.atom +++ b/notes/notes.atom @@ -3,7 +3,7 @@ <title>isopod.cool notes</title> <id>https://isopod.cool/notes/</id> <link rel="alternate" href="https://isopod.cool/notes/"></link> - <updated>2025-07-05T00:00:00+00:00</updated> + <updated>2026-02-14T00:00:00+00:00</updated> <author> <name>Hannah Isopod</name> <uri>https://isopod.cool/</uri> @@ -13,6 +13,26 @@ <category term="links"/> <category term="tech"/> <entry> + <title>fuck windows: dreaming of an honest computer</title> + <id>https://www.joewintergreen.com/fuck-windows-dreaming-of-an-honest-computer/</id> + <link rel="alternate" href="https://www.joewintergreen.com/fuck-windows-dreaming-of-an-honest-computer/" type="html" title="fuck windows: dreaming of an honest computer"></link> + <published>2026-02-14T00:00:00+00:00</published> + <updated>2026-02-14T00:00:00+00:00</updated> + <summary><p>This is probably the most sober assessment I've seen of why Linux is so desirable of late. This right here is the main factor that motivated me to adopt Linux as my daily driver OS 5 years ago.</p><p>Is Linux good? Debatable. Is it better than Windows? Depends. Is it actively hostile to you? Does it exist to harvest your data and juice the usage stats for Microsoft's LLM chatbot? Fuck no.</p></summary> + <category term="capitalism"/> + <category term="windows"/> + </entry> + <entry> + <title>WORSHIP OF THE ENGINEER</title> + <id>https://www.sheeeeeeeep.art/the-worship-of-engineering.html</id> + <link rel="alternate" href="https://www.sheeeeeeeep.art/the-worship-of-engineering.html" type="html" title="WORSHIP OF THE ENGINEER"></link> + <published>2026-02-14T00:00:00+00:00</published> + <updated>2026-02-14T00:00:00+00:00</updated> + <summary><p>BECAUSE SOFTWARE SENT PEOPLE TO THE MOON.<br>BECAUSE SOFTWARE SENT PEOPLE TO THE MOON.<br>BECAUSE SOFTWARE SENT PEOPLE TO THE MOON.<br>BECAUSE SOFTWARE SENT PEOPLE TO THE MOON.</p></summary> + <category term="ai"/> + <category term="society"/> + </entry> + <entry> <title>Playing "Minecraft" without Minecraft</title> <id>https://lenowo.org/viewtopic.php?t=5</id> <link rel="alternate" href="https://lenowo.org/viewtopic.php?t=5" type="html" title="Playing 'Minecraft' without Minecraft"></link> diff --git a/old/1/icons/deeptwisty.png b/old/1/icons/deeptwisty.png Binary files differindex 7cb8472..31c1ad8 100644 --- a/old/1/icons/deeptwisty.png +++ b/old/1/icons/deeptwisty.png diff --git a/old/1/icons/kirby.png b/old/1/icons/kirby.png Binary files differindex 2b19ef6..618d02d 100644 --- a/old/1/icons/kirby.png +++ b/old/1/icons/kirby.png diff --git a/old/1/images/bg_default.png b/old/1/images/bg_default.png Binary files differindex 0e323e1..82a1b2a 100644 --- a/old/1/images/bg_default.png +++ b/old/1/images/bg_default.png diff --git a/old/1/images/bg_old1.png b/old/1/images/bg_old1.png Binary files differindex 854c83f..e501205 100644 --- a/old/1/images/bg_old1.png +++ b/old/1/images/bg_old1.png diff --git a/old/1/images/bg_old2.png b/old/1/images/bg_old2.png Binary files differindex d7fe03c..e812687 100644 --- a/old/1/images/bg_old2.png +++ b/old/1/images/bg_old2.png diff --git a/old/1/images/friaday.png b/old/1/images/friaday.png Binary files differindex a389663..f54c4ba 100644 --- a/old/1/images/friaday.png +++ b/old/1/images/friaday.png diff --git a/old/1/images/moday.png b/old/1/images/moday.png Binary files differindex 7b212f9..d8a0616 100644 --- a/old/1/images/moday.png +++ b/old/1/images/moday.png diff --git a/old/1/images/satuaday.png b/old/1/images/satuaday.png Binary files differindex 9711982..bd8faf2 100644 --- a/old/1/images/satuaday.png +++ b/old/1/images/satuaday.png diff --git a/old/1/images/suday.png b/old/1/images/suday.png Binary files differindex cca11b1..2382f37 100644 --- a/old/1/images/suday.png +++ b/old/1/images/suday.png diff --git a/old/1/images/thuday.png b/old/1/images/thuday.png Binary files differindex e681fbc..1d547f9 100644 --- a/old/1/images/thuday.png +++ b/old/1/images/thuday.png diff --git a/old/1/images/tueaday.png b/old/1/images/tueaday.png Binary files differindex f4ff337..7270c3e 100644 --- a/old/1/images/tueaday.png +++ b/old/1/images/tueaday.png diff --git a/old/1/images/weaday.png b/old/1/images/weaday.png Binary files differindex d1ad858..35fddb8 100644 --- a/old/1/images/weaday.png +++ b/old/1/images/weaday.png diff --git a/old/1/stamps/deeptwistybutton.png b/old/1/stamps/deeptwistybutton.png Binary files differindex 23693b6..2cee235 100644 --- a/old/1/stamps/deeptwistybutton.png +++ b/old/1/stamps/deeptwistybutton.png diff --git a/old/1/stamps/handcode.png b/old/1/stamps/handcode.png Binary files differindex c5bbdd1..be51b0e 100644 --- a/old/1/stamps/handcode.png +++ b/old/1/stamps/handcode.png diff --git a/old/2/buttons/ace.png b/old/2/buttons/ace.png Binary files differindex 1d62add..86b293a 100644 --- a/old/2/buttons/ace.png +++ b/old/2/buttons/ace.png diff --git a/old/2/buttons/aro.png b/old/2/buttons/aro.png Binary files differindex e1e50d2..b096a70 100644 --- a/old/2/buttons/aro.png +++ b/old/2/buttons/aro.png diff --git a/old/2/buttons/bantimetravel.png b/old/2/buttons/bantimetravel.png Binary files differindex 83bcfa1..b63bde0 100644 --- a/old/2/buttons/bantimetravel.png +++ b/old/2/buttons/bantimetravel.png diff --git a/old/2/buttons/deeptwisty_button.png b/old/2/buttons/deeptwisty_button.png Binary files differindex b5d24fc..63a0351 100644 --- a/old/2/buttons/deeptwisty_button.png +++ b/old/2/buttons/deeptwisty_button.png diff --git a/old/2/buttons/handcode.png b/old/2/buttons/handcode.png Binary files differindex c5bbdd1..be51b0e 100644 --- a/old/2/buttons/handcode.png +++ b/old/2/buttons/handcode.png diff --git a/old/2/buttons/krisbtn.png b/old/2/buttons/krisbtn.png Binary files differindex 176d3c4..a7b0943 100644 --- a/old/2/buttons/krisbtn.png +++ b/old/2/buttons/krisbtn.png diff --git a/old/2/buttons/niceopod_button.png b/old/2/buttons/niceopod_button.png Binary files differindex 0398b0e..a31848a 100644 --- a/old/2/buttons/niceopod_button.png +++ b/old/2/buttons/niceopod_button.png diff --git a/old/2/buttons/righttorepair.png b/old/2/buttons/righttorepair.png Binary files differindex 865ba1f..154ad36 100644 --- a/old/2/buttons/righttorepair.png +++ b/old/2/buttons/righttorepair.png diff --git a/old/2/icons/deeptwisty.png b/old/2/icons/deeptwisty.png Binary files differindex 7cb8472..31c1ad8 100644 --- a/old/2/icons/deeptwisty.png +++ b/old/2/icons/deeptwisty.png diff --git a/old/2/images/2022-05-21_blog_image_1.png b/old/2/images/2022-05-21_blog_image_1.png Binary files differindex 48743ac..7232f8b 100644 --- a/old/2/images/2022-05-21_blog_image_1.png +++ b/old/2/images/2022-05-21_blog_image_1.png diff --git a/old/2/images/2022-05-21_blog_image_2.png b/old/2/images/2022-05-21_blog_image_2.png Binary files differindex d53bf3f..a55cf33 100644 --- a/old/2/images/2022-05-21_blog_image_2.png +++ b/old/2/images/2022-05-21_blog_image_2.png diff --git a/old/2/images/albums/funeral.png b/old/2/images/albums/funeral.png Binary files differindex 150076d..9ba0dcc 100644 --- a/old/2/images/albums/funeral.png +++ b/old/2/images/albums/funeral.png diff --git a/old/2/images/albums/spectrum.png b/old/2/images/albums/spectrum.png Binary files differindex f57f9eb..73a1fd9 100644 --- a/old/2/images/albums/spectrum.png +++ b/old/2/images/albums/spectrum.png diff --git a/old/2/images/albums/unstoppable_force.png b/old/2/images/albums/unstoppable_force.png Binary files differindex 22659aa..a240bc9 100644 --- a/old/2/images/albums/unstoppable_force.png +++ b/old/2/images/albums/unstoppable_force.png diff --git a/old/2/images/albums/vast.png b/old/2/images/albums/vast.png Binary files differindex 398d5a0..4a7db5b 100644 --- a/old/2/images/albums/vast.png +++ b/old/2/images/albums/vast.png diff --git a/old/2/images/isopod.png b/old/2/images/isopod.png Binary files differindex cf974c0..d911ebd 100644 --- a/old/2/images/isopod.png +++ b/old/2/images/isopod.png diff --git a/old/2/images/isopod_with_aviators.png b/old/2/images/isopod_with_aviators.png Binary files differindex 443a6fb..03d73df 100644 --- a/old/2/images/isopod_with_aviators.png +++ b/old/2/images/isopod_with_aviators.png diff --git a/old/2/pages/stats.html b/old/2/pages/stats.html index 041225a..5dde725 100644 --- a/old/2/pages/stats.html +++ b/old/2/pages/stats.html @@ -69,7 +69,7 @@ </tr> <tr> <td>Drop rates</td> - <td nowrap>1-3 bags of Doritos - 80%<br/>Wired earbuds - 10%<br/>Random Linux install media - 1%</td> + <td nowrap>1-3 bags of Doritos - 80%<br>Wired earbuds - 10%<br>Random Linux install media - 1%</td> </tr> <tr> <td>Song</td> diff --git a/old/2/themes/deeptwisty/bg.png b/old/2/themes/deeptwisty/bg.png Binary files differindex 431a733..d33e1c8 100644 --- a/old/2/themes/deeptwisty/bg.png +++ b/old/2/themes/deeptwisty/bg.png diff --git a/old/2/themes/default/div-bg.png b/old/2/themes/default/div-bg.png Binary files differindex 4d45b2c..1225179 100644 --- a/old/2/themes/default/div-bg.png +++ b/old/2/themes/default/div-bg.png diff --git a/old/2/themes/geocities/beam.png b/old/2/themes/geocities/beam.png Binary files differindex 839d2bc..fa09122 100644 --- a/old/2/themes/geocities/beam.png +++ b/old/2/themes/geocities/beam.png diff --git a/old/2/themes/gruvbox/bg.png b/old/2/themes/gruvbox/bg.png Binary files differindex 528f35b..b7a8500 100644 --- a/old/2/themes/gruvbox/bg.png +++ b/old/2/themes/gruvbox/bg.png diff --git a/stats/bg.jxl b/stats/bg.jxl Binary files differdeleted file mode 100644 index 33477c6..0000000 --- a/stats/bg.jxl +++ /dev/null diff --git a/stats/index.php b/stats/index.php index 54deb7c..5e11909 100644 --- a/stats/index.php +++ b/stats/index.php @@ -3,178 +3,105 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Stats</title> + <title>stats | isopod.cool v4</title> <link href="../style.css" rel="stylesheet" type="text/css" media="all"> - <style> - #statstable { - width: 100%; - } - #statstable td:first-child { - padding-left: calc(var(--stdpadding) / 2); - } - #statstable tr:nth-child(2n+1) { - background-color: #ffffff11; - } - @media only screen and (hover: none) { - #statstable td:first-child { - font-weight: bold; - } - } - </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); - include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); ?> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/common.php'); ?> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(); ?> - <h1>stat tracker</h1> - <h2 id="caption">Powered by RealTrue™ StatAI™</h2> - <table id="statstable"> - <tbody> - <tr> - <td>Storage space</td> - <td>47TiB</td> - </tr> - <tr> - <td>Desktop environment</td> - <td>GNOME (Wayland)</td> - </tr> - <tr> - <td>Layout</td> - <td>ANSI 75% + Knob + External numpad</td> - </tr> - <tr> - <td>Switches</td> - <td>Keychron K Pro Brown</td> - </tr> - <tr> - <td>Firmware</td> - <td>QMK</td> - </tr> - <tr> - <td>RGB</td> - <td>Yes</td> - </tr> - <tr> - <td>CDs owned</td> - <td>164</td> - </tr> - <tr> - <td>Consoles modded</td> - <td>2</td> - </tr> - <tr> - <td>Computers downgraded</td> - <td>2</td> - </tr> - <tr> - <td>Computer count (confirmed working)</td> - <td>6</td> - </tr> - <tr> - <td>Domains owned</td> - <td title="deeptwisty.com, isopod.cool, isopod.zone, bathynomus.xyz, flatfuckfri.day, isopod.mov">6</td> - </tr> - <tr> - <td>Talent</td> - <td style="font-family: mono; color: red;">[Integer overflow error]</td> - </tr> - <tr> - <td>Bitches</td> - <td>0</td> - </tr> - <tr> - <td>Species</td> - <td><i>Bathynomus Giganteus</i></td> - </tr> - <tr> - <td>Gender</td> - <td><?php - $boogeraids = array( - 'Listed <a href="https://genders.wtf">here</a>', - 'AMD Ryzen 7 5700G, 32GB DDR4-3600 RAM, AMD Radeon RX 6800XT GPU, 500GB NVMe SSD, 2TB NVMe SSD, 4TB HDD', - 'I forgor đ', - '<i>Bathynomus Giganteus</i>', - 'gay', - '//TODO', - 'Hannah', - 'Ada', - 'fa[DATA EXPUNGED]', - 'uwu', - 'that one image of the isopods eating doritos', - 'girl of some kind', - 'linux user', - '', - 'amateur', - 'tgirl at the IKEA checkout with one furniture item and a full size BlÃĨhaj', - 'bug' - ); - echo $boogeraids[array_rand($boogeraids)]; - ?></td> - </tr> - <tr> - <td>3.5mm headphone jack</td> - <td>yes</td> - </tr> - <tr> - <td>Audio channels</td> - <td>mono</td> - </tr> - <tr> - <td>Font family</td> - <td style="font-family: b612_mono, mono, monospace;"><a href="https://b612-font.com/">mono</a></td> - </tr> - <tr> - <td>Sodium glutamate</td> - <td>7.1 surround</td> - </tr> - <tr> - <td>Drop rates</td> - <td style="white-space:nowrap;">1-3 bags of Doritos - 80% <br>Wired earbuds - 10% <br>Random Linux install media - 1%</td> - </tr> - <tr> - <td>Efficiency rating</td> - <td>80+ Gold</td> - </tr> - <tr> - <td>Wattage rating</td> - <td>1000W</td> - </tr> - <tr> - <td>Height</td> - <td>194cm</td> - </tr> - <tr> - <td>Social Insurance Number</td> - <td>69</td> - </tr> - <tr> - <td>Home address</td> - <td>12h 28m 24.97s, +31° 28Ⲡ37.7âŗ</td> - </tr> - <tr> - <td>Most played game (Steam)</td> - <td>Space Engineers (734 hours)</td> - </tr> - <tr> - <td>Most played game (in general)</td> - <td>Minecraft (Hours unknown but definitely high)</td> - </tr> - <tr> - <td>Best Hand</td> - <td>756,276,480</td> - </tr> - <tr> - <td title="Since this bit was added, anyway">Page views</td> - <td> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + <main> + <section> + <h2>stat tracker</h2> + <p class="h2caption">Powered by RealTrue™ StatAI™</p> + <dl> + <dt>Storage space</dt> + <dd>47TiB</dd> + <dt>Desktop environment</dt> + <dd>GNOME (Wayland)</dd> + <dt>Layout</dt> + <dd>ANSI 75% + Knob + External numpad</dd> + <dt>Switches</dt> + <dd>Keychron K Pro Brown</dd> + <dt>Firmware</dt> + <dd>QMK</dd> + <dt>RGB</dt> + <dd>Yes</dd> + <dt>CDs owned</dt> + <dd>164</dd> + <dt>Consoles modded</dt> + <dd>2</dd> + <dt>Computers downgraded</dt> + <dd>2</dd> + <dt>Computer count (confirmed working)</dt> + <dd>6</dd> + <dt>Domains owned</dt> + <dd title="deeptwisty.com, isopod.cool, isopod.zone, bathynomus.xyz, flatfuckfri.day, isopod.mov">6</dd> + <dt>Talent</dt> + <dd style="font-family: mono; color: red;">[Integer overflow error]</dd> + <dt>Bitches</dt> + <dd>0</dd> + <dt>Species</dt> + <dd><i>Bathynomus Giganteus</i></dd> + <dt>Gender</dt> + <dd> + <?php + $boogeraids = array( + 'Listed <a href="https://genders.wtf">here</a>', + 'AMD Ryzen 7 5700G, 32GB DDR4-3600 RAM, AMD Radeon RX 6800XT GPU, 500GB NVMe SSD, 2TB NVMe SSD, 4TB HDD', + 'I forgor đ', + '<i>Bathynomus Giganteus</i>', + 'gay', + '//TODO', + 'Hannah', + 'Ada', + 'fa[DATA EXPUNGED]', + 'uwu', + 'that one image of the isopods eating doritos', + 'girl of some kind', + 'linux user', + '', + 'amateur', + 'tgirl at the IKEA checkout with one furniture item and a full size BlÃĨhaj', + 'bug' + ); + echo $boogeraids[array_rand($boogeraids)]; + ?> + </dd> + <dt>3.5mm headphone jack</dt> + <dd>yes</dd> + <dt>Audio channels</dt> + <dd>mono</dd> + <dt>Font family</dt> + <dd style="font-family: b612_mono, mono, monospace;"><a href="https://b612-font.com/">mono</a></dd> + <dt>Sodium glutamate</dt> + <dd>7.1 surround</dd> + <dt>Drop rates</dt> + <dd style="white-space:nowrap;">1-3 bags of Doritos - 80% <br>Wired earbuds - 10% <br>Random Linux install media - 1%</dd> + <dt>Efficiency rating</dt> + <dd>80+ Gold</dd> + <dt>Wattage rating</dt> + <dd>1000W</dd> + <dt>Height</dt> + <dd>194cm</dd> + <dt>Social Insurance Number</dt> + <dd>69</dd> + <dt>Home address</dt> + <dd>12h 28m 24.97s, +31° 28Ⲡ37.7âŗ</dd> + <dt>Most played game (Steam)</dt> + <dd>Space Engineers (734 hours)</dd> + <dt>Most played game (in general)</dt> + <dd>Minecraft (Hours unknown but definitely high)</dd> + <dt>Best Hand</dt> + <dd>4,746,252,688</dd> + <dt title="Since this bit was added, anyway">Page views</dt> + <dd> <?php $num = (int) filter_var(file_get_contents($datadir."stats_views.txt"), FILTER_SANITIZE_NUMBER_INT); $num++; file_put_contents($datadir."stats_views.txt", $num); echo $num; ?> - </td> - </tr> - <tr> + </dd> <?php $booger = array( "arch", @@ -191,38 +118,38 @@ $poopaids_copy = array_rand($booger); $boogeraids = $booger[$poopaids_copy]; $aidsbooger = $aids[$poopaids_copy]; - echo "<td>$boogeraids</td><td>$aidsbooger</td>"; + echo "<dt>$boogeraids</dt><dd>$aidsbooger</dd>"; ?> - </tr> - <tr> - <td>Number I'm thinking of</td> - <td><?php echo rand(0, 69421); ?></td> - </tr> - <tr> - <td>Personality</td> - <td><?php - $ei = array( - "E", - "I" - ); - echo $ei[array_rand($ei)]; - $sn = array( - "S", - "N" - ); - echo $sn[array_rand($sn)]; - $tf = array( - "T", - "F" - ); - echo $tf[array_rand($tf)]; - $jp = array( - "J", - "P" - ); - echo $jp[array_rand($jp)]; - ?></td> - </tr> - </tbody></table> + <dt>Number I'm thinking of</dt> + <dd><?php echo rand(0, 69421); ?></dd> + <dt>Personality</dt> + <dd> + <?php + $ei = array( + "E", + "I" + ); + echo $ei[array_rand($ei)]; + $sn = array( + "S", + "N" + ); + echo $sn[array_rand($sn)]; + $tf = array( + "T", + "F" + ); + echo $tf[array_rand($tf)]; + $jp = array( + "J", + "P" + ); + echo $jp[array_rand($jp)]; + ?> + </dd> + </dl> + </section> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> </body> </html> diff --git a/stuff/beat/index.php b/stuff/beat/index.php index 16b7054..8a1a182 100644 --- a/stuff/beat/index.php +++ b/stuff/beat/index.php @@ -3,9 +3,8 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title><?php echo '@'.date("B"); ?></title> + <title><?php echo '@'.date("B"); ?> | isopod.cool v4</title> <link href="/style.css" rel="stylesheet" type="text/css" media="all"> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> <style> .beatframe { width: 100%; @@ -16,24 +15,27 @@ </style> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?> - <h1 style="background-image: unset;">.beat</h1> - <h2 id="caption"><?php echo '@'.date("B"); ?></h2> - <nav> - <a href="https://en.wikipedia.org/wiki/Swatch_Internet_Time">Swatch Internet Time (Wikipedia)</a> - </nav> - <h2>88x31 Embeds</h2> - <div class="beatframe"> - <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=digital" style="width: 84px; height: 27px;"></iframe> - </div> - <pre><code><iframe src="https://isopod.cool/stuff/beat/frame.php?theme=digital" style="width: 84px; height: 27px;"></iframe></code></pre> - <div class="beatframe"> - <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=pixel" style="width: 84px; height: 27px;"></iframe> - </div> - <pre><code><iframe src="https://isopod.cool/stuff/beat/frame.php?theme=pixel" style="width: 84px; height: 27px;"></iframe></code></pre> - <div class="beatframe"> - <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=sketch" style="width: 84px; height: 27px;"></iframe> - </div> - <pre><code><iframe src="https://isopod.cool/stuff/beat/frame.php?theme=sketch" style="width: 84px; height: 27px;"></iframe></code></pre> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + <main> + <h2 style="background-image: unset;">.beat</h2> + <p class="h2caption">A totally practical way of measuring time!</p> + <p> + <a href="https://en.wikipedia.org/wiki/Swatch_Internet_Time">Swatch Internet Time (Wikipedia)</a> + </p> + <h3>88x31 Embeds</h3> + <div class="beatframe"> + <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=digital" style="width: 88px; height: 31px; border: none;" title="Current time in .beats"></iframe> + </div> + <pre><code><iframe src="https://isopod.cool/stuff/beat/frame.php?theme=digital" style="width: 88px; height: 31px; border: none;" title="Current time in .beats"></iframe></code></pre> + <div class="beatframe"> + <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=pixel" style="width: 88px; height: 31px; border: none;" title="Current time in .beats"></iframe> + </div> + <pre><code><iframe src="https://isopod.cool/stuff/beat/frame.php?theme=pixel" style="width: 88px; height: 31px; border: none;" title="Current time in .beats"></iframe></code></pre> + <div class="beatframe"> + <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=sketch" style="width: 88px; height: 31px; border: none;" title="Current time in .beats"></iframe> + </div> + <pre><code><iframe src="https://isopod.cool/stuff/beat/frame.php?theme=sketch" style="width: 88px; height: 31px; border: none;" title="Current time in .beats"></iframe></code></pre> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> </body> </html> diff --git a/stuff/canadian_flag_neocats.zip b/stuff/canadian_flag_neocats.zip Binary files differnew file mode 100644 index 0000000..e7d4c81 --- /dev/null +++ b/stuff/canadian_flag_neocats.zip diff --git a/stuff/index.php b/stuff/index.php index 89acd3b..5d02a87 100644 --- a/stuff/index.php +++ b/stuff/index.php @@ -3,103 +3,118 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Items</title> + <title>stuff | isopod.cool v4</title> <link href="../style.css" rel="stylesheet" type="text/css" media="all"> - <style> - details[open] > summary { - margin-bottom: .5rem; - } - details ul { - margin: 0; - padding-left: 1.5rem; - } - </style> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(true, -15, "Pictured: The level of code quality you can expect if you use this stuff") ?> - <h1>stuff</h1> - <h2 id="caption">things too!</h2> - <h2>Utilities</h2> - <table> - <tr> - <td><a href="rssfilter.php">rssfilter.php</a></td> - <td>Basic RSS and Atom feed filtering utility. Accepts regex.</td> - </tr> - <tr> - <td><a href="firefoxrss/feed.php">firefoxrss</a></td> - <td>RSS bridge for Firefox release notes.</td> - </tr> - </table> - <h2>Downloads</h2> - <table> - <tr> - <td nowrap><a href="EnchantedToolsPack_v1.zip">EnchantedToolsPack_v1.zip</a></td> - <td>Custom resourcepack for Minecraft that uses functionality from <a href="https://optifine.net/home">Optifine</a> to add custom textures for enchanted tools and weapons. Confirmed working with 1.19.</td> - </tr> - </table> - <h2>Scripts</h2> - <table> - <tr> - <td>webpkiller/</td> - <td><details><summary>Automatic .webp converters</summary>Various scripts intended for use as the default program for opening .webp files. They automatically replace the .webp image with a .png one and open that instead. Incompatible with animated .webp images.</details></td> - </tr> - <tr class="indent-1"> - <td><a href="webpkiller/webpkiller.sh">webpkiller.sh</a></td> - <td> - <details> - <summary>Bash script for Linux.</summary> - <ul> - <li>Only works on .webp files.</li> - <li>Requires <a href="https://imagemagick.org/">ImageMagick</a> to be installed.</li> - </ul> - </details> - </td> - </tr> - <tr class="indent-1"> - <td><a href="webpkiller/webpkiller.cmd">webpkiller.cmd</a></td> - <td> - <details> - <summary>Batch script for Windows.</summary> - <ul> - <li>Only works on .webp files.</li> - <li>Requires <a href="https://imagemagick.org/">ImageMagick</a>.</li> - <li>Replaces <i>every</i> instance of ".webp" in the filepath because Windows batch language is hard.</li> - </ul> - </details> - </td> - </tr> - <tr class="indent-1"> - <td><a href="webpkiller/webpkiller.py">webpkiller.py</a></td> - <td> - <details> - <summary>Platform-agnostic Python script.</summary> - <ul> - <li>Works on anything supported by pillow.</li> - <li>Requires <a href="https://www.python.org/">Python 3</a> and the <a href="https://python-pillow.org/">pillow</a> library.</li> - </ul> - </details> - </td> - </tr> - <tr class="indent-1"> - <td><a href="webpkiller/webpkiller_win.zip">webpkiller_win.zip</a></td> - <td><details><summary>Windows webpkiller.py build.</summary>webpkiller.py, but compiled for Windows with <a href="https://pypi.org/project/pyinstaller/">pyinstaller</a>.</td> - </tr> - <tr> - <td><a href="dirtomp3.sh">dirtomp3.sh</a></td> - <td>Bash script that uses ffmpeg to convert a music library to mp3s.</td> - </tr> - </table> - <h2>Other</h2> - <table> - <tr> - <td><a href="neon_boost_times.html">neon_boost_times.html</a></td> - <td>A table of my level times in Neon Boost.</td> - </tr> - <tr> - <td><a href="https://userstyles.world/style/5238/status-cafe-latte">userstyles.world/style/5238<br/>/status-cafe-latte</a></td> - <td>Stylus theme I made for <a href="https://status.cafe/">status.cafe</a> and the attached forum.</td> - </tr> - </table> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php');?> + <main> + + <section> + <h2>stuff</h2> + <p class="h2caption">things too!</p> + + <section> + <h3>Utilities</h3> + <table> + <tr> + <td><a href="rssfilter.php">rssfilter.php</a></td> + <td>Basic RSS and Atom feed filtering utility. Accepts regex.</td> + </tr> + <tr> + <td><a href="firefoxrss/feed.php">firefoxrss</a></td> + <td>RSS bridge for Firefox release notes. This hasn't worked in quite some time due to changes to the site it scrapes, and it doesn't need to, since <a href="https://rss-bridge.bathynomus.xyz/">rss-bridge</a> can do this now.</td> + </tr> + </table> + </section> + + <section> + <h3>Downloads</h3> + <table> + <tr> + <td nowrap><a href="canadian_flag_neocats.zip">canadian_flag_neocats.zip</a></td> + <td>Custom neocat emojis that are the flags of Canadian provinces. Includes a <code>meta.json</code> to import to your *key instance. Based on the <a href="https://volpeon.ink/emojis/neocat/">originals</a> by Volpeon.</td> + </tr> + <tr> + <td nowrap><a href="EnchantedToolsPack_v1.zip">EnchantedToolsPack_v1.zip</a></td> + <td>Custom resourcepack for Minecraft that uses functionality from <a href="https://optifine.net/home">Optifine</a> to add custom textures for enchanted tools and weapons. Confirmed working with 1.19.</td> + </tr> + </table> + </section> + + <section> + <h3>Scripts</h3> + <p class="notice warning">These scripts are all old, long since out of use by yours truly, and probably poorly written. I make no guarantees that they'll work properly, or that they won't set your computer on fire. You've been warned.</p> + <table> + <tr> + <td>webpkiller/</td> + <td> + <details><summary>Automatic .webp converters</summary>Various scripts intended for use as the default program for opening .webp files. They automatically replace the .webp image with a .png one and open that instead. Incompatible with animated .webp images.</details> + </td> + </tr> + <tr class="indent-1"> + <td><a href="webpkiller/webpkiller.sh">webpkiller.sh</a></td> + <td> + <details> + <summary>Bash script for Linux.</summary> + <ul> + <li>Only works on .webp files.</li> + <li>Requires <a href="https://imagemagick.org/">ImageMagick</a> to be installed.</li> + </ul> + </details> + </td> + </tr> + <tr class="indent-1"> + <td><a href="webpkiller/webpkiller.cmd">webpkiller.cmd</a></td> + <td> + <details> + <summary>Batch script for Windows.</summary> + <ul> + <li>Only works on .webp files.</li> + <li>Requires <a href="https://imagemagick.org/">ImageMagick</a>.</li> + <li>Replaces <i>every</i> instance of ".webp" in the filepath because Windows batch language is hard.</li> + </ul> + </details> + </td> + </tr> + <tr class="indent-1"> + <td><a href="webpkiller/webpkiller.py">webpkiller.py</a></td> + <td> + <details> + <summary>Platform-agnostic Python script.</summary> + <ul> + <li>Works on anything supported by pillow.</li> + <li>Requires <a href="https://www.python.org/">Python 3</a> and the <a href="https://python-pillow.org/">pillow</a> library.</li> + </ul> + </details> + </td> + </tr> + <tr class="indent-1"> + <td><a href="webpkiller/webpkiller_win.zip">webpkiller_win.zip</a></td> + <td><details><summary>Windows webpkiller.py build.</summary>webpkiller.py, but compiled for Windows with <a href="https://pypi.org/project/pyinstaller/">pyinstaller</a>.</td> + </tr> + <tr> + <td><a href="dirtomp3.sh">dirtomp3.sh</a></td> + <td>Bash script that uses ffmpeg to convert a music library to mp3s.</td> + </tr> + </table> + </section> + + <section> + <h3>Other</h3> + <table> + <tr> + <td><a href="neon_boost_times.html">neon_boost_times.html</a></td> + <td>A table of my level times in Neon Boost.</td> + </tr> + <tr> + <td><a href="https://userstyles.world/style/5238/status-cafe-latte">userstyles.world/style/5238<br/>/status-cafe-latte</a></td> + <td>Stylus theme I made for <a href="https://status.cafe/">status.cafe</a> and the attached forum.</td> + </tr> + </table> + </section> + </section> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> </body> </html> diff --git a/etc/quotes/bg.jpg b/stuff/quotes/bg.jpg Binary files differindex e13a975..e13a975 100644 --- a/etc/quotes/bg.jpg +++ b/stuff/quotes/bg.jpg diff --git a/etc/quotes/bg.jxl b/stuff/quotes/bg.jxl Binary files differindex 30b75bf..30b75bf 100644 --- a/etc/quotes/bg.jxl +++ b/stuff/quotes/bg.jxl diff --git a/etc/quotes/bg_dither.png b/stuff/quotes/bg_dither.png Binary files differindex e252d2f..e252d2f 100644 --- a/etc/quotes/bg_dither.png +++ b/stuff/quotes/bg_dither.png diff --git a/etc/quotes/images/c_pfp.png b/stuff/quotes/images/c_pfp.png Binary files differindex a54ad21..a54ad21 100644 --- a/etc/quotes/images/c_pfp.png +++ b/stuff/quotes/images/c_pfp.png diff --git a/etc/quotes/images/g_pfp.png b/stuff/quotes/images/g_pfp.png Binary files differindex 1d1ca3b..1d1ca3b 100644 --- a/etc/quotes/images/g_pfp.png +++ b/stuff/quotes/images/g_pfp.png diff --git a/etc/quotes/images/greensmile.png b/stuff/quotes/images/greensmile.png Binary files differindex fc0f891..fc0f891 100644 --- a/etc/quotes/images/greensmile.png +++ b/stuff/quotes/images/greensmile.png diff --git a/etc/quotes/images/h_pfp.png b/stuff/quotes/images/h_pfp.png Binary files differindex 73c56c5..73c56c5 100644 --- a/etc/quotes/images/h_pfp.png +++ b/stuff/quotes/images/h_pfp.png diff --git a/etc/quotes/images/j_pfp.png b/stuff/quotes/images/j_pfp.png Binary files differindex 5fb6b36..5fb6b36 100644 --- a/etc/quotes/images/j_pfp.png +++ b/stuff/quotes/images/j_pfp.png diff --git a/stuff/quotes/images/m_pfp.png b/stuff/quotes/images/m_pfp.png Binary files differnew file mode 100644 index 0000000..d3f938d --- /dev/null +++ b/stuff/quotes/images/m_pfp.png diff --git a/etc/quotes/images/p_pfp.png b/stuff/quotes/images/p_pfp.png Binary files differindex b46d8db..b46d8db 100644 --- a/etc/quotes/images/p_pfp.png +++ b/stuff/quotes/images/p_pfp.png diff --git a/etc/quotes/images/s_pfp.png b/stuff/quotes/images/s_pfp.png Binary files differindex c35c967..c35c967 100644 --- a/etc/quotes/images/s_pfp.png +++ b/stuff/quotes/images/s_pfp.png diff --git a/stuff/quotes/images/t_pfp.png b/stuff/quotes/images/t_pfp.png Binary files differnew file mode 100644 index 0000000..36e021c --- /dev/null +++ b/stuff/quotes/images/t_pfp.png diff --git a/etc/quotes/images/v_pfp.png b/stuff/quotes/images/v_pfp.png Binary files differindex bf460d6..bf460d6 100644 --- a/etc/quotes/images/v_pfp.png +++ b/stuff/quotes/images/v_pfp.png diff --git a/etc/quotes/images/t_pfp.png b/stuff/quotes/images/x_pfp.png Binary files differindex c975deb..c975deb 100644 --- a/etc/quotes/images/t_pfp.png +++ b/stuff/quotes/images/x_pfp.png diff --git a/stuff/quotes/index.php b/stuff/quotes/index.php new file mode 100644 index 0000000..3828f13 --- /dev/null +++ b/stuff/quotes/index.php @@ -0,0 +1,441 @@ +<!--?php ini_set('display_errors', '1'); +ini_set('display_startup_errors', '1'); +error_reporting(E_ALL); +?--> +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>#quotes | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> + <style type="text/css"> + main { + --bg0: #323339; + --fg0: #d7d5d9; + font-family: sans-serif; + } + main a { + color: #1c9cee; + text-decoration: none; + } + main a:hover { + color: #1c9cee; + text-decoration: underline; + } + .pfp { + border-radius: 50%; + height: 2.5rem; + min-width: 2.5rem; + aspect-ratio: 1; + box-shadow: none; + } + .message { + display: flex; + margin: 1rem; + text-shadow: none; + word-break: break-word; + } + .content { + margin-left: 1rem; + } + main hr { + margin: auto; + border-top: thin solid #42464d; + } + h4 { + padding-left: initial; + border-left: none; + } + </style> + </head> + <body> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + <main> + <section> + <h2>#quotes</h2> + <p class="h2caption">highlights from the #quotes channel in the discord chat</p> + <p class="notice">Obligatory warning for "sex joke" up ahead. Turn back now if that's not your style.</p> + <?php + class User { + public string $pfp; + public string $name; + public string $color; + public function __construct(string $p, string $n, string $c) { + $this->pfp = $p; + $this->name = $n; + $this->color = $c; + } + } + $me = new User("h_pfp", "isopod", "00ffb7"); + $vivi = new User("v_pfp", "pink one", "ff009e"); + $sad = new User("s_pfp", "yellow one", "f1c40f"); + $mage = new User("m_pfp", "sea slug", "faaaaa"); + $celian = new User("c_pfp", "bird one", "73fbff"); + $thom = new User("x_pfp", "tomato", "567c2d"); + $goon = new User("g_pfp", "crab one", "2c9c91"); + $portals = new User("p_pfp", "purple one", "5a397d"); + $joy = new User("j_pfp", "green one", "a2ff00"); + $taro = new User("t_pfp", "nebulous creature", "a7a502"); + + $quotes = array( + array($me, "you hate my dead swag", true), + array($mage, "yeah I do"), + array($mage, "I love your alive swag"), + array($me, "I know I'm bordering on furry macro fetish levels of huge", true), + array($celian, "you want me to explode", true), + array($mage, "đĨ°<br>YEAH<br>LITERLLY"), + array($taro, "wait what was my brain doing", true), + array($taro, "oh yeah i was thinking"), + array($me, "you don't appreciate the thock", true), + array($mage, "thocks you"), + array($me, "I thought you said \"fucks you\""), + array($mage, "I recommend just deleting the larvae", true), + array($me, "is your <em>fursona</em> pim sex?", true), + array($joy, "Ethical consumption of gacha<br>There's no ethical consumption under gachitalism", true), + array($celian, "i think doom guy should lick the rocky cliffs for precious minerals", true), + array($me, "I don't have aspirations of egghood", true), + array($mage, "I wish australia was [...] real", true), + array($mage, "I accidentally kill over 50 small animals every time I ride my horse. I can kill you too", true), + array($mage, "the jermas have awful breeding problems", true), + array($celian, "<img src='images/greensmile.png' alt='vaguely unsettling green smiley face emoji bearing a strong resemblance to the one from geometry dash'/>", true), + array($me, "swagful"), + array($celian, "You can quote me on that: I LOVE penis", true), + array($celian, "pee is awesome", true), + array($mage, "Our bells jingled with delight!", true), + array($me, "you love my dejected and bindlepilled swag", true), + array($celian, "genshin player slash slur", true), + array($me, "I'm dejected and bindlepilled", true), + array($celian, "you didn't know? every boat comes with free sex", true), + array($me, "you hate my gay little slurry", true), + array($me, "I've gotta up my slop game", true), + array($me, "your horny ass salad<br>you've been eating horny salad", true), + array($vivi, "i dont wanna be a <em>hamster</em> i wanna be a MILF", true), + array($mage, "kirby does not have boobs", true), + array($joy, "Babygirl, you are so bad at eating", true), + array($mage, "I made a facebook account to be transgender", true), + array($me, "having a facebook account makes you less transgender"), + array($celian, "she's trying to kill me", true), + array($mage, "oh HELL yeah"), + array($vivi, "instead of destroying everything how about you DESTROY this AAAAAASSSSSSSSSSSSSSSSSSSSS", true), + array($joy, "Pet names for your partner<ul><li>Sugar</li><li>Sweetheart</li><li>Beautiful princess with a disorder</li><li>Gianni Matragano</li><li>My love</li></ul>", true), + array($me, "L + ratio + no chitin", true), + array($me, "You can't be lumping like that white baby", true), + array($me, "You hate his perfectly symmetrical swag", true), + array($mage, "explodes and dies and gets it all over you", true), + array($vivi, "dont compare yourself to jesus just because you thought of making a number a tumblr sexyman", true), + array($vivi, "that would be skibidiphobic", true), + array($mage, "Why did he turn into a card this is some objectum tf shit", true), + array($vivi, "It's almost like he's transgender"), + array($celian, "I hate weezer and their child<br>fortunately I have killed weezer", true), + array($me, "furries can be trusted to decide who should live and who should die", true), + array($celian, "I'm a slut for polls", true), + array($celian, "i dont like homosexuality", true), + array($vivi, "internalized frog-phobia", true), + array($mage, "I think it's fucked up you can't just kill people", true), + array($mage, "babygirl you piss so bad what the fuck", true), + array($joy, "There's something about digitally altered screams of anguish that really stick in my mind", true), + array($mage, "I would change it to daddy's little slut or something. To inflict maximum damage. But rat slut amongus family is good...", true), + array($celian, "I think you just hate my water-soluble swag", true), + array($vivi, "put your words in my mouth and sentence all over me like a paragraph", true), + array($vivi, "i miss going ssssssssss in your whore tree banthrom", true), + array($celian, "YOU"), + array($vivi, "going sssssss and pppppppppp was the highlight of it for me"), + array($celian, "đ"), + array($celian, "picks yuo up<br>picks you up like you are a baby seal", true), + array($mage, "Yoooooooo<br>Makes noises<br>Euuuh ueh uh huah"), + array($vivi, "is the devil from the bible a pillow princess?", true), + array($me, "you would disparage the humble onion?", true), + array($vivi, "fruited the fuck out", true), + array($mage, "Babygirl you are so servers in United States", true), + array($mage, "Big BAWS. Naked Snake. Big BAWS. Naked Snake. Metal Gear Solid 3. 3. 3. Metal Gear Solid 3. Soviet Union. Jungle! Jungle!", true), + array($celian, "wait arent snake always naked"), + array($mage, "I have feelings for you"), + array($vivi, "back when i was a fan of edgy minion memes", true), + array($me, "I think we should fully replace Discord with Second Life", true), + array($mage, "just ignore the drowning horses in the hot tub", true), + array($mage, "BALLS?", true), + array($celian, "ye<br>if you're too tall u gotta have balls<br>to show off how tall you are"), + array($mage, "why do you serve so much cunt in roblox", true), + array($vivi, "omg its almost as pretty as you are ahaha<br>am i bleeding out", true), + array($mage, "Alasator is suspicious of my figgy pudding", true), + array($me, "check out my rod", true), + array($mage, "thats a nice rod"), + array($joy, "yo you're really schloobin it out this time", true), + array($joy, "I'd be the best wife ever", true), + array($mage, "i think your tits dont like the mechanism", true), + array($me, "Are you the hoe?", true), + array($joy, "I have no issues with eating babies", true), + array($me, "Would you dropkick joe biden? I think you should dropkick joe biden", true), + array($celian, "i dont care enough about him to drop kick him tbh"), + array($me, "i think you should drop kick him"), + array($mage, "sad flooboob", true), + array($me, "thats so weirdcore liminal analogue horror backrooms scp", true), + array($me, "I think you should die for funsies", true), + array($mage, "Joob spoob?", true), + array($sad, "PUSSY?"), + array($vivi, "I would love to just absolutely rawdog a toaster", true), + array($sad, "i LOVE the filth", true), + array($goon, "i had a dream that, Wheezer they all decided to go birdwatching", true), + array($me, "Serial like Universal Serial Bus", true), + array($celian, "Love me a good froot loop"), + array($me, "thats his brain-heart<br>thats his brheart", true), + array($celian, "i think you should unload it", true), + array($vivi, "i would love to unload inside a shotgun, yes"), + array($celian, "im gonna cum", true), + array($vivi, "DUDE. NICE"), + array($vivi, "put my ass in a hydraulic press", true), + array($me, "No time spent scrolling through furry porn is wasted", true), + array($celian, "its the blood powered fuck machine", true), + array($me, "is the isopod cunty", true), + array($celian, "maybe"), + array($me, "Extra creamy sounds fun", true), + array($celian, "i had a testicle induced lucid dream last night", true), + array($celian, "i am NOT washing my hands in milk", true), + array($vivi, "why not? you scared?"), + array($mage, "Lesbianism! The yummy treat", true), + array($mage, "i think its fucked you cant eat butterflies", true), + array($mage, "eats your child"), + array($mage, "āŋđđđąđĻđđĢāŋđđąđĻđđĢāŋđąđĻđđĢāŋ ę§đę§đđĻđąđđąđĻđđĢāŋđĢę§đę§đđĻđąđĢę§đę§", true), + array($celian, "playing and talking about this game isnt enough i need to absorb it like plants do to nutrients in the soil", true), + array($celian, "NOOOO you can't do that... spooky fog", true), + array($vivi, "im sorry my FISH is a little rusty", true), + array($me, "Mmmm yummy car engine steak ^_^", true), + array($mage, "You would put me in the meat grinder next", true), + array($me, "But you're not beef"), + array($celian, "What if I disguise myself as a steak"), + array($celian, "I don't think I've drawn a <em>human</em> dick since I was like...", true), + array($celian, "dfgprp-403c286c-ccb1-4a3c-ba2c-3aa8fff58c0b.png", true), + array($sad, "you're nut?", true), + array($celian, "aren't we all?"), + array($vivi, "your arms are looking very testicular mr. Thanos", true), + array($vivi, "that slut did NOT taste good", true), + array($vivi, "im a [little sponge] who requires [[MOISTURE]]", true), + array($celian, "HOLY SHIT REAL BOMB THREAT!!!!!!!!!!!!!!!!!!!!", true), + array($vivi, "Shmumpus", true), + array($vivi, "You can use the wet thing for combat", true), + array($vivi, "my hobbies include milking my creature for eggnog", true), + array($me, "everybody loves Bomb Threat", true), + array($celian, "cutely explodes", true), + array($sad, "YOOOOOO"), + array($mage, "You would dye your dick?", true), + array($celian, "If I had one"), + array($me, "very impressive sex", true), + array($celian, "do you think feetleys feet are lickable", true), + array($vivi, "my brain has gotten to the point where i cannot come up with a threat that does not involve cum", true), + array($me, "can you WEAR <strong>Gabriel's MILK</strong>?", true), + array($mage, "Italy has a cheese named horse cheese but it's not made from horses", true), + array($celian, "worm from animals we all know him", true), + array($vivi, "you're mom", true), + array($me, "No I'm not"), + array($mage, "I believe in parenting with the knife", true), + array($mage, "Penis", true), + array($me, "Penis"), + array($celian, "Dies"), + array($vivi, "who names a child JUICE??", true), + array($me, "next thing i know im in this alien's discord server", true), + array($celian, "Just remove your <em>balls</em>", true), + array($vivi, "im gonna fucken CUM about that....like ANGRILY.", true), + array($vivi, "im gonna look at more <strong>foreskin gifs</strong>", true), + array($vivi, "all i can do is CUM and HOPE FOR THE BEST", true), + array($me, "Rainbow Dash is Kim Kitsuragi's ponysona", true), + array($mage, "You don't love me? You would deny me uncrunched eyeballs?", true), + array($sad, "I fuck <em>the blockchain</em>", true), + array($me, "Beautiful women named Mario are messaging me on my phone", true), + array($sad, "his <strong>HUGE BOOBS</strong> are distracting me", true), + array($mage, "I think you should play Second Life with me", true), + array($sad, "I think you're mentally ill"), + array($mage, "most anime girls are cute in a dog way", true), + array($mage, "Bestie I'm talking about balls, cock and balls, you would turn me into balls?", true), + array($sad, "Yes"), + array($celian, "I find Lois so hot and sexy", true), + array($mage, "she doesnt have an articulated pussy, i have to tell you", true), + array($celian, "Mlp ponies are like Scooby Doo to me", true), + array($me, "Would you play Krunker recommended by Klook dot com with me?", true), + array($me, "I dress like a female bird", true), + array($vivi, "i love it when I can feel my hat THROB ON MY HEAD", true), + array($vivi, "put the <strong><em>P</em></strong>iss stone down you know what that does to your", true), + array($mage, "I am such a loser when it comes to women", true), + array($joy, "Only true rizz masters get rewarded with Egg", true), + array($mage, "You would be a little pony?", true), + array($me, "I can neither confirm nor deny this"), + array($celian, "I don't wanna have my pussy out<br>it's there in spirit", true), + array($mage, "Do <i>I</i> have a dick or a pussy in spirit"), + array($mage, "Babygirl you need ketamine", true), + array($goon, "he shits with that thing have some respect", true), + array($me, "I think Gabriel should have boob armor", true), + array($sad, "You're interesting"), + array($me, "i have a copy of Karkalicious on my computer", true), + array($celian, "I love you so much too we should go out or something", true), + array($mage, "i hope you have wonderful sloppy toppy", true), + array($celian, "hell? i could bring you there if you want<br>that sounded so threatening, i meant on like a date or something", true), + array($mage, "I think it's okay if cooking pasta ends up in murder", true), + array($mage, "teehee :3 <strong><em>SITS ON YOUR BALLS</em></strong>", true), + array($vivi, "i AM the vinegar in a can of spaghetti-os that was cleaned out for the sole purpose of drinking vinegar", true), + array($celian, "I don't have bones", true), + array($me, "You can get some from the bone trees"), + array($celian, "Hey do you still have blood?", true), + array($sad, "me when im just not built different", true), + array($me, "yoinks your blood", true), + array($celian, "The sixth element is... kiki", true), + array($me, "Extrudes your taxes", true), + array($mage, "Anime girl Will moment", true), + array($vivi, "just in time for the himbo findification!", true), + array($me, "I wish someone would put me down<br>Wait a minute", true), + array($celian, "why are you rotated you whore", true), + array($me, "brb", true), + array($celian, "yooo"), + array($celian, "Do you want to watch the movie? The pussy?", true), + array($celian, "why does my salmon look like a vagina", true), + array($me, "you could say I handle a lot of cocks", true), + array($me, "obviously im not gonna handle a bunch of raw chickens and then touch my cock"), + array($me, "I don't think cocks get killed for their meat"), + array($mage, "and the girls have like car shaped heads", true), + array($mage, "I'm trying to find a cool way to say nonbinary peoples' tits", true), + array($celian, "Luigi tits"), + array($celian, "If I have my wings out all the time what does that mean<br>like a dick?", true), + array($celian, "You want to be the person that eats horses like grapes?", true), + array($mage, "Some people pass down books and jewelry, my family passes down autism", true), + array($mage, "theres a panda walking through me", true), + array($celian, "I'm more like an osprey but like Tumblrized", true), + array($me, "Listen I may be a furry but at least I'm not a weeb", true), + array($celian, "do u wanna try to guess? đŗ", true), + array($sad, "is it... BIG?<br>AND THROBBING?"), + array($sad, "Chicken is one of the most fucking boring shit you can wear", true), + array($mage, "Why don't Canadians eat the snow to get rid of it", true), + array($celian, "Well you see... there's a ladder that goes through the window"), + array($celian, "I heard mothsex.gif", true), + array($portals, "Yeah bare naked ladies fuck HARD", true), + array($me, "I hope I'm not just the gay person in your computer to you but the gay isopod in your computer", true), + array($celian, "oh<br>bestie i have bad news for u<br>your parents might be having sex :(", true), + array($me, "I'm literally an isopod my fursona is just a human and I'm wearing a fursuit 100% of the time", true), + array($me, "I said something to the effect of we should skip february except for valentines day<br>the rest you got right<br>nearly typed fruary", true), + array($mage, "Furry"), + array($me, "NO"), + array($celian, "fury behavior"), + array($me, "FURY INDEED IM FUCKING MAD"), + array($me, "amongus babies and their adopted dads", true), + array($thom, "I have 6 partners", true), + array($goon, "6 am or pm?"), + array($mage, "Men season themselves in the wind", true), + array($vivi, "i would love to be vored by a cow as well", true), + array($celian, "I'm eely", true), + array($celian, "yeehee"), + array($celian, "Im crunde"), + array($celian, "beainxella"), + array($me, "I cannot begin to describe the aerospace applications of a material with the properties that your beetle has given my pants", true), + array($me, "you can make space worthy pants with human technology we've done it before"), + array($celian, "COCK RING KEN", true), + array($celian, "Yoo no more gay!", true), + array($mage, "She hates gay people and LOVES bald people"), + array($mage, "i dont want to buy the fucked up heterosexual bird", true), + array($me, "you think Baldi is a dilf?", true), + array($celian, "sure?"), + array($vivi, "like i could fuck a freezer<br>i couldn't fuck a freezer<br>too cold", true), + array($celian, "<img src='https://media.discordapp.net/attachments/964004743238254642/1051302341439139961/image.png' />", true), + array($me, "MY computer is attractive, alright. yours is not.", true), + array($me, "your computer is a milf"), + array($me, "bowser was always hot. coward", true), + array($celian, "oh is your jaw equiped?", true), + array($sad, "I AM YOUR <b>CHEESEBURGER</b>", true), + array($celian, "gimmie a sex<br>*SEC<br>*SEC<br>*SEC<br>*SEC<br>A SECOND<br>OH MY GOD", true), + array($mage, "I think it's incredibly feminine to crawl around in storm drains", true), + array($me, "I can't tell where participating in the bit where I'm a furry ends and actually insisting I'm not a furry begins", true), + array($me, "what fucking cyberpunk world are you living in where panties have HUDs", true), + array($vivi, "I want a panic attack now", true), + array($me, "you're gonna be <i>so</i> tasty in two weeks", true), + array($me, "nobody's going to be able to decipher our language because they'll do it right and translate phrases like \"i think dio's tits should switch places\" and assume they did it wrong and keep trying", true), + array($me, "Sasuke shoved his hands into Naruto's pants and grinned when the blond whimpered from his touch. \"Already, Naruto?\" he asked.<br>Wrong chat<br>How yall doin", true), + array($me, "I'm not in denial I'm a furry", true), + array($me, "mold is a fursuit for bread", true), + array($mage, "when someone eats moldy food does that mean they're voring a furry?"), + array($me, "yes"), + array($me, "can you believe sag their pirt is four years old? <span style='font-family: monospace;'>(it is from 2018)</span>", true), + array($celian, "wait isn't it 5?<br>we're in 2022<br>did you count 2020<br>wait<br>i may be stupid."), + array($me, "I'm not FRENCH I'm a FURRY", true), + array($vivi, "Maybe the real cum pepsi is the friends we made along the way", true), + array($celian, "Ibuprofwn kind of slut.", true), + array($me, "I wish <i>my</i> cock was a fidget spinner", true), + array($vivi, "It's castration time!", true), + array($vivi, "I girlbossed a little to close to the comfy and fell asleep", true), + array($me, "that milk is the <i>sequel</i> to expired", true), + array($me, "Tony the tiger is HOT.", true), + array($sad, "Never ask a woman her age, never ask a man his salary, never ask a medieval man what his letters to his best friend said", true), + array($celian, "Dio would have been hotter with crocs", true), + array($sad, "Im just trying to picture like,, donald trump shitting", true), + array($me, "who would you have picked to win the tumblr sexy man award<br>the fucking onceler?", true), + array($thom, "...<br>how'd you know?"), + array($celian, "I wanna see the bloopers of Stephen Merchant moaning into the mic", true), + array($me, "come on, look at him. Sans is literally <b><i>so sexy</i></b>", true), + array($me, "there are many ways to consume weed: you can smoke it out of a doob, you can smoke it out of a bong, you can smoke it out of a brownie- ...wait", true), + array($mage, "I think you'll be a fan of gangster balls soon bestie", true), + array($celian, "there i removed my vagina", true), + array($me, "For you, the person who wants to be naked in a ball, that is very bad for you", true), + array($mage, "If I had to rate it, I'd rate it fucking gay", true), + array($mage, "you're only playing Scout correctly if you've had <b>gay sex</b>", true), + array($me, "*Caroline voice* Pee your pants, Mr. Johnson.", true), + array($sad, "i feel like im reading it with my eyes", true), + array($me, "i think there should be a datapack that lets you right click people with a bucket<br>and milk them", true), + array($celian, "bebito <span class='house'>house</span> reveel<br>bebito <span class='house'>hous</span> reveel when the bebito has.<br><span class='house'>hous</span> reveaal<br><span class='house'>hous</span> reval bebito REAL NO CLICKBAIT!!!!!!!!!!!!!!!!", true), + array($celian, "its like having a stroke WHILE having an aneurism", true), + array($mage, "ideal"), + array($me, "Joe Biden can get his ass blasted in a nonfurry way", true), + array($celian, "bruh (respectfully)", true), + array($celian, "this isn't a furby this is walter white cum jar", true), + array($vivi, "can I have the walter white cum jar please đđđĨē"), + array($me, "i'd rather not explode today, Thanks", true), + array($celian, "got some hair :)", true), + array($me, "Walter White is a <b><i><u>DILF</u></i></b>, Celian.", true), + array($sad, "if there <i>was</i> porn i wouldnt leave", true), + array($me, "haunting you with the looming threat of horse", true), + array($celian, "Walter White sex jumpscare", true), + array($celian, "Evangelion spoilers walter white and saul goodman kiss", true), + array($me, "I think they should stop commissioning criminal intelligence and start commissioning furries", true), + array($vivi, "I feel like DeviantArt right now, 2014 edition.", true), + array($me, "I want a transparent penis", true), + array($mage, "The buzzing sound of the penis won't go away", true), + array($thom, "vivi I really think you should stop shitting on reddit", true), + array($celian, "I don't agree because I disagree with you", true), + array($celian, "", true), + array($mage, ""), + array($celian, ""), + array($thom, "<br><br>"), + array($me, ""), + array($vivi, ""), + array($celian, ""), + array($vivi, ""), + array($me, "Imagine touching <span style='font-family: monospace;'>[audio loss]</span> me", true), + array($thom, "theres something homoerotic about cars", true), + array($me, "im in spain without the sain", true), + array($mage, "REMEMBER TO MAKE BACKUP COPIES IF YOU INTEND TO EDIT THIS PENIS!!", true), + array($vivi, "god is actually surprisingly submissive and breedable", true), + array($me, "don't smoke cigarettes kids they'll make your lungs sus", true), + array($thom, "Bestie you've been given 2 full folders of skins<br>You can be any type of white you want to", true), + array($celian, "im gonna pause the video so i can listen to the flavors better", true), + array($vivi, "we stan the <b><i>boner knife</i></b> in this <span class='house'>house</span>", true), + array($vivi, "god said it's my turn on the being a milf", true), + array($mage, "\"Big Boy\" will be milked for his venom at the Australian Reptile Park", true), + array($mage, "i think you should get some weed and <i>drink it</i>", true), + array($sad, "imagine having a digestive system couldnt be me", true), + array($mage, "Hot"), + array($mage, "damn, guess i gotta send you some <i>autism</i> in the mail", true), + array($mage, "I just diagnosed you with bottom disorder", true), + array($mage, "Girls are always whole ass wet from the roof", true), + array($celian, "This is an amazing day for humanity, and by humanity, I mean my titties", true) + ); + + foreach($quotes as $q) { + if(isset($q[2]) && $q[2]) { + echo "<hr>"; + } + echo "<article class='message'>"; + echo "<img src='images/".$q[0]->pfp.".png' class='pfp' />"; + echo "<div class='content'><h5 style='margin: 0; color: #".$q[0]->color.";'>".$q[0]->name."</h5>".$q[1]."</div>"; + echo "</article>"; + } + ?> + </section> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> + </body> +</html> diff --git a/stuff/webgarden/images/collectmypages.png b/stuff/webgarden/images/collectmypages.png Binary files differnew file mode 100644 index 0000000..3a367ea --- /dev/null +++ b/stuff/webgarden/images/collectmypages.png diff --git a/stuff/webgarden/images/webgarden-bg-light.png b/stuff/webgarden/images/webgarden-bg-light.png Binary files differnew file mode 100644 index 0000000..caa6981 --- /dev/null +++ b/stuff/webgarden/images/webgarden-bg-light.png diff --git a/stuff/webgarden/images/yay.png b/stuff/webgarden/images/yay.png Binary files differnew file mode 100644 index 0000000..fae981b --- /dev/null +++ b/stuff/webgarden/images/yay.png diff --git a/stuff/webgarden/index.php b/stuff/webgarden/index.php index 0f1d2d4..0f79686 100644 --- a/stuff/webgarden/index.php +++ b/stuff/webgarden/index.php @@ -56,6 +56,7 @@ <head> <meta charset="utf-8"> <title>Pot</title> + <link href="style.css" rel="stylesheet" type="text/css" media="all"> <style type="text/css"> :root { @@ -66,53 +67,79 @@ padding: 0; margin: 0; } - h1 { - width: 224px; - position: absolute; - top: var(--top-header-gap); - left: 6px; + body > a { + text-decoration: none; + } + body > a:hover { + color: var(--fg0); + } + #plant { + background: url('images/webgarden-bg.png'); + background-size: cover; + } + .header { + background-color: var(--bg0); + border-bottom: .33rem solid var(--accent1); + width: 100%; + padding: 8px 0; + } + .header h2 { font-family: b612_mono, monospace; - border-left: 3px solid gainsboro; + font-size: 2em; padding-left: 6px; + text-decoration: none; + margin: 0; + + border-bottom: .2rem solid; + width: fit-content; + + --hbcolor: var(--fg0); + border-image: linear-gradient(to right, var(--hbcolor) 50%, transparent 50%) 100% 1; } - h2 { + .h2caption { width: 212px; - position: absolute; - top: calc(45px + var(--top-header-gap)); - left: 6px; - font-size: 1.1em; - font-family: b612_mono, monospace; - border-left: 3px solid gainsboro; padding-left: 6px; + font-family: b612_mono, monospace; + font-style: italic; + text-decoration: none; + margin: 0; } #mainmenu { - background: #222222; + background: var(--bg0); transition-duration: 0.6s; height: 250px; width: var(--menuwidth); position: absolute; top: 0; - left: 224px; + left: calc(250px - 1rem); z-index: 2; - box-shadow: 0 0 0 black; display: flex; flex-direction: column; align-items: center; justify-content: center; - box-shadow: 0 0 8px black; + box-shadow: 0 0 0 black; + border-left: 1rem solid var(--accent1); } body:hover #mainmenu { - left: calc(250px - var(--menuwidth)); - box-shadow: 0 0 20px black; + left: calc(250px - var(--menuwidth) - 1rem); + box-shadow: 0 0 40px black; } a { - color: white; + color: var(--fg0); } #mainmenu a { - color: #df1955; + color: var(--linkcolor); } #mainmenu a:hover { - color: #00ffd5; + color: var(--linkhover); + } + hr { + width: 100%; + border-bottom: none; + border-left: none; + border-right: none; + color: var(--stdaccentborder); + border-top-color: var(--stdaccentborder); } .flipped { @@ -169,30 +196,64 @@ #mus:checked ~ audio { display: initial; } + + @media screen and (prefers-color-scheme: light) { + #plant { + background-image: + url('images/webgarden-bg-light.png'); + } + } + + .meee { + width: 70px; + position: absolute; + top: 172px; + left: 142px; + --hannahbg: light-dark(#2228, #ddd4); + background: + linear-gradient(135deg, transparent 1rem, var(--hannahbg) 0) top left; + + padding-right: 3rem; + padding-top: 8px; + padding-left: 8px; + } </style> </head> <body> - <a target="_blank" href="../../"> - <div id="plant" style="background: url('images/webgarden-bg.png'); background-size: cover;"> - <h1>isopod.cool</h1> - <h2><?php echo $cap; ?></h2> - <img src="../../images/autoisopod_small.png" style="width: 70px; position: absolute; transform: scaleX(-1) rotate(-30deg); top: 188px; left: 144px;" /> - <img src="images/bubblecolumn1.gif" style="height: 250px; position: absolute; left: 20px; top: 0;" /> + <a target="_blank" href="/"> + <div id="plant"> + <div class="header"> + <h2>isopod.cool</h2> + <p class="h2caption"><?php echo $cap; ?></p> + </div> + <div class="meee"> + <img <?php + + if(rand(1, 1000) == 500) { + echo('src="images/collectmypages.png"'); + } else { + echo('src="images/yay.png"'); + } + + ?> style="max-width: 100%; height: auto;" /> + </div> + + <img class="bubblecolumn" src="images/bubblecolumn1.gif" style="height: 250px; position: absolute; left: 20px; top: 0;" /> <span id="hoverme"><</span> </div> </a> <input type="checkbox" id="mus" name="mus" style="display: none;"></input> <div id="mainmenu"> - <a target="_blank" href="../../">homepage</a> + <a target="_blank" href="/">homepage</a> <!--a target="_blank" href="../../desktop.html">$login<span class="blinking">_</span></a--> - <hr style="width: 30px;"> + <hr> <a href="image1.html">images</a> <a href="status.php">status</a> <label for="mus"><a style="text-decoration: underline; cursor: pointer;">song</a></label> - <hr style="width: 30px;"> + <hr> <iframe src="https://isopod.cool/stuff/beat/frame.php?theme=pixel" style="width: 84px; height: 27px;"></iframe> <img src="/etc/buttons/isopodhours.png" alt="isopod hours"/> - <img src="/etc/buttons/trans.png" alt="nonbinary"/> + <img src="/etc/buttons/trans.png" alt="transgender"/> </div> <audio controls style="position: absolute; width: calc(100% - 0.4rem); top: 0.2rem; left: 0.2rem; z-index: 5;"><source src="music.mp3" type="audio/mp3"></audio> </body> diff --git a/stuff/webgarden/status.php b/stuff/webgarden/status.php index 4330d31..a8708f9 100644 --- a/stuff/webgarden/status.php +++ b/stuff/webgarden/status.php @@ -5,15 +5,6 @@ <title>Status</title> <link href="style.css" rel="stylesheet" type="text/css" media="all"> <style type="text/css"> - body { - background: #222222; - } - #statuscafe a { - color: #df1955; - } - #statuscafe a:hover { - color: #00ffd5; - } #statuscafe { display: flex; flex-direction: column; diff --git a/stuff/webgarden/style.css b/stuff/webgarden/style.css index 0599032..bd37aec 100644 --- a/stuff/webgarden/style.css +++ b/stuff/webgarden/style.css @@ -22,33 +22,88 @@ font-weight: bold; font-style: italic; } + +:root { + color-scheme: dark light; + + /* Trying to define as few specific colours as possible as generically as possible */ + --background: light-dark(#fff5eb, #1a1a1d); + --foreground: light-dark(#222, #ddd); + --accent1: light-dark(#64790a, #ff1159); + --accent2: light-dark(#007a70, #00ffd5); + --shadow: #000a; + --message-red: light-dark(#c00, red); + --message-green: light-dark(#007500, lime); + --message-yellow: light-dark(#d3b200, yellow); + --message-blue: light-dark(#005fbb, dodgerblue); + + --linkcolor: var(--accent1); + --linkhover: var(--accent2); + + --fg0: var(--foreground); + --fg1: color-mix(in srgb, var(--foreground) 85%, var(--background) 15%); + --fg2: color-mix(in srgb, var(--foreground) 75%, var(--background) 25%); + --fg3: color-mix(in srgb, var(--foreground) 65%, var(--background) 35%); + + --bg0: var(--background); + --bg1: color-mix(in srgb, var(--background) 93%, var(--foreground) 7%); + --bg2: color-mix(in srgb, var(--background) 87%, var(--foreground) 13%); + --bg3: color-mix(in srgb, var(--background) 80%, var(--foreground) 20%); + --bg00: light-dark(white, black); + + --accentbordercolor: light-dark(var(--accent1), var(--fg0)); +} + html, body { margin: 0; padding: 0; overflow: hidden; } body { - font-family: b612_mono, mono, monospace; - color: white; - background: #101010; - text-shadow: 1px 1px 4px black; + font-family: b612_mono, monospace; + color: var(--fg0); + background-color: var(--bg0); } #plant { height: 250px; width: 250px; } -a#forward, a#back, h1, h2, #hoverme { +a { + color: var(--linkcolor); +} +a:hover { + color: var(--linkhover); +} +a#forward, a#back, #hoverme { font-family: 'Silkscreen'; color: white; text-decoration: none; } +#hoverme, #statuscafe ~ #back { + color: var(--fg0); +} #hoverme { position: absolute; top: 4px; - left: 209px; - animation-name: arrowwiggle; - animation-duration: 6s; - animation-iteration-count: infinite; + left: 219px; width: fit-content; text-align: right; +} + +@media screen and (prefers-reduced-motion: reduce) { + html:focus-within { + scroll-behavior: auto; + } + + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; + } + .bubblecolumn { + display: none; + } }
\ No newline at end of file @@ -1,307 +1,705 @@ @font-face { + font-family: b612; + src: url(https://isopod.cool/stuff/fonts/B612/B612-Regular.ttf); +} +@font-face { + font-family: b612; + src: url(https://isopod.cool/stuff/fonts/B612/B612-Bold.ttf); + font-weight: bold; +} +@font-face { + font-family: b612; + src: url(https://isopod.cool/stuff/fonts/B612/B612-Italic.ttf); + font-style: italic; +} +@font-face { + font-family: b612; + src: url(https://isopod.cool/stuff/fonts/B612/B612-BoldItalic.ttf); + font-weight: bold; + font-style: italic; +} + +@font-face { font-family: b612_mono; - src: url(stuff/fonts/B612_Mono/B612Mono-Regular.ttf); + src: url(https://isopod.cool/stuff/fonts/B612_Mono/B612Mono-Regular.ttf); } @font-face { font-family: b612_mono; - src: url(stuff/fonts/B612_Mono/B612Mono-Bold.ttf); + src: url(https://isopod.cool/stuff/fonts/B612_Mono/B612Mono-Bold.ttf); font-weight: bold; } @font-face { font-family: b612_mono; - src: url(stuff/fonts/B612_Mono/B612Mono-Italic.ttf); + src: url(https://isopod.cool/stuff/fonts/B612_Mono/B612Mono-Italic.ttf); font-style: italic; } @font-face { font-family: b612_mono; - src: url(stuff/fonts/B612_Mono/B612Mono-BoldItalic.ttf); + src: url(https://isopod.cool/stuff/fonts/B612_Mono/B612Mono-BoldItalic.ttf); font-weight: bold; font-style: italic; } :root { - --stdfont: b612_mono, monospace; - --bgcolor: #222222; - --fontcolor: #dcdcdc; - --linkcolor: #df1955; - --linkhover: #00ffd5; - --blockbg: #fff1; - --blockbghover: #fff2; - --stdshadow: #000; + color-scheme: dark light; + + /* Trying to define as few specific colours as possible as generically as possible */ + --background: light-dark(#fff5eb, #1a1a1d); + --foreground: light-dark(#222, #ddd); + --accent1: light-dark(#64790a, #ff1159); + --accent2: light-dark(#007a70, #00ffd5); + --shadow: #000a; + --message-red: light-dark(#c00, red); + --message-green: light-dark(#007500, lime); + --message-yellow: light-dark(#d3b200, yellow); + --message-blue: light-dark(#005fbb, dodgerblue); + + --linkcolor: var(--accent1); + --linkhover: var(--accent2); + + --fg0: var(--foreground); + --fg1: color-mix(in srgb, var(--foreground) 85%, var(--background) 15%); + --fg2: color-mix(in srgb, var(--foreground) 75%, var(--background) 25%); + --fg3: color-mix(in srgb, var(--foreground) 65%, var(--background) 35%); + + --bg0: var(--background); + --bg1: color-mix(in srgb, var(--background) 93%, var(--foreground) 7%); + --bg2: color-mix(in srgb, var(--background) 87%, var(--foreground) 13%); + --bg3: color-mix(in srgb, var(--background) 80%, var(--foreground) 20%); + --bg00: light-dark(white, black); + /* ALL colors should be defined here. If there's a color value somewhere else, move it here so it can be responsive */ - --stdaccentborder: 3px solid var(--fontcolor); - --bodywidth: min(90vw, 80ch); - --stddropshadow: 4px 4px 8px var(--stdshadow); --stdpadding: 1rem; - --navbarheight: calc(var(--stdpadding) * 4.5); - --h1-image: url('images/isopod.php'); - --shadowsize: 3rem; - --blockbackdrop: blur(1.5px); + --idealwidth: calc(80ch + (var(--stdpadding) * 10)); + --bodywidth: min(calc(90vw - (4 * var(--stdpadding))), var(--idealwidth)); + /*--mobileviewmaxwidth: calc(92ch + 24rem); root variables don't work in media queries, apparently. Keeping this here for reference */ + + --border-size-x: 1rem; + --border-size-y: .33rem; + + --accentbordercolor: light-dark(var(--accent1), var(--fg0)); + --stdaccentborder: .2rem solid var(--accentbordercolor); + + --stddropshadow: .25rem .25rem .5rem var(--shadow); + --blockshadow: drop-shadow(0 0 1.5rem var(--shadow)); + + --bodyfont: b612_mono, monospace; + } html, body { height: 100%; + padding: 0; + margin: 0; } body { - color: var(--fontcolor); - font-family: var(--stdfont); - text-shadow: 1px 1px 3px var(--stdshadow); + color: var(--fg0); + font-family: var(--bodyfont); - max-width: var(--bodywidth); - margin: auto; - background-color: var(--bgcolor); - box-sizing: border-box; + background: + url('https://isopod.cool/bg-dither.png') repeat center/cover fixed, + var(--bg0); } body > p:last-child { padding-bottom: var(--stdpadding); } -/* Headings */ -body > h1:first-of-type, body > main:first-of-type > div > h1:first-of-type { - margin-top: calc(var(--navbarheight) + var(--stdpadding)); - font-size: 3em; - background-image: var(--h1-image); - background-size: contain; - background-position: right; - background-repeat: no-repeat; - padding-bottom: calc(var(--stdpadding) * 2); - margin-bottom: calc(var(--stdpadding) * -2); -} -h1 + h2#caption {font-weight: normal; - padding-top: 0; - margin-top: -1.4em; -} -h1, h2, h3, h4, h5, h6 { - border-left: var(--stdaccentborder); - padding-left: var(--stdpadding); -} -summary :is(h1, h2, h3, h4, h5, h6) { - display: inline-block; - border-left: none; - padding-left: initial; - margin: 0; -} - /* Links */ + a { - color: var(--linkcolor); + color: var(--accent1); } a:hover { - color: var(--linkhover); + color: var(--accent2); } +.backlink { + border-left: var(--stdpadding) solid var(--accent1); + padding: calc(var(--stdpadding) * 0.7) var(--stdpadding); + width: fit-content; + margin-left: calc(-1 * var(--stdpadding)); +} + +/* Header */ -/* Nav & Header */ header { - position: absolute; + position: fixed; top: 0; - width: max-content; - min-width: var(--bodywidth); - height: var(--navbarheight); - padding-top: 0.5rem; - left: 50%; - transform: translateX(-50%); + left: 0; + right: 0; + filter: var(--blockshadow); + pointer-events: none; + z-index: 5; +} +header * { + pointer-events: auto; } -#header-content { + +.headerbar { /* This div represents the top header bar */ display: flex; + flex-direction: row; + justify-content: space-between; align-items: center; + + padding: 0 var(--stdpadding); + + background: var(--bg0); + filter: drop-shadow(0 var(--border-size-y) 0 var(--accent1)); } -#header-content > * { - margin: 0; +.headerbar > * { + flex: 1 1 0; } -#header-content > :last-child { - flex: 1; +.headerbar p { text-align: right; } -nav { + +.headerbar > div { /* Center image in the top bar */ display: flex; - flex-wrap: wrap; - max-width: 100%; - align-items: center; justify-content: center; - gap: calc(var(--stdpadding / 2)); + align-items: center; + height: 5rem; } -nav a, nav span, body > a{ - padding: calc(var(--stdpadding) / 2) calc(var(--stdpadding) / 4 * 3); - margin: calc(var(--stdpadding) / 2) 0; +.headerbar img { + max-height: 100%; } -nav a, body > a, summary { - border-left: var(--stdaccentborder); - background: linear-gradient(var(--blockbghover) 0 0) 0 / var(--bgpos, 0) no-repeat; - transition: background .3s, border .3s; + + +.bubblecolumn { + position: fixed; + left: 4rem; + top: 0; + width: 29px; + height: 100vh; + background-image: url(/images/bubblecolumn1.gif); + background-repeat: repeat-y; + pointer-events: none; + z-index: -1; } -nav a { - border-color: #0000; + + /* Header nav */ +header nav { + max-width: fit-content; + filter: drop-shadow(var(--border-size-x) 0 0 var(--accent1)); + background: var(--bg0); + background: linear-gradient(315deg, transparent var(--stdpadding), var(--bg0) 0) bottom right; /* TODO: replace this nonsense once border-shape drops */ + padding-bottom: var(--stdpadding); } -nav a:hover, body > a:hover, summary:hover { - --bgpos: 100%; - border-left: var(--stdaccentborder); +#header-inside-corner-kludge { /* Janky solution to get an inside bevel where the top bar and nav sidebar meet. */ + background: var(--bg0); + background: linear-gradient(135deg, var(--bg0) var(--stdpadding), transparent 0) top left; + width: calc(var(--stdpadding) * 2); + height: calc(var(--stdpadding) * 2); + top: 0; + right: calc(0px - var(--stdpadding) * 2); + position: absolute; } -body > a { - display: block; - margin-left: 0; - padding-left: 1rem; - font-weight: bold; - font-size: 1.25em; +nav ul { + list-style: none; + padding: 0; + margin: 0; +} +nav li { + padding: calc(var(--stdpadding) / 2) calc(var(--stdpadding) * 2); + margin-top: 0; + margin-bottom: 0; +} +.burgermenu { + display: none; +} + +/* Main */ + +main { + padding: calc(var(--stdpadding) * 5); + padding-top: 6rem; + padding-bottom: 4rem; + + margin: auto; + max-width: var(--bodywidth); + min-height: 100vh; + box-sizing: border-box; + + background-color: var(--bg0); + box-shadow: 0 0 2.5rem var(--shadow) inset; + + line-height: 1.4; +} +section { + margin-bottom: calc(var(--stdpadding) * 3); +} + +.pagenav ul { + display: flex; + flex-wrap: wrap; + list-style: none; + padding: 0; + gap: var(--stdpadding); + justify-content: center; + align-items: center; +} +.pagenav li { + padding: 0; } -/* Background image type beat */ -#leftsidebg, #rightsidebg { - --bgimg: url(/bg_dither.png)/*, url(/bg.jxl), url(/bg.jpg)*/; - background-image: /*linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%), linear-gradient(90deg, rgba(255, 0, 0, 0.06), rgba(0, 255, 0, 0.02), rgba(0, 0, 255, 0.06)), */var(--bgimg); - background-size: /*100% 2px, 3px 100%, cover, cover, cover, */cover; - background-repeat: repeat; - background-position: center; +/* Footer */ + +footer { position: fixed; - z-index: -10; + right: 0; bottom: 0; - top: 0; - --distancefromcenter: calc((var(--bodywidth) / -2) - (var(--stdpadding) * 3)); + background: var(--bg0); + background: linear-gradient(135deg, transparent var(--stdpadding), var(--bg0) 0) top left; + padding: var(--stdpadding); + filter: drop-shadow(calc(0px - var(--border-size-x)) 0 0 var(--accent2)) + var(--blockshadow); + max-width: 85vw; + + display: flex; + gap: var(--stdpadding); + align-items: center; + flex-wrap: wrap; } -#leftsidebg { - right: calc(50% - var(--distancefromcenter)); - left: 0; - box-shadow: calc(0rem - var(--shadowsize)) 0 var(--shadowsize) calc(0rem - var(--shadowsize)) black inset; +footer p { + margin: 0; } -#rightsidebg { - right: 0; - left: calc(50% - var(--distancefromcenter)); - box-shadow: var(--shadowsize) 0 var(--shadowsize) calc(0rem - var(--shadowsize)) black inset; + +/* Headings */ + +h2, h3, h4, h5, h6 { + margin-top: calc(var(--stdpadding) * 3); } +h2, h3, h4 { + border-bottom: .2rem solid; + padding-bottom: .2em; + width: fit-content; -/* 88x31 button container */ -.buttons { - text-align: center; - font-size: 0; + --hbcolor: var(--fg0); + border-image: linear-gradient(to right, var(--hbcolor) 50%, transparent 50%) 100% 1; } -.buttons > * { - display: inline-block; - margin: 0.1rem; - font-size: 0; +h2 { + font-size: 2.5rem; } -.buttons > a > img { - transition-duration: .5s; - box-shadow: none; - display: inline-block; - transform: translate(0, 0); +h3 { + font-size: 1.5rem; + --hbcolor: var(--accent1); + border-bottom-width: .1rem; } -.buttons > a > img:hover { - box-shadow: 2px 2px 4px black; - z-index: 5; - transform: translate(-2px, -2px); +h4 { + font-size: 1.25rem; + --hbcolor: var(--accent2); + border-bottom-width: .1rem; +} +h5 { + font-size: 1rem; +} +h6 { + font-size: .9rem; +} +.h2caption { + margin-top: -2.9rem; + margin-bottom: 1.6rem; + margin-left: auto; + width: 50%; + text-align: right; + font-style: italic; +} +h3 + .h2caption, h4 + .h2caption { + margin-top: -2.4rem; + margin-bottom: 1.1rem; +} + +/* Details/summary */ + +details { + border-left: var(--stdaccentborder); + padding-left: var(--stdpadding); +} +details:open summary { + margin-bottom: var(--stdpadding); +} +summary { + padding: var(--stdpadding); + margin-left: calc(var(--stdpadding) * -1); + background-color: var(--bg1); + background: linear-gradient(225deg, transparent var(--stdpadding), var(--bg1) 0) top right; +} + +/* Universal for the next 4 things */ + +figure, section > blockquote, pre, .codetitle, .aside, .notice { + margin: var(--stdpadding) calc(var(--stdpadding) * 3); + border-left: var(--stdaccentborder); +} + +/* Interjections */ + +.aside { + background-color: var(--bg1); + font-size: 0.9em; + min-height: calc(7rem + (var(--stdpadding) * 2)); +} +.aside-image { + height: 100%; + max-height: 7rem; + width: 7rem; + float: left; + padding: var(--stdpadding); + margin: 0 var(--stdpadding) var(--stdpadding) 0; + display: flex; + justify-content: center; + align-items: center; + border-right: .1rem solid var(--accent1); +} +.aside-image img, .aside-image picture { + max-height: 100%; +} +.aside-content { + padding: var(--stdpadding); +} +.aside-content :first-child { + margin-top: 0; +} +.aside-content :last-child { + margin-bottom: 0; +} + +.notice { + border-left-color: var(--message-blue); + background-color: color-mix(in srgb, var(--bg0) 90%, var(--message-blue) 10%); + padding: var(--stdpadding); + font-size: 0.9em; +} +.error { + border-left-color: var(--message-red); + background-color: color-mix(in srgb, var(--bg0) 90%, var(--message-red) 10%); +} +.success { + border-left-color: var(--message-green); + background-color: color-mix(in srgb, var(--bg0) 90%, var(--message-green) 10%); +} +.warning { + border-left-color: var(--message-yellow); + background-color: color-mix(in srgb, var(--bg0) 90%, var(--message-yellow) 10%); +} + +/* Blockquotes */ + +figure.quote, section > blockquote { + background-color: var(--bg1); + padding: var(--stdpadding); + background: linear-gradient(315deg, transparent var(--stdpadding), var(--bg1) 0) bottom right; } /* Code snippets */ + +pre { + height: fit-content; +} code { - padding: 0.15rem; + padding: 0.15em .5em; } pre > code { display: block; - margin-bottom: 1rem; overflow-x: auto; + border-top: .1rem solid var(--accent2); +} +code { + background-color: var(--bg00); } -code, .codetitle { - background-color: black; +:not(pre) > code { + border: .1rem solid var(--fg3); } pre > code, .codetitle { - width: 75%; - margin: auto; - border: 1px solid #00ffd5; - padding: 0.7rem; + padding: calc(0.7 * var(--stdpadding)); } .codetitle { margin-bottom: 0; border-bottom: none; - text-align: center; + font-size: .9em; + display: block; + background-color: var(--bg1); + background: linear-gradient(225deg, transparent var(--stdpadding), var(--bg1) 0) top right; } .codetitle + pre { margin-top: 0; } +/* Media */ + +img, picture, video { + max-width: 100%; + max-height: 50rem; + min-width: 0; +} +:is(main, section, picture, .media) > img, picture, video { + margin: auto; + display: block; +} +figure.media { + background-color: var(--bg1); + background: linear-gradient(315deg, var(--bg1) var(--stdpadding), transparent var(--stdpadding), transparent calc(var(--stdpadding) * 1.3), var(--bg1) 0) bottom right; + border-left: var(--stdaccentborder); +} +figure.media * { + margin: 0 auto; +} +figure.media figcaption { + padding: var(--stdpadding); + font-size: .9em; +} +.gallery { + display: flex; + max-width: 100%; + width: max-content; +} +.gallery > * { + flex: 1 1 0; +} +p img { + height: 2em; + display: inline; + margin: initial; + vertical-align: middle; + transition: .15s; +} +p img:hover { + transform: scale(1.3); +} + /* Tables */ + table { + font-size: .9em; + width: fit-content; border-collapse: collapse; + border: .1rem solid var(--fg0); +} +.tablecontainer { + overflow-x: scroll; +} +table, .tablecontainer { + margin: var(--stdpadding) 0; +} +.tablecontainer table { + margin: 0 auto; +} +.tablecontainer caption { + text-align: left; +} +caption { + background: var(--bg1); + background: + linear-gradient(135deg, transparent var(--stdpadding), var(--bg1) 0) top left, + linear-gradient(225deg, transparent var(--stdpadding), var(--bg1) 0) top right; + padding: var(--stdpadding); + background-size: 50% 100%; + background-repeat: no-repeat; +} +thead, tfoot { + border-top: .1rem solid var(--accent1); + border-collapse: separate; +} +tbody { + border-top: .1rem solid var(--accent2); + border-collapse: separate; } td { - padding: calc(var(--stdpadding) / 2); + min-width: 10ch; + border: .1rem solid var(--fg1); } -tr > td:first-child { - padding-left: 0; +td, th { + padding: calc(var(--stdpadding) * .4); } -tr.indent-1 td { - padding-left: calc(var(--stdpadding)); +thead th, thead td { + padding: calc(var(--stdpadding) * .4) var(--stdpadding); } -tr.indent-1 td:first-child { - border-left: var(--stdaccentborder); + +/* Lists */ + +dl { + display: flex; + flex-wrap: wrap; + --ratio: .333; /* Ratio of dt's width to dd's width. Defaults to 1/3 here. */ +} +dt, dd { + padding: calc(var(--stdpadding) * .5); + box-sizing: border-box; +} +dt { + width: calc(100% * var(--ratio)); + padding-left: var(--stdpadding); +} +dd { + width: calc(100% - (100% * var(--ratio))); + margin-left: 0; + padding-right: var(--stdpadding); } +:is(dt, dd):nth-of-type(2n) { + background-color: var(--bg1); +} +dt:empty{ + width: 0; + padding: 0; +} +dt:empty + dd { + width: 100%; + padding-left: var(--stdpadding); +} + +/* Forms & Comments */ -/* Quotations */ -figure.quote, blockquote { - padding: calc(var(--stdpadding) * 1.5); +input, textarea { + border: none; + background-color: var(--bg00); + font-family: var(--bodyfont); margin: 0; +} + +input, textarea, .commentform .notice, .commentform-field label { + padding: calc(var(--stdpadding) * 0.5) calc(var(--stdpadding) * 0.8); + box-sizing: border-box; + font-size: 0.85rem; +} + +input[type="text"], textarea { + width: 100%; + min-width: 100%; + max-width: 100%; border-left: var(--stdaccentborder); - background-color: var(--blockbg); - margin-bottom: var(--stdpadding); - backdrop-filter: var(--blockbackdrop); } -figure.quote blockquote { - padding: initial; - border-left: initial; - background-color: initial; - margin-bottom: initial; - backdrop-filter: initial; + +input[type="text"] { + border-top: .1rem solid var(--accent1); } -figure.quote figcaption { - margin-left: calc(var(--stdpadding) * 3); - margin-top: var(--stdpadding); + +textarea { + border-bottom: .1rem solid var(--accent2); } -blockquote > :first-child { - margin-top: 0; + +input[type="submit"] { + border: var(--stdaccentborder); + height: min-content; + background-color: var(--bg1); } -blockquote > :last-child { - margin-bottom: 0; + +input[type="submit"]:hover { + border-color: var(--accent2); + color: var(--accent2); + background-color: var(--bg2); + cursor: pointer; } -/* Media, plus captions thereof */ -img, picture, video { - max-width: 100%; - max-height: 50rem; - min-width: 0; +.commentform-field { + flex: 1 1 0; + display: flex; + flex-direction: column; + justify-content: end; } -:is(body, p, picture) > img, picture, video, figure.media { - margin: auto; - display: block; + +.commentform-field label { + background-color: var(--bg1); + border-left: var(--stdaccentborder); } -.gallery { +#commentform-top, .commentform-top { display: flex; - max-width: 100%; + gap: var(--stdpadding); } -figure.media { - width: fit-content; - max-width: 100%; + +.commentform { + display: flex; + flex-direction: column; + gap: var(--stdpadding); + margin: var(--stdpadding) 0; } -figure.media > div { - display: inline-block; + +#commentform-bottom, .commentform-bottom { + display: flex; + justify-content: space-between; + flex-direction: row-reverse; + gap: var(--stdpadding); } -figure.media > div > figcaption { - width: min-content; - min-width: 100%; - font-size: 0.9em; - padding: calc(var(--stdpadding) * 0.9); + +.commentform .notice { + display: flex; + justify-content: center; + align-items: center; margin: 0; - margin-bottom: initial; - margin-top: -4px; +} + +.comment { + margin: 2rem auto; + display: flex; + flex-direction: column; +} + +.comment > div { border-left: var(--stdaccentborder); - background-color: var(--blockbg); - box-sizing: border-box; + border-left-color: var(--accent1); + margin: 0; + padding: 0 var(--stdpadding); + background: var(--bg1); +} + +.gb-cool/*, .gb-found*/ { + word-break: break-all; +} + +.comment > .gb-reply { + border-left: none; + border-right: var(--stdaccentborder); + border-right-color: var(--accent2); + border-top: var(--stdaccentborder); + padding: 0; +} + +.gb-reply > div { /* Reply contents */ + + margin: var(--stdpadding); + text-align: right; +} + +.gb-reply > p { /* "Reply:" label */ + float: left; + margin: 0; + margin-right: var(--stdpadding); + padding: var(--stdpadding); + border-right: .1rem solid var(--accent2); +} + +.gb-head { + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: .1rem solid var(--fg1); +} + +.gb-head p { + flex: 1 1 0; + text-align: center; +} + +.gb-head p:first-of-type { + text-align: left; +} + +.gb-head p:last-of-type { + text-align: right; } /* Misc */ -summary { - padding: calc(var(--stdpadding)/2) var(--stdpadding); + +hr { + border-bottom: none; + border-left: none; + border-right: none; + color: var(--stdaccentborder); + border-top-color: var(--stdaccentborder); +} +.prefers-contrast-less-message { + display: none; } summary:hover { cursor: pointer; @@ -312,8 +710,169 @@ summary:hover { [title]:hover { cursor: help; } -hr { - width: 30%; +.webrings { + display: flex; + flex-wrap: wrap; + gap: var(--stdpadding); + width: 100%; + justify-content: space-around; + margin: calc(3 * var(--stdpadding)) 0; +} +.ring { + display: flex; + gap: 1ch; +} +.ring * { + text-wrap: nowrap; +} +.buttons { + display: flex; + flex-wrap: wrap; + justify-content: center; +} +.buttons > * { + width: 88px; + max-height: 31px; +} + +/* Music page stuff */ +.musicpage section { + min-height: 23rem; +} +.cd { + --cdsize: min(20rem, var(--bodywidth)); + --clearplastic: color-mix(in srgb, var(--background) 90%, var(--foreground) 10%); + + width: var(--cdsize); + aspect-ratio: 1; + + border-radius: 50%; + border: calc(var(--cdsize) / 50) solid var(--clearplastic); + overflow: hidden; + line-height: 0; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: var(--stdpadding); + margin-top: 3rem; + box-shadow: 0 0 3rem #0003; + transform: scale(1); + transition: .2s; + box-sizing: border-box; +} +.cd:hover { + transform: scale(1.1); + box-shadow: 0 0 8rem #0007; +} +.cd + h3 { + display: inline-block; +} +.cd img { + animation-duration: 100000ms; + animation-iteration-count: infinite; + animation-timing-function: linear; + width: 100%; +} +.cd:hover img { + animation-duration: 300ms; +} +section:nth-child(2n+1) .cd { + float: left; + margin-right: 2rem; + animation-name: spin; +} +section:nth-child(2n) .cd { + float: right; + margin-left: 2rem; + animation-name: spin-reverse; +} +section:nth-child(2n+1) .cd img { + animation-name: spin; +} +section:nth-child(2n) .cd img { + animation-name: spin-reverse; +} + +.cd::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: calc(var(--cdsize) / 8); + height: calc(var(--cdsize) / 8); + background-color: var(--bg0); + border-radius: 50%; + border: calc(var(--cdsize) / 12) solid var(--clearplastic); + box-shadow: 0 0 calc(var(--cdsize) / 8) #0003 inset; +} + +/* Blog stuff */ + +.prevnextnav { + display: flex; + gap: var(--stdpadding); +} +.prevlink, .nextlink { + padding: var(--stdpadding); + flex-grow: 1; +} +.prevlink { + border-left: var(--stdpadding) solid var(--accent1); + margin-left: calc(-1 * var(--stdpadding));; +} +.nextlink { + border-right: var(--stdpadding) solid var(--accent1); + margin-right: calc(-1 * var(--stdpadding));; + text-align: right; +} + + +ul#articles { + margin: 0; + margin-top: 1rem; + display: flex; + flex-direction: column; + padding-left: 0; + list-style: none; +} +.blogentry { + max-width: 100%; + list-style: none; + display: inline-block; + margin: calc(var(--stdpadding)) 0; +} +ul#articles h3 { + margin: calc(var(--stdpadding)) 0; +} +.blogentry > * { + display: block; + margin: 0.1rem 0; + box-sizing: border-box; +} +.blogentry > div :first-child { + margin-top: .1rem; +} +.blogentry > div :last-child { + margin-bottom: .1rem; +} +.entrysummary { + font-size: .9em; +} +.entrytag { + font-size: .9em; + color: var(--fg2); + font-style: italic; + display: inline-block; + margin-right: 1ch; +} +time.entrydate, .entrydate time { + font-weight: bold; +} +.entrytitle { + padding-left: initial; + border-left: initial; + margin-bottom: .25rem; } /* Funsies */ @@ -340,6 +899,7 @@ hr { animation-iteration-count: infinite; color: yellow; float: right; + text-shadow: 0 0 1em black, 0 0 2em black, 0 0 3em black, 0 0 4em black; } .house { color: cornflowerblue; @@ -353,18 +913,34 @@ hr { 50.001%, 100% {opacity: 1;} } @keyframes rainbow-text { - 100%,0%{color: rgb(255,0,0); text-shadow: 0 0 4px rgb(216, 1, 1);} - 8%{color: rgb(255,127,0); text-shadow: 0 0 4px rgb(211, 105, 0);} - 16%{color: rgb(255,255,0); text-shadow: 0 0 4px rgb(214, 214, 0);} - 25%{color: rgb(127,255,0); text-shadow: 0 0 4px rgb(105, 211, 0);} - 33%{color: rgb(0,255,0); text-shadow: 0 0 4px rgb(0, 204, 0);} - 41%{color: rgb(0,255,127); text-shadow: 0 0 4px rgb(0, 209, 105);} - 50%{color: rgb(0,255,255); text-shadow: 0 0 4px rgb(0, 202, 202);} - 58%{color: rgb(0,127,255); text-shadow: 0 0 4px rgb(0, 103, 206);} - 66%{color: rgb(0,0,255); text-shadow: 0 0 4px rgb(0, 0, 206);} - 75%{color: rgb(127,0,255); text-shadow: 0 0 4px rgb(103, 0, 206);} - 83%{color: rgb(255,0,255); text-shadow: 0 0 4px rgb(211, 0, 211);} - 91%{color: rgb(255,0,127); text-shadow: 0 0 4px rgb(211, 0, 105);} + 100%,0%{color: rgb(255,0,0); text-shadow: 0 0 .25rem rgb(216, 1, 1);} + 8%{color: rgb(255,127,0); text-shadow: 0 0 .25rem rgb(211, 105, 0);} + 16%{color: rgb(255,255,0); text-shadow: 0 0 .25rem rgb(214, 214, 0);} + 25%{color: rgb(127,255,0); text-shadow: 0 0 .25rem rgb(105, 211, 0);} + 33%{color: rgb(0,255,0); text-shadow: 0 0 .25rem rgb(0, 204, 0);} + 41%{color: rgb(0,255,127); text-shadow: 0 0 .25rem rgb(0, 209, 105);} + 50%{color: rgb(0,255,255); text-shadow: 0 0 .25rem rgb(0, 202, 202);} + 58%{color: rgb(0,127,255); text-shadow: 0 0 .25rem rgb(0, 103, 206);} + 66%{color: rgb(0,0,255); text-shadow: 0 0 .25rem rgb(0, 0, 206);} + 75%{color: rgb(127,0,255); text-shadow: 0 0 .25rem rgb(103, 0, 206);} + 83%{color: rgb(255,0,255); text-shadow: 0 0 .25rem rgb(211, 0, 211);} + 91%{color: rgb(255,0,127); text-shadow: 0 0 .25rem rgb(211, 0, 105);} +} +@keyframes spin { + from { + transform:rotate(0deg); + } + to { + transform:rotate(360deg); + } +} +@keyframes spin-reverse { + from { + transform:rotate(360deg); + } + to { + transform:rotate(0deg); + } } /* ads */ @@ -393,129 +969,356 @@ hr { } } -/* If user is on mobile */ -@media only screen and (hover: none) { - header { - position: initial; - top: initial; - left: initial; - right: initial; - height: initial; - transform: initial; - width: fit-content; +/* Responsive Layout */ + +@media screen and (max-width: calc(92ch + 24rem)) { + + /* Body stuff */ + main { + padding: calc((100vw - var(--bodywidth)) / 4); + padding-top: calc(8.5rem + var(--stdpadding) + var(--border-size-y)); + padding-bottom: calc(var(--stdpadding) * 2); + box-sizing: content-box; + overflow: hidden; + } + + figure, blockquote, section > blockquote, pre, .codetitle, .aside, :not(.commentform-bottom) > .notice { + margin: var(--stdpadding) calc(var(--stdpadding) * 2); + } + @media (max-width: 100vh) { + figure, blockquote, section > blockquote, pre, .codetitle, .aside, :not(.commentform-bottom) > .notice { + margin: var(--stdpadding) 0; + } } - #header-content { - padding-bottom: calc(var(--stdpadding) / 2); + .codetitle { + margin-bottom: 0; } - #header-content > * { - flex: 1; + .gallery { + flex-direction: column; } - #header-content > :last-child { - word-break: break-word; + .aside-image { + height: 7rem; + } + + dl { + flex-direction: column; } - body > h1:first-of-type { - margin-top: var(--stdpadding); - word-break: break-word; + dt, dd { + width: 100%; + padding: calc(var(--stdpadding) * .5) var(--stdpadding); } - nav a, nav span { - flex-grow: 1; + dt { + padding-top: var(--stdpadding); } - nav a, body > a, summary { - border-left: 3px solid var(--fontcolor); - background-color: var(--blockbg); - backdrop-filter: var(--blockbackdrop); + dd { + padding-bottom: var(--stdpadding); + padding-left: calc(var(--stdpadding) * 2); } - nav a, body > a, nav span { - padding: calc(var(--stdpadding) / 2) calc(var(--stdpadding) / 4 * 3); - margin: 0 0 calc(var(--stdpadding) / 2) 0; + #commentform-top, .commentform-top { + flex-direction: column; } - body > a { - margin-left: 0; - margin-top: var(--stdpadding); + .comment > .gb-head { + gap: calc(var(--stdpadding) * 0.4); + flex-wrap: wrap; + padding: var(--stdpadding); } - pre > code, .codetitle { - border-width: .1rem; - width: initial; + .gb-head p { + flex: initial; + margin: 0; + text-align: left; } - @media (max-width: 43rem) { - .buttons > * { - width: 24%; + .gb-head .gb-name { + width: 100%; + } + + /* Footer stuff */ + footer { + position: initial; + filter: drop-shadow(0 calc(0px - var(--border-size-y)) 0 var(--accent2)) + var(--blockshadow); + max-width: 100%; + } +} + +@media screen and ((max-width: calc(92ch + 24rem)) or (max-height: 38rem)) { + + /* Header stuff */ + .headerbar { + max-width: 100vw; + box-sizing: border-box; + } + .headerbar > * { + width: 100%; + } + header h1 { + display: none; + } + .headerbar > div { + margin-left: calc((var(--stdpadding) * 2) + 3rem); + } + .headerbar img { + font-size: 2rem; + font-weight: bold; + max-height: 80%; + margin-top: 0; + } + @media (max-width: 100vh) { + .headerbar { + flex-direction: column; } - .buttons > a > img { - width: 100%; + } + @media (max-height: 100vw) { + .headerbar > div { + justify-content: initial; } } - #leftsidebg, #rightsidebg { - top: 0; left: 0; right: 0; bottom: 0; - filter: brightness(0.3); - box-shadow: none; + + header nav { + transition: .3s; + transform: translateX(-100%); + position: fixed; + top: 0; + padding-top: var(--stdpadding); + max-height: 100vh; + box-sizing: border-box; } - tr:hover { - background-color: initial; + #nav-checkbox-hack:checked ~ nav, nav:has(:focus) { + transform: translateX(0); } - td { - display: block; + #nav-darkened-background-kludge { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + transform: translateY(-100vh); + transition: .3s; + background-color: var(--shadow); + filter: none; + padding: 0; } - @media (prefers-contrast: more) { - #leftsidebg, #rightsidebg { - display: none; - } + :is(#nav-checkbox-hack:checked, nav:has(:focus)) ~ #nav-darkened-background-kludge { + transform: translateY(0); + } + #header-inside-corner-kludge { + display: none; + } + .burgermenu { + display: flex; + justify-content: center; + align-items: center; + width: 3rem; + height: 3rem; + } + .bm-open { + position: fixed; + top: var(--stdpadding); + left: calc(var(--stdpadding) * 2); + } + .bm-close { + margin-left: calc(var(--stdpadding) * 2); } -} -@media screen and (orientation:portrait) { - .gallery { - flex-direction: column; + .bubblecolumn { + display: none; } } -/* TODO: Light theme -@media (prefers-color-scheme: light) { - :root { - --bgcolor: #dffffa; - --fontcolor: #222222; - --blockbg: #0001; - --blockbghover: #00000022; - --stdshadow: #19191977; +@media screen and (max-height: 38rem) { /* If the viewport isn't tall enough for the nav */ + header nav ul { + display: flex; + flex-wrap: wrap; + } + header nav { + max-width: calc(100vw - var(--stdpadding)); + overflow-y: scroll; } } -*/ -@media (prefers-contrast: more) { +/* Light theme stuff not covered by colours */ + +@media screen and (prefers-color-scheme: light) { body { - color: white; - background-color:#111111; + background: + url('https://isopod.cool/bg-light-dither.png') repeat center/cover fixed, + var(--bg0); } - #leftsidebg, #rightsidebg { - display: none; - /*box-shadow: 100vw 0 0 #000000ee inset;*/ + .headerbar img { + filter: invert(1); + } +} + +/* Accessibility Stuff */ +/* https://developer.mozilla.org/en-US/docs/Web/CSS/system-color for colours to use */ + +@media screen and (prefers-contrast: more) { + :root { + --background: Canvas; + --foreground: CanvasText; + --accent1: ActiveText; /* I'm more or less just letting the OS/browser pick colours for me here */ + --accent2: AccentColorText; + + --fg0: var(--foreground); + --fg1: var(--foreground); + --fg2: var(--foreground); + --fg3: var(--foreground); + + --bg0: var(--background); + --bg1: var(--background); + --bg2: var(--background); + --bg3: var(--background); + } + figure.quote, section > blockquote, figure.media, .aside { /* TODO: replace this nonsense once border-shape drops */ + filter: drop-shadow(.1rem 0 0 var(--fg0)) + drop-shadow(0 .1rem 0 var(--fg0)) + drop-shadow(-.1rem 0 0 var(--fg0)) + drop-shadow(0 -.1rem 0 var(--fg0)); + border-left-width: .4rem; + } + details { + border-top: .1rem solid var(--fg0); + border-bottom: .1rem solid var(--fg0); + border-right: .1rem solid var(--fg0); + border-left-width: .4rem; + } + details:open summary { + border-bottom: .1rem solid var(--fg0); + margin-right: calc(var(--stdpadding) * -1); + } + details:open { + padding-right: var(--stdpadding); + } + code { + border: .1rem solid var(--fg0); + } + pre code { + border: none; + border-top: .1rem solid var(--accent1); + } + pre { + filter: drop-shadow(.1rem 0 0 var(--fg0)) + drop-shadow(0 .1rem 0 var(--fg0)); + } + .codetitle { + filter: drop-shadow(.1rem 0 0 var(--fg0)) + drop-shadow(0 -.1rem 0 var(--fg0)); + } + a:hover { + background-color: AccentColor; + } + :is(dt, dd):nth-of-type(2n) { + border: .1rem solid var(--fg0); + } + input[type="text"], textarea { + border-left-width: .4rem; + } + input[type="text"] { + border-bottom: .1rem solid var(--fg0); + border-right: .1rem solid var(--fg0); + } + textarea { + border-top: .1rem solid var(--fg0); + border-right: .1rem solid var(--fg0); + border-bottom-color: var(--fg0); } - a { - color: #00ffd5; + .notice { + border: .1rem solid var(--message-blue); + } + .error { + border: .1rem solid var(--message-red); + } + .success { + border: .1rem solid var(--message-green); + } + .warning { + border: .1rem solid var(--message-yellow); + } + .comment { + border-bottom: .1rem solid var(--fg1); + border-top: .1rem solid var(--fg1); + } + .comment > div { + border-right: .1rem solid var(--fg1); + border-left-width: .4rem; + } + + .comment > .gb-reply { + border-left: .1rem solid var(--fg1); + border-right-width: .4rem; + } + + .commentform-field label { + border-left-width: .4rem; + border-top: .1rem solid var(--fg0); + border-right: .1rem solid var(--fg0); + } + .commentform-field textarea ~ label { + border-top: none; + border-bottom: .1rem solid var(--fg0); + } + + + .gb-reply > p { /* "Reply:" label */ + + border-right: .1rem solid var(--accent2); + } + pre, .codetitle, .notice { + border-left-width: .4rem; + } + @media (max-width: calc(92ch + 24rem)) { + dt:nth-of-type(2n) { + border-bottom: none; + } + dd:nth-of-type(2n) { + border-top: none; + } + } + @media (min-width: calc(92ch + 24rem)) { + dt:nth-of-type(2n) { + border-right: none; + } + dd:nth-of-type(2n) { + border-left: none; + } } } -/* TODO: Low contrast theme */ -/*@media (prefers-contrast: less) { +@media screen and (prefers-contrast: less) { /* I don't know how to trigger this value in the OS nor do I know how I'm supposed to use it. Doing this until I find a better solution. */ + :root { + filter: contrast(.7); + } -}*/ + .prefers-contrast-less-message { + display: initial; + } +} -@media (prefers-reduced-motion) { - * { - transition-duration: 0s !important; +@media screen and (forced-colors: active) { + header nav, footer { + background: var(--bg0) !important; /* Forced colors mode deletes backgrounds on anything with a background-image set, like my janky beveled corners solution. This is to restore them, and won't be necessary once border-shape drops */ + } + figure.quote, section > blockquote, figure.media, pre, .codetitle { /* TODO: once border-shape drops, this is about what the corresponding styling in HC mode should be */ + border: .1rem solid var(--fg0); + border-left: var(--stdaccentborder); + border-left-width: .4em; + filter: none; } } -@media print { - body { - text-shadow: none; - color: black; +@media screen and (prefers-reduced-motion: reduce) { + html:focus-within { + scroll-behavior: auto; } - h1 { - margin-top: initial; + + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + scroll-behavior: auto !important; } - nav, form, #leftsidebg, #rightsidebg { + .bubblecolumn { display: none; } - }
\ No newline at end of file diff --git a/uses/compier/images/cablegore.jpg b/uses/compier/images/cablegore.jpg Binary files differnew file mode 100644 index 0000000..8719f5c --- /dev/null +++ b/uses/compier/images/cablegore.jpg diff --git a/uses/compier/index.php b/uses/compier/index.php index 0b8b087..f1ad98f 100644 --- a/uses/compier/index.php +++ b/uses/compier/index.php @@ -3,117 +3,197 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>My Computer</title> + <title>my computer | isopod.cool v4</title> <link href="/style.css" rel="stylesheet" type="text/css" media="all"> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(true); ?> - <h1>the comp<em title="Is that a Homestar Runner reference?">ier</em></h1> - <h2 id="caption">my main computer</h2> - <p>My main PC is an ever-shifting, questionably arranged agglomeration of components selected as if at random, initially designed and assembled by yours truly circa March of '22. Apparently, I have a lot to say about it.</p> - <figure class="media"> - <div> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + <main> + <section> + <h2>the comp<em title="Is that a Homestar Runner reference?">ier</em></h2> + <p class="h2caption">my 'puter</p> + <p class="backlink"><a href="../"><< uses</a></p> + <p>My main PC is an ever-shifting, questionably arranged agglomeration of components selected as if at random, initially designed and assembled by yours truly circa March of '22. Apparently, I have a lot to say about it.</p> + <figure class="media"> <picture> <source srcset="images/pc1.jxl" type="image/jxl"> <img src="images/pc1.jpg" alt="Front view of my computer tower. It's black, with solid metal side panels and a mostly grey front panel. It has four 5.25" expansion bays and two 3.25" external expansion bays. The top 5.25" bay contains an optical drive and the rest are filled with a 3D-printed vent for an extra fan. One of the 3.25" bays is occupied by an aftermarket front I/O panel with two USB 3 ports and headphone and mic jacks. Below that is the power and reset buttons and power and hard drive LEDs, and then the stock intake vent. The very bottom piece of said vent has a USB logo printed on it. There's also a Pentium 4 sticker."> </picture> - <figcaption style="margin-top: 0;">The old motherboard had an Intel wifi chip, but as of installing the new one "Intel Inside" isn't even technically true.</figcaption> - </div> - </figure> - <figure class="media"> - <div> + <figcaption>The old motherboard had an Intel wifi chip, but as of installing the new one "Intel Inside" isn't even technically true.</figcaption> + </figure> + <figure class="media"> <picture> <source srcset="images/pc2.jxl" type="image/jxl"> <img src="images/pc2.jpg" alt="The inside of my computer. All of the components are promintently visible. Two intake fans are mounted on the bottom, directly below the GPU. My cable management is serviceable, with a lot of extra length crammed in the dead space between the top-mounted PSU and the optical drive. Also visible from this angle are the abnormally large feet."> </picture> - <figcaption style="margin-top: 0;">Yes, I had to cut holes in the bottom for those fans. I think it looks pretty mint, if you ignore the fact that some of the chunkier expansion options down there are blocked.</figcaption> - </div> - </figure> - <h2>Internals</h2> - <h3>CPU — AMD Ryzen 7 5700G</h3> - <p>The Ryzen 7 5700G is basically the 5800 except cheaper and you trade PCIe gen 4 support for an integrated GPU. This was important to me in case my dedicated GPU died or otherwise became unavailable. This has come in useful occasionally.</p> - <p>It's a couple generations old at this point, but it's still faster than I probably need. I don't see myself replacing it for a while, to such an extent that as of writing it's now on its second motherboard.</p> - <h3>CPU Cooler — Noctua NH-U12A</h3> - <p>Admittedly, a bit overkill for the 65-watt chip it's attached to. I bought it because I was getting thermal throttling with the stock cooler, but when I took it off to put the new cooler on I discovered I hadn't mounted the stock cooler properly to begin with. The stock cooler, mounted correctly, would probably have sufficed, but frankly that mounting system was dogshit anyway. SecuFirm™ gang 4 lyfe.</p> - <p>Now that I have it, this cooler is great. Nothing specific to say, it just works and works <em>very</em> well. I wouldn't be surprised if I never replaced this. My one complaint is that the fan clips are kind of annoying to deal with.</p> - <h3>Motherboard — ASRock X570S PG Riptide</h3> - <p>It's a motherboard. I replaced my old Gigabyte B550 with this in a successful attempt to fix a strange issue with USB and audio that, after extensive troubleshooting, I can only think to attribute to a dying USB controller.</p> - <p>It's pretty good so far. Much more internal I/O but less rear USB 2 than the old one, and I had to bring my own wifi card. Luckily, it has a slot for an M.2 wifi module, and the random Realtek unit I had kicking around from my old laptop has been working without issue. One of my favourite little niceties is that it has USB 3 headers that aren't blocked by my highly aftermarket chassis fans.</p> - <p>I have had one major problem so far: when I first installed it, it recognized all my drives, but didn't see any of them as valid boot devices. Updating the four-year-old BIOS and turning CSM on fixed that.</p> - <p>I've also learned that you don't actually need to plug in the second CPU power connector if you're only running a 65-watt APU with no serious overclocking to speak of, which was convenient since that particular cable is currently buried in a moving box somewhere in my garage.</p> - <p>Bought used, this motherboard didn't come with any of the usual accessories, I/O shield included. Don't worry about that. It's fine.</p> - <h3>RAM — G.Skill Ripjaws V 2x16GB DDR4-3600 CL18</h3> - <p>Good RAM. No complaints. My old motherboard needed a BIOS update to recognize the XMP profiles, though, so maybe check for that if you're having that issue.</p> - <h3>Boot SSD — Samsung 980 500GB (NVMe)</h3> - <p>Used solely to store my OS and programs. Far bigger than necessary for that purpose, but no issues so far. Plenty fast and all that. I initially assumed it had DRAM, then I learned it didn't, <em>then</em> I learned that it's one of those drives that leeches off of your system memory instead of having an onboard cache, so make of that what you will.</p> - <h3>Secondary SSD — WD Blue 2TB (NVMe)</h3> - <p>This drive is mounted as /home, for convenient OS reinstalls and such-like. Also nice and zippy, but I suspect I'm not actually doing anything that would hit this thing hard enough to noticeably differentiate its performance from that of any other NVMe SSD. This one also uses your system memory as a cache, but that's fine. I've got plenty to go around.</p> - <p>The drive that used to fill this role was a WD Blue 1TB SATA SSD that started off serving the same purpose as an aftermarket upgrade to my old laptop, but got transplanted wholesale when I upgraded to the new system. That drive still functions, but since it holds all my most sensitive and irreplacable files, I elected to replace it for Peace Of Mind™ after my PSU exploded, and opted for a cheeky capacity upgrade while I was at it. Plus, this one was on sale for like, $90 off!</p> - <h3>HDD — WD Black 4TB (7200RPM)</h3> - <p>This drive is here as an overcorrection following years of gaming on laptops with tiny little SSDs in them. I mostly fill it with Legally Obtained Content™ and the dregs of my Steam library that I don't play very often. Absolutely no complaints thus far.</p> - <h3>Case — Dynex DX-350CC</h3> - <p>I seem to have accidentally gotten into building sleeper PCs. I promise I didn't mean to — I was drawn to this case for its superior expandability, greater ease of working-on, and massively increased piezo-buzzer-havingitude compared to the Corsair 110R this machine used to reside in. It just so happens to also be from 2004, back when "Pentium" was the name for Intel's flagship line of CPUs instead of their worst ones and I was learning to walk.</p> - <p>For all those reasons plus its absolutely charming aesthetic character, I really like this case. Unlike the last guy, I can actually get at the modular PSU without yanking it out and scratching all the paint off. It even constitutes an upgrade in terms of front I/O and airflow, after some aftermarket mods.</p> - <p>See, this case came with mounts for two 92mm fans, which is better than some of its contemporaries, but not nearly enough for several hundred watts of glistening, sinewy computing muscle. In order to bring it up to modern snuff, I cut a couple slightly sketchy speed holes in the bottom and 3D-printed a bracket and vent for the front drive bays, and mounted the 120mm fans out of my old case in those places. I also fitted some slightly goofy-looking aftermarket rubber feet to give the case more ground clearance to get better airflow from the bottom. Since I now have two entire fans blowing directly onto the GPU, I'd guess that it's actually getting <em>better</em> airflow than in the old case.</p> - <p>Ironically, those fans make the machine more annoying to work on by blocking access to the bottom of the motherboard, but that's fine. It should only really be an issue if I need to do a motherboard swap.</p> - <h3>Power Supply — EVGA SuperNOVA G6 1000W</h3> - <p>This power supply is a tad bit overkill for the system it's in — in spite of my new video card, I'm still running a 65-watt CPU. I've got so much headroom I could probably fit a second of the same GPU in here. I could probably get away with a 750-watt unit, but I've got good — or at least understandable — reasons for going this crazy.</p> - <p>I originally specced out this system with a much more sensible Seasonic Focus GX-650 rated for 650 watts, but despite being, by all accounts, the correct power supply for my use case at the time, it still died suddenly with a loud POP two and a half years into Seasonic's 10-year Worry-Free Warranty™. The RMA process was good, at least.</p> - <p>I wanted to get something less likely to suffer the same fate this time around, but having just lost a well-reviewed unit from a reputable brand with a good efficiency rating and a generous yet sensible rated wattage to nothing but bad luck, the only thing I could really do to maybe accomplish this other than just getting luckier was to buy something so overbuilt that it no longer regards my machine running at full bore as a significant load, hence this absolute goliath of a PSU. The original plan was to get a slightly more reasonable 850 watt unit instead, but this one was on a really good sale. I basically paid 850-watt money for it.</p> - <p>As of writing a few months after installing it in my system, my plan has yet to backfire. Time will tell if I made the right call.</p> - <h3>Optical Drive — LG WH16NS40 Blu-Ray Burner</h3> - <p>It's really important to me that my computer have a disc drive, and this was the cheapest unit available that supported all the major formats. Like most of the parts in my computer, it functions reliably as advertised without significant issue and I don't have much to say on the matter. This thing isn't just for the Aesthetic™ — I have a decently large collection of CDs that I've ripped using my computer.</p> - <p>I used to have a WH<em>14</em>NS40, which is basically the same save for slightly worse performance in certain specific contexts and a weird firmware issue to do with ripping 4K blu-rays. I had no problems with it, but I had to cannibalize it from my main rig for a different build and ended up replacing it with this, the closest thing available to the exact same unit.</p> - <h3>Case Fans — Arctic P12 (x3) + Noctua NF-A9 (x2)</h3> - <p>All perfectly fine fans. The 120mm Arctic P12s are good value at a good noise level, but in my experience the same cannot be said for their smaller fans, hence the premium Noctuas for the 92mm fan mounts.</p> - <p>I've also got random generic dust filters on all the intakes in a desperate attempt to sort of control the dust buildup inside my machine. It kind of works.</p> - <h3>GPU — AMD Radeon RX 6800 XT</h3> - <p>Fine, enough edging. Here's the part you're probably actually interested in, you filthy gamer.</p> - <p>I got this card used in late 2024 for circa half of its launch MSRP — I would not have been able to justify something this high-end brand new, especially at scalper prices when I was initially building this machine. I used to run an RX 6600 XT, but I had a project going which urgently required a quality video card and I'd been looking for an excuse to upgrade the one in my machine for a while, so out it came and a-scouring the eBay listings I went.</p> - <p>Gaming wise, the 6600 XT was about all I really needed. Frankly, I could probably get by on the integrated graphics in my CPU, but I quite like having two display outputs to complement my second monitor. This new GPU is ludicrous overkill for me in this department; it's marketed towards playing the latest triple-A titles at maxed-out settings in 4K, which means it completely pulverizes every PSX-graphics indie title I can throw at it with the overwhelming force and ruthless efficiency of the Chicxulub impactor.</p> - <p>The real reason I wanted this orbital nuke of a graphics processor was for Blender. If Blender Open Data is to be believed, this thing represents a more than doubling of the performance available to me in the Cycles rendering engine, which translates to a substantial improvement in render times. Of course, a mid-range Nvidia product would be better here than anything AMD is capable of, but as a known Linux user that was a no-go for me; I've heard nothing but horror stories about Nvidia GPUs and desktop Linux, and my personal experience frankly corroborates them. The venerable Mr. Torvalds said it best: <a href="https://youtu.be/iYWzMvlj2RQ">fuck 'em</a>.</p> - <p>There were a handful of GPUs in this performance class and approximate price bracket that I was considering — in fact, my original upgrade plan was a 7700 XT. I went with the 6800 XT because I deduced through the awesome power of spreadsheets that, with the current state of the used market, it had all the others beat in price-to-performance ratio, and it wasn't even close. I specifically went for the AMD reference model, since it was the only version with a short enough heatsink that I was confident it would fit in my case without any modifications.</p> - <p>I want it on record here that if I ever drop north of a grand on a 4090 or whatever the biggest baddest new this-or-a-used-car AAA-cruncher is and I haven't won the lottery, I am to be taken out back and shot like a lame horse. Frankly, I probably need some sense beaten into me if I'm buying lottery tickets to begin with.</p> - <h2>Peripherals</h2> - <h3>Mouse — Logitech MX Vertical</h3> - <p>In a previous revision of this page I said my old G602 was my "forever mouse", but I also said I'd be willing to replace it for the sake of better ergonomics, which is what this new one is for: pre-empting carpal tunnel syndrome. Besides, that mouse is in declining condition anyway, and you can only get in there with a soldering iron so many times before it becomes more trouble (and money for replacement parts) than it's worth. The old mouse is now my "on-the-go" mouse, a slot that recently opened up in my life due to my now having to take a laptop to in-person classes.</p> - <p>This new mouse shape was a bit of an adjustment at first, but after a month or so of daily or so use I find it significantly more comfortable than standard mice with no major downsides as far as usability is concerned. That said, although popular consensus is that this model is on the larger side, it's still a touch small for my hands. I'm currently working on getting on estrogen to maybe solve this issue.</p> - <p>This particular mouse is kind of a straight downgrade from its Gaming™ predecessor in a couple ways: no reassignable macro keys, and a slower sensor. In my case, I honestly wasn't using all those extra buttons anyway since the software to assign them isn't on Linux, and as for the sensor, I'm not a skilled enough gamer nor do I play the right types of games for the difference between "about as fast as my monitors" and whatever four or five digit number the esports mouse gold standard is this year to realistically be a bottleneck. Besides, if I fancied myself a Pro Gamer, a premium office mouse like this wouldn't have even been on my radar.</p> - <h3>Keyboard — Keychron V6 Max</h3> - <p>The original plan was to just quietly update this part and purge all mention of my previous keyboard(s) because I was embarrassed that I bought this to replace an extremely similar keyboard (which I will be selling, I'm not completely stupid), but this new one is actually different enough that I want to talk about it.</p> - <p>See, I used to have the tenkeyless Keychron V3 paired with a Q0 numpad to make up for the V3's lack of one, a combination that I settled on as a workaround for the 100% V6 that I wanted only being available in Keychron's stupid bluish-grey colourway. I had no problems with those keyboards, but I still bought this because I wanted to consolidate them into the same USB connection to free up a port on the 4-port USB switch I use to share these peripherals with my school laptop.</p> - <p>This new keyboard is nicer to an extent I wasn't expecting. I was <em>expecting</em> something totally identical to my old V3 but for the extra keys off to the right, but Keychron seems to have upped their build quality over the past two and half years, because this one both feels and sounds markedly... nicer. Thockier? Is that the word keyboard people use? At any rate, it feels more premium and I like it. It does flex a lot more if you push down on it hard, but that doesn't really affect normal use.</p> - <p>I like Keychrons, especially the V-series, for their hot-swappable switches, highly configurable open-source firmware, and the inclusion of spare keycaps for use with MacOS, which is great because it lets me replace the Windows key with Command or Option or some shit and get that idiotic branding off of my generic USB peripheral in use with exclusively non-Windows machines. It also helps that you can actually buy this, and for somewhat reasonable prices to boot, neither of which are givens in the world of enthusiast keyboards.</p> - <p>Admittedly, I also got this specific model for the USB dongle-based wireless connectivity. I've gone on record as saying that wireless keyboards as part of a desktop setup are the stupidest thing ever, but I think my principles can survive this one mostly intact because it's at least not fucking <em>bluetooth</em> — it's still a plug-and-play USB peripheral — and it can act as a wired keyboard if I decide the wireless sucks. I just wanted one less wire to deal with on my desk because, as of writing, I've had to tear down and move this setup like twice in the past three months.</p> - <p>I got this with the Gateron Jupiter Brown switches because, of the Cherry Reds, Keychron K Pro Browns, and Gateron G Pro Blues I've tried on previous mechanical keyboards, I liked the Keychron Browns the best, and these are pretty similar. They seem to take more force than the Keychron Browns, which I'm not sure if I like, but maybe that'll change as these get broken in. Luckily, they're hot-swappable, so if I hate them I can easily change them out! I also got some <em>sick</em> aftermarket keycaps for this one.</p> - <picture> - <source srcset="images/keeb.jxl" type="image/jxl"> - <img src="images/keeb.jpg" alt="A Keychron V6 Max, a 100% mechanical keyboard with three extra macro keys and a knob. The keycaps are a combination of, from the center out, yellow-on-black, yellow-on-gray, and black-on-white, with a couple black-on-yellow accent keys. The macro keys have novelty automotive-themed designs instead of normal legends. The keyboard has yellow backlighting."> - </picture> - <p>Word of warning to potential Keychron customers: If you buy from their site using a VPN, they may well flag your order as "suspicious" and hold your shit hostage until you send them a photo of your ID to prove you're a real person, like they did to me the first time around. They did accept a photo where I'd censored all the information I hadn't already given them as part of checkout, so that was nice I guess. Just something to keep in mind.</p> - <h3>Gamepad — Xbox One wireless controller</h3> - <p>I bought this several years ago when I was still running Windows because I wanted maximum compatibility for minimum effort. It still works now that I'm on Linux, using bluetooth and with xpadneo installed. It's decent, no complaints, I'm sure it could be better but I don't use it enough to justify caring.</p> - <h3>Monitors — MSI MAG274QRFW 27" 1440p 180Hz (2x)</h3> - <p>Another "endgame" purchase. Very good monitors, if I replace them it'll be because they broke. (Speak of the devil, one of them has been replaced under warranty since I originally wrote this section.) I truly don't care for OLEDs — they get burn-in, for god's sake, I thought we moved on from that in the early 2000's when LCDs became commonplace.</p> - <p>These are mounted on a pair of cheap Amazon special gas spring wall-mount VESA arms because I fucking hate monitor feet on my desk.</p> - <h3>Headphones — Beyerdynamic DT 770 Pro (Modified)</h3> - <p>After a lifetime of losing headphones to frayed cables and the inevitable failure of poor quality materials, my top priority when getting my next nice pair of cans was durability, and Beyerdynamic's products fit the bill nicely. I can officially say I've <em>sat on these</em> without damaging them, which for me is saying something. As a bonus, they also have excellent sound quality and are supremely comfortable.</p> - <p>The only issue with these headphones is the non-removable cable, which is an automatic deal-breaker for me. I purchased mine through a modding company that replaced that cable with a 4-pin mini XLR jack, which has proven to be a bit of a double-edged sword as finding sanely priced replacement cables for it is nigh impossible.</p> - <p>I'm also rocking aftermarket cat ears. I just don't trust the quality on the cheap novelty headphones that come with them built in.</p> - <picture> - <source srcset="images/cans.jxl" type="image/jxl"> - <img src="images/cans.jpg" alt="A pair of Beyerdynamic DT 770 Pro headphones with a removable mini XLR cable plugged in, a custom green headband wire, and aftermarket cat ears."> - </picture> - <h3>Drawing Tablet — HUION Kamvas Pro 12</h3> - <p>Perfectly cromulent 12-inch display tablet. It doesn't completely work out of the box, but the proprietary driver program is at least available for Linux, or there's OpenTabletDriver, which in my experience seems more reliable but is missing <a href="https://opentabletdriver.net/Tablets">one feature</a> from this specific model. I like that the stylus is completely passive and doesn't need to be charged, which, having grown up using a Nintendo DS, feels like an absurd thing for a stylus to require.</p> - <h3>Webcam — Logitech C925e</h3> - <p>It's a USB webcam. The picture is good enough — better than most laptops — but it does some annoying auto-adjustment stuff that makes chroma-key shenanigans difficult at times. Standout features are the privacy shutter, indicator light when the camera is in use, and screw mount. I'm sure the microphone is adequate in a pinch, but I have no reason to use it.</p> - <h3>Microphone — Audio-Technica AT2020 XLR</h3> - <p>I'll be totally honest with you, I used to have the USB version of this exact microphone and replaced it with a used XLR variant to exchange an XLR input on my audio interface for a free USB port. Both versions are equally very good, probably as good as I'll ever need. The sound quality on this sucker is so good that my friends in voice chat complain whenever they hear me on anything else.</p> - <p>In what is becoming a running theme, it sits on a perhaps unbefitting $20 no-name mic arm from Amazon, with matching cheap shock mount and pop filter. They work, though. The springs on the arm are loud and, as my friends are keen to point out every time, quite audible through the mic.</p> - <p>Also, free bit of advice from me to you: for audio hardware, buy used professional or music gear, not gaming stuff. The sound quality and build quality is almost always way better.</p> - <h3>Audio Interface — Arturia Minifuse 2</h3> - <p>Nothing to write home about for the most part. It's a good quality audio interface with the amount of I/O I presently need, which is to say two mono inputs, and it mostly works fine on Linux. Bizarrely, though, between this and my Benhringer Model D, the only device with a MIDI interface that's recognized by my computer is the analog synthesizer. If I had to spend this kind of money on an audio interface again, I'd probably go for a used Behringer unit with more inputs.</p> + <figcaption>Yes, I had to cut holes in the bottom for those fans. I think it looks pretty mint, if you ignore the fact that some of the chunkier expansion options down there are blocked.</figcaption> + </figure> + + <section> + <h3>Internals</h3> + + <section> + <h4>CPU — AMD Ryzen 7 5700G</h4> + <p>The Ryzen 7 5700G is basically the 5800 except cheaper and you trade PCIe gen 4 support for an integrated GPU. This was important to me in case my dedicated GPU died or otherwise became unavailable. This has come in useful occasionally.</p> + <p>It's a couple generations old at this point, but it's still faster than I probably need. I don't see myself replacing it for a while, to such an extent that as of writing it's now on its second motherboard.</p> + </section> + + <section> + <h4>CPU Cooler — Noctua NH-U12A</h4> + <p>Admittedly, a bit overkill for the 65-watt chip it's attached to. I bought it because I was getting thermal throttling with the stock cooler, but when I took it off to put the new cooler on I discovered I hadn't mounted the stock cooler properly to begin with. The stock cooler, mounted correctly, would probably have sufficed, but frankly that mounting system was dogshit anyway. SecuFirm™ gang 4 lyfe.</p> + <p>Now that I have it, this cooler is great. Nothing specific to say, it just works and works <em>very</em> well. I wouldn't be surprised if I never replaced this. My one complaint is that the fan clips are kind of annoying to deal with.</p> + <p>In a testament to how durable the fans that it came with are, I recently opened my computer to diagnose a weird noise it had been making for the past few months to find my CPU cooler had done this to the GPU power cable:</p> + <figure class="media"> + <img src="images/cablegore.jpg" alt="One of the wires on my GPU power cable worn down so that the copper inside is visible."> + <figcaption>Some electrical tape will fix that. Good as new! Still less sketchy than 12VHPWR.</figcaption> + </figure> + </section> + + <section> + <h4>Motherboard — ASRock X570S PG Riptide</h4> + <p>It's a motherboard. I replaced my old Gigabyte B550 with this in a successful attempt to fix a strange issue with USB and audio that, after extensive troubleshooting, I can only think to attribute to a dying USB controller.</p> + <p>It's pretty good so far. Much more internal I/O but less rear USB 2 than the old one, and I had to bring my own wifi card. Luckily, it has a slot for an M.2 wifi module, and the random Realtek unit I had kicking around from my old laptop has been working without issue. One of my favourite little niceties is that it has USB 3 headers that aren't blocked by my highly aftermarket chassis fans.</p> + <p>I have had one major problem so far: when I first installed it, it recognized all my drives, but didn't see any of them as valid boot devices. Updating the four-year-old BIOS and turning CSM on fixed that.</p> + <p>I've also learned that you don't actually need to plug in the second CPU power connector if you're only running a 65-watt APU with no serious overclocking to speak of, which was convenient since that particular cable is currently buried in a moving box somewhere in my garage.</p> + <p>Bought used, this motherboard didn't come with any of the usual accessories, I/O shield included. Don't worry about that. It's fine.</p> + </section> + + <section> + <h4>RAM — G.Skill Ripjaws V 2x16GB DDR4-3600 CL18</h4> + <p>Good RAM. No complaints. My old motherboard needed a BIOS update to recognize the XMP profiles, though, so maybe check for that if you're having that issue.</p> + </section> + + <section> + <h4>Boot SSD — Samsung 980 500GB (NVMe)</h4> + <p>Used solely to store my OS and programs. Far bigger than necessary for that purpose, but no issues so far. Plenty fast and all that. I initially assumed it had DRAM, then I learned it didn't, <em>then</em> I learned that it's one of those drives that leeches off of your system memory instead of having an onboard cache, so make of that what you will.</p> + </section> + + <section> + <h4>Secondary SSD — WD Blue 2TB (NVMe)</h4> + <p>This drive is mounted as /home, for convenient OS reinstalls and such-like. Also nice and zippy, but I suspect I'm not actually doing anything that would hit this thing hard enough to noticeably differentiate its performance from that of any other NVMe SSD. This one also uses your system memory as a cache, but that's fine. I've got plenty to go around.</p> + <p>The drive that used to fill this role was a WD Blue 1TB SATA SSD that started off serving the same purpose as an aftermarket upgrade to my old laptop, but got transplanted wholesale when I upgraded to the new system. That drive still functions, but since it holds all my most sensitive and irreplacable files, I elected to replace it for Peace Of Mind™ after my PSU exploded, and opted for a cheeky capacity upgrade while I was at it. Plus, this one was on sale for like, $90 off!</p> + </section> + + <section> + <h4>HDD — WD Black 4TB (7200RPM)</h4> + <p>This drive is here as an overcorrection following years of gaming on laptops with tiny little SSDs in them. I mostly fill it with Legally Obtained Content™ and the dregs of my Steam library that I don't play very often. Absolutely no complaints thus far.</p> + </section> + + <section> + <h4>Case — Dynex DX-350CC</h4> + <p>I seem to have accidentally gotten into building sleeper PCs. I promise I didn't mean to — I was drawn to this case for its superior expandability, greater ease of working-on, and massively increased piezo-buzzer-havingitude compared to the Corsair 110R this machine used to reside in. It just so happens to also be from 2004, back when "Pentium" was the name for Intel's flagship line of CPUs instead of their worst ones and I was learning to walk.</p> + <p>For all those reasons plus its absolutely charming aesthetic character, I really like this case. Unlike the last guy, I can actually get at the modular PSU without yanking it out and scratching all the paint off. It even constitutes an upgrade in terms of front I/O and airflow, after some aftermarket mods.</p> + <p>See, this case came with mounts for two 92mm fans, which is better than some of its contemporaries, but not nearly enough for several hundred watts of glistening, sinewy computing muscle. In order to bring it up to modern snuff, I cut a couple slightly sketchy speed holes in the bottom and 3D-printed a bracket and vent for the front drive bays, and mounted the 120mm fans out of my old case in those places. I also fitted some slightly goofy-looking aftermarket rubber feet to give the case more ground clearance to get better airflow from the bottom. Since I now have two entire fans blowing directly onto the GPU, I'd guess that it's actually getting <em>better</em> airflow than in the old case.</p> + <p>Ironically, those fans make the machine more annoying to work on by blocking access to the bottom of the motherboard, but that's fine. It should only really be an issue if I need to do a motherboard swap.</p> + </section> + + <section> + <h4>Power Supply — EVGA SuperNOVA G6 1000W</h4> + <p>This power supply is a tad bit overkill for the system it's in — in spite of my new video card, I'm still running a 65-watt CPU. I've got so much headroom I could probably fit a second of the same GPU in here. I could probably get away with a 750-watt unit, but I've got good — or at least understandable — reasons for going this crazy.</p> + <p>I originally specced out this system with a much more sensible Seasonic Focus GX-650 rated for 650 watts, but despite being, by all accounts, the correct power supply for my use case at the time, it still died suddenly with a loud POP two and a half years into Seasonic's 10-year Worry-Free Warranty™. The RMA process was good, at least.</p> + <p>I wanted to get something less likely to suffer the same fate this time around, but having just lost a well-reviewed unit from a reputable brand with a good efficiency rating and a generous yet sensible rated wattage to nothing but bad luck, the only thing I could really do to maybe accomplish this other than just getting luckier was to buy something so overbuilt that it no longer regards my machine running at full bore as a significant load, hence this absolute goliath of a PSU. The original plan was to get a slightly more reasonable 850 watt unit instead, but this one was on a really good sale. I basically paid 850-watt money for it.</p> + <p>As of writing a few months after installing it in my system, my plan has yet to backfire. Time will tell if I made the right call.</p> + </section> + + <section> + <h4>Optical Drive — LG WH16NS40 Blu-Ray Burner</h4> + <p>It's really important to me that my computer have a disc drive, and this was the cheapest unit available that supported all the major formats. Like most of the parts in my computer, it functions reliably as advertised without significant issue and I don't have much to say on the matter. This thing isn't just for the Aesthetic™ — I have a decently large collection of CDs that I've ripped using my computer.</p> + <p>I used to have a WH<em>14</em>NS40, which is basically the same save for slightly worse performance in certain specific contexts and a weird firmware issue to do with ripping 4K blu-rays. I had no problems with it, but I had to cannibalize it from my main rig for a different build and ended up replacing it with this, the closest thing available to the exact same unit.</p> + </section> + + <section> + <h4>Case Fans — Arctic P12 (x3) + Noctua NF-A9 (x2)</h4> + <p>All perfectly fine fans. The 120mm Arctic P12s are good value at a good noise level, but in my experience the same cannot be said for their smaller fans, hence the premium Noctuas for the 92mm fan mounts.</p> + <p>I've also got random generic dust filters on all the intakes in a desperate attempt to sort of control the dust buildup inside my machine. It kind of works.</p> + </section> + + <section> + <h4>GPU — AMD Radeon RX 6800 XT</h4> + <p>Fine, enough edging. Here's the part you're probably actually interested in, you filthy gamer.</p> + <p>I got this card used in late 2024 for circa half of its launch MSRP — I would not have been able to justify something this high-end brand new, especially at scalper prices when I was initially building this machine. I used to run an RX 6600 XT, but I had a project going which urgently required a quality video card and I'd been looking for an excuse to upgrade the one in my machine for a while, so out it came and a-scouring the eBay listings I went.</p> + <p>Gaming wise, the 6600 XT was about all I really needed. Frankly, I could probably get by on the integrated graphics in my CPU, but I quite like having two display outputs to complement my second monitor. This new GPU is ludicrous overkill for me in this department; it's marketed towards playing the latest triple-A titles at maxed-out settings in 4K, which means it completely pulverizes every PSX-graphics indie title I can throw at it with the overwhelming force and ruthless efficiency of the Chicxulub impactor.</p> + <p>The real reason I wanted this orbital nuke of a graphics processor was for Blender. If Blender Open Data is to be believed, this thing represents a more than doubling of the performance available to me in the Cycles rendering engine, which translates to a substantial improvement in render times. Of course, a mid-range Nvidia product would be better here than anything AMD is capable of, but as a known Linux user that was a no-go for me; I've heard nothing but horror stories about Nvidia GPUs and desktop Linux, and my personal experience frankly corroborates them. The venerable Mr. Torvalds said it best: <a href="https://youtu.be/iYWzMvlj2RQ">fuck 'em</a>.</p> + <p>There were a handful of GPUs in this performance class and approximate price bracket that I was considering — in fact, my original upgrade plan was a 7700 XT. I went with the 6800 XT because I deduced through the awesome power of spreadsheets that, with the current state of the used market, it had all the others beat in price-to-performance ratio, and it wasn't even close. I specifically went for the AMD reference model, since it was the only version with a short enough heatsink that I was confident it would fit in my case without any modifications.</p> + <p>I want it on record here that if I ever drop north of a grand on a 4090 or whatever the biggest baddest new this-or-a-used-car AAA-cruncher is and I haven't won the lottery, I am to be taken out back and shot like a lame horse. Frankly, I probably need some sense beaten into me if I'm buying lottery tickets to begin with.</p> + </section> + </section> + + <section> + <h3>Peripherals</h3> + + <section> + <h4>Mouse — Logitech MX Vertical</h4> + <p>In a previous revision of this page I said my old G602 was my "forever mouse", but I also said I'd be willing to replace it for the sake of better ergonomics, which is what this new one is for: pre-empting carpal tunnel syndrome. Besides, that mouse is in declining condition anyway, and you can only get in there with a soldering iron so many times before it becomes more trouble (and money for replacement parts) than it's worth.</p> + <p>This new mouse shape was a bit of an adjustment at first, but after a month or so of daily or so use I find it significantly more comfortable than standard mice with no major downsides as far as usability is concerned. That said, although popular consensus is that this model is on the larger side, it's still a touch small for my hands. I'm currently working on getting on estrogen to maybe solve this issue.</p> + <p>This particular mouse is kind of a straight downgrade from its Gaming™ predecessor in a couple ways: no reassignable macro keys, and a slower sensor. In my case, I honestly wasn't using all those extra buttons anyway since the software to assign them isn't on Linux, and as for the sensor, I'm not a skilled enough gamer nor do I play the right types of games for the difference between "about as fast as my monitors" and whatever four or five digit number the esports mouse gold standard is this year to realistically be a bottleneck. Besides, if I fancied myself a Pro Gamer, a premium office mouse like this wouldn't have even been on my radar.</p> + </section> + + <section> + <h4>Keyboard — Keychron V6 Max</h4> + <p>The original plan was to just quietly update this part and purge all mention of my previous keyboard(s) because I was embarrassed that I bought this to replace an extremely similar keyboard (which I have since sold, I'm not completely stupid), but this new one is actually different enough that I want to talk about it.</p> + <p>See, I used to have the tenkeyless Keychron V3 paired with a Q0 numpad to make up for the V3's lack of one, a combination that I settled on as a workaround for the 100% V6 that I wanted only being available in Keychron's stupid bluish-grey colourway. I had no problems with those keyboards, but I still bought this because I wanted to consolidate them into the same USB connection to free up a port on the 4-port USB switch I use to share these peripherals with my school laptop.</p> + <p>This new keyboard is nicer to an extent I wasn't expecting. I was <em>expecting</em> something totally identical to my old V3 but for the extra keys off to the right, but Keychron seems to have upped their build quality over the past two and half years, because this one both feels and sounds markedly... nicer. Thockier? Is that the word keyboard people use? At any rate, it feels more premium and I like it. It does flex a lot more if you push down on it hard, but that doesn't really affect normal use.</p> + <p>I like Keychrons, especially the V-series, for their hot-swappable switches, highly configurable open-source firmware, and the inclusion of spare keycaps for use with MacOS, which is great because it lets me replace the Windows key with Command or Option or some shit and get that idiotic branding off of my generic USB peripheral in use with exclusively non-Windows machines. It also helps that you can actually buy this, and for somewhat reasonable prices to boot, neither of which are givens in the world of enthusiast keyboards.</p> + <p>Admittedly, I also got this specific model for the USB dongle-based wireless connectivity. I've gone on record as saying that wireless keyboards as part of a desktop setup are the stupidest thing ever, but I think my principles can survive this one mostly intact because it's at least not fucking <em>bluetooth</em> — it's still a plug-and-play USB peripheral — and it can act as a wired keyboard if I decide the wireless sucks. I just wanted one less wire to deal with on my desk because, as of writing, I've had to tear down and move this setup like twice in the past three months.</p> + <p>I got this with the Gateron Jupiter Brown switches because, of the Cherry Reds, Keychron K Pro Browns, and Gateron G Pro Blues I've tried on previous mechanical keyboards, I liked the Keychron Browns the best, and these are pretty similar. They seem to take more force than the Keychron Browns, which I'm not sure if I like, but maybe that'll change as these get broken in. Luckily, they're hot-swappable, so if I hate them I can easily change them out! I also got some <em>sick</em> aftermarket keycaps for this one.</p> + <figure class="media"> + <picture> + <source srcset="images/keeb.jxl" type="image/jxl"> + <img src="images/keeb.jpg" alt="A Keychron V6 Max, a 100% mechanical keyboard with three extra macro keys and a knob. The keycaps are a combination of, from the center out, yellow-on-black, yellow-on-gray, and black-on-white, with a couple black-on-yellow accent keys. The macro keys have novelty automotive-themed designs instead of normal legends. The keyboard has yellow backlighting."> + </picture> + </figure> + <p>Word of warning to potential Keychron customers: If you buy from their site using a VPN, they may well flag your order as "suspicious" and hold your shit hostage until you send them a photo of your ID to prove you're a real person, like they did to me the first time around. They did accept a photo where I'd censored all the information I hadn't already given them as part of checkout, so that was nice I guess. Just something to keep in mind.</p> + </section> + + <section> + <h4>Gamepad — Xbox One wireless controller</h4> + <p>I bought this several years ago when I was still running Windows because I wanted maximum compatibility for minimum effort. Now that I'm on Linux, I've been able to get it to work using <code>xpadneo</code>, but not consistently. I want to replace it with the new Steam controller when that drops.</p> + </section> + + <section> + <h4>Monitors — MSI MAG274QRFW 27" 1440p 180Hz (2x)</h4> + <p>Another "endgame" purchase. Very good monitors, if I replace them it'll be because they broke. (Speak of the devil, one of them has been replaced under warranty since I originally wrote this section.) I truly don't care for OLEDs — they get burn-in, for god's sake, I thought we moved on from that in the early 2000's when LCDs became commonplace. Plus, uh, they're still more expensive than a good LCD.</p> + <p>These are mounted on a pair of cheap Amazon special gas spring wall-mount VESA arms because I fucking hate monitor feet on my desk.</p> + </section> + + <section> + <h4>Headphones — Beyerdynamic DT 770 Pro (Modified)</h4> + <p>After a lifetime of losing headphones to frayed cables and the inevitable failure of poor quality materials, my top priority when getting my next nice pair of cans was durability, and Beyerdynamic's products fit the bill nicely. I've <em>sat on these</em> without damaging them, which for me is saying something. As a bonus, they also have excellent sound quality and are supremely comfortable.</p> + <p>The only issue with these headphones is the non-removable cable, which is an automatic deal-breaker for me. I purchased mine through a modding company that replaced that cable with a 4-pin mini XLR jack, which has proven to be a bit of a double-edged sword as finding sanely priced replacement cables for it with the right pinout is nigh impossible, forcing me to start making my own. I think the new models have removable cables, though, which is nice.</p> + <p>I'm also rocking aftermarket cat ears. I just don't trust the quality on the cheap novelty headphones that come with them built in.</p> + <figure class="media"> + <picture> + <source srcset="images/cans.jxl" type="image/jxl"> + <img src="images/cans.jpg" alt="A pair of Beyerdynamic DT 770 Pro headphones with a removable mini XLR cable plugged in, a custom green headband wire, and aftermarket cat ears."> + </picture> + </figure> + </section> + + <section> + <h4>Drawing Tablet — HUION Kamvas Pro 12</h4> + <p>Perfectly cromulent 12-inch display tablet. It doesn't completely work out of the box, but the proprietary driver program is at least available for Linux, or there's OpenTabletDriver, which in my experience seems more reliable but is missing <a href="https://opentabletdriver.net/Tablets">one feature</a> from this specific model. I like that the stylus is completely passive and doesn't need to be charged, which, having grown up using a Nintendo DS, feels like an absurd thing for a stylus to require.</p> + </section> + + <section> + <h4>Webcam — Logitech C925e</h4> + <p>It's a USB webcam. The picture is good enough — better than most laptops — but it does some annoying auto-adjustment stuff that makes chroma-key shenanigans difficult at times. Standout features are the privacy shutter, indicator light when the camera is in use, and screw mount. I'm sure the microphone is adequate in a pinch, but I have no reason to use it.</p> + </section> + + <section> + <h4>Microphone — Audio-Technica AT2020 XLR</h4> + <p>I'll be totally honest with you, I used to have the USB version of this exact microphone and replaced it with a used XLR variant to exchange an XLR input on my audio interface for a free USB port. Both versions are equally very good, probably as good as I'll ever need. The sound quality on this sucker is so good that my friends in voice chat complain whenever they hear me on anything else.</p> + <p>In what is becoming a running theme, it sits on a perhaps unbefitting $20 no-name mic arm from Amazon, with matching cheap shock mount and pop filter. They work, though. The springs on the arm are loud and, as my friends are keen to point out every time, quite audible through the mic.</p> + <p>Also, free bit of advice from me to you: for audio hardware, buy used professional or music gear, not gaming stuff. The sound quality and build quality is almost always way better.</p> + </section> + + <section> + <h4>Audio Interface — Arturia Minifuse 2</h4> + <p>The more I have to live with this thing the more I hate it. The MIDI ports don't work at all under Linux for some reason, and the headphone output has started making weird buzzing sounds. Luckily the inputs seem fine (for now), but replacing this thing is currently priority numero uno for setup upgrades.</p> + </section> + </section> + </section> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> </body> -</html> + +</html>
\ No newline at end of file diff --git a/uses/cumulonimbus/index.php b/uses/cumulonimbus/index.php index b0d8b5a..d56df36 100644 --- a/uses/cumulonimbus/index.php +++ b/uses/cumulonimbus/index.php @@ -3,50 +3,98 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>cumulonimbus</title> + <title>cumulonimbus | isopod.cool v4</title> <link href="/style.css" rel="stylesheet" type="text/css" media="all"> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(true); ?> - - <h1>cumulonimbus</h1> - <h2 id="caption">get it? 'cause it's in da cloud</h2> - <p><code>cumulonimbus</code> is an OVH KS-1 dedicated server and the larger, more intimidating successor to <code>cumulus</code>, the DigitalOcean VPS that I used to use. Its specs are as follows:</p> - <ul> - <li>CPU: 4c/8t Intel Xeon-D 1520</li> - <li>RAM: 32GB DDR4-2133 ECC</li> - <li>SSD: 480GB Mirrored RAID</li> - <li>OS: Ubuntu Server 24.04 LTS</li> - <li>Bandwidth: 300Mbps symmetrical</li> - </ul> - <p>As appears to be a pattern for me, it's massive overkill for what I need it for, but as I expand on <a href="/blog/posts/renting_an_unremarkable_server/">here</a>, it's actually close to half the price of the much wimpier old VPS. Pretty crazy.</p> - <h2>Software</h2> - <h3>OS - <a href="https://ubuntu.com/server">Ubuntu Server 24.04</a></h3> - <p>Canonical isn't my favourite company, but Ubuntu server is fine enough and it's what I'm used to for servers. I have never once had any major problems with this.</p> - <h3>Web Server/Reverse Proxy - <a href="https://caddyserver.com/">Caddy</a></h3> - <p>This is the software that makes all my websites (of which there are now several) and other services available to the internet. I used to use Nginx for this, and both programs do this job quite well, but I like Caddy because it's much simpler to configure and handles HTTPS automatically for you.</p> - <h3><a href="https://radicale.org/v3.html">Radicale</a></h3> - <p>A fairly basic and extremely reliable solution for hosting synced calendars and contacts lists. It even tolerates my abuse of symlinks to create a shared calendar for my family, a feature it does not support by default.</p> - <p>This isn't really a reflection on Radicale, but I really appreciate that somehow, Apple has decided to build CalDAV support directly into iOS. Even Android needs a third-party app for that.</p> - <h3><a href="https://activitypub.software/TransFem-org/Sharkey">Sharkey</a></h3> - <p>When it became clear that Firefish was a dead project, my choices for migrating my fedi instance were a burgeoning hate-fork of Firefish and a fork of upstream Misskey that required directly tinkering with the instance database in order to migrate. Apparently I preferred the latter.</p> - <p>It's a pretty damn good user experience by my estimation, and it has a lot of nice features I use and a hell of a lot of nice features that I don't. It's kind of a miracle it works as well as it does with all this stuff in it. The frontend is pretty heavy, but that's obviously not an issue for me.</p> - <p>If you're going to install any Misskey derivative, I'd strongly recommend just using the Docker image. Installing it natively requires you to essentially download the source code and compile it yourself, and if you're not used to the Node.js ecosystem it's really more trouble than it's worth.</p> - <h3><a href="https://forgejo.org/">Forgejo</a></h3> - <p>My needs aren't really comprehensive enough to speak on the quality of Forgejo as a git forge beyond that it seems pretty good and does everything I need. I do like how easy it is to update.</p> - <h3><a href="https://freshrss.org/">FreshRSS</a></h3> - <p>I ended up with this because I elected to ditch Nextcloud in the process of migrating hosting providers, and this was the first RSS reader that I managed to get working on the new server. I swear, it's like the RSS 2.0 spec states that your self-hosted RSS reader has to have installation instructions that don't work.</p> - <p>I've yet to find an RSS reader with a user experience I like, but this one is tolerable enough that I don't think "I should really find a replacement for this" every time I use it like I did when I was using Whatever Nextcloud Has™, plus it supports a couple common APIs so I can replace the frontend if I decide I hate it.</p> - <p>Speaking of which, I'm currently using a mobile app called Capy Reader to access this on my phone since the mobile web UI kind of sucks.</p> - <h3><a href="https://github.com/RSS-Bridge/rss-bridge">rss-bridge</a></h3> - <p>Extracts RSS feeds from a genuinely kind of shocking number of websites that don't otherwise have them. I make generous use of this. Feel free to use <a href="https://rss-bridge.bathynomus.xyz/">my instance</a> if you want.</p> - <h3><a href="https://docs.searxng.org/">SearXNG</a></h3> - <p>Aggregates search results from various other search engines. Does that job well and has like, a lot of options to customize where it pulls results from. I wish it had more powerful image result filtering tools, though.</p> - <h3><a href="https://github.com/dani-garcia/vaultwarden">VaultWarden</a></h3> - <p>My password manager. Before this I used KeepassXC in conjunction with Syncthing to get it onto my phone, which was a pretty good solution, with the one downside that I could only add passwords from my PC because I didn't completely trust Syncthing not to disappear one of my passwords in a syncing conflict. My primary motivation for switching to this was that it eliminates that concern. It's also just good in general.</p> - <p>This makes two services I'm self-hosting even though my paid Protonmail account also has them.</p> - <h3><a href="https://zadzmo.org/code/nepenthes/">Nepenthes</a></h3> - <p>A tarpit for AI scrapers. Self-explanatory at this point.</p> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + <main> + <section> + <h2>cumulonimbus</h2> + <p class="h2caption">get it? 'cause it's in da cloud</p> + <p class="backlink"><a href="../"><< uses</a></p> + <p><code>cumulonimbus</code> is an OVH KS-1 dedicated server and the larger, more intimidating successor to <code>cumulus</code>, the DigitalOcean VPS that I used to use. Its specs are as follows:</p> + <dl style="--ratio: .2;"> + <dt>CPU</dt> + <dd>4c/8t Intel Xeon-D 1520</dd> + <dt>RAM</dt> + <dd>32GB DDR4-2133 ECC</dd> + <dt>SSD</dt> + <dd>480GB Mirrored RAID</dd> + <dt>OS</dt> + <dd>Ubuntu Server 24.04 LTS</dd> + <dt>Bandwidth</dt> + <dd>300Mbps symmetrical</dd> + </dl> + <p>As appears to be a pattern for me, it's massive overkill for what I need it for, but as I expand on <a href="/blog/posts/renting_an_unremarkable_server/">here</a>, it's actually close to half the price of the much wimpier old VPS. Pretty crazy.</p> + + <section> + <h3>Software</h3> + + <section> + <h4>OS - <a href="https://ubuntu.com/server">Ubuntu Server 24.04</a></h4> + <p>Canonical isn't my favourite company, but Ubuntu server is fine enough and it's what I'm used to for servers. I have never once had any major problems with this.</p> + </section> + + <section> + <h4>Web Server/Reverse Proxy - <a href="https://caddyserver.com/">Caddy</a></h4> + <p>This is the software that makes all my websites (of which there are now several) and other services available to the internet. I used to use Nginx for this, and both programs do this job quite well, but I like Caddy because it's much simpler to configure and handles HTTPS automatically for you.</p> + </section> + + <section> + <h4><a href="https://radicale.org/v3.html">Radicale</a></h4> + <p>A fairly basic and extremely reliable solution for hosting synced calendars and contacts lists. It even tolerates my abuse of symlinks to create a shared calendar for my family, a feature it does not support by default.</p> + <p>This isn't really a reflection on Radicale, but I really appreciate that somehow, Apple has decided to build CalDAV support directly into iOS. Even Android needs a third-party app for that.</p> + </section> + + <section> + <h4><a href="https://activitypub.software/TransFem-org/Sharkey">Sharkey</a></h4> + <p>When it became clear that Firefish was a dead project, my choices for migrating my fedi instance were a burgeoning hate-fork of Firefish and a fork of upstream Misskey that required directly tinkering with the instance database in order to migrate. Apparently I preferred the latter.</p> + <p>It's a pretty damn good user experience by my estimation, and it has a lot of nice features I use and a hell of a lot of nice features that I don't. It's kind of a miracle it works as well as it does with all this stuff in it. The frontend is pretty heavy, but that's obviously not an issue for me.</p> + <p>If you're going to install any Misskey derivative, I'd strongly recommend just using the Docker image. Installing it natively requires you to essentially download the source code and compile it yourself, and if you're not used to the Node.js ecosystem it's really more trouble than it's worth.</p> + </section> + + <section> + <h4><a href="https://forgejo.org/">Forgejo</a></h4> + <p>My needs aren't really comprehensive enough to speak on the quality of Forgejo as a git forge beyond that it seems pretty good and does everything I need. I do like how easy it is to update.</p> + </section> + + <section> + <h4><a href="https://freshrss.org/">FreshRSS</a></h4> + <p>I ended up with this because I elected to ditch Nextcloud in the process of migrating hosting providers, and this was the first RSS reader that I managed to get working on the new server. I swear, it's like the RSS 2.0 spec states that your self-hosted RSS reader has to have installation instructions that don't work.</p> + <p>I've yet to find an RSS reader with a user experience I like, but this one is tolerable enough that I don't think "I should really find a replacement for this" every time I use it like I did when I was using Whatever Nextcloud Has™, plus it supports a couple common APIs so I can replace the frontend if I decide I hate it.</p> + <p>Speaking of which, I'm currently using a mobile app called Capy Reader to access this on my phone since the mobile web UI kind of sucks.</p> + </section> + + <section> + <h4><a href="https://github.com/RSS-Bridge/rss-bridge">rss-bridge</a></h4> + <p>Extracts RSS feeds from a genuinely kind of shocking number of websites that don't otherwise have them. I make generous use of this. Feel free to use <a href="https://rss-bridge.bathynomus.xyz/">my instance</a> if you want.</p> + </section> + + <section> + <h4><a href="https://docs.searxng.org/">SearXNG</a></h4> + <p>Aggregates search results from various other search engines. Does that job well and has like, a lot of options to customize where it pulls results from. I wish it had more powerful image result filtering tools, though.</p> + </section> + + <section> + <h4><a href="https://github.com/dani-garcia/vaultwarden">VaultWarden</a></h4> + <p>My password manager. Before this I used KeepassXC in conjunction with Syncthing to get it onto my phone, which was a pretty good solution, with the one downside that I could only add passwords from my PC because I didn't completely trust Syncthing not to disappear one of my passwords in a syncing conflict. My primary motivation for switching to this was that it eliminates that concern. It's also just good in general.</p> + <p>This makes two services I'm self-hosting even though my paid Protonmail account also has them.</p> + </section> + + <section> + <h4><a href="https://pocket-id.org/">Pocket ID</a></h4> + <p>This is here because Tailscale only lets you sign in with an SSO provider, and rolling my own was more palatable than relying on Google or Microsoft for that.</p> + </section> + + <section> + <h4><a href="https://zadzmo.org/code/nepenthes/">Nepenthes</a></h4> + <p>A tarpit for AI scrapers. Self-explanatory at this point.</p> + </section> + </section> + </section> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> </body> -</html> + +</html>
\ No newline at end of file diff --git a/uses/index.php b/uses/index.php index 7bda492..d379676 100644 --- a/uses/index.php +++ b/uses/index.php @@ -1,131 +1,213 @@ <!DOCTYPE html> <html lang="en"> + <head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <title>uses | isopod.cool v4</title> + <link href="/style.css" rel="stylesheet" type="text/css" media="all"> + </head> + <body> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + <main> + <section> + <h2>My setup</h2> + <p class="h2caption">if yours is different you're objectively stupid</p> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>My setup</title> - <link href="/style.css" rel="stylesheet" type="text/css" media="all"> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> -</head> - -<body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(); ?> - <h1>my setup</h1> - <h2 id="caption">If yours is different you're objectively stupid</h2> - <h2>Computers</h2> - <a href="compier/" id="compier">comp<em title="Is that a Homestar Runner reference?">ier</em></a> - <p>My main PC, a mid-tower desktop "designed" and built by me, boasting a Ryzen 5700G, 32 gigs of DDR4, something like 6 terabytes of storage, a comically overbuilt PSU, and a graphics card. It runs <a href="#eos">arch, btw</a>.</p> - <h3>LappÊ (M1 Pro Macbook Pro 16")</h3> - <p>Everyone in my family reacted with shock when they learned I was getting a Macbook, and to be fair, I am a card-carrying Apple hater. I got this because I needed a beefy new laptop that could run Adobe products for college, and the only worse fate than having to daily a Mac in my mind was having to use Windows in its current state, especially if I was gonna do any kind of development work (it's a web design course, so I am).</p> - <details> - <summary>More info</summary> - <p>Regardless, the fact of the matter is that Apple's ARM-based M-series chips allow the Macbook Pro to be the only good high-power laptop on the market right now — the only one without chronic overheating and battery issues, as well as the only ARM (or RISC in general, really) laptop with software that isn't hot garbage. If you want a beefy laptop for school, it's this or suffer.</p> - <p>My experience with MacOS so far has been pretty okay for the most part. I daily drive GNOME on my personal machine, so I already feel pretty at home with the layout. There's a roughly equal smattering of features that seem so obviously good that I'm mad we don't have them on Linux, like the Finder column view, and bizarre UX friction that seems to only exist to make you want to use iCloud. It's an interesting strategy compared to Microsoft's approach of forcing their cloud shit on you as aggressively as possible and making it impossible to permanently turn off, and then having the OS suck shit just because their designers are incompetent and have the collective attention span of a goldfish with ADHD and dementia who's currently having a seizure.</p> - <p>The hardware is interesting. The choice to go all USB-C is a bold one, and I respect it, but time has scarcely reduced the need for dongles, of which I had a couple on order before this machine even arrived. People also rave about the trackpad on these things, and there is rather quite a lot of it, but I just find it inconsistent and annoying to do anything on. Then again, I am very out of practice with trackpads in general, so it could be me. The keyboard sucks. Magsafe is awesome. Repairability is a fucking joke, which is why I hate this company.</p> - <p>This one is the 2021 16" M1 Pro Macbook Pro (truly inspired naming convention, guys), bought refurbished, with 32GB of RAM and 1TB of storage. I chose these specs because it seemed like a good amount of leeway over my course's listed minimum of half as much RAM and storage and the base M1 chip, and it was a pretty good deal. Apple will send hired goons after me for saying this, but it seems to have held up really well and still works great 4 years on. cpubenchmark.net claims it still gets better performance than the base M4. It has some cool stickers on it:</p> - <figure class="media"> - <div> - <div class="gallery"> - <img src="images/macback.webp" alt='Lid of a 2021 16" MacBook Pro covered in many fun stickers, such as "ThonkPad", "V1 Plushie", "BlÃĨhaj with Booze", and several isopods'> - <img src="images/macfront.webp" alt='Next to the trackpad of my new-to-me macbook I have placed a "Queer Inside" sticker, new old stock Pentium D and Designed For Windows XP/2000 badges, and a tiny isopod sticker'> - </div> - <figcaption style="margin-top: 0;">I don't know how these survived the refurbishing process. They're not mine. I really like 'em, though. </joke></figcaption> - </div> - </figure> - <p>I've got this plumbed into my desk setup with a thunderbolt dock and a switchable USB hub, both from Ugreen. Both work fine, except that the dock won't output two different pictures from its two HDMI ports, which Ugreen is adamant is a limitation of the Mac. Luckily I can get a second display out from the built-in HDMI. Also, the USB hub takes male-to-male type A cables. Blasphemous.</p> - </details> - <a href="servy586/" id="servy586">Servy 586</a> - <p>A home-built TrueNAS box assembled from used gaming parts that could pass for a high-end, if a little dated, gaming rig if not for the preponderance of hard drives I put in it in place of a competent GPU. Much more stable than the <a href="/blog/posts/building_a_normal_server/">old one</a>.</p> - <p>Read about its conception and construction <a href="/blog/posts/building_a_sensible_server">here</a>.</p> - <h3>Libre Computing Le Potato</h3> - <p>A Raspberry Pi clone that I use to run Pi-hole, and that's it. I wanted a machine that was isolated from my incessant tinkering with the big boy server.</p> - <a href="cumulonimbus" id="cumulonimbus">cumulonimbus</a> - <p>The cloud server that runs this website and almost everything else I self-host that's accessible from the public internet, because paying two <span title="An Imperial Netflix Subscription, sometimes abbreviated to INS, is an approximate unit of cashflow based on the price of a Standard tier Netflix subscription in the mid-2010s. It generally refers to a window of anywhere from $10 to $14 per month depending on context. One Metric Netflix Subscriptionne, or MNS, is equal to exactly âŦ10 per month.">Imperial Netflix Subscriptions</span> is better than dealing with the endless maze of headaches that is pointing your DNS records to a machine on a residential connection at a shared dwelling.</p> - <p><a href="/blog/posts/renting_an_unremarkable_server">I wrote a blog post about it!</a></p> - <h3 id="phone">Google Pixel 8a</h3> - <p>This counts as a personal computer.</p> - <p>Chosen solely because it was the most recent Pixel at a sane price, I was pushed to upgrade to this from my old 4a by the impending end of software support for 5th generation and older Pixels. Turns out, buying a used Android is a good way to not get security updates for most of the device's useful life, and if I'm gonna bother with <a href="#graphene">GrapheneOS</a> it would behoove me to make sure I'm up to date on those.</p> - <details> - <summary>More info</summary> - <p>Seeing for myself the difference that four years of iteration has made to the a-series Pixels has only solidified my perception that smartphones are as good as they'll ever need to be and have been for quite some time. The faster processor, nicer screen, and better camera in this year's model don't make a difference for the things I do with my phone, and the lack of a headphone jack has already proven inconvenient.</p> - <p>That said, the loss of the headphone jack did not come without its benefits in exchange. The 8a is broadly a nicer and more premium-feeling device than the 4a, and I specifically appreciate the wireless charging and faster cellular data connection more than I was expecting to. Bizarrely, even my 4G LTE speeds in areas without 5G service seem to be drastically improved.</p> - <p>I also like some of the new features in newer versions of Android that never released for the 4a, chief among them the "Charging Optimization" switch that limits the battery to 80% charge to preserve its health long-term, which I'll be needing since I plan to keep this sucker for the entire <em>seven years</em> that it's slated to keep getting security updates. Extraordinarily rare Google W.</p> - </details> - <h2>Consoles</h2> - <h3>New 2DS XL (Hacked)</h3> - <p>Did you know it's surprisingly easy to hack your 3DS? <a href="https://3ds.hacks.guide/">Do it now!</a></p> - <p>I also used to have a Switch, but I've sold it on account of I never really use the thing anyway. I still wanna show off the dope clear shell mod I did to it though, so here's that:</p> - <details> - <summary>dope awesome nintendo pictures</summary> - <img src="images/switchfront.jpg" alt="Front view of a Nintendo Switch with clear plastic shells on the joycons" /> - <img src="images/switchback.jpg" alt="Back view of a Nintendo Switch with clear plastic shells on the joycons and console" /> - </details> - <h2>Other Hardware</h2> - <h3>Prusa MINI+</h3> - <p>I bought a Prusa because their printers have a reputation for quality, which this unit has certainly lived up to. It's been quite reliable, and when it fails, it's usually my fault in a really obvious way. It automates a lot of features that I suspect would have been pain points on a cheaper printer, up to and including uploading gcode to it directly over the network. This thing's easier to use than a regular 2D printer!</p> - <details> - <summary>More info</summary> - <p>My one major issue is that the cantilevered gantry results in a slight inaccuracy in the Z axis, meaning the first layer is too high on one side of the bed and too low on the other. I suspect that this is why they didn't make it bigger, although it could also just be my fault for going and ordering the un-assembled kit version to save money on assembly.</p> - <p>I run mine with Prusa's satin textured bed plate for easier removal of PETG parts (I managed to damage the included smooth plate printing big stuff in PETG) and a 0.6mm Diamondback nozzle for printing with filaments with abrasive additives. It's expensive for a nozzle, but I think for the last nozzle I'll ever need to buy on an already 700 Canadian Victory Point printer it makes sense. I used to run an E3D Nozzle X, but I think I wrecked the coating trying to clean it with a brass wire brush.</p> - </details> - <h3>CyberPower CP1500PFCLCD</h3> - <p>A UPS that powers my computer, server, and related paraphernalia. I got it for all the normal reasons you get a UPS (power outage protection and such-like) and it has thus far performed as advertised. I wouldn't try to game off of the thing, but it's proven more than sufficient to keep my machines on long enough for a graceful shutdown in the event of a power outage. Highly recommend getting one.</p> - <h3>Netgear GS308</h3> - <p>It's a gigabit network switch. It has 8 ports. It performs as advertised. What else is there to say?</p> - <h3>CMF Watch Pro 2</h3> - <p>I used to be the kind of unconditional tech enthusiast who thought smartwatches as a premise were really cool, but that was when I was like 13, and the novelty of my Moto 360 and its adorable little WearOS videogames honestly wore off pretty quick. I'm not so Tiktok-brained that grabbing my phone out of my pocket to check the time or my notifications or whatever registers as an inconvenience, let alone to the extent that I would want to buy a smartwatch about it.</p> - <details> - <summary>More info</summary> - <p>So why'd I buy this then? For me, it's about the biometric sensors. Primarily I just wanted some hard data to assuage some anxiety I was having about the state of my heart, and a device that costs as much as a dedicated heart monitor while doing all the other smartwatch stuff <em>and</em> not making me feel like a paranoid weirdo for owning it seemed like a pretty damn good deal to me.</p> - <p>The smartwatch itself is fine. The custom OS it runs is a little more basic than even circa-2016 WearOS in terms of software features, but I honestly don't care about any of that stuff anyway, and it's actually really nice for the hundred Canadian Zero-Calorie Sugar-Free Diet Dollars and free shipping that they're charging, although I wish the app reported more detailed biometric data, said the undisputed queen of run-on sentences.</p> - <p>The one problem I'm having so far is that after like a month the included pleather wristband is starting to discolor and flake off and generally do Pleather Things™, but frankly this is a very cheap smartwatch and I'd rather them cut costs on the one part I can easily replace than on, like, the battery or the CPU or some shit. Hopefully this isn't indicative of the long-term endurance of the actual device.</p> - </details> - <h2>Software</h2> - <h3 id="eos"><a href="compier">Desktop</a> Operating System - <a href="https://endeavouros.com/" target="_blank">EndeavourOS</a> (Linux)</h3> - <p>My <a href="#compier">main computer</a> runs EndeavourOS with the GNOME desktop environment. I chose it mostly to get the AUR, which has occasionally proved useful, but at this point I'm kind of stuck here because all the config files for my programs are in standard locations, god forbid, and everyone else is on flatpaks now, which fuck that all up for no good reason. I once <a href="https://isopod.cool/blog/posts/my_terrible_distro_hop/">failed to switch to Fedora</a> because of this.</p> - <details> - <summary>More info</summary> - <p>I have a long history with Linux, dating back to 2015 with the first computer I ever owned: a <a href="../blog/posts/toshiba_chromebook/">Chromebook</a> that I put Linux on to play Minecraft, which ChromeOS couldn't do in any meaningful capacity at the time. It took me all of nine months to blow it up doing that because it was passively cooled with a plastic shell and not designed to ever go above ~30% usage on the dinky little Celeron that was its excuse for a CPU. After that I got a real PC running Windows, which solved the Minecraft problem so I mostly stuck to that for the next six years, although I did make intermittent attempts to switch to Linux again.</p> - <p>I pulled it off for real in 2021, when I took a combination of upsetting news about the upcoming Windows 11 and an SSD upgrade to my laptop as an opportunity to swap out my operating system as well. It went pretty well, all told; I wasn't using much Windows-exclusive software other than Paint.NET and some games, the latter of which now run great on Linux anyway thanks to Valve's efforts with Proton. Shame I can't play all my Epic Games Store freebies anymore, though.</p> - <p>My current desktop environment of choice, as previously mentioned, is GNOME. I used to run XFCE, and KDE before that, but I got sick of all my stuff occasionally breaking on me and wanted to see if GNOME would be sufficiently UX-designed that it would Just Work™ and Not Get In My Way™ and all that. So far so mostly good. I was worried about how well Wayland would work, but it's basically fine, with the exception of Discord not playing nice with regards to screensharing.</p> - </details> - <h3 id="graphene">Mobile Operating System - <a href="https://grapheneos.org/">Graphene OS</a> (Android)</h3> - <p>On top of the bordering on iPhone-grade support lifetime, this here is the other reason I'm so brand-loyal to Google's first-party <a href="#phone">hardware</a>.</p> - <details> - <summary>More info</summary> - <p>GrapheneOS is a fork of Android that's been security-hardened and de-googled, two of my favourite things for an operating system to be. It's dedicated to privacy and security above all else, almost to a fault. I'm told it's only available on the Pixel line because those phones have security hardware in them no other OEM on the planet can be bothered with.</p> - <p>GrapheneOS provides a few user-facing privacy features that I quite like, such as the ability to deny network and sensor access to apps in the permission settings, and a bunch of under-the-hood security improvements I'm woefully underqualified to explain short of just pasting stuff wholesale from their website.</p> - <p>Do I need this level of security? Probably not. Would I enjoy some of the features GrapheneOS strips out in the name of security? Possibly. But I like the peace of mind knowing that if cops ever get a hold of my phone they'll at least be kind of frustrated trying to access it.</p> - </details> - <h3>Web Browser - <a href="https://www.mozilla.org/en-US/firefox/new/" target="_blank">Firefox</a></h3> - <p>I quite like Firefox. It's extremely customizable (especially if you know where to look), the devtools are better, and there's a wealth of privacy tools available that just kind of don't exist in Chrome (including <a href="https://arstechnica.com/gadgets/2024/05/google-starts-deprecating-older-more-capable-chrome-extensions-next-week/">adblockers</a> as of late). It can also edit PDFs now!</p> - <details> - <summary>More info</summary> - <p>On top of being generally superior, I also use Firefox on principle. It's currently the only major browser outside of the Apple-exclusive Safari that isn't built atop Google's <a href="https://chrome.bathynomus.xyz">Chromium</a>, and I don't like the idea of Google having total monopolistic control over all web browsers.</p> - <p>Firefox is one of the only pieces of software I'll actively advocate switching to, so go do it. Do it now. It, like essentially all other browsers, can <a href="https://support.mozilla.org/en-US/kb/import-bookmarks-google-chrome">import your data</a> from its competition, and I'd also recommend using this <a href="https://ffprofile.com/">profile generator</a> to fortify it for maximum privacy while you're at it.</p> - <p>All that said, Mozilla is under questionable management at the moment and kind of in Google's pocket anyway, so maybe we shouldn't be relying completely on them to champion the free web. Maybe throw some money in the general direction of the <a href="https://servo.org/">Servo</a> project.</p> - <p>I use the <a href="https://f-droid.org/packages/org.mozilla.fennec_fdroid/">Fennec</a> fork of Firefox on mobile, and <a href="https://github.com/ungoogled-software/ungoogled-chromium">Ungoogled Chromium</a> for the occasional poorly-built website (usually streaming services, work stuff, or banks) that doesn't want to run in my weird paranoid Firefox config.</p> - </details> - <h3>IDE - <a href="https://vscodium.com/">VSCodium</a></h3> - <p>Microsoft's Visual Studio Code is, loathe though I may be to admit it, my favourite IDE I've ever used, which is why I use VSCodium, an open-source build of VSCode with all the telemetry and shit stripped out.</p> - <h3>3D Graphics - <a href="https://www.blender.org/">Blender</a></h3> - <p>Lucky that the only 3D graphics program available on Linux just so happens to also be the best one available anywhere. I use this sucker for just about everything it can theoretically do, from CAD to video editing, and even some things that it's actually good at!</p> - <h3>Photo Editor - <a href="https://www.gimp.org/">GIMP</a></h3> - <p>Honestly, what were you expecting? If you want to edit raster graphics on Linux, GIMP is more or less the be-all-end-all, unless you want to do everything in the terminal with ImageMagick. I'd prefer to use Paint.NET or even my Legally Obtained DRM-free copy of Photoshop CS6, but somehow photo editors are one of the only things that are consistently incompatible with WINE. I've been meaning to give <a href="https://www.photopea.com/">Photopea</a> a shot.</p> - <h3>DAW - <a href="https://www.reaper.fm/">REAPER</a></h3> - <p>My primary motivation for choosing REAPER is that it's available for Linux. My secondary motivation is that it has a lot less of the bizarre idiosyncracies and feature omissions that I found limiting when I was using LMMS. It's also cheaper for a perpetual license than even the shittiest most artificially-limited versions of most of the other major DAWs, although it's not like I can run any of them anyway.</p> - <h3>Media Players - <a href="https://wiki.gnome.org/Apps/Rhythmbox">Rhythmbox</a>, <a href="https://mpv.io/">MPV</a>, <a href="https://www.videolan.org/vlc/">VLC</a></h3> - <p>I use Rhythmbox for music, MPV for video, and VLC for anything that doesn't open one of the other two when I click on it. All three are very boringly good at what they do, and all three are varying levels of fugly.</p> - <h3>Torrent Client - <a href="https://www.qbittorrent.org/">qBittorrent</a></h3> - <p>This is the program I use to download my, uh, Linux ISOs. And local copies of Wikipedia. At least one of those is actually true. I've got it configured to only work through my VPN. I don't know if my ISP would actually get on my case if I torrented anything... unscrupulous without it, but I'd rather not risk it.</p> - <h3><a href="https://syncthing.net/">Syncthing</a></h3> - <p>Syncthing is a peer-to-peer automatic file syncing program that I use to automatically sync files between my various devices, peer-to-peer style. It works really well and I really like it. Among other things, I use it to get photos from my phone onto my PC, my music library from my PC onto my phone, and for automatic backups of both to my server.</p> - <h3>Notes - <a href="https://obsidian.md/">Obsidian</a></h3> - <p>The best user experience I've seen in a notes program since the Notes app on my iPhone 4S. The thing that sold me on it is that it saves your notes as markdown files in a user-defined folder, so I can point Syncthing to it. This beats out my previous solution of Whatever Nextcloud Has™ by a country mile. Let me know if you know of an RSS reader that works like this.</p> - <h3>Shell - <a href="https://www.zsh.org/">zsh</a></h3> - <p>I switched to zsh largely due to ambient peer pressure from the wider Linux community, and I doubt I'm taking full advantage of its many advanced features, whatever those are, but I do quite like how conducive it is to customization with such programs as <a href="https://ohmyz.sh/">Oh My Zsh</a> and <a href="https://github.com/romkatv/powerlevel10k">Powerlevel10k</a>, and I miss its improved tab completion and command history functionality whenever I'm ssh'd into one of my servers.</p> - -</body> + <section> + <h3>Computers</h3> + + <section> + <h4><a href="compier/" id="compier">comp<em title="Is that a Homestar Runner reference?">ier</em></a></h4> + <p>My main PC, a mid-tower desktop "designed" and built by me, boasting a Ryzen 5700G, 32 gigs of DDR4, something like 6 terabytes of storage, a comically overbuilt PSU, and a graphics card. It runs <a href="#eos">arch, btw</a>.</p> + </section> + + <section> + <h4>LappÊ (M1 Pro Macbook Pro 16")</h4> + <p>Everyone in my family reacted with shock when they learned I was getting a Macbook, and to be fair, I am a card-carrying Apple hater. I got this because I needed a beefy new laptop that could run Adobe products for college, and the only worse fate than having to daily a Mac in my mind was having to use Windows in its current state, especially if I was gonna do any kind of development work (it's a web design course, so I am).</p> + <details> + <summary>More info</summary> + <p>Regardless, the fact of the matter is that Apple's ARM-based M-series chips allow the Macbook Pro to be the only good high-power laptop on the market right now — the only one without chronic overheating and battery issues, as well as the only ARM (or RISC in general, really) laptop with software that isn't hot garbage. If you want a beefy laptop for school, it's this or suffer.</p> + <p>My experience with MacOS so far has been pretty okay for the most part. I daily drive GNOME on my personal machine, so I already feel pretty at home with the layout. There's a roughly equal smattering of features that seem so obviously good that I'm mad we don't have them on Linux, like the Finder column view, and bizarre UX friction that seems to only exist to make you want to use iCloud. It's an interesting strategy compared to Microsoft's approach of forcing their cloud shit on you as aggressively as possible and making it impossible to permanently turn off, and then having the OS suck shit just because their designers are incompetent and have the collective attention span of a goldfish with ADHD and dementia who's currently having a seizure.</p> + <p>The hardware is interesting. The choice to go all USB-C is a bold one, and I respect it, but time has scarcely reduced the need for dongles, of which I had a couple on order before this machine even arrived. People also rave about the trackpad on these things, and there is rather quite a lot of it, but I just find it inconsistent and annoying to do anything on. Then again, I am very out of practice with trackpads in general, so it could be me. The keyboard sucks. Magsafe is awesome. Repairability is a fucking joke, which is why I hate this company.</p> + <p>This one is the 2021 16" M1 Pro Macbook Pro (truly inspired naming convention, guys), bought refurbished, with 32GB of RAM and 1TB of storage. I chose these specs because it seemed like a good amount of leeway over my course's listed minimum of half as much RAM and storage and the base M1 chip, and it was a pretty good deal. Apple will send hired goons after me for saying this, but it seems to have held up really well and still works great 4 years on. cpubenchmark.net claims it still gets better performance than the base M4. It has some cool stickers on it:</p> + <figure class="media"> + <div> + <div class="gallery"> + <img src="images/macback.webp" alt='Lid of a 2021 16" MacBook Pro covered in many fun stickers, such as "ThonkPad", "V1 Plushie", "BlÃĨhaj with Booze", and several isopods'> + <img src="images/macfront.webp" alt='Next to the trackpad of my new-to-me macbook I have placed a "Queer Inside" sticker, new old stock Pentium D and Designed For Windows XP/2000 badges, and a tiny isopod sticker'> + </div> + <figcaption style="margin-top: 0;">I don't know how these survived the refurbishing process. They're not mine. I really like 'em, though. </joke></figcaption> + </div> + </figure> + <p>I've got this plumbed into my desk setup with a thunderbolt dock and a switchable USB hub, both from Ugreen. Both work fine, except that the dock won't output two different pictures from its two HDMI ports, which Ugreen is adamant is a limitation of the Mac. Luckily I can get a second display out from the built-in HDMI. Also, the USB hub takes male-to-male type A cables. Blasphemous.</p> + </details> + </section> + + <section> + <h4><a href="servy586/" id="servy586">Servy 586</a></h4> + <p>A home-built TrueNAS box assembled from used gaming parts that could pass for a high-end, if a little dated, gaming rig if not for the preponderance of hard drives I put in it in place of a competent GPU. Much more stable than the <a href="/blog/posts/building_a_normal_server/">old one</a>.</p> + <p>Read about its conception and construction <a href="/blog/posts/building_a_sensible_server">here</a>.</p> + </section> + + <section> + <h4>Libre Computing Le Potato</h4> + <p>A Raspberry Pi clone that I use to run Pi-hole, and that's it. I wanted a machine that was isolated from my incessant tinkering with the big boy server.</p> + </section> + + <section> + <h4><a href="cumulonimbus" id="cumulonimbus">cumulonimbus</a></h4> + <p>The cloud server that runs this website and almost everything else I self-host that's accessible from the public internet, because paying two <span title="An Imperial Netflix Subscription, sometimes abbreviated to INS, is an approximate unit of cashflow based on the price of a Standard tier Netflix subscription in the mid-2010s. It generally refers to a window of anywhere from $10 to $14 per month depending on context. One Metric Netflix Subscriptionne, or MNS, is equal to exactly âŦ10 per month.">Imperial Netflix Subscriptions</span> is better than dealing with the endless maze of headaches that is pointing your DNS records to a machine on a residential connection at a shared dwelling.</p> + <p><a href="/blog/posts/renting_an_unremarkable_server">I wrote a blog post about it!</a></p> + </section> + + <section> + <h4 id="phone">Google Pixel 8a</h4> + <p>This counts as a personal computer.</p> + <p>Chosen solely because it was the most recent Pixel at a sane price, I was pushed to upgrade to this from my old 4a by the impending end of software support for 5th generation and older Pixels. Turns out, buying a used Android is a good way to not get security updates for most of the device's useful life, and if I'm gonna bother with <a href="#graphene">GrapheneOS</a> it would behoove me to make sure I'm up to date on those.</p> + <details> + <summary>More info</summary> + <p>Seeing for myself the difference that four years of iteration has made to the a-series Pixels has only solidified my perception that smartphones are as good as they'll ever need to be and have been for quite some time. The faster processor, nicer screen, and better camera in this year's model don't make a difference for the things I do with my phone, and the lack of a headphone jack has already proven inconvenient.</p> + <p>That said, the loss of the headphone jack did not come without its benefits in exchange. The 8a is broadly a nicer and more premium-feeling device than the 4a, and I specifically appreciate the wireless charging and faster cellular data connection more than I was expecting to. Bizarrely, even my 4G LTE speeds in areas without 5G service seem to be drastically improved.</p> + <p>I also like some of the new features in newer versions of Android that never released for the 4a, chief among them the "Charging Optimization" switch that limits the battery to 80% charge to preserve its health long-term, which I'll be needing since I plan to keep this sucker for the entire <em>seven years</em> that it's slated to keep getting security updates. Extraordinarily rare Google W.</p> + </details> + </section> + </section> + + <section> + <h3>Consoles</h3> + + <section> + <h4>New 2DS XL (Hacked)</h4> + <p>Did you know it's surprisingly easy to hack your 3DS? <a href="https://3ds.hacks.guide/">Do it now!</a></p> + <p>I also used to have a Switch, but I've sold it on account of I never really use the thing anyway. I still wanna show off the dope clear shell mod I did to it though, so here's that:</p> + <details> + <summary>dope awesome nintendo pictures</summary> + <img src="images/switchfront.jpg" alt="Front view of a Nintendo Switch with clear plastic shells on the joycons" /> + <img src="images/switchback.jpg" alt="Back view of a Nintendo Switch with clear plastic shells on the joycons and console" /> + </details> + </section> + </section> + + <section> + <h3>Other Hardware</h3> + + <section> + <h4>Prusa MINI+</h4> + <p>I bought a Prusa because their printers have a reputation for quality, which this unit has certainly lived up to. It's been quite reliable, and when it fails, it's usually my fault in a really obvious way. It automates a lot of features that I suspect would have been pain points on a cheaper printer, up to and including uploading gcode to it directly over the network. This thing's easier to use than a regular 2D printer!</p> + <details> + <summary>More info</summary> + <p>My one major issue is that the cantilevered gantry results in a slight inaccuracy in the Z axis, meaning the first layer is too high on one side of the bed and too low on the other. I suspect that this is why they didn't make it bigger, although it could also just be my fault for going and ordering the un-assembled kit version to save money on assembly.</p> + <p>I run mine with Prusa's satin textured bed plate for easier removal of PETG parts (I managed to damage the included smooth plate printing big stuff in PETG) and a 0.6mm Diamondback nozzle for printing with filaments with abrasive additives. It's expensive for a nozzle, but I think for the last nozzle I'll ever need to buy on an already 700 Canadian Victory Point printer it makes sense. I used to run an E3D Nozzle X, but I think I wrecked the coating trying to clean it with a brass wire brush.</p> + </details> + </section> + + <section> + <h4>CyberPower CP1500PFCLCD</h4> + <p>A UPS that powers my computer, server, and related paraphernalia. I got it for all the normal reasons you get a UPS (power outage protection and such-like) and it has thus far performed as advertised. I wouldn't try to game off of the thing, but it's proven more than sufficient to keep my machines on long enough for a graceful shutdown in the event of a power outage. Highly recommend getting one.</p> + </section> + + <section> + <h4>Netgear GS308</h4> + <p>It's a gigabit network switch. It has 8 ports. It performs as advertised. What else is there to say?</p> + </section> + + <section> + <h4>CMF Watch Pro 2</h4> + <p>I used to be the kind of unconditional tech enthusiast who thought smartwatches as a premise were really cool, but that was when I was like 13, and the novelty of my Moto 360 and its adorable little WearOS videogames honestly wore off pretty quick. I'm not so Tiktok-brained that grabbing my phone out of my pocket to check the time or my notifications or whatever registers as an inconvenience, let alone to the extent that I would want to buy a smartwatch about it.</p> + <details> + <summary>More info</summary> + <p>So why'd I buy this then? For me, it's about the biometric sensors. Primarily I just wanted some hard data to assuage some anxiety I was having about the state of my heart, and a device that costs as much as a dedicated heart monitor while doing all the other smartwatch stuff <em>and</em> not making me feel like a paranoid weirdo for owning it seemed like a pretty damn good deal to me.</p> + <p>The smartwatch itself is fine. The custom OS it runs is a little more basic than even circa-2016 WearOS in terms of software features, but I honestly don't care about any of that stuff anyway, and it's actually really nice for the hundred Canadian Zero-Calorie Sugar-Free Diet Dollars and free shipping that they're charging, although I wish the app reported more detailed biometric data, said the undisputed queen of run-on sentences.</p> + <p>The one problem I'm having so far is that after like a month the included pleather wristband is starting to discolor and flake off and generally do Pleather Things™, but frankly this is a very cheap smartwatch and I'd rather them cut costs on the one part I can easily replace than on, like, the battery or the CPU or some shit. Hopefully this isn't indicative of the long-term endurance of the actual device.</p> + </details> + </section> + </section> + + <section> + <h3>Software</h3> + + <section> + <h4 id="eos"><a href="compier">Desktop</a> Operating System - <a href="https://endeavouros.com/" target="_blank">EndeavourOS</a> (Linux)</h4> + <p>My <a href="#compier">main computer</a> runs EndeavourOS with the GNOME desktop environment. I chose it mostly to get the AUR, which has occasionally proved useful, but at this point I'm kind of stuck here because all the config files for my programs are in standard locations, god forbid, and everyone else is on flatpaks now, which fuck that all up for no good reason. I once <a href="https://isopod.cool/blog/posts/my_terrible_distro_hop/">failed to switch to Fedora</a> because of this.</p> + <details> + <summary>More info</summary> + <p>I have a long history with Linux, dating back to 2015 with the first computer I ever owned: a <a href="../blog/posts/toshiba_chromebook/">Chromebook</a> that I put Linux on to play Minecraft, which ChromeOS couldn't do in any meaningful capacity at the time. It took me all of nine months to blow it up doing that because it was passively cooled with a plastic shell and not designed to ever go above ~30% usage on the dinky little Celeron that was its excuse for a CPU. After that I got a real PC running Windows, which solved the Minecraft problem so I mostly stuck to that for the next six years, although I did make intermittent attempts to switch to Linux again.</p> + <p>I pulled it off for real in 2021, when I took a combination of upsetting news about the upcoming Windows 11 and an SSD upgrade to my laptop as an opportunity to swap out my operating system as well. It went pretty well, all told; I wasn't using much Windows-exclusive software other than Paint.NET and some games, the latter of which now run great on Linux anyway thanks to Valve's efforts with Proton. Shame I can't play all my Epic Games Store freebies anymore, though.</p> + <p>My current desktop environment of choice, as previously mentioned, is GNOME. I used to run XFCE, and KDE before that, but I got sick of all my stuff occasionally breaking on me and wanted to see if GNOME would be sufficiently UX-designed that it would Just Work™ and Not Get In My Way™ and all that. So far so mostly good. I was worried about how well Wayland would work, but it's basically fine, with the exception of Discord not playing nice with regards to screensharing.</p> + </details> + </section> + + <section> + <h4 id="graphene">Mobile Operating System - <a href="https://grapheneos.org/">Graphene OS</a> (Android)</h4> + <p>On top of the bordering on iPhone-grade support lifetime, this here is the other reason I'm so brand-loyal to Google's first-party <a href="#phone">hardware</a>.</p> + <details> + <summary>More info</summary> + <p>GrapheneOS is a fork of Android that's been security-hardened and de-googled, two of my favourite things for an operating system to be. It's dedicated to privacy and security above all else, almost to a fault. I'm told it's only available on the Pixel line because those phones have security hardware in them no other OEM on the planet can be bothered with.</p> + <p>GrapheneOS provides a few user-facing privacy features that I quite like, such as the ability to deny network and sensor access to apps in the permission settings, and a bunch of under-the-hood security improvements I'm woefully underqualified to explain short of just pasting stuff wholesale from their website.</p> + <p>Do I need this level of security? Probably not. Would I enjoy some of the features GrapheneOS strips out in the name of security? Possibly. But I like the peace of mind knowing that if cops ever get a hold of my phone they'll at least be kind of frustrated trying to access it.</p> + </details> + </section> + + <section> + <h4>Web Browser - <a href="https://www.mozilla.org/en-US/firefox/new/" target="_blank">Firefox</a></h4> + <p>I quite like Firefox. It's extremely customizable (especially if you know where to look), the devtools are better, and there's a wealth of privacy tools available that just kind of don't exist in Chrome (including <a href="https://arstechnica.com/gadgets/2024/05/google-starts-deprecating-older-more-capable-chrome-extensions-next-week/">adblockers</a> as of late). It can also edit PDFs now!</p> + <details> + <summary>More info</summary> + <p>On top of being generally superior, I also use Firefox on principle. It's currently the only major browser outside of the Apple-exclusive Safari that isn't built atop Google's <a href="https://chrome.bathynomus.xyz">Chromium</a>, and I don't like the idea of Google having total monopolistic control over all web browsers.</p> + <p>Firefox is one of the only pieces of software I'll actively advocate switching to, so go do it. Do it now. It, like essentially all other browsers, can <a href="https://support.mozilla.org/en-US/kb/import-bookmarks-google-chrome">import your data</a> from its competition, and I'd also recommend using this <a href="https://ffprofile.com/">profile generator</a> to fortify it for maximum privacy while you're at it.</p> + <p>All that said, Mozilla is under questionable management at the moment and kind of in Google's pocket anyway, so maybe we shouldn't be relying completely on them to champion the free web. Maybe throw some money in the general direction of the <a href="https://servo.org/">Servo</a> project.</p> + <p>I use the <a href="https://f-droid.org/packages/org.mozilla.fennec_fdroid/">Fennec</a> fork of Firefox on mobile, and <a href="https://github.com/ungoogled-software/ungoogled-chromium">Ungoogled Chromium</a> for the occasional poorly-built website (usually streaming services, work stuff, or banks) that doesn't want to run in my weird paranoid Firefox config.</p> + </details> + </section> + + <section> + <h4>IDE - <a href="https://vscodium.com/">VSCodium</a></h4> + <p>Microsoft's Visual Studio Code is, loathe though I may be to admit it, my favourite IDE I've ever used, which is why I use VSCodium, an open-source build of VSCode with all the telemetry and shit stripped out.</p> + </section> + + <section> + <h4>3D Graphics - <a href="https://www.blender.org/">Blender</a></h4> + <p>Lucky that the only 3D graphics program available on Linux just so happens to also be the best one available anywhere. I use this sucker for just about everything it can theoretically do, from CAD to video editing, and even some things that it's actually good at!</p> + </section> + + <section> + <h4>Photo Editor - <a href="https://www.gimp.org/">GIMP</a></h4> + <p>Honestly, what were you expecting? If you want to edit raster graphics on Linux, GIMP is more or less the be-all-end-all, unless you want to do everything in the terminal with ImageMagick. I'd prefer to use Paint.NET or even my Legally Obtained DRM-free copy of Photoshop CS6, but somehow photo editors are one of the only things that are consistently incompatible with WINE. I've been meaning to give <a href="https://www.photopea.com/">Photopea</a> a shot, or maybe the Affinity suite. Apparently that actually <em>does</em> work in WINE.</p> + </section> + + <section> + <h4>DAW - <a href="https://www.reaper.fm/">REAPER</a></h4> + <p>My primary motivation for choosing REAPER is that it's available for Linux. My secondary motivation is that it has a lot less of the bizarre idiosyncracies and feature omissions that I found limiting when I was using LMMS. It's also cheaper for a perpetual license than even the shittiest most artificially-limited versions of most of the other major DAWs, although it's not like I can run any of them anyway.</p> + </section> + + <section> + <h4>Media Players - <a href="https://wiki.gnome.org/Apps/Rhythmbox">Rhythmbox</a>, <a href="https://mpv.io/">MPV</a>, <a href="https://www.videolan.org/vlc/">VLC</a></h4> + <p>I use Rhythmbox for music, MPV for video, and VLC for anything that doesn't open one of the other two when I click on it. All three are very boringly good at what they do, and all three are varying levels of fugly.</p> + </section> + + <section> + <h4>Torrent Client - <a href="https://www.qbittorrent.org/">qBittorrent</a></h4> + <p>This is the program I use to download my, uh, Linux ISOs. And local copies of Wikipedia. At least one of those is actually true. I've got it configured to only work through my VPN. I don't know if my ISP would actually get on my case if I torrented anything... unscrupulous without it, but I'd rather not risk it.</p> + </section> + + <section> + <h4>Syncing Thing - <a href="https://syncthing.net/">Syncthing</a></h4> + <p>Syncthing is a peer-to-peer automatic file syncing program that I use to automatically sync files between my various devices, peer-to-peer style. It works really well and I really like it. Among other things, I use it to get photos from my phone onto my PC, my music library from my PC onto my phone, and for automatic backups of both to my server.</p> + </section> + + <section> + <h4>Notes - <a href="https://obsidian.md/">Obsidian</a></h4> + <p>The best user experience I've seen in a notes program since the Notes app on my iPhone 4S. The thing that sold me on it is that it saves your notes as markdown files in a user-defined folder, so I can point Syncthing to it. This beats out my previous solution of Whatever Nextcloud Has™ by a country mile. Let me know if you know of an RSS reader that works like this.</p> + </section> + + <section> + <h4>Shell - <a href="https://www.zsh.org/">zsh</a></h4> + <p>I switched to zsh largely due to ambient peer pressure from the wider Linux community, and I doubt I'm taking full advantage of its many advanced features, whatever those are, but I do quite like how conducive it is to customization with such programs as <a href="https://ohmyz.sh/">Oh My Zsh</a> and <a href="https://github.com/romkatv/powerlevel10k">Powerlevel10k</a>, and I miss its improved tab completion and command history functionality whenever I'm ssh'd into one of my servers.</p> + </section> + </section> + </section> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> + </body> </html>
\ No newline at end of file diff --git a/uses/servy586/index.php b/uses/servy586/index.php index 19fa1d5..6fb4b1a 100644 --- a/uses/servy586/index.php +++ b/uses/servy586/index.php @@ -3,82 +3,162 @@ <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>My Home Server</title> + <title>my home server | isopod.cool v4</title> <link href="/style.css" rel="stylesheet" type="text/css" media="all"> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> </head> <body> - <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); bg(true); ?> - <h1>servy <span title="Are you perhaps detecting a pattern with how I name these?">586</span></h1> - <h2 id="caption">my home server</h2> - <p>Assembled from mostly used parts that range from vaguely sensible to <em>wildly</em> overspecced for my use case, my home server seems to have ended up as my personal exercise in gratuitous computing overkill, for the sort of peasant that can't afford <a href="4k_in_more_ways_than_one.png">4 grand for an RTX 4090</a>.</p> - <p>It got that way because I was trying to build a machine of a similar level of performance to the old gaming laptop that used to be my home server, before I <a href="/blog/posts/building_a_normal_server/">vivisected it and grafted on a NAS</a>, only to find that it didn't seem to like my doing that very much. Believe it or not, the point of this monster was to get away from the unusably bad stability issues the old server was having, and it seems to have worked. You can read more about how I justified it all to myself <a href="https://isopod.cool/blog/posts/building_a_sensible_server/">here</a>.</p> - <h2>Hardware</h2> - <h3>CPU - AMD Ryzen 7 3700X</h3> - <p>When I said "gratuitous computing overkill", this is primarily what I meant. For a home server, this high-end, albiet 5-year-old, gaming CPU is admittedly a little bit ridiculous. An Intel N100 Chromebook chip would be more than capable of most of the things this server is doing, but I had a good reason to go for something this fast: I knew I wanted to run Minecraft servers on this machine, possibly more than one, and with Minecraft, single-core performance is king. Even professional Minecraft hosting providers use chips like this, because enterprise-grade server hardware is worse than the consumer stuff for this task.</p> - <p>My line of reasoning for choosing this CPU was as follows: my currect machine has an i7-9750H in it, so I'll get the desktop version of that, the i7-9700K, for similar performance, except wait, the corresponding Ryzen chip from the same generation is a <em>way</em> better value on the used market, let's get that. And that's how I ended up <a href="https://www.cpubenchmark.net/compare/3425vs3485/Intel-i7-9750H-vs-AMD-Ryzen-7-3700X">accidentally doubling my multi-threaded performance</a> despite specifically setting out <em>not</em> to get a major upgrade. Realistically, though, I wouldn't have saved a ton of money going for something more in line with my stated goal anyway.</p> - <h3>CPU Cooler - Thermalright Peerless Assassin 120</h3> - <p>In what is becoming something of a theme here, I'm well aware that this cooler is ludicrously overbuilt for the chip I'm asking it to cool, but that's the point. This thing provides more than ample headroom for me to set a nice, relaxed, quiet curve on the machine's case fans, which is important since it's currently sitting right next to my desk.</p> - <h3>Motherboard - ASUS ROG CROSSHAIR VI HERO X370</h3> - <p>Also a bit of a silly motherboard for a home server, what with all the built-in Gaming Lights™ and fancy overclocking features. I need it though, because this is the only thing with all the expandability I need. It has eight whole SATA ports, exactly enough for all my drives, which saves me having to burn a PCIe slot on a SATA controller. This particular board also has another helpful feature: if add-in cards are installed in both the first and second PCIe x16 slots, it shares the bandwidth evenly between them for two x8 connections instead of having one x16 and one x4. This gives me enough lanes for the specific 10 gig network card I'm using.</p> - <p>Buying used components is always a bit of a risky play, and I initially thought this board, or the CPU, was dead on arrival when it failed to POST with a cryptic CPU error. Fortunately, I was able to fix it with the BIOS flashback feature. I may or may not have updated the BIOS, but it gives you so little feedback I don't know. I just inserted the USB drive, hit the flashback button and waited until it stopped blinking. Either way, it works now.</p> - <h3>RAM - Corsair Vengeance LPX 2x16GB DDR4-3200 CL16</h3> - <p>It's RAM. What can I say? I picked this particular kit because it was the cheapest one available from a brand I actually trusted. I bought this stuff new, since used DDR4 prices at the time were exactly the same anyway.</p> - <h3>GPU - Nvidia Quadro P400</h3> - <p>A bit of an anemic video card for gaming, but I'm not gaming on this machine, at least not like that. This card was both dirt cheap used and has the two features I was actually looking for and nothing more: literally any video output at all for first-time setup, and good transcoding performance for Jellyfin.</p> - <h3>Network Card - Dell Intel X540-T2 10GbE</h3> - <p>These old server NICs allow for 10 gigabit ethernet connectivity at rock-bottom prices. I originally bought two so I could put one each in the server and my main PC and direct-attach them, but limitations of my B550 motherboard killed that plan. This one still went in the server so it will be ready when I eventually upgrade to something that can accept the other card.</p> - <p>The one downside of these cheap old network cards is that the fans on them are pretty much always dying and tend to be very loud. I solved this problem by splicing a replacement fan onto the connector from the original, and mounting it to the card's heatsink with a zip-tie that's screwed into one of the original fan mounting holes.</p> - <div style="display: flex;"> - <img style="width: 50%;" src="nictua.jpg" alt="A 40mm wide, 10mm thick Noctua fan zip-tied to the heatsink on a PCIe Ethernet card."> - <img style="width: 50%;"src="ziptiemount.jpg" alt="The zip-tie is screwed into one of the original fan mounting holes on the heatsink. As in, the screw is going through the zip-tie."> - </div> - <p>Lucky me the original fan is a standard 12 volt one and doesn't take, like, 19 volts or something stupid like that. I wouldn't put it past Dell.</p> - <h3>Power Supply - Seasonic GX-650 650W</h3> - <p>I originally bought a GX-650 for my main PC, then it blew up out of nowhere and I RMA'd it, but still bought a beefier replacement anyway out of both an abundance of caution and a desire for more GPU upgrade headroom. When this unit arrived, it ended up in my server. Again, it's overkill for what I need, but that's now my official strategy for PSUs.</p> - <h3>Case - Enlight 7237 (?)</h3> - <p>This Pentium 3-era case was among the first I found that could accommodate my needs for this machine, although I admit my search strategy was flawed. Still, I was enamoured with this case and, frankly, building in it was a pleasure compared to my experiences with modern cases. I can actually get to the modular PSU cables without removing anything! Imagine that! And in a case that <em>predates the concept of modular power supplies by fully half a decade</em>. In spite of its objectively dogshit airflow, this case makes me resent the modern Corsair box I originally built my main rig in.</p> - <p>Since this case appears to have been whitelabeled by a system integrator called Touch Computer before being emptied out and sold to me, there's no indication of what model it is, but it closely resembles the Enlight 7237, so I suspect it's either that or something closely related. Apparently these were very common back in the day, and I can see why.</p> - <figure class="media"> - <div> - <div style="display: flex;"> - <img style="width: 50%;" src="servercase.jpg" alt="A beige PC tower with four 5.25" bays and two external 3.5" bays, populated with an optical drive and a floppy drive respectively. The only visible branding is a Pentium III sticker and a badge that reads "TOUCH"."> - <img style="width: 50%;"src="servercaseinside.jpg" alt="The inside of the same old PC case. Its layout is extremely pragmatic: motherboard in the very bottom corner, PSU in the top corner above it, and all the drive bay mounts are in a cage lining the front side. In other words, it looks like an old PC case."> - </div> - <figcaption style="margin-top: 0;">These photos are from the case's Ebay listing. It did, in fact, ship with all that stuff, including the IDE cable.</figcaption> - </div> - </figure> - <p>The "586" in this machine's name is derived from the Pentium sticker on the front of the case.</p> - <h2>Drives</h2> - <h3>Boot Drive - Samsung 870 EVO 250GB (2x) (Mirrored)</h3> - <p>I run two boot disks in a mirrored array for increased reliability. It's not strictly necessary, but it's one more thing I can rule out if the thing ever fails to boot.</p> - <p>I bought these drives for the original laptop server build, but they didn't make the cut after I hit some weird laptop-BIOS-ass limitations on my SATA connectivity.</p> - <h3>Apps Storage - Crucial BX500 1TB + WD Blue 1TB (Mirrored)</h3> - <p>I like my redundancy, especially since both of these drives are technically used. The BX500 was used for the same purpose in the old server, and the WD Blue was originally a storage upgrade for that laptop when it was still my daily driver, before being transplanted into my shiny new desktop rig, before then being replaced for peace of mind when my PSU a-sploded.</p> - <p>These are the drives I install programs to and such-like. There's no reason I couldn't use the giant HDD pool for this, but the performance hit just wouldn't be worth the savings, especially since I only had to buy one of these drives for home-server purposes anyway.</p> - <h3>Game Server Storage - Samsung OEM 256GB NVMe</h3> - <p>Not redundant, unfortunately, since I only had one of these laying around and there was only one remaining drive slot in the system when I decided to add it. This is the original boot drive from the old laptop, meaning it's over four years old, so it arguably needs redundancy the most, but frequent automated backups should mitigate that issue.</p> - <p>I install my game server(s) to this drive for maximum performance. By now the pattern must have emerged that I'm going all out on speed for anything that's going to affect that in particular. Only the best for the half a dozen or so friends who are gonna ever actually play on this thing. I think we've all dealt with enough poorly-performing shit-tier Minecraft servers in our time.</p> - <h3>Bulk Storage - Seagate Exos 16TB 7200RPM (x4) (RAIDZ1)</h3> - <p>A patently insane amount of storage. Even configured such that one of them is used up entirely on redundancy, that's still well north of 40TB of usable space. It's enough for my entire life, and that's the idea. These drives hold automated backups of all my other devices, my entire library of Legally Obtained media, and a good amount of other stuff, too. The NAS is to minimize the chances I ever lose any of it, and the massive HDD array is to minimize the chances I have to delete any myself.</p> - <p>I absolutely could not afford drives like this new — I got these drives Manufacturer Recertified™ from <a href="https://serverpartdeals.com/">serverpartdeals.com</a>. This makes them ever-so-slightly less trustworthy than new drives, but that's what the RAID is for, and the recertified ones are <em>half</em> the price of brand new. I chose the specific drives I did because they were the best available in terms of cost-per-terabyte at the time I bought them.</p> - <h2>Software</h2> - <h3>OS - <a href="https://www.truenas.com/">TrueNAS Scale</a></h3> - <p>I could probably recreate my elaborate configuration on like, baseline debian or something, but I don't want to. Between four ZFS pools, virtual machines, a slightly convoluted system of SMB shares, and various other services, the slick web GUI TrueNAS provides makes everything far more convenient. Its configuration export feature was also very handy when migrating to the new machine.</p> - <p>It's got some idiosyncracies to it, but in general TrueNAS smooths out the experience of running this server enough that I'm doing a lot of things I probably couldn't be bothered to otherwise.</p> - <h3><a href="https://jellyfin.org/">Jellyfin</a></h3> - <p>Let's be real, this is what home servers are for. This is why you get one, to make watching your, uh, totally legally obtained movies on your phone more convenient. Jellyfin does a great job of this. It fetches metadata reliably and plays nice with my GPU for transcoding. I also use it to host my music library, now that the Finamp beta lets you transcode your downloads to OPUS.</p> - <h3><a href="https://gethomepage.dev/">Homepage</a></h3> - <p>I mostly keep this around because there's no way to point your Firefox new tab page to a local file on your computer, but it's got some nice features. Namely, it can display stats from your various services.</p> - <h3><a href="https://syncthing.net/">Syncthing</a></h3> - <p>I fucking love Syncthing. I've got all my favourite files from my PC and my phone backing up to my server, automatically and with zero effort. If I could only run one thing on my server, it'd be this.</p> - <h3><a href="https://filebrowser.org/">Filebrowser</a></h3> - <p>A Google Drive-style web file browser for my network shares. I can access them over SMB, of course, but this provides the same functionality with a lot less friction for devices and people that aren't super compatible with that level of nerd shit.</p> - <h3>OS - <a href="https://www.debian.org/">Debian Linux</a></h3> - <p>Wait, what? Didn't I just say I was running TrueNAS? I am, but I also have a virtual machine under TrueNAS for my game servers, and this is the OS I use for that. There's a learning curve here compared to Ubuntu Server, which I'm more used to, but at the end of the day Linux is Linux.</p> - <h3><a href="https://craftycontrol.com/">Crafty Controller</a></h3> - <p>A convenient admin panel for my Minecraft servers. Getting my old server imported was an Experience, but after that it's been smooth. Highly recommend. I especially like the automated backup system.</p> - <h3><a href="https://www.wireguard.com/">WireGuard</a></h3> - <p>I run a WireGuard client in the VM with a server on my VPS to make my game servers accessible from outside the <span class="house">house</span> without giving out my IP address, worrying about dynamic DNS, or trying to port forward on the solid lump of concentrated ISP malice that passes for my router. I had to write a couple configuration files by hand, god forbid, but otherwise this was much easier.</p> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/header.php'); ?> + <main> + <section> + <h2>servy <span title="Are you perhaps detecting a pattern with how I name these?">586</span></h2> + <p class="h2caption">my home server</p> + <p class="backlink"><a href="../"><< uses</a></p> + <p>Assembled from mostly used parts that range from vaguely sensible to <em>wildly</em> overspecced for my use case, my home server seems to have ended up as my personal exercise in gratuitous computing overkill, for the sort of peasant that can't afford <a href="4k_in_more_ways_than_one.png">4 grand for an RTX 4090</a>.</p> + <p>It got that way because I was trying to build a machine of a similar level of performance to the old gaming laptop that used to be my home server, before I <a href="/blog/posts/building_a_normal_server/">vivisected it and grafted on a NAS</a>, only to find that it didn't seem to like my doing that very much. Believe it or not, the point of this monster was to get away from the unusably bad stability issues the old server was having, and it seems to have worked. You can read more about how I justified it all to myself <a href="https://isopod.cool/blog/posts/building_a_sensible_server/">here</a>.</p> + <figure class="media"> + <img src="servy.webp" alt="My server, sitting on a makeshift plinth I made out of scrap 2x4's and some spare IKEA desk legs in my house's utility room. Also visible are the UPS I've plugged it into and a water pipe."> + <figcaption>Feel free to ignore that water main. Just out of frame on the other side of it are the network router and the main breaker panel for the <span class="house">house</span>, so I figure if that pipe explodes I'll have bigger problems.</figcaption> + </figure> + + <section> + <h3>Hardware</h3> + + <section> + <h4>CPU - AMD Ryzen 7 3700X</h4> + <p>When I said "gratuitous computing overkill", this is primarily what I meant. For a home server, this high-end, albiet 5-year-old, gaming CPU is admittedly a little bit ridiculous. An Intel N100 Chromebook chip would be more than capable of most of the things this server is doing, but I had a good reason to go for something this fast: I knew I wanted to run Minecraft servers on this machine, possibly more than one, and with Minecraft, single-core performance is king. Even professional Minecraft hosting providers use chips like this, because enterprise-grade server hardware is worse than the consumer stuff for this task.</p> + <p>My line of reasoning for choosing this CPU was as follows: my currect machine has an i7-9750H in it, so I'll get the desktop version of that, the i7-9700K, for similar performance, except wait, the corresponding Ryzen chip from the same generation is a <em>way</em> better value on the used market, let's get that. And that's how I ended up <a href="https://www.cpubenchmark.net/compare/3425vs3485/Intel-i7-9750H-vs-AMD-Ryzen-7-3700X">accidentally doubling my multi-threaded performance</a> despite specifically setting out <em>not</em> to get a major upgrade. Realistically, though, I wouldn't have saved a ton of money going for something more in line with my stated goal anyway.</p> + </section> + + <section> + <h4>CPU Cooler - Thermalright Peerless Assassin 120</h4> + <p>In what is becoming something of a theme here, I'm well aware that this cooler is ludicrously overbuilt for the chip I'm asking it to cool, but that's the point. This thing provides more than ample headroom for me to set a nice, relaxed, quiet curve on the machine's case fans, which is important since when I built it it was sitting right next to my desk.</p> + </section> + + <section> + <h4>Motherboard - ASUS ROG CROSSHAIR VI HERO X370</h4> + <p>Also a bit of a silly motherboard for a home server, what with all the built-in Gaming Lights™ and fancy overclocking features. I need it though, because this is the only thing with all the expandability I need. It has eight whole SATA ports, exactly enough for all my drives, which saves me having to burn a PCIe slot on a SATA controller. This particular board also has another helpful feature: if add-in cards are installed in both the first and second PCIe x16 slots, it shares the bandwidth evenly between them for two x8 connections instead of having one x16 and one x4. This gives me enough lanes for the specific 10 gig network card I'm using.</p> + <p>Buying used components is always a bit of a risky play, and I initially thought this board, or the CPU, was dead on arrival when it failed to POST with a cryptic CPU error. Fortunately, I was able to fix it with the BIOS flashback feature. I may or may not have updated the BIOS, but it gives you so little feedback I don't know. I just inserted the USB drive, hit the flashback button and waited until it stopped blinking. Either way, it works now.</p> + </section> + + <section> + <h4>RAM - Corsair Vengeance LPX 2x16GB DDR4-3200 CL16</h4> + <p>It's RAM. What can I say? I picked this particular kit because it was the cheapest one available from a brand I actually trusted. I bought this stuff new, since used DDR4 prices at the time were exactly the same anyway.</p> + </section> + + <section> + <h4>GPU - Nvidia Quadro P400</h4> + <p>A bit of an anemic video card for gaming, but I'm not gaming on this machine, at least not like that. This card was both dirt cheap used and has the two features I was actually looking for and nothing more: literally any video output at all for first-time setup, and good transcoding performance for Jellyfin.</p> + </section> + + <section> + <h4>Network Card - Dell Intel X540-T2 10GbE</h4> + <p>These old server NICs allow for 10 gigabit ethernet connectivity at rock-bottom prices. I originally bought two so I could put one each in the server and my main PC and direct-attach them, but limitations of my old B550 motherboard killed that plan. This one still went in the server so it will be ready when I eventually get around to installing it.</p> + <p>The one downside of these cheap old network cards is that the fans on them are pretty much always dying and tend to be very loud. I solved this problem by splicing a replacement fan onto the connector from the original, and mounting it to the card's heatsink with a zip-tie that's screwed into one of the original fan mounting holes.</p> + <figure class="media"> + <div style="display: flex;"> + <img style="width: 50%;" src="nictua.jpg" alt="A 40mm wide, 10mm thick Noctua fan zip-tied to the heatsink on a PCIe Ethernet card."> + <img style="width: 50%;"src="ziptiemount.jpg" alt="The zip-tie is screwed into one of the original fan mounting holes on the heatsink. As in, the screw is going through the zip-tie."> + </div> + <figcaption>Believe me, I've done crazier.</figcaption> + </figure> + <p>Lucky me the original fan is a standard 12 volt one and doesn't take, like, 19 volts or something stupid like that. I wouldn't put it past Dell.</p> + </section> + + <section> + <h4>Power Supply - Seasonic GX-650 650W</h4> + <p>I originally bought a GX-650 for my main PC, then it blew up out of nowhere and I RMA'd it, but still bought a beefier replacement anyway out of both an abundance of caution and a desire for more GPU upgrade headroom. When this unit arrived, it ended up in my server. Again, it's overkill for what I need, but that's now my official strategy for PSUs.</p> + </section> + + <section> + <h4>Case - Enlight 7237 (?)</h4> + <p>This Pentium 3-era case was among the first I found that could accommodate my needs for this machine, although I admit my search strategy was flawed. Still, I was enamoured with this case and, frankly, building in it was a pleasure compared to my experiences with modern cases. I can actually get to the modular PSU cables without removing anything! Imagine that! And in a case that <em>predates the concept of modular power supplies by fully half a decade</em>. In spite of its objectively dogshit airflow, this case makes me resent the modern Corsair box I originally built my main rig in.</p> + <p>Since this case appears to have been whitelabeled by a system integrator called Touch Computer before being emptied out and sold to me, there's no indication of what model it is, but it closely resembles the Enlight 7237, so I suspect it's either that or something closely related. Apparently these were very common back in the day, and I can see why.</p> + <figure class="media"> + <div style="display: flex;"> + <img style="width: 50%;" src="servercase.jpg" alt="A beige PC tower with four 5.25" bays and two external 3.5" bays, populated with an optical drive and a floppy drive respectively. The only visible branding is a Pentium III sticker and a badge that reads "TOUCH"."> + <img style="width: 50%;"src="servercaseinside.jpg" alt="The inside of the same old PC case. Its layout is extremely pragmatic: motherboard in the very bottom corner, PSU in the top corner above it, and all the drive bay mounts are in a cage lining the front side. In other words, it looks like an old PC case."> + </div> + <figcaption style="margin-top: 0;">These photos are from the case's Ebay listing. It did, in fact, ship with all that stuff, including the IDE cable.</figcaption> + </figure> + <p>The "586" in this machine's name is derived from the Pentium sticker on the front of the case.</p> + </section> + </section> + + <section> + <h3>Drives</h3> + + <section> + <h4>Boot Drive - Samsung 870 EVO 250GB (2x) (Mirrored)</h4> + <p>I run two boot disks in a mirrored array for increased reliability. It's not strictly necessary, but it's one more thing I can rule out if the thing ever fails to boot.</p> + <p>I bought these drives for the original laptop server build, but they didn't make the cut after I hit some weird laptop-BIOS-ass limitations on my SATA connectivity.</p> + </section> + + <section> + <h4>Apps Storage - Crucial BX500 1TB + WD Blue 1TB (Mirrored)</h4> + <p>I like my redundancy, especially since both of these drives are technically used. The BX500 was used for the same purpose in the old server, and the WD Blue was originally a storage upgrade for that laptop when it was still my daily driver, before being transplanted into my shiny new desktop rig, before then being replaced for peace of mind when my PSU a-sploded.</p> + <p>These are the drives I install programs to and such-like. There's no reason I couldn't use the giant HDD pool for this, but the performance hit just wouldn't be worth the savings, especially since I only had to buy one of these drives for home-server purposes anyway.</p> + </section> + + <section> + <h4>Game Server Storage - Samsung OEM 256GB NVMe</h4> + <p>Not redundant, unfortunately, since I only had one of these laying around and there was only one remaining drive slot in the system when I decided to add it. This is the original boot drive from the old laptop, meaning it's over four years old, so it arguably needs redundancy the most, but frequent automated backups should mitigate that issue.</p> + <p>I install my game server(s) to this drive for maximum performance. By now the pattern must have emerged that I'm going all out on speed for anything that's going to affect that in particular. Only the best for the half a dozen or so friends who are gonna ever actually play on this thing. I think we've all dealt with enough poorly-performing shit-tier Minecraft servers in our time.</p> + </section> + + <section> + <h4>Bulk Storage - Seagate Exos 16TB 7200RPM (x4) (RAIDZ1)</h4> + <p>A patently insane amount of storage. Even configured such that one of them is used up entirely on redundancy, that's still well north of 40TB of usable space. It's enough for my entire life, and that's the idea. These drives hold automated backups of all my other devices, my entire library of Legally Obtained media, and a good amount of other stuff, too. The NAS is to minimize the chances I ever lose any of it, and the massive HDD array is to minimize the chances I have to delete any myself.</p> + <p>I absolutely could not afford drives like this new — I got these drives Manufacturer Recertified™ from <a href="https://serverpartdeals.com/">serverpartdeals.com</a>. This makes them ever-so-slightly less trustworthy than new drives, but that's what the RAID is for, and the recertified ones are <em>half</em> the price of brand new. I chose the specific drives I did because they were the best available in terms of cost-per-terabyte at the time I bought them.</p> + </section> + </section> + + <section> + <h3>Software</h3> + + <section> + <h4>OS - <a href="https://www.truenas.com/">TrueNAS Scale</a></h4> + <p>I could probably recreate my elaborate configuration on like, baseline debian or something, but I don't want to. Between four ZFS pools, virtual machines, a slightly convoluted system of SMB shares, and various other services, the slick web GUI TrueNAS provides makes everything far more convenient. Its configuration export feature was also very handy when migrating to the new machine.</p> + <p>It's got some idiosyncracies to it, but in general TrueNAS smooths out the experience of running this server enough that I'm doing a lot of things I probably couldn't be bothered to otherwise.</p> + </section> + + <section> + <h4><a href="https://jellyfin.org/">Jellyfin</a></h4> + <p>Let's be real, this is what home servers are for. This is why you get one, to make watching your, uh, totally legally obtained movies on your phone more convenient. Jellyfin does a great job of this. It fetches metadata reliably and plays nice with my GPU for transcoding. I also use it to host my music library, now that the Finamp beta lets you transcode your downloads to OPUS.</p> + </section> + + <section> + <h4><a href="https://gethomepage.dev/">Homepage</a></h4> + <p>I mostly keep this around because there's no way to point your Firefox new tab page to a local file on your computer, but it's got some nice features. Namely, it can display stats from your various services.</p> + </section> + + <section> + <h4><a href="https://syncthing.net/">Syncthing</a></h4> + <p>I fucking love Syncthing. I've got all my favourite files from my PC and my phone backing up to my server, automatically and with zero effort. If I could only run one thing on my server, it'd be this.</p> + </section> + + <section> + <h4><a href="https://filebrowser.org/">Filebrowser</a></h4> + <p>A Google Drive-style web file browser for my network shares. I can access them over SMB, of course, but this provides the same functionality with a lot less friction for devices and people that aren't super compatible with that level of nerd shit.</p> + </section> + + <section> + <h4>OS - <a href="https://www.debian.org/">Debian Linux</a></h4> + <p>Wait, what? Didn't I just say I was running TrueNAS? I am, but I also have a virtual machine under TrueNAS for my game servers, and this is the OS I use for that. There's a learning curve here compared to Ubuntu Server, which I'm more used to, but at the end of the day Linux is Linux.</p> + </section> + + <section> + <h4><a href="https://craftycontrol.com/">Crafty Controller</a></h4> + <p>A convenient admin panel for my Minecraft servers. Getting my old server imported was an Experience, but after that it's been smooth. Highly recommend. I especially like the automated backup system.</p> + </section> + + <section> + <h4><a href="https://www.wireguard.com/">WireGuard</a></h4> + <p>I run a WireGuard client in the VM with a server on my VPS to make my game servers accessible from outside the <span class="house">house</span> without giving out my IP address, worrying about dynamic DNS, or trying to port forward on the solid lump of concentrated ISP malice that passes for my router. I had to write a couple configuration files by hand, god forbid, but otherwise this was much easier.</p> + </section> + </section> + </section> + </main> + <?php include($_SERVER['DOCUMENT_ROOT'] . '/footer.php'); ?> </body> -</html> + +</html>
\ No newline at end of file diff --git a/uses/servy586/servy.webp b/uses/servy586/servy.webp Binary files differnew file mode 100644 index 0000000..b39ca15 --- /dev/null +++ b/uses/servy586/servy.webp |
