commit 7a9728eba8a3671f8d227d4ade4ecbd3442e38cf Author: Gitea Actions Date: Tue Mar 10 06:32:29 2026 +0000 Deploy from Gitea Actions diff --git a/404.html b/404.html new file mode 100644 index 0000000..a03814b --- /dev/null +++ b/404.html @@ -0,0 +1,17 @@ +404 Page not found · wiki.wompmacho.com
+Skip to main content

Page Not Found 😕

Error 404

It seems that the page you've requested does not exist.

© +2026 +Michael

Powered by Hugo & Blowfish

\ No newline at end of file diff --git a/android-chrome-192x192.png b/android-chrome-192x192.png new file mode 100644 index 0000000..b63c037 Binary files /dev/null and b/android-chrome-192x192.png differ diff --git a/android-chrome-512x512.png b/android-chrome-512x512.png new file mode 100644 index 0000000..da0f767 Binary files /dev/null and b/android-chrome-512x512.png differ diff --git a/apple-touch-icon.png b/apple-touch-icon.png new file mode 100644 index 0000000..a011953 Binary files /dev/null and b/apple-touch-icon.png differ diff --git a/authors/index.html b/authors/index.html new file mode 100644 index 0000000..7062c6d --- /dev/null +++ b/authors/index.html @@ -0,0 +1,19 @@ +Authors · wiki.wompmacho.com
+Skip to main content

Authors

© +2026 +Michael

Powered by Hugo & Blowfish

\ No newline at end of file diff --git a/authors/index.xml b/authors/index.xml new file mode 100644 index 0000000..618ab26 --- /dev/null +++ b/authors/index.xml @@ -0,0 +1 @@ +Authors on wiki.wompmacho.comhttps://wiki.wompmacho.com/authors/Recent content in Authors on wiki.wompmacho.comHugo -- gohugo.ioen© 2026 MichaelSun, 08 Mar 2026 00:00:00 +0000Wompmachohttps://wiki.wompmacho.com/authors/wompmacho/Sun, 08 Mar 2026 00:00:00 +0000https://wiki.wompmacho.com/authors/wompmacho/ \ No newline at end of file diff --git a/authors/wompmacho/index.html b/authors/wompmacho/index.html new file mode 100644 index 0000000..be255ad --- /dev/null +++ b/authors/wompmacho/index.html @@ -0,0 +1,18 @@ +Wompmacho · wiki.wompmacho.com
+Skip to main content

Wompmacho

Liberal

·95 words·1 min
Liberal is bad. # Wait, wasn’t this group touting to be “liberal” once? Tell me more about why Liberal is bad. You know what… that person looks funny and bothers me and calls themself a liberal so I don’t wanna be in that catagory anymore. No wait, actually lets just demonize a group because fox news says so. NO WAIT, let’s not use words correctly because words, logic, facts… These things don’t matter.

First Post

··51 words·1 min
Yo 👋 +If you actually come to find this then props to ya man. Thanks for dropping by. idk if this will be worth ever doing, but this was fun for me to set up… and who knows maybe this is of some use to others… so fuck it –> Enjoy.

© +2026 +Michael

Powered by Hugo & Blowfish

\ No newline at end of file diff --git a/authors/wompmacho/index.xml b/authors/wompmacho/index.xml new file mode 100644 index 0000000..a00b0a6 --- /dev/null +++ b/authors/wompmacho/index.xml @@ -0,0 +1,11 @@ +Wompmacho on wiki.wompmacho.comhttps://wiki.wompmacho.com/authors/wompmacho/Recent content in Wompmacho on wiki.wompmacho.comHugo -- gohugo.ioen© 2026 MichaelSun, 08 Mar 2026 00:00:00 +0000Liberalhttps://wiki.wompmacho.com/posts/liberal/Sun, 08 Mar 2026 00:00:00 +0000https://wiki.wompmacho.com/posts/liberal/<h2 class="relative group">Liberal is bad. + <div id="liberal-is-bad" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#liberal-is-bad" aria-label="Anchor">#</a> + </span> + +</h2> +<p>Wait, wasn&rsquo;t this group touting to be &ldquo;liberal&rdquo; once? Tell me more about why Liberal is bad. You know what… that person looks funny and bothers me and calls themself a liberal so I don’t wanna be in that catagory anymore. No wait, actually lets just demonize a group because fox news says so. NO WAIT, let&rsquo;s not use words correctly because words, logic, facts&hellip; These things don&rsquo;t matter.</p>Performance Reviewshttps://wiki.wompmacho.com/posts/performance_reviews/Sat, 08 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/posts/performance_reviews/<p>The Hidden Flaw of Performance Reviews.</p>First Posthttps://wiki.wompmacho.com/posts/firstpost/Sun, 02 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/posts/firstpost/<p>Yo 👋</p> +<p>If you actually come to find this then props to ya man. Thanks for dropping by. idk if this will be worth ever doing, but this was fun for me to set up&hellip; and who knows maybe this is of some use to others&hellip; so fuck it &ndash;&gt; Enjoy.</p> \ No newline at end of file diff --git a/authors/wompmacho/page/1/index.html b/authors/wompmacho/page/1/index.html new file mode 100644 index 0000000..540e20c --- /dev/null +++ b/authors/wompmacho/page/1/index.html @@ -0,0 +1 @@ +https://wiki.wompmacho.com/authors/wompmacho/ \ No newline at end of file diff --git a/categories/index.html b/categories/index.html new file mode 100644 index 0000000..fee9453 --- /dev/null +++ b/categories/index.html @@ -0,0 +1,17 @@ +Categories · wiki.wompmacho.com
+Skip to main content

Categories

© +2026 +Michael

Powered by Hugo & Blowfish

\ No newline at end of file diff --git a/categories/index.xml b/categories/index.xml new file mode 100644 index 0000000..921da89 --- /dev/null +++ b/categories/index.xml @@ -0,0 +1 @@ +Categories on wiki.wompmacho.comhttps://wiki.wompmacho.com/categories/Recent content in Categories on wiki.wompmacho.comHugo -- gohugo.ioen© 2026 Michael \ No newline at end of file diff --git a/css/main.bundle.min.24854dde0af9d0619f56f3ba2a7101ac21aaa3fe2ccb639112fb1ccd8c44a8b2e9e043fd16fda8efbfe56cc94b58c4ba506ba4ac6fc876c397d04cd40b49ae17.css b/css/main.bundle.min.24854dde0af9d0619f56f3ba2a7101ac21aaa3fe2ccb639112fb1ccd8c44a8b2e9e043fd16fda8efbfe56cc94b58c4ba506ba4ac6fc876c397d04cd40b49ae17.css new file mode 100644 index 0000000..ff0cfec --- /dev/null +++ b/css/main.bundle.min.24854dde0af9d0619f56f3ba2a7101ac21aaa3fe2ccb639112fb1ccd8c44a8b2e9e043fd16fda8efbfe56cc94b58c4ba506ba4ac6fc876c397d04cd40b49ae17.css @@ -0,0 +1,178 @@ +:root{--color-neutral:255, 255, 255;--color-neutral-50:248, 250, 252;--color-neutral-100:241, 245, 249;--color-neutral-200:226, 232, 240;--color-neutral-300:203, 213, 225;--color-neutral-400:148, 163, 184;--color-neutral-500:100, 116, 139;--color-neutral-600:71, 85, 105;--color-neutral-700:51, 57, 65;--color-neutral-800:20, 25, 31;--color-neutral-900:15, 23, 42;--color-primary-50:226, 242, 255;--color-primary-100:186, 221, 255;--color-primary-200:141, 201, 255;--color-primary-300:91, 179, 255;--color-primary-400:50, 162, 255;--color-primary-500:0, 146, 255;--color-primary-600:23, 131, 255;--color-primary-700:31, 113, 235;--color-primary-800:35, 95, 216;--color-primary-900:38, 61, 185;--color-secondary-50:255, 236, 241;--color-secondary-100:255, 208, 218;--color-secondary-200:253, 157, 166;--color-secondary-300:249, 117, 130;--color-secondary-400:255, 79, 98;--color-secondary-500:255, 57, 73;--color-secondary-600:255, 48, 72;--color-secondary-700:237, 36, 65;--color-secondary-800:224, 27, 58;--color-secondary-900:209, 4, 45}/*!tailwindcss v4.1.18 | MIT License | https://tailwindcss.com*//*!Blowfish | MIT License | https://github.com/nunocoracao/blowfish*/@layer properties;@layer theme,base,components,utilities;@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace;--spacing:0.25rem;--container-2xs:18rem;--container-md:28rem;--container-xl:36rem;--container-3xl:48rem;--container-7xl:80rem;--text-xs:0.75rem;--text-xs--line-height:calc(1 / 0.75);--text-sm:0.875rem;--text-sm--line-height:calc(1.25 / 0.875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-0.025em;--tracking-normal:0em;--leading-snug:1.375;--leading-relaxed:1.625;--radius-md:0.375rem;--radius-lg:0.5rem;--radius-xl:0.75rem;--radius-2xl:1rem;--ease-in:cubic-bezier(0.4, 0, 1, 1);--ease-out:cubic-bezier(0, 0, 0.2, 1);--ease-in-out:cubic-bezier(0.4, 0, 0.2, 1);--animate-pulse:pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;--blur-sm:8px;--blur-xl:24px;--blur-2xl:40px;--aspect-video:16 / 9;--default-transition-duration:150ms;--default-transition-timing-function:cubic-bezier(0.4, 0, 0.2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,::after,::before,::backdrop,::file-selector-button{box-sizing:border-box;margin:0;padding:0;border:0 solid}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;tab-size:4;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea,::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;border-radius:0;background-color:initial;opacity:1}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports(not (-webkit-appearance:-apple-pay-button)) or (contain-intrinsic-size:1px){::placeholder{color:currentcolor;@supports(color:color-mix(in lab,red,red)){color: color-mix(in oklab,currentcolor 50%,transparent);}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]),::file-selector-button{appearance:button}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer utilities{.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border-width:0}.\!absolute{position:absolute!important}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing) * 0)}.inset-x-0{inset-inline:calc(var(--spacing) * 0)}.-start-6{inset-inline-start:calc(var(--spacing) * -6)}.start-\[calc\(max\(-50vw\,-800px\)\+50\%\)\]{inset-inline-start:calc(max(-50vw,-800px) + 50%)}.end-6{inset-inline-end:calc(var(--spacing) * 6)}.end-8{inset-inline-end:calc(var(--spacing) * 8)}.top-0{top:calc(var(--spacing) * 0)}.top-1\/2{top:calc(1/2 * 100%)}.top-5{top:calc(var(--spacing) * 5)}.top-20{top:calc(var(--spacing) * 20)}.right-0{right:calc(var(--spacing) * 0)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-6{bottom:calc(var(--spacing) * 6)}.bottom-24{bottom:calc(var(--spacing) * 24)}.left-0{left:calc(var(--spacing) * 0)}.left-1\/2{left:calc(1/2 * 100%)}.-z-10{z-index:calc(10 * -1)}.z-2{z-index:2}.z-10{z-index:10}.z-50{z-index:50}.z-80{z-index:80}.z-100{z-index:100}.z-500{z-index:500}.z-\[1\]{z-index:1}.z-\[999\]{z-index:999}.z-\[1040\]{z-index:1040}.z-\[1070\]{z-index:1070}.z-\[1080\]{z-index:1080}.order-first{order:-9999}.float-left{float:left}.container{width:100%;@media(width >= 640px){max-width: 640px;}@media(width >= 853px){max-width: 853px;}@media(width >= 1024px){max-width: 1024px;}@media(width >= 1280px){max-width: 1280px;}@media(width >= 1536px){max-width: 1536px;}}.\!-m-px{margin:-1px!important}.m-0{margin:calc(var(--spacing) * 0)}.m-1{margin:calc(var(--spacing) * 1)}.m-2{margin:calc(var(--spacing) * 2)}.m-300{margin:calc(var(--spacing) * 300)}.m-auto{margin:auto}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.mx-1{margin-inline:calc(var(--spacing) * 1)}.mx-\[3px\]{margin-inline:3px}.mx-\[15\%\]{margin-inline:15%}.mx-auto{margin-inline:auto}.my-0{margin-block:calc(var(--spacing) * 0)}.my-3{margin-block:calc(var(--spacing) * 3)}.-ms-5{margin-inline-start:calc(var(--spacing) * -5)}.ms-0{margin-inline-start:calc(var(--spacing) * 0)}.ms-2{margin-inline-start:calc(var(--spacing) * 2)}.ms-6{margin-inline-start:calc(var(--spacing) * 6)}.ms-7{margin-inline-start:calc(var(--spacing) * 7)}.ms-auto{margin-inline-start:auto}.-me-48{margin-inline-end:calc(var(--spacing) * -48)}.me-1{margin-inline-end:calc(var(--spacing) * 1)}.me-2{margin-inline-end:calc(var(--spacing) * 2)}.me-4{margin-inline-end:calc(var(--spacing) * 4)}.me-6{margin-inline-end:calc(var(--spacing) * 6)}.prose{color:var(--tw-prose-body);max-width:65ch; :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; margin-bottom: 1.25em; } :where([class~="lead"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-lead); font-size: 1.25em; line-height: 1.6; margin-top: 1.2em; margin-bottom: 1.2em; } :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-links); text-decoration: none; font-weight: 500; text-decoration-color: rgba(var(--color-primary-300), 1); &:hover { color: rgba(var(--color-primary-600), 1); text-decoration: none; border-radius: 0.09rem; } } :where(strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-bold); font-weight: 600; } :where(a strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(blockquote strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(thead th strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: decimal; margin-top: 1.25em; margin-bottom: 1.25em; padding-inline-start: 1.625em; } :where(ol[type="A"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-alpha; } :where(ol[type="a"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-alpha; } :where(ol[type="A" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-alpha; } :where(ol[type="a" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-alpha; } :where(ol[type="I"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-roman; } :where(ol[type="i"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-roman; } :where(ol[type="I" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: upper-roman; } :where(ol[type="i" s]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: lower-roman; } :where(ol[type="1"]):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: decimal; } :where(ul):not(:where([class~="not-prose"],[class~="not-prose"] *)) { list-style-type: disc; margin-top: 1.25em; margin-bottom: 1.25em; padding-inline-start: 1.625em; } :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker { font-weight: 400; color: var(--tw-prose-counters); } :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *))::marker { color: var(--tw-prose-bullets); } :where(dt):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; margin-top: 1.25em; } :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-color: var(--tw-prose-hr); border-top-width: 1px; margin-top: 3em; margin-bottom: 3em; border: 0.8px solid rgba(var(--color-neutral-300), 1); } :where(blockquote):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 500; font-style: italic; color: var(--tw-prose-quotes); border-inline-start-width: 0.25rem; border-inline-start-color: var(--tw-prose-quote-borders); quotes: "\201C""\201D""\2018""\2019"; margin-top: 1.6em; margin-bottom: 1.6em; padding-inline-start: 1em; } :where(blockquote p:first-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { content: open-quote; } :where(blockquote p:last-of-type):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { content: close-quote; } :where(h1):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 800; font-size: 2.25em; margin-top: 0; margin-bottom: 0.8888889em; line-height: 1.1111111; } :where(h1 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 900; color: inherit; } :where(h2):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 700; font-size: 1.5em; margin-top: 2em; margin-bottom: 1em; line-height: 1.3333333; } :where(h2 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 800; color: inherit; } :where(h3):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; font-size: 1.25em; margin-top: 1.6em; margin-bottom: 0.6em; line-height: 1.6; } :where(h3 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 700; color: inherit; } :where(h4):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; margin-top: 1.5em; margin-bottom: 0.5em; line-height: 1.5; } :where(h4 strong):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 700; color: inherit; } :where(img):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; } :where(picture):not(:where([class~="not-prose"],[class~="not-prose"] *)) { display: block; margin-top: 2em; margin-bottom: 2em; } :where(video):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; } :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { font-weight: 600; font-family: inherit; color: var(--tw-prose-kbd); box-shadow: 0 0 0 1px var(--tw-prose-kbd-shadows), 0 3px 0 var(--tw-prose-kbd-shadows); font-size: 0.9rem; border-radius: 0.25rem; padding-top: 0.1875em; padding-inline-end: 0.375em; padding-bottom: 0.1875em; padding-inline-start: 0.375em; background-color: rgba(var(--color-neutral-200), 1); padding: 0.1rem 0.4rem; } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-code); font-weight: 600; font-size: 0.875em; padding-top: 3px; padding-bottom: 3px; padding-left: 5px; padding-right: 5px; border-radius: 0.25rem; } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { content: "`"; display: none; } :where(code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { content: "`"; display: none; } :where(a code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-code); } :where(h1 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(h2 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; font-size: 0.875em; } :where(h3 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; font-size: 0.9em; } :where(h4 code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(blockquote code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(thead th code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: inherit; } :where(pre):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-pre-code); background-color: var(--tw-prose-pre-bg); overflow-x: auto; font-weight: 400; font-size: 0.875em; line-height: 1.7142857; margin-top: 1.7142857em; margin-bottom: 1.7142857em; border-radius: 0.375rem; padding-top: 0.8571429em; padding-inline-end: 1.1428571em; padding-bottom: 0.8571429em; padding-inline-start: 1.1428571em; } :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: transparent; border-width: 0; border-radius: 0; padding: 0; font-weight: inherit; color: inherit; font-size: inherit; font-family: inherit; line-height: inherit; } :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { content: none; } :where(pre code):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { content: none; } :where(table):not(:where([class~="not-prose"],[class~="not-prose"] *)) { width: 100%; table-layout: auto; margin-top: 2em; margin-bottom: 2em; font-size: 0.875em; line-height: 1.7142857; } :where(thead):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-bottom-width: 1px; border-bottom-color: var(--tw-prose-th-borders); } :where(thead th):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-headings); font-weight: 600; vertical-align: bottom; padding-inline-end: 0.5714286em; padding-bottom: 0.5714286em; padding-inline-start: 0.5714286em; } :where(tbody tr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-bottom-width: 1px; border-bottom-color: var(--tw-prose-td-borders); } :where(tbody tr:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-bottom-width: 0; } :where(tbody td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { vertical-align: baseline; } :where(tfoot):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border-top-width: 1px; border-top-color: var(--tw-prose-th-borders); } :where(tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { vertical-align: top; } :where(th, td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-align: start; } :where(figure > *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; margin-bottom: 0; } :where(figcaption):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: var(--tw-prose-captions); font-size: 0.875em; line-height: 1.4285714; margin-top: 0.8571429em; } --tw-prose-body: rgba(var(--color-neutral-700), 1);--tw-prose-headings:rgba(var(--color-neutral-800), 1);--tw-prose-lead:rgba(var(--color-neutral-500), 1);--tw-prose-links:rgba(var(--color-primary-600), 1);--tw-prose-bold:inherit;--tw-prose-counters:rgba(var(--color-neutral-800), 1);--tw-prose-bullets:rgba(var(--color-neutral-500), 1);--tw-prose-hr:oklch(92.8% 0.006 264.531);--tw-prose-quotes:rgba(var(--color-neutral-700), 1);--tw-prose-quote-borders:rgba(var(--color-primary-500), 1);--tw-prose-captions:rgba(var(--color-neutral-500), 1);--tw-prose-kbd:oklch(21% 0.034 264.665);--tw-prose-kbd-shadows:color-mix(in oklab, oklch(21% 0.034 264.665) 10%, transparent);--tw-prose-code:rgba(var(--color-secondary-700), 1);--tw-prose-pre-code:rgba(var(--color-neutral-700), 1);--tw-prose-pre-bg:rgba(var(--color-neutral-50), 1);--tw-prose-th-borders:rgba(var(--color-neutral-500), 1);--tw-prose-td-borders:rgba(var(--color-neutral-300), 1);--tw-prose-invert-body:rgba(var(--color-neutral-300), 1);--tw-prose-invert-headings:rgba(var(--color-neutral-50), 1);--tw-prose-invert-lead:rgba(var(--color-neutral-500), 1);--tw-prose-invert-links:rgba(var(--color-primary-400), 1);--tw-prose-invert-bold:rgba(var(--color-neutral), 1);--tw-prose-invert-counters:rgba(var(--color-neutral-400), 1);--tw-prose-invert-bullets:rgba(var(--color-neutral-600), 1);--tw-prose-invert-hr:oklch(37.3% 0.034 259.733);--tw-prose-invert-quotes:rgba(var(--color-neutral-200), 1);--tw-prose-invert-quote-borders:rgba(var(--color-primary-600), 1);--tw-prose-invert-captions:rgba(var(--color-neutral-400), 1);--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:rgb(255 255 255 / 10%);--tw-prose-invert-code:rgba(var(--color-secondary-400), 1);--tw-prose-invert-pre-code:rgba(var(--color-neutral-200), 1);--tw-prose-invert-pre-bg:rgba(var(--color-neutral-700), 1);--tw-prose-invert-th-borders:rgba(var(--color-neutral-500), 1);--tw-prose-invert-td-borders:rgba(var(--color-neutral-700), 1);font-size:1rem;line-height:1.75; :where(picture > img):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; margin-bottom: 0; } :where(li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.5em; margin-bottom: 0.5em; } :where(ol > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0.375em; } :where(ul > li):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0.375em; } :where(.prose > ul > li p):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.75em; margin-bottom: 0.75em; } :where(.prose > ul > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; } :where(.prose > ul > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-bottom: 1.25em; } :where(.prose > ol > li > p:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; } :where(.prose > ol > li > p:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-bottom: 1.25em; } :where(ul ul, ul ol, ol ul, ol ol):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.75em; margin-bottom: 0.75em; } :where(dl):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 1.25em; margin-bottom: 1.25em; } :where(dd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0.5em; padding-inline-start: 1.625em; } :where(hr + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(h2 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(h3 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(h4 + *):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(thead th:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0; } :where(thead th:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-end: 0; } :where(tbody td, tfoot td):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-top: 0.5714286em; padding-inline-end: 0.5714286em; padding-bottom: 0.5714286em; padding-inline-start: 0.5714286em; } :where(tbody td:first-child, tfoot td:first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-start: 0; } :where(tbody td:last-child, tfoot td:last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { padding-inline-end: 0; } :where(figure):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 2em; margin-bottom: 2em; } :where(.prose > :first-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-top: 0; } :where(.prose > :last-child):not(:where([class~="not-prose"],[class~="not-prose"] *)) { margin-bottom: 0; } :where(mark):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: rgba(var(--color-neutral-800), 1); background-color: rgba(var(--color-primary-600), 1); padding: 0.1rem 0.2rem; border-radius: 0.25rem; } :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))::before { display: none; } :where(p):not(:where([class~="not-prose"],[class~="not-prose"] *))::after { display: none; } :where(a.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-600), 1); } :where(p.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-600), 1); }}.\!mt-0{margin-top:calc(var(--spacing) * 0)!important}.-mt-\[2px\]{margin-top:calc(2px * -1)}.-mt-\[15px\]{margin-top:calc(15px * -1)}.mt-0{margin-top:calc(var(--spacing) * 0)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-8{margin-top:calc(var(--spacing) * 8)}.mt-10{margin-top:calc(var(--spacing) * 10)}.mt-12{margin-top:calc(var(--spacing) * 12)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mt-20{margin-top:calc(var(--spacing) * 20)}.mt-\[0\.5rem\]{margin-top:.5rem}.-mr-\[100\%\]{margin-right:calc(100% * -1)}.mr-0{margin-right:calc(var(--spacing) * 0)}.mr-1{margin-right:calc(var(--spacing) * 1)}.mr-2{margin-right:calc(var(--spacing) * 2)}.mr-3{margin-right:calc(var(--spacing) * 3)}.mr-5{margin-right:calc(var(--spacing) * 5)}.\!mb-0{margin-bottom:calc(var(--spacing) * 0)!important}.\!mb-9{margin-bottom:calc(var(--spacing) * 9)!important}.-mb-1{margin-bottom:calc(var(--spacing) * -1)}.mb-0{margin-bottom:calc(var(--spacing) * 0)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.mb-16{margin-bottom:calc(var(--spacing) * 16)}.mb-20{margin-bottom:calc(var(--spacing) * 20)}.mb-\[2px\]{margin-bottom:2px}.ml-0{margin-left:calc(var(--spacing) * 0)}.ml-2{margin-left:calc(var(--spacing) * 2)}.box-border{box-sizing:border-box}.box-content{box-sizing:content-box}.scrollbar{&::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}&::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}&::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}@supports(-moz-appearance:none){scrollbar-width: auto; scrollbar-color: var(--scrollbar-thumb,initial) var(--scrollbar-track,initial);}&::-webkit-scrollbar{display:block;width:var(--scrollbar-width,16px);height:var(--scrollbar-height,16px)}}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.line-clamp-5{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:5}.\!block{display:block!important}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.table-cell{display:table-cell}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1/1}.aspect-video{aspect-ratio:var(--aspect-video)}.size-1{width:calc(var(--spacing) * 1);height:calc(var(--spacing) * 1)}.\!h-px{height:1px!important}.h-0{height:calc(var(--spacing) * 0)}.h-1\/2{height:calc(1/2 * 100%)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-14{height:calc(var(--spacing) * 14)}.h-16{height:calc(var(--spacing) * 16)}.h-24{height:calc(var(--spacing) * 24)}.h-36{height:calc(var(--spacing) * 36)}.h-40{height:calc(var(--spacing) * 40)}.h-48{height:calc(var(--spacing) * 48)}.h-84{height:calc(var(--spacing) * 84)}.h-\[3px\]{height:3px}.h-\[150px\]{height:150px}.h-\[800px\]{height:800px}.h-\[1000px\]{height:1e3px}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.max-h-3{max-height:calc(var(--spacing) * 3)}.max-h-20{max-height:calc(var(--spacing) * 20)}.min-h-0{min-height:calc(var(--spacing) * 0)}.min-h-\[130px\]{min-height:130px}.min-h-\[148px\]{min-height:148px}.min-h-full{min-height:100%}.\!w-px{width:1px!important}.w-0{width:calc(var(--spacing) * 0)}.w-2{width:calc(var(--spacing) * 2)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-36{width:calc(var(--spacing) * 36)}.w-80{width:calc(var(--spacing) * 80)}.w-\[15\%\]{width:15%}.w-\[30px\]{width:30px}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.max-w-3xl{max-width:var(--container-3xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-20{max-width:calc(var(--spacing) * 20)}.max-w-\[200px\]{max-width:200px}.max-w-\[267px\]{max-width:267px}.max-w-\[1600px\]{max-width:1600px}.max-w-\[calc\(100\%-1rem\)\]{max-width:calc(100% - 1rem)}.max-w-fit{max-width:fit-content}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-prose{max-width:65ch}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[1\.8rem\]{min-width:1.8rem}.min-w-\[30px\]{min-width:30px}.min-w-\[220px\]{min-width:220px}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-auto{flex:auto}.flex-initial{flex:0 auto}.flex-none{flex:none}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-auto{flex-basis:auto}.-translate-x-1\/2{--tw-translate-x:calc(calc(1/2 * 100%) * -1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1/2 * 100%) * -1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-8{--tw-translate-y:calc(var(--spacing) * -8);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-4{--tw-translate-y:calc(var(--spacing) * 4);translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-\[1\.02\]{scale:1.02}.-rotate-90{rotate:calc(90deg * -1)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform\!{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)!important}.transform-none{transform:none}.animate-pulse{animation:var(--animate-pulse)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-none{touch-action:none}.resize{resize:both}.list-none{list-style-type:none}.appearance-none{appearance:none}.grid-rows-\[0fr\]{grid-template-rows:0fr}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.space-y-2{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-3{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-5{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-6{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))); }}.space-y-10{ :where(& > :not(:last-child)) { --tw-space-y-reverse: 0; margin-block-start: calc(calc(var(--spacing) * 10) * var(--tw-space-y-reverse)); margin-block-end: calc(calc(var(--spacing) * 10) * calc(1 - var(--tw-space-y-reverse))); }}.gap-x-5{column-gap:calc(var(--spacing) * 5)}.gap-x-6{column-gap:calc(var(--spacing) * 6)}.space-x-2{ :where(& > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse))); }}.space-x-3{ :where(& > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse))); }}.space-x-5{ :where(& > :not(:last-child)) { --tw-space-x-reverse: 0; margin-inline-start: calc(calc(var(--spacing) * 5) * var(--tw-space-x-reverse)); margin-inline-end: calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-x-reverse))); }}.place-self-center{place-self:center}.self-center{align-self:center}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.\!overflow-hidden{overflow:hidden!important}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.scroll-smooth{scroll-behavior:smooth}.\!rounded-md{border-radius:var(--radius-md)!important}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[50\%\]{border-radius:50%}.rounded-full{border-radius:calc(infinity * 1px)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-s-\[0\.25rem\]{border-start-start-radius:.25rem;border-end-start-radius:.25rem}.rounded-e-\[0\.25rem\]{border-start-end-radius:.25rem;border-end-end-radius:.25rem}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.\!border-0{border-style:var(--tw-border-style)!important;border-width:0!important}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-y-\[10px\]{border-block-style:var(--tw-border-style);border-block-width:10px}.border-s-0{border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}.border-s-1{border-inline-start-style:var(--tw-border-style);border-inline-start-width:1px}.border-s-2{border-inline-start-style:var(--tw-border-style);border-inline-start-width:2px}.border-s-\[0\.125rem\]{border-inline-start-style:var(--tw-border-style);border-inline-start-width:.125rem}.border-e-0{border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-neutral-100{border-color:rgba(var(--color-neutral-100),1)}.border-neutral-200{border-color:rgba(var(--color-neutral-200),1)}.border-neutral-300{border-color:rgba(var(--color-neutral-300),1)}.border-primary-400{border-color:rgba(var(--color-primary-400),1)}.border-primary-500{border-color:rgba(var(--color-primary-500),1)}.border-secondary-500{border-color:rgba(var(--color-secondary-500),1)}.border-transparent{border-color:transparent}.prose-invert{--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders); :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-neutral-600), 1); &:hover { color: rgba(var(--color-primary-400), 1); } } :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: rgba(var(--color-neutral-200), 1); background-color: rgba(var(--color-neutral-700), 1); } :where(mark):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: rgba(var(--color-primary-400), 1); } :where(code:not(pre code)):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: color-mix(in oklab, oklch(21% 0.006 285.885) 70%, transparent); } :where(a.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-400), 1); } :where(p.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-400), 1); } :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border: 0.8px solid rgba(var(--color-neutral-500), 1); }}.bg-\[\#6d6d6d\]{background-color:#6d6d6d}.bg-black{background-color:#000}.bg-neutral{background-color:rgba(var(--color-neutral),1)}.bg-neutral-50{background-color:rgba(var(--color-neutral-50),1)}.bg-neutral-50\/97{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-50),1),1) 97%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-50),1) 97%,transparent);}}.bg-neutral-100{background-color:rgba(var(--color-neutral-100),1)}.bg-neutral-100\/75{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-100),1),1) 75%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-100),1) 75%,transparent);}}.bg-neutral-300{background-color:rgba(var(--color-neutral-300),1)}.bg-neutral-500\/50{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-500),1),1) 50%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-500),1) 50%,transparent);}}.bg-neutral\/25{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral),1),1) 25%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral),1) 25%,transparent);}}.bg-neutral\/50{background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral),1),1) 50%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral),1) 50%,transparent);}}.bg-primary-100{background-color:rgba(var(--color-primary-100),1)}.bg-primary-200{background-color:rgba(var(--color-primary-200),1)}.bg-primary-200\/80{background-color:color-mix(in srgb,rgba(rgba(var(--color-primary-200),1),1) 80%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-primary-200),1) 80%,transparent);}}.bg-primary-500{background-color:rgba(var(--color-primary-500),1)}.bg-primary-600{background-color:rgba(var(--color-primary-600),1)}.bg-transparent{background-color:initial}.bg-white{background-color:#fff}.bg-linear-60{--tw-gradient-position:60deg;@supports(background-image:linear-gradient(in lab,red,red)){--tw-gradient-position: 60deg in oklab;}background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-none{background-image:none}.from-neutral{--tw-gradient-from:rgba(var(--color-neutral), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-primary-500{--tw-gradient-from:rgba(var(--color-primary-500), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-60\%{--tw-gradient-from-position:60%}.to-neutral{--tw-gradient-to:rgba(var(--color-neutral), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-neutral-100{--tw-gradient-to:rgba(var(--color-neutral-100), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-secondary-600{--tw-gradient-to:rgba(var(--color-secondary-600), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.bg-clip-padding{background-clip:padding-box}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-fill{object-fit:fill}.object-scale-down{object-fit:scale-down}.object-left{object-position:left}.\!p-0{padding:calc(var(--spacing) * 0)!important}.p-0{padding:calc(var(--spacing) * 0)}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:calc(var(--spacing) * 0)}.px-1{padding-inline:calc(var(--spacing) * 1)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-\[0\.4rem\]{padding-inline:.4rem}.px-\[30px\]{padding-inline:30px}.py-1{padding-block:calc(var(--spacing) * 1)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-20{padding-block:calc(var(--spacing) * 20)}.py-\[0\.4rem\]{padding-block:.4rem}.py-\[1px\]{padding-block:1px}.ps-2{padding-inline-start:calc(var(--spacing) * 2)}.ps-5{padding-inline-start:calc(var(--spacing) * 5)}.pe-2{padding-inline-end:calc(var(--spacing) * 2)}.pe-3{padding-inline-end:calc(var(--spacing) * 3)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-8{padding-top:calc(var(--spacing) * 8)}.pt-16{padding-top:calc(var(--spacing) * 16)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-32{padding-bottom:calc(var(--spacing) * 32)}.pl-0{padding-left:calc(var(--spacing) * 0)}.text-center{text-align:center}.text-end{text-align:end}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.-indent-\[999px\]{text-indent:calc(999px * -1)}.align-bottom{vertical-align:bottom}.align-middle{vertical-align:middle}.align-text-bottom{vertical-align:text-bottom}.align-top{vertical-align:top}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.6rem\]{font-size:.6rem}.leading-3{--tw-leading:calc(var(--spacing) * 3);line-height:calc(var(--spacing) * 3)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-7{--tw-leading:calc(var(--spacing) * 7);line-height:calc(var(--spacing) * 7)}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.text-wrap{text-wrap:wrap}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.\!whitespace-nowrap{white-space:nowrap!important}.whitespace-normal{white-space:normal}.\!text-neutral{color:rgba(var(--color-neutral),1)!important}.text-inherit{color:inherit}.text-neutral-50{color:rgba(var(--color-neutral-50),1)}.text-neutral-200{color:rgba(var(--color-neutral-200),1)}.text-neutral-300{color:rgba(var(--color-neutral-300),1)}.text-neutral-400{color:rgba(var(--color-neutral-400),1)}.text-neutral-500{color:rgba(var(--color-neutral-500),1)}.text-neutral-600{color:rgba(var(--color-neutral-600),1)}.text-neutral-700{color:rgba(var(--color-neutral-700),1)}.text-neutral-800{color:rgba(var(--color-neutral-800),1)}.text-neutral-900{color:rgba(var(--color-neutral-900),1)}.text-primary-100{color:rgba(var(--color-primary-100),1)}.text-primary-300{color:rgba(var(--color-primary-300),1)}.text-primary-400{color:rgba(var(--color-primary-400),1)}.text-primary-500{color:rgba(var(--color-primary-500),1)}.text-primary-600{color:rgba(var(--color-primary-600),1)}.text-primary-700{color:rgba(var(--color-primary-700),1)}.text-primary-800{color:rgba(var(--color-primary-800),1)}.text-transparent{color:transparent}.text-white{color:#fff}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.ordinal{--tw-ordinal:ordinal;font-variant-numeric:var(--tw-ordinal,)var(--tw-slashed-zero,)var(--tw-numeric-figure,)var(--tw-numeric-spacing,)var(--tw-numeric-fraction,)}.\!no-underline{text-decoration-line:none!important}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.decoration-neutral-300{text-decoration-color:rgba(var(--color-neutral-300),1)}.decoration-primary-500{text-decoration-color:rgba(var(--color-primary-500),1)}.underline-offset-auto{text-underline-offset:auto}.\!opacity-0{opacity:0%!important}.\!opacity-100{opacity:100%!important}.opacity-0{opacity:0%}.opacity-30{opacity:30%}.opacity-50{opacity:50%}.opacity-60{opacity:60%}.opacity-65{opacity:65%}.opacity-100{opacity:100%}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-normal{mix-blend-mode:normal}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color, rgb(0 0 0 / 0.25));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 8px 10px -6px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-primary-500{--tw-ring-color:rgba(var(--color-primary-500), 1)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur\!{--tw-blur:blur(8px) !important;filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)!important}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter\!{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)!important}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(var(--blur-2xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-112{--tw-backdrop-brightness:brightness(112%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-220{--tw-backdrop-saturate:saturate(220%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[grid-template-rows\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[height\]{transition-property:height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[opacity\,visibility\]{transition-property:opacity,visibility;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[transform\,_opacity\]{transition-property:transform,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[width\]{transition-property:width;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:150ms;transition-duration:150ms}.duration-200{--tw-duration:200ms;transition-duration:200ms}.duration-300{--tw-duration:300ms;transition-duration:300ms}.duration-\[350ms\]{--tw-duration:350ms;transition-duration:350ms}.duration-\[600ms\]{--tw-duration:600ms;transition-duration:600ms}.ease-\[cubic-bezier\(0\,0\,0\.15\,1\)\,_cubic-bezier\(0\,0\,0\.15\,1\)\]{--tw-ease:cubic-bezier(0,0,0.15,1), cubic-bezier(0,0,0.15,1);transition-timing-function:cubic-bezier(0,0,.15,1),cubic-bezier(0,0,.15,1)}.ease-\[cubic-bezier\(0\.25\,0\.1\,0\.25\,1\.0\)\]{--tw-ease:cubic-bezier(0.25,0.1,0.25,1.0);transition-timing-function:cubic-bezier(.25,.1,.25,1)}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.select-none{-webkit-user-select:none;user-select:none}.\!\[clip\:rect\(0\,0\,0\,0\)\]{clip:rect(0,0,0,0)!important}.group-open\:rotate-0{&:is(:where(.group):is([open], :popover-open, :open) *){rotate:0}}.group-hover\:scale-110{&:is(:where(.group):hover *){@media(hover:hover){--tw-scale-x: 110%; --tw-scale-y: 110%; --tw-scale-z: 110%; scale: var(--tw-scale-x) var(--tw-scale-y);}}}.group-hover\:text-primary-500{&:is(:where(.group):hover *){@media(hover:hover){color: rgba(var(--color-primary-500),1);}}}.group-hover\:opacity-100{&:is(:where(.group):hover *){@media(hover:hover){opacity: 100%;}}}.group-hover\:ring-2{&:is(:where(.group):hover *){@media(hover:hover){--tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px+var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor); box-shadow: var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);}}}.group-hover\:ring-primary-500{&:is(:where(.group):hover *){@media(hover:hover){--tw-ring-color: rgba(var(--color-primary-500),1);}}}.group-data-\[twe-input-focused\]\:border-x-0{&:is(:where(.group)[data-twe-input-focused] *){border-inline-style:var(--tw-border-style);border-inline-width:0}}.group-data-\[twe-input-focused\]\:border-s-0{&:is(:where(.group)[data-twe-input-focused] *){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}}.group-data-\[twe-input-focused\]\:border-e-0{&:is(:where(.group)[data-twe-input-focused] *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}}.group-data-\[twe-input-focused\]\:border-t{&:is(:where(.group)[data-twe-input-focused] *){border-top-style:var(--tw-border-style);border-top-width:1px}}.group-data-\[twe-input-focused\]\:border-solid{&:is(:where(.group)[data-twe-input-focused] *){--tw-border-style:solid;border-style:solid}}.group-data-\[twe-input-focused\]\:border-white{&:is(:where(.group)[data-twe-input-focused] *){border-color:#fff}}.group-data-\[twe-input-focused\]\:border-t-transparent{&:is(:where(.group)[data-twe-input-focused] *){border-top-color:transparent}}.group-data-\[twe-input-focused\]\:shadow-white{&:is(:where(.group)[data-twe-input-focused] *){--tw-shadow-color:#fff;@supports(color:color-mix(in lab,red,red)){--tw-shadow-color: color-mix(in oklab,#fff var(--tw-shadow-alpha),transparent);}}}.group-data-\[twe-input-state-active\]\:border-x-0{&:is(:where(.group)[data-twe-input-state-active] *){border-inline-style:var(--tw-border-style);border-inline-width:0}}.group-data-\[twe-input-state-active\]\:border-s-0{&:is(:where(.group)[data-twe-input-state-active] *){border-inline-start-style:var(--tw-border-style);border-inline-start-width:0}}.group-data-\[twe-input-state-active\]\:border-e-0{&:is(:where(.group)[data-twe-input-state-active] *){border-inline-end-style:var(--tw-border-style);border-inline-end-width:0}}.group-data-\[twe-input-state-active\]\:border-t{&:is(:where(.group)[data-twe-input-state-active] *){border-top-style:var(--tw-border-style);border-top-width:1px}}.group-data-\[twe-input-state-active\]\:border-solid{&:is(:where(.group)[data-twe-input-state-active] *){--tw-border-style:solid;border-style:solid}}.group-data-\[twe-input-state-active\]\:border-t-transparent{&:is(:where(.group)[data-twe-input-state-active] *){border-top-color:transparent}}.peer-checked\:visible{&:is(:where(.peer):checked ~ *){visibility:visible}}.peer-checked\:opacity-100{&:is(:where(.peer):checked ~ *){opacity:100%}}.peer-checked\/full\:grid-rows-\[1fr\]{&:is(:where(.peer\/full):checked ~ *){grid-template-rows:1fr}}.before\:absolute{&::before{content:var(--tw-content);position:absolute}}.before\:inset-0{&::before{content:var(--tw-content);inset:calc(var(--spacing) * 0)}}.after\:clear-both{&::after{content:var(--tw-content);clear:both}}.after\:block{&::after{content:var(--tw-content);display:block}}.after\:content-\[\'\'\]{&::after{--tw-content:'';content:var(--tw-content)}}.first\:mt-8{&:first-child{margin-top:calc(var(--spacing) * 8)}}.empty\:hidden{&:empty{display:none}}.hover\:border-transparent{&:hover{@media(hover:hover){border-color: transparent;}}}.hover\:\!bg-primary-500{&:hover{@media(hover:hover){background-color: rgba(var(--color-primary-500),1) !important;}}}.hover\:bg-neutral-200{&:hover{@media(hover:hover){background-color: rgba(var(--color-neutral-200),1);}}}.hover\:bg-primary-100{&:hover{@media(hover:hover){background-color: rgba(var(--color-primary-100),1);}}}.hover\:bg-primary-500{&:hover{@media(hover:hover){background-color: rgba(var(--color-primary-500),1);}}}.hover\:bg-primary-600{&:hover{@media(hover:hover){background-color: rgba(var(--color-primary-600),1);}}}.hover\:text-neutral{&:hover{@media(hover:hover){color: rgba(var(--color-neutral),1);}}}.hover\:text-neutral-700{&:hover{@media(hover:hover){color: rgba(var(--color-neutral-700),1);}}}.hover\:text-primary-400{&:hover{@media(hover:hover){color: rgba(var(--color-primary-400),1);}}}.hover\:text-primary-500{&:hover{@media(hover:hover){color: rgba(var(--color-primary-500),1);}}}.hover\:text-primary-600{&:hover{@media(hover:hover){color: rgba(var(--color-primary-600),1);}}}.hover\:text-primary-700{&:hover{@media(hover:hover){color: rgba(var(--color-primary-700),1);}}}.hover\:no-underline{&:hover{@media(hover:hover){text-decoration-line: none;}}}.hover\:underline{&:hover{@media(hover:hover){text-decoration-line: underline;}}}.hover\:decoration-primary-400{&:hover{@media(hover:hover){text-decoration-color: rgba(var(--color-primary-400),1);}}}.hover\:decoration-2{&:hover{@media(hover:hover){text-decoration-thickness: 2px;}}}.hover\:underline-offset-2{&:hover{@media(hover:hover){text-underline-offset: 2px;}}}.hover\:opacity-90{&:hover{@media(hover:hover){opacity: 90%;}}}.hover\:outline-none{&:hover{@media(hover:hover){--tw-outline-style: none; outline-style: none;}}}.focus\:translate-y-0{&:focus{--tw-translate-y:calc(var(--spacing) * 0);translate:var(--tw-translate-x)var(--tw-translate-y)}}.focus\:border-primary-500{&:focus{border-color:rgba(var(--color-primary-500),1)}}.focus\:bg-primary-100{&:focus{background-color:rgba(var(--color-primary-100),1)}}.focus\:no-underline{&:focus{text-decoration-line:none}}.focus\:opacity-90{&:focus{opacity:90%}}.focus\:ring-primary-500{&:focus{--tw-ring-color:rgba(var(--color-primary-500), 1)}}.focus\:outline-2{&:focus{outline-style:var(--tw-outline-style);outline-width:2px}}.focus\:outline-transparent{&:focus{outline-color:transparent}}.focus\:outline-dotted{&:focus{--tw-outline-style:dotted;outline-style:dotted}}.focus\:outline-none{&:focus{--tw-outline-style:none;outline-style:none}}.data-\[popper-reference-hidden\]\:hidden{&[data-popper-reference-hidden]{display:none}}.data-\[twe-carousel-fade\]\:z-0{&[data-twe-carousel-fade]{z-index:0}}.data-\[twe-carousel-fade\]\:z-\[1\]{&[data-twe-carousel-fade]{z-index:1}}.data-\[twe-carousel-fade\]\:opacity-0{&[data-twe-carousel-fade]{opacity:0%}}.data-\[twe-carousel-fade\]\:opacity-100{&[data-twe-carousel-fade]{opacity:100%}}.data-\[twe-carousel-fade\]\:delay-600{&[data-twe-carousel-fade]{transition-delay:600ms}}.data-\[twe-carousel-fade\]\:duration-\[600ms\]{&[data-twe-carousel-fade]{--tw-duration:600ms;transition-duration:600ms}}.motion-reduce\:transition-none{@media(prefers-reduced-motion:reduce){transition-property: none;}}.sm\:me-7{@media(width >= 640px){margin-inline-end: calc(var(--spacing) * 7);}}.sm\:mt-16{@media(width >= 640px){margin-top: calc(var(--spacing) * 16);}}.sm\:mb-0{@media(width >= 640px){margin-bottom: calc(var(--spacing) * 0);}}.sm\:w-1\/2{@media(width >= 640px){width: calc(1/2 * 100%);}}.sm\:grid-cols-2{@media(width >= 640px){grid-template-columns: repeat(2,minmax(0,1fr));}}.sm\:flex-row{@media(width >= 640px){flex-direction: row;}}.sm\:overflow-hidden{@media(width >= 640px){overflow: hidden;}}.sm\:p-6{@media(width >= 640px){padding: calc(var(--spacing) * 6);}}.sm\:px-6{@media(width >= 640px){padding-inline: calc(var(--spacing) * 6);}}.sm\:px-14{@media(width >= 640px){padding-inline: calc(var(--spacing) * 14);}}.sm\:py-24{@media(width >= 640px){padding-block: calc(var(--spacing) * 24);}}.sm\:text-lg{@media(width >= 640px){font-size: var(--text-lg); line-height: var(--tw-leading,var(--text-lg--line-height));}}.sm\:last\:me-0{@media(width >= 640px){&:last-child{margin-inline-end:calc(var(--spacing) * 0)}}}.md\:-me-16{@media(width >= 853px){margin-inline-end: calc(var(--spacing) * -16);}}.md\:mt-0{@media(width >= 853px){margin-top: calc(var(--spacing) * 0);}}.md\:mr-7{@media(width >= 853px){margin-right: calc(var(--spacing) * 7);}}.md\:flex{@media(width >= 853px){display: flex;}}.md\:hidden{@media(width >= 853px){display: none;}}.md\:h-56{@media(width >= 853px){height: calc(var(--spacing) * 56);}}.md\:h-\[200px\]{@media(width >= 853px){height: 200px;}}.md\:w-1\/3{@media(width >= 853px){width: calc(1/3 * 100%);}}.md\:w-auto{@media(width >= 853px){width: auto;}}.md\:grid-cols-3{@media(width >= 853px){grid-template-columns: repeat(3,minmax(0,1fr));}}.md\:flex-row{@media(width >= 853px){flex-direction: row;}}.md\:justify-start{@media(width >= 853px){justify-content: flex-start;}}.md\:p-\[10vh\]{@media(width >= 853px){padding: 10vh;}}.md\:px-24{@media(width >= 853px){padding-inline: calc(var(--spacing) * 24);}}.lg\:absolute{@media(width >= 1024px){position: absolute;}}.lg\:relative{@media(width >= 1024px){position: relative;}}.lg\:sticky{@media(width >= 1024px){position: sticky;}}.lg\:top-10{@media(width >= 1024px){top: calc(var(--spacing) * 10);}}.lg\:top-\[140px\]{@media(width >= 1024px){top: 140px;}}.lg\:order-last{@media(width >= 1024px){order: 9999;}}.lg\:m-0{@media(width >= 1024px){margin: calc(var(--spacing) * 0);}}.lg\:mx-0{@media(width >= 1024px){margin-inline: calc(var(--spacing) * 0);}}.lg\:mx-auto{@media(width >= 1024px){margin-inline: auto;}}.lg\:ms-auto{@media(width >= 1024px){margin-inline-start: auto;}}.lg\:mt-0{@media(width >= 1024px){margin-top: calc(var(--spacing) * 0);}}.lg\:block{@media(width >= 1024px){display: block;}}.lg\:grid{@media(width >= 1024px){display: grid;}}.lg\:hidden{@media(width >= 1024px){display: none;}}.lg\:h-72{@media(width >= 1024px){height: calc(var(--spacing) * 72);}}.lg\:h-full{@media(width >= 1024px){height: 100%;}}.lg\:w-1\/4{@media(width >= 1024px){width: calc(1/4 * 100%);}}.lg\:w-auto{@media(width >= 1024px){width: auto;}}.lg\:max-w-2xs{@media(width >= 1024px){max-width: var(--container-2xs);}}.lg\:max-w-7xl{@media(width >= 1024px){max-width: var(--container-7xl);}}.lg\:max-w-none{@media(width >= 1024px){max-width: none;}}.lg\:grid-flow-col-dense{@media(width >= 1024px){grid-auto-flow: column dense;}}.lg\:grid-cols-2{@media(width >= 1024px){grid-template-columns: repeat(2,minmax(0,1fr));}}.lg\:flex-row{@media(width >= 1024px){flex-direction: row;}}.lg\:gap-24{@media(width >= 1024px){gap: calc(var(--spacing) * 24);}}.lg\:p-\[12vh\]{@media(width >= 1024px){padding: 12vh;}}.lg\:px-0{@media(width >= 1024px){padding-inline: calc(var(--spacing) * 0);}}.lg\:px-8{@media(width >= 1024px){padding-inline: calc(var(--spacing) * 8);}}.lg\:px-32{@media(width >= 1024px){padding-inline: calc(var(--spacing) * 32);}}.lg\:py-16{@media(width >= 1024px){padding-block: calc(var(--spacing) * 16);}}.lg\:py-32{@media(width >= 1024px){padding-block: calc(var(--spacing) * 32);}}.lg\:ps-8{@media(width >= 1024px){padding-inline-start: calc(var(--spacing) * 8);}}.xl\:w-1\/4{@media(width >= 1280px){width: calc(1/4 * 100%);}}.xl\:grid-cols-4{@media(width >= 1280px){grid-template-columns: repeat(4,minmax(0,1fr));}}.\32 xl\:grid-cols-5{@media(width >= 1536px){grid-template-columns: repeat(5,minmax(0,1fr));}}.ltr\:-ml-12{&:where(:dir(ltr), [dir=ltr], [dir=ltr] *){margin-left:calc(var(--spacing) * -12)}}.ltr\:block{&:where(:dir(ltr), [dir=ltr], [dir=ltr] *){display:block}}.ltr\:hidden{&:where(:dir(ltr), [dir=ltr], [dir=ltr] *){display:none}}.rtl\:-mr-\[79px\]{&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){margin-right:calc(79px * -1)}}.rtl\:block{&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){display:block}}.rtl\:hidden{&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){display:none}}.rtl\:rotate-180{&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){rotate:180deg}}.dark\:block{&:is(.dark *){display:block}}.dark\:flex{&:is(.dark *){display:flex}}.dark\:hidden{&:is(.dark *){display:none}}.dark\:border-neutral-400{&:is(.dark *){border-color:rgba(var(--color-neutral-400),1)}}.dark\:border-neutral-600{&:is(.dark *){border-color:rgba(var(--color-neutral-600),1)}}.dark\:border-neutral-700{&:is(.dark *){border-color:rgba(var(--color-neutral-700),1)}}.dark\:border-primary-300{&:is(.dark *){border-color:rgba(var(--color-primary-300),1)}}.dark\:border-primary-600{&:is(.dark *){border-color:rgba(var(--color-primary-600),1)}}.dark\:border-white\/10{&:is(.dark *){border-color:color-mix(in oklab,#fff 10%,transparent)}}.dark\:prose-invert{&:is(.dark *){--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders); :where(a):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-neutral-600), 1); &:hover { color: rgba(var(--color-primary-400), 1); } } :where(kbd):not(:where([class~="not-prose"],[class~="not-prose"] *)) { color: rgba(var(--color-neutral-200), 1); background-color: rgba(var(--color-neutral-700), 1); } :where(mark):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: rgba(var(--color-primary-400), 1); } :where(code:not(pre code)):not(:where([class~="not-prose"],[class~="not-prose"] *)) { background-color: color-mix(in oklab, oklch(21% 0.006 285.885) 70%, transparent); } :where(a.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-400), 1); } :where(p.active):not(:where([class~="not-prose"],[class~="not-prose"] *)) { text-decoration-color: rgba(var(--color-primary-400), 1); } :where(hr):not(:where([class~="not-prose"],[class~="not-prose"] *)) { border: 0.8px solid rgba(var(--color-neutral-500), 1); }}}.dark\:bg-neutral-400{&:is(.dark *){background-color:rgba(var(--color-neutral-400),1)}}.dark\:bg-neutral-600{&:is(.dark *){background-color:rgba(var(--color-neutral-600),1)}}.dark\:bg-neutral-700{&:is(.dark *){background-color:rgba(var(--color-neutral-700),1)}}.dark\:bg-neutral-800{&:is(.dark *){background-color:rgba(var(--color-neutral-800),1)}}.dark\:bg-neutral-800\/25{&:is(.dark *){background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-800),1),1) 25%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-800),1) 25%,transparent);}}}.dark\:bg-neutral-800\/50{&:is(.dark *){background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-800),1),1) 50%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-800),1) 50%,transparent);}}}.dark\:bg-neutral-800\/60{&:is(.dark *){background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-800),1),1) 60%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-800),1) 60%,transparent);}}}.dark\:bg-neutral-900{&:is(.dark *){background-color:rgba(var(--color-neutral-900),1)}}.dark\:bg-neutral-900\/50{&:is(.dark *){background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-900),1),1) 50%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-900),1) 50%,transparent);}}}.dark\:bg-neutral-900\/99{&:is(.dark *){background-color:color-mix(in srgb,rgba(rgba(var(--color-neutral-900),1),1) 99%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-neutral-900),1) 99%,transparent);}}}.dark\:bg-primary-300{&:is(.dark *){background-color:rgba(var(--color-primary-300),1)}}.dark\:bg-primary-400{&:is(.dark *){background-color:rgba(var(--color-primary-400),1)}}.dark\:bg-primary-800{&:is(.dark *){background-color:rgba(var(--color-primary-800),1)}}.dark\:bg-primary-800\/30{&:is(.dark *){background-color:color-mix(in srgb,rgba(rgba(var(--color-primary-800),1),1) 30%,transparent);@supports(color:color-mix(in lab,red,red)){background-color: color-mix(in oklab,rgba(var(--color-primary-800),1) 30%,transparent);}}}.dark\:bg-primary-900{&:is(.dark *){background-color:rgba(var(--color-primary-900),1)}}.dark\:from-neutral-800{&:is(.dark *){--tw-gradient-from:rgba(var(--color-neutral-800), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}}.dark\:from-primary-600{&:is(.dark *){--tw-gradient-from:rgba(var(--color-primary-600), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}}.dark\:to-neutral-800{&:is(.dark *){--tw-gradient-to:rgba(var(--color-neutral-800), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}}.dark\:to-secondary-800{&:is(.dark *){--tw-gradient-to:rgba(var(--color-secondary-800), 1);--tw-gradient-stops:var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}}.dark\:text-neutral{&:is(.dark *){color:rgba(var(--color-neutral),1)}}.dark\:text-neutral-100{&:is(.dark *){color:rgba(var(--color-neutral-100),1)}}.dark\:text-neutral-200{&:is(.dark *){color:rgba(var(--color-neutral-200),1)}}.dark\:text-neutral-300{&:is(.dark *){color:rgba(var(--color-neutral-300),1)}}.dark\:text-neutral-400{&:is(.dark *){color:rgba(var(--color-neutral-400),1)}}.dark\:text-neutral-500{&:is(.dark *){color:rgba(var(--color-neutral-500),1)}}.dark\:text-neutral-700{&:is(.dark *){color:rgba(var(--color-neutral-700),1)}}.dark\:text-neutral-800{&:is(.dark *){color:rgba(var(--color-neutral-800),1)}}.dark\:text-primary-200{&:is(.dark *){color:rgba(var(--color-primary-200),1)}}.dark\:text-primary-400{&:is(.dark *){color:rgba(var(--color-primary-400),1)}}.dark\:text-white{&:is(.dark *){color:#fff}}.dark\:opacity-60{&:is(.dark *){opacity:60%}}.dark\:backdrop-brightness-95{&:is(.dark *){--tw-backdrop-brightness:brightness(95%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}}.dark\:backdrop-saturate-180{&:is(.dark *){--tw-backdrop-saturate:saturate(180%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}}.dark\:hover\:\!bg-primary-700{&:is(.dark *){&:hover{@media(hover:hover){background-color: rgba(var(--color-primary-700),1) !important;}}}}.dark\:hover\:bg-neutral-700{&:is(.dark *){&:hover{@media(hover:hover){background-color: rgba(var(--color-neutral-700),1);}}}}.dark\:hover\:bg-primary-400{&:is(.dark *){&:hover{@media(hover:hover){background-color: rgba(var(--color-primary-400),1);}}}}.dark\:hover\:bg-primary-900{&:is(.dark *){&:hover{@media(hover:hover){background-color: rgba(var(--color-primary-900),1);}}}}.dark\:hover\:text-neutral-200{&:is(.dark *){&:hover{@media(hover:hover){color: rgba(var(--color-neutral-200),1);}}}}.dark\:hover\:text-neutral-800{&:is(.dark *){&:hover{@media(hover:hover){color: rgba(var(--color-neutral-800),1);}}}}.dark\:hover\:text-primary-400{&:is(.dark *){&:hover{@media(hover:hover){color: rgba(var(--color-primary-400),1);}}}}.dark\:focus\:bg-primary-900{&:is(.dark *){&:focus{background-color:rgba(var(--color-primary-900),1)}}}.print\:hidden{@media print{display: none;}}.\[\&_\.translation_\.menuhide_span\]\:text-sm\!{& .translation .menuhide span{font-size:var(--text-sm)!important;line-height:var(--tw-leading,var(--text-sm--line-height))!important}}.\[\&_\.translation_button_\.icon\]\:text-4xl\!{& .translation button .icon{font-size:var(--text-4xl)!important;line-height:var(--tw-leading,var(--text-4xl--line-height))!important}}.\[\&_\.translation_button_span\]\:text-base\!{& .translation button span{font-size:var(--text-base)!important;line-height:var(--tw-leading,var(--text-base--line-height))!important}}.\[\&_span\]\:text-2xl{& span{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}}}@layer utilities{.highlight-wrapper{position:relative;z-index:0;display:block;overflow:hidden;border-radius:var(--radius-md);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1));box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);margin-top:1.7142857em;margin-bottom:1.7142857em}.highlight-wrapper pre,.highlight-wrapper table,.highlight-wrapper div{margin-top:0;margin-bottom:0}.highlight-wrapper:has(.codeblock-title) pre{border-radius:0}.codeblock-title{border-bottom-style:var(--tw-border-style);border-bottom-width:1px;border-color:rgba(var(--color-neutral-200),1);padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 2);&:is(.dark *){border-color:rgba(var(--color-neutral-800),1)}background-color:#fff;&:is(.dark *){background-color:#0d1117}}.chroma .lntd,.chroma .lntd pre{margin:calc(var(--spacing) * 0);--tw-border-style:none;border-style:none;padding:calc(var(--spacing) * 0);vertical-align:top}.chroma .lntable{display:block;width:auto;overflow:hidden;padding-inline:calc(var(--spacing) * 4);padding-block:calc(var(--spacing) * 3);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));border-spacing:0}.chroma .hl{margin-inline:calc(var(--spacing) * -4);display:block;width:auto;padding-inline:calc(var(--spacing) * 4)}.chroma .lntd .hl{margin:calc(var(--spacing) * 0);padding:calc(var(--spacing) * 0)}.chroma:not(:is(table *))>code{display:block;min-width:max-content}html:not(.dark){.bg{background-color:#fff}.chroma{background-color:#fff}.chroma .err{color:#f6f8fa;background-color:#82071e}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0}.chroma .hl{background-color:#e5e5e5}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .line{display:flex}.chroma .k{color:#cf222e}.chroma .kc{color:#cf222e}.chroma .kd{color:#cf222e}.chroma .kn{color:#cf222e}.chroma .kp{color:#cf222e}.chroma .kr{color:#cf222e}.chroma .kt{color:#cf222e}.chroma .na{color:#1f2328}.chroma .nc{color:#1f2328}.chroma .no{color:#0550ae}.chroma .nd{color:#0550ae}.chroma .ni{color:#6639ba}.chroma .nl{color:#900;font-weight:700}.chroma .nn{color:#24292e}.chroma .nx{color:#1f2328}.chroma .nt{color:#0550ae}.chroma .nb{color:#6639ba}.chroma .bp{color:#6a737d}.chroma .nv{color:#953800}.chroma .vc{color:#953800}.chroma .vg{color:#953800}.chroma .vi{color:#953800}.chroma .vm{color:#953800}.chroma .nf{color:#6639ba}.chroma .fm{color:#6639ba}.chroma .s{color:#0a3069}.chroma .sa{color:#0a3069}.chroma .sb{color:#0a3069}.chroma .sc{color:#0a3069}.chroma .dl{color:#0a3069}.chroma .sd{color:#0a3069}.chroma .s2{color:#0a3069}.chroma .se{color:#0a3069}.chroma .sh{color:#0a3069}.chroma .si{color:#0a3069}.chroma .sx{color:#0a3069}.chroma .sr{color:#0a3069}.chroma .s1{color:#0a3069}.chroma .ss{color:#032f62}.chroma .m{color:#0550ae}.chroma .mb{color:#0550ae}.chroma .mf{color:#0550ae}.chroma .mh{color:#0550ae}.chroma .mi{color:#0550ae}.chroma .il{color:#0550ae}.chroma .mo{color:#0550ae}.chroma .o{color:#0550ae}.chroma .ow{color:#0550ae}.chroma .p{color:#1f2328}.chroma .c{color:#57606a}.chroma .ch{color:#57606a}.chroma .cm{color:#57606a}.chroma .c1{color:#57606a}.chroma .cs{color:#57606a}.chroma .cp{color:#57606a}.chroma .cpf{color:#57606a}.chroma .gd{color:#82071e;background-color:#ffebe9}.chroma .ge{color:#1f2328}.chroma .gi{color:#116329;background-color:#dafbe1}.chroma .go{color:#1f2328}.chroma .gl{text-decoration:underline}.chroma .w{color:#fff}}html.dark{.bg{color:#e6edf3;background-color:#0d1117}.chroma{color:#e6edf3;background-color:#0d1117}.chroma .err{color:#f85149}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0}.chroma .hl{background-color:#333}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#737679}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#6e7681}.chroma .line{display:flex}.chroma .k{color:#ff7b72}.chroma .kc{color:#79c0ff}.chroma .kd{color:#ff7b72}.chroma .kn{color:#ff7b72}.chroma .kp{color:#79c0ff}.chroma .kr{color:#ff7b72}.chroma .kt{color:#ff7b72}.chroma .nc{color:#f0883e;font-weight:700}.chroma .no{color:#79c0ff;font-weight:700}.chroma .nd{color:#d2a8ff;font-weight:700}.chroma .ni{color:#ffa657}.chroma .ne{color:#f0883e;font-weight:700}.chroma .nl{color:#79c0ff;font-weight:700}.chroma .nn{color:#ff7b72}.chroma .py{color:#79c0ff}.chroma .nt{color:#7ee787}.chroma .nv{color:#79c0ff}.chroma .vc{color:#79c0ff}.chroma .vg{color:#79c0ff}.chroma .vi{color:#79c0ff}.chroma .vm{color:#79c0ff}.chroma .nf{color:#d2a8ff;font-weight:700}.chroma .fm{color:#d2a8ff;font-weight:700}.chroma .l{color:#a5d6ff}.chroma .ld{color:#79c0ff}.chroma .s{color:#a5d6ff}.chroma .sa{color:#79c0ff}.chroma .sb{color:#a5d6ff}.chroma .sc{color:#a5d6ff}.chroma .dl{color:#79c0ff}.chroma .sd{color:#a5d6ff}.chroma .s2{color:#a5d6ff}.chroma .se{color:#79c0ff}.chroma .sh{color:#79c0ff}.chroma .si{color:#a5d6ff}.chroma .sx{color:#a5d6ff}.chroma .sr{color:#79c0ff}.chroma .s1{color:#a5d6ff}.chroma .ss{color:#a5d6ff}.chroma .m{color:#a5d6ff}.chroma .mb{color:#a5d6ff}.chroma .mf{color:#a5d6ff}.chroma .mh{color:#a5d6ff}.chroma .mi{color:#a5d6ff}.chroma .il{color:#a5d6ff}.chroma .mo{color:#a5d6ff}.chroma .o{color:#ff7b72;font-weight:700}.chroma .ow{color:#ff7b72;font-weight:700}.chroma .c{color:#8b949e;font-style:italic}.chroma .ch{color:#8b949e;font-style:italic}.chroma .cm{color:#8b949e;font-style:italic}.chroma .c1{color:#8b949e;font-style:italic}.chroma .cs{color:#8b949e;font-weight:700;font-style:italic}.chroma .cp{color:#8b949e;font-weight:700;font-style:italic}.chroma .cpf{color:#8b949e;font-weight:700;font-style:italic}.chroma .gd{color:#ffa198;background-color:#490202}.chroma .ge{font-style:italic}.chroma .gr{color:#ffa198}.chroma .gh{color:#79c0ff;font-weight:700}.chroma .gi{color:#56d364;background-color:#0f5323}.chroma .go{color:#8b949e}.chroma .gp{color:#8b949e}.chroma .gs{font-weight:700}.chroma .gu{color:#79c0ff}.chroma .gt{color:#ff7b72}.chroma .gl{text-decoration:underline}.chroma .w{color:#6e7681}}}@layer utilities{.tab__button.tab--active{border-bottom:2px solid rgb(var(--color-primary-500))}.tab__panel{display:none}.tab__panel.tab--active{display:block}}#zen-mode-button{cursor:pointer}.zen-mode{position:relative}body.zen-mode-enable{ #bmc-wbtn, .author { display: none !important; }}.a11y-panel-enter-active{animation:slideInFromTop .3s cubic-bezier(.4,0,.2,1)forwards}.a11y-panel-leave-active{animation:slideOutToTop .3s cubic-bezier(.4,0,.2,1)forwards}.ios-toggle{position:relative;width:42px;height:24px;background:#e5e5e5;border-radius:12px;cursor:pointer;transition:background-color .3s ease;pointer-events:auto}.ios-toggle input{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;z-index:1}.ios-toggle::after{content:"";position:absolute;top:2px;left:2px;width:20px;height:20px;background:#fff;border-radius:50%;transition:transform .3s ease,background-color .3s ease;box-shadow:0 1px 3px rgba(0,0,0,.2);z-index:0}.ios-toggle input:checked+.toggle-track::after{transform:translateX(18px)}.ios-toggle input:checked+.toggle-track{background:rgba(var(--color-primary-500),1)}.ios-toggle input:checked~.ios-toggle-ball{transform:translateX(18px)}.ios-toggle.is-checked{background:rgba(var(--color-primary-500),1)}.ios-toggle:has(input:checked){background:rgba(var(--color-primary-500),1)}.ios-toggle:has(input:checked)::after{transform:translateX(18px)}.dark .ios-toggle{background:#404040}.dark .ios-toggle::after{background:#f5f5f5}@layer components{:root{--adm-note-border:oklch(68.5% 0.169 237.323);--adm-note-bg:oklch(97.7% 0.013 236.62);--adm-note-text:oklch(39.1% 0.09 240.876);--adm-tip-border:oklch(69.6% 0.17 162.48);--adm-tip-bg:oklch(97.9% 0.021 166.113);--adm-tip-text:oklch(37.8% 0.077 168.94);--adm-important-border:oklch(62.7% 0.265 303.9);--adm-important-bg:oklch(97.7% 0.014 308.299);--adm-important-text:oklch(38.1% 0.176 304.987);--adm-warning-border:oklch(70.5% 0.213 47.604);--adm-warning-bg:oklch(98% 0.016 73.684);--adm-warning-text:oklch(40.8% 0.123 38.172);--adm-caution-border:oklch(63.7% 0.237 25.331);--adm-caution-bg:oklch(97.1% 0.013 17.38);--adm-caution-text:oklch(39.6% 0.141 25.723);--adm-abstract-border:oklch(71.5% 0.143 215.221);--adm-abstract-bg:oklch(98.4% 0.019 200.873);--adm-abstract-text:oklch(39.8% 0.07 227.392);--adm-bug-border:oklch(64.5% 0.246 16.439);--adm-bug-bg:oklch(96.9% 0.015 12.422);--adm-bug-text:oklch(41% 0.159 10.272);--adm-danger-border:oklch(63.7% 0.237 25.331);--adm-danger-bg:oklch(97.1% 0.013 17.38);--adm-danger-text:oklch(39.6% 0.141 25.723);--adm-example-border:oklch(55.8% 0.288 302.321);--adm-example-bg:oklch(97.7% 0.014 308.299);--adm-example-text:oklch(38.1% 0.176 304.987);--adm-failure-border:oklch(65.6% 0.241 354.308);--adm-failure-bg:oklch(97.1% 0.014 343.198);--adm-failure-text:oklch(40.8% 0.153 2.432);--adm-info-border:oklch(62.3% 0.214 259.815);--adm-info-bg:oklch(97% 0.014 254.604);--adm-info-text:oklch(37.9% 0.146 265.522);--adm-question-border:oklch(76.9% 0.188 70.08);--adm-question-bg:oklch(98.7% 0.022 95.277);--adm-question-text:oklch(41.4% 0.112 45.904);--adm-quote-border:oklch(55.1% 0.027 264.364);--adm-quote-bg:oklch(98.5% 0.002 247.839);--adm-quote-text:oklch(27.8% 0.033 256.848);--adm-success-border:oklch(69.6% 0.17 162.48);--adm-success-bg:oklch(97.9% 0.021 166.113);--adm-success-text:oklch(37.8% 0.077 168.94);--adm-todo-border:oklch(68.5% 0.169 237.323);--adm-todo-bg:oklch(97.7% 0.013 236.62);--adm-todo-text:oklch(44.3% 0.11 240.79)}html.dark{--adm-note-bg:color-mix(in srgb, oklch(44.3% 0.11 240.79), #0f0f0f 50%);--adm-note-text:oklch(95.1% 0.026 236.824);--adm-tip-bg:color-mix(in srgb, oklch(43.2% 0.095 166.913), #0f0f0f 50%);--adm-tip-text:oklch(95% 0.052 163.051);--adm-important-bg:color-mix(in srgb, oklch(43.8% 0.218 303.724), #0f0f0f 50%);--adm-important-text:oklch(94.6% 0.033 307.174);--adm-warning-bg:color-mix(in srgb, oklch(47% 0.157 37.304), #0f0f0f 45%);--adm-warning-text:oklch(95.4% 0.038 75.164);--adm-caution-bg:color-mix(in srgb, oklch(44.4% 0.177 26.899), #0f0f0f 45%);--adm-caution-text:oklch(93.6% 0.032 17.717);--adm-abstract-bg:color-mix(in srgb, oklch(45% 0.085 224.283), #0f0f0f 50%);--adm-abstract-text:oklch(95.6% 0.045 203.388);--adm-bug-bg:color-mix(in srgb, oklch(45.5% 0.188 13.697), #0f0f0f 50%);--adm-bug-text:oklch(94.1% 0.03 12.58);--adm-danger-bg:color-mix(in srgb, oklch(44.4% 0.177 26.899), #0f0f0f 45%);--adm-danger-text:oklch(93.6% 0.032 17.717);--adm-example-bg:color-mix(in srgb, oklch(43.8% 0.218 303.724), #0f0f0f 50%);--adm-example-text:oklch(94.6% 0.033 307.174);--adm-failure-bg:color-mix(in srgb, oklch(45.9% 0.187 3.815), #0f0f0f 50%);--adm-failure-text:oklch(94.8% 0.028 342.258);--adm-info-bg:color-mix(in srgb, oklch(42.4% 0.199 265.638), #0f0f0f 50%);--adm-info-text:oklch(93.2% 0.032 255.585);--adm-question-bg:color-mix(in srgb, oklch(47.3% 0.137 46.201), #0f0f0f 50%);--adm-question-text:oklch(96.2% 0.059 95.617);--adm-quote-bg:color-mix(in srgb, oklch(27.8% 0.033 256.848), #0f0f0f 50%);--adm-quote-text:oklch(96.7% 0.003 264.542);--adm-success-bg:color-mix(in srgb, oklch(43.2% 0.095 166.913), #0f0f0f 50%);--adm-success-text:oklch(95% 0.052 163.051);--adm-todo-bg:color-mix(in srgb, oklch(44.3% 0.11 240.79), #0f0f0f 50%);--adm-todo-text:oklch(95.1% 0.026 236.824)}.admonition-content>:first-child{margin-top:0!important}.admonition-content>:last-child{margin-bottom:0!important}.admonition-content pre{margin-block:0!important}.admonition[data-type=note]{border-color:var(--adm-note-border);background-color:var(--adm-note-bg);color:var(--adm-note-text)}.admonition[data-type=tip]{border-color:var(--adm-tip-border);background-color:var(--adm-tip-bg);color:var(--adm-tip-text)}.admonition[data-type=important]{border-color:var(--adm-important-border);background-color:var(--adm-important-bg);color:var(--adm-important-text)}.admonition[data-type=warning]{border-color:var(--adm-warning-border);background-color:var(--adm-warning-bg);color:var(--adm-warning-text)}.admonition[data-type=caution]{border-color:var(--adm-caution-border);background-color:var(--adm-caution-bg);color:var(--adm-caution-text)}.admonition[data-type=abstract]{border-color:var(--adm-abstract-border);background-color:var(--adm-abstract-bg);color:var(--adm-abstract-text)}.admonition[data-type=bug]{border-color:var(--adm-bug-border);background-color:var(--adm-bug-bg);color:var(--adm-bug-text)}.admonition[data-type=danger]{border-color:var(--adm-danger-border);background-color:var(--adm-danger-bg);color:var(--adm-danger-text)}.admonition[data-type=example]{border-color:var(--adm-example-border);background-color:var(--adm-example-bg);color:var(--adm-example-text)}.admonition[data-type=failure]{border-color:var(--adm-failure-border);background-color:var(--adm-failure-bg);color:var(--adm-failure-text)}.admonition[data-type=info]{border-color:var(--adm-info-border);background-color:var(--adm-info-bg);color:var(--adm-info-text)}.admonition[data-type=question]{border-color:var(--adm-question-border);background-color:var(--adm-question-bg);color:var(--adm-question-text)}.admonition[data-type=quote]{border-color:var(--adm-quote-border);background-color:var(--adm-quote-bg);color:var(--adm-quote-text)}.admonition[data-type=success]{border-color:var(--adm-success-border);background-color:var(--adm-success-bg);color:var(--adm-success-text)}.admonition[data-type=todo]{border-color:var(--adm-todo-border);background-color:var(--adm-todo-bg);color:var(--adm-todo-text)}}html:not(.dark){color-scheme:light}html.dark{color-scheme:dark}body a,body button{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}button,[role=button]{cursor:pointer}.icon svg{height:1em;width:1em}.logo svg{height:5rem;width:5rem}#search-query::-webkit-search-cancel-button,#search-query::-webkit-search-decoration,#search-query::-webkit-search-results-button,#search-query::-webkit-search-results-decoration{display:none}.prose blockquote{&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){border-right-style:var(--tw-border-style);border-right-width:4px}&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){border-left-style:var(--tw-border-style);border-left-width:0}&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){padding-right:calc(var(--spacing) * 4)}}.prose ul>li,.prose ol>li{&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){margin-right:calc(var(--spacing) * 7)}&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){padding-right:calc(var(--spacing) * 2)}&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){padding-left:calc(var(--spacing) * 0)}}.prose ol>li:before,.prose ul>li:before{&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){right:calc(var(--spacing) * 1)}&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){left:auto}}.prose thead td:first-child,.prose thead th:first-child{&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){padding-right:calc(var(--spacing) * 0)}}.prose thead td:last-child,.prose thead th:last-child{&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){padding-left:calc(var(--spacing) * 0)}}.prose div.min-w-0.max-w-prose>*:first-child{margin-top:calc(var(--spacing) * 3)}#TOCView{max-height:calc(100vh - 150px);min-height:0;overflow-x:hidden}.toc ul,.toc li{list-style-type:none;padding-inline:calc(var(--spacing) * 0);--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.toc ul ul{&:where(:dir(ltr), [dir=ltr], [dir=ltr] *){padding-left:calc(var(--spacing) * 4)}&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){padding-right:calc(var(--spacing) * 4)}}.toc a{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal);color:rgba(var(--color-neutral-700),1);&:is(.dark *){color:rgba(var(--color-neutral-300),1)}}.toc ul>li{&:where(:dir(rtl), [dir=rtl], [dir=rtl] *){margin-right:calc(var(--spacing) * 0)}}.highlight{position:relative;z-index:0}.highlight-wrapper:hover>.copy-button{visibility:visible}.copy-button{visibility:hidden;position:absolute;top:calc(var(--spacing) * 0);right:calc(var(--spacing) * 0);z-index:10;width:calc(var(--spacing) * 20);cursor:pointer;text-overflow:ellipsis;overflow:hidden;border-top-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md);background-color:rgba(var(--color-neutral-200),1);padding-block:calc(var(--spacing) * 1);font-family:var(--font-mono);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));white-space:nowrap;color:rgba(var(--color-neutral-700),1);opacity:90%;&:is(.dark *){background-color:rgba(var(--color-neutral-600),1)}&:is(.dark *){color:rgba(var(--color-neutral-200),1)}}.copy-button:hover,.copy-button:focus,.copy-button:active,.copy-button:active:hover{background-color:rgba(var(--color-primary-100),1);&:is(.dark *){background-color:rgba(var(--color-primary-600),1)}}.copy-textarea{position:absolute;z-index:calc(10 * -1);opacity:5%}.katex-display{overflow:auto hidden}.katex-display{padding:1em;width:calc(100% - 1em)}table{display:block;overflow:auto}code{word-wrap:break-word;overflow-wrap:break-word}a{word-break:break-word;word-wrap:break-word;overflow-wrap:break-word}.prose-invert .highlight pre>code{background-color:unset}pre{text-align:left}.single_hero_round{max-height:50vh;object-fit:cover}.single_hero_background{width:calc(100% + 1px);z-index:-10}.hero_gradient{width:100%;height:100%}.thumbnail_card{min-width:300px;height:200px}.thumbnail_card_related{height:150px}.thumbnail{width:300px;min-height:180px}@media(width < 853px){.thumbnail{width:100%}}.thumbnail-shadow{box-shadow:5px 5px 20px 1px rgba(0,0,0,.3)}@media(width < 853px){.width-patch{width:80vw}}@media(width >= 853px){.width-patch{width:65ch}}.anchor{display:block;position:relative;top:-150px;height:0;visibility:hidden}[id^=fn],[id^=fnref]{scroll-margin-top:145px}#main-content{scroll-margin-top:-125px}@media(width >= 640px){.article{flex-wrap:wrap}}@media(width >= 853px){.article{flex-wrap:nowrap}}.medium-zoom-image--opened{z-index:100}@layer utilities{.bf-border-color{border-color:rgba(var(--color-neutral-300),1);&:is(.dark *){border-color:rgba(var(--color-neutral-700),1)}}.bf-border-color-hover{&:hover{@media(hover:hover){border-color: rgba(var(--color-primary-600),1);}}&:is(.dark *){&:hover{@media(hover:hover){border-color: rgba(var(--color-primary-400),1);}}}}.bf-icon-color-hover{&:hover{@media(hover:hover){color: rgba(var(--color-primary-600),1);}}&:is(.dark *){&:hover{@media(hover:hover){color: rgba(var(--color-primary-400),1);}}}}.bf-scrollbar{&::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}&::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}&::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}@supports(-moz-appearance:none){scrollbar-width: thin; scrollbar-color: var(--scrollbar-thumb,initial) var(--scrollbar-track,initial);}&::-webkit-scrollbar{display:block;width:8px;height:8px}--scrollbar-thumb:oklch(70.8% 0 0);--scrollbar-track:oklch(92.2% 0 0);&:is(.dark *){--scrollbar-thumb:oklch(43.9% 0 0)}&:is(.dark *){--scrollbar-track:oklch(26.9% 0 0)}}}body:has(#mobile-menu-toggle:checked){overflow:hidden}@media(min-width:853px){body:has(#mobile-menu-toggle:checked){overflow:visible}}#bmc-wbtn{z-index:50!important}.nested-menu{position:relative}.menuhide{position:absolute;z-index:1000;white-space:nowrap;opacity:0;visibility:hidden;transition:visibility .3s,opacity .3s ease-in-out}.nested-menu:hover .menuhide,.nested-menu:focus-within .menuhide{opacity:1;visibility:visible}.active{text-decoration-line:underline;text-decoration-thickness:3px;text-underline-offset:4px}@layer base{input:where([type=text]),input:where(:not([type])),input:where([type=email]),input:where([type=url]),input:where([type=password]),input:where([type=number]),input:where([type=date]),input:where([type=datetime-local]),input:where([type=month]),input:where([type=search]),input:where([type=tel]),input:where([type=time]),input:where([type=week]),select:where([multiple]),textarea,select{appearance:none;background-color:#fff;border-color:oklch(55.1% .027 264.364);border-width:1px;border-radius:0;padding-top:.5rem;padding-right:.75rem;padding-bottom:.5rem;padding-left:.75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000;&:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:oklch(54.6% 0.245 262.881);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:oklch(54.6% .245 262.881)}}input::placeholder,textarea::placeholder{color:oklch(55.1% .027 264.364);opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}::-webkit-date-and-time-value{text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-year-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;print-color-adjust:exact}select:where([multiple]),select:where([size]:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;padding-right:.75rem;print-color-adjust:unset}input:where([type=checkbox]),input:where([type=radio]){appearance:none;padding:0;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:oklch(54.6% .245 262.881);background-color:#fff;border-color:oklch(55.1% .027 264.364);border-width:1px;--tw-shadow:0 0 #0000}input:where([type=checkbox]){border-radius:0}input:where([type=radio]){border-radius:100%}input:where([type=checkbox]):focus,input:where([type=radio]):focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:oklch(54.6% 0.245 262.881);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}input:where([type=checkbox]):checked,input:where([type=radio]):checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}input:where([type=checkbox]):checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e");@media(forced-colors:active){appearance: auto;}}input:where([type=radio]):checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");@media(forced-colors:active){appearance: auto;}}input:where([type=checkbox]):checked:hover,input:where([type=checkbox]):checked:focus,input:where([type=radio]):checked:hover,input:where([type=radio]):checked:focus{border-color:transparent;background-color:currentColor}input:where([type=checkbox]):indeterminate{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat;@media(forced-colors:active){appearance: auto;}}input:where([type=checkbox]):indeterminate:hover,input:where([type=checkbox]):indeterminate:focus{border-color:transparent;background-color:currentColor}input:where([type=file]){background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}input:where([type=file]):focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}}@layer base{*{@supports(-moz-appearance:none){scrollbar-color: initial; scrollbar-width: initial;}}}@property --tw-translate-x{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-translate-y{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-translate-z{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-scale-x{syntax: "*"; + inherits: false; + initial-value: 1; +}@property --tw-scale-y{syntax: "*"; + inherits: false; + initial-value: 1; +}@property --tw-scale-z{syntax: "*"; + inherits: false; + initial-value: 1; +}@property --tw-rotate-x{syntax: "*"; + inherits: false; +}@property --tw-rotate-y{syntax: "*"; + inherits: false; +}@property --tw-rotate-z{syntax: "*"; + inherits: false; +}@property --tw-skew-x{syntax: "*"; + inherits: false; +}@property --tw-skew-y{syntax: "*"; + inherits: false; +}@property --tw-pan-x{syntax: "*"; + inherits: false; +}@property --tw-pan-y{syntax: "*"; + inherits: false; +}@property --tw-pinch-zoom{syntax: "*"; + inherits: false; +}@property --tw-space-y-reverse{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-space-x-reverse{syntax: "*"; + inherits: false; + initial-value: 0; +}@property --tw-border-style{syntax: "*"; + inherits: false; + initial-value: solid; +}@property --tw-gradient-position{syntax: "*"; + inherits: false; +}@property --tw-gradient-from{syntax: ""; + inherits: false; + initial-value: #0000; +}@property --tw-gradient-via{syntax: ""; + inherits: false; + initial-value: #0000; +}@property --tw-gradient-to{syntax: ""; + inherits: false; + initial-value: #0000; +}@property --tw-gradient-stops{syntax: "*"; + inherits: false; +}@property --tw-gradient-via-stops{syntax: "*"; + inherits: false; +}@property --tw-gradient-from-position{syntax: ""; + inherits: false; + initial-value: 0%; +}@property --tw-gradient-via-position{syntax: ""; + inherits: false; + initial-value: 50%; +}@property --tw-gradient-to-position{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-leading{syntax: "*"; + inherits: false; +}@property --tw-font-weight{syntax: "*"; + inherits: false; +}@property --tw-tracking{syntax: "*"; + inherits: false; +}@property --tw-ordinal{syntax: "*"; + inherits: false; +}@property --tw-slashed-zero{syntax: "*"; + inherits: false; +}@property --tw-numeric-figure{syntax: "*"; + inherits: false; +}@property --tw-numeric-spacing{syntax: "*"; + inherits: false; +}@property --tw-numeric-fraction{syntax: "*"; + inherits: false; +}@property --tw-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-shadow-color{syntax: "*"; + inherits: false; +}@property --tw-shadow-alpha{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-inset-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-inset-shadow-color{syntax: "*"; + inherits: false; +}@property --tw-inset-shadow-alpha{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-ring-color{syntax: "*"; + inherits: false; +}@property --tw-ring-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-inset-ring-color{syntax: "*"; + inherits: false; +}@property --tw-inset-ring-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-ring-inset{syntax: "*"; + inherits: false; +}@property --tw-ring-offset-width{syntax: ""; + inherits: false; + initial-value: 0px; +}@property --tw-ring-offset-color{syntax: "*"; + inherits: false; + initial-value: #fff; +}@property --tw-ring-offset-shadow{syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +}@property --tw-outline-style{syntax: "*"; + inherits: false; + initial-value: solid; +}@property --tw-blur{syntax: "*"; + inherits: false; +}@property --tw-brightness{syntax: "*"; + inherits: false; +}@property --tw-contrast{syntax: "*"; + inherits: false; +}@property --tw-grayscale{syntax: "*"; + inherits: false; +}@property --tw-hue-rotate{syntax: "*"; + inherits: false; +}@property --tw-invert{syntax: "*"; + inherits: false; +}@property --tw-opacity{syntax: "*"; + inherits: false; +}@property --tw-saturate{syntax: "*"; + inherits: false; +}@property --tw-sepia{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow-color{syntax: "*"; + inherits: false; +}@property --tw-drop-shadow-alpha{syntax: ""; + inherits: false; + initial-value: 100%; +}@property --tw-drop-shadow-size{syntax: "*"; + inherits: false; +}@property --tw-backdrop-blur{syntax: "*"; + inherits: false; +}@property --tw-backdrop-brightness{syntax: "*"; + inherits: false; +}@property --tw-backdrop-contrast{syntax: "*"; + inherits: false; +}@property --tw-backdrop-grayscale{syntax: "*"; + inherits: false; +}@property --tw-backdrop-hue-rotate{syntax: "*"; + inherits: false; +}@property --tw-backdrop-invert{syntax: "*"; + inherits: false; +}@property --tw-backdrop-opacity{syntax: "*"; + inherits: false; +}@property --tw-backdrop-saturate{syntax: "*"; + inherits: false; +}@property --tw-backdrop-sepia{syntax: "*"; + inherits: false; +}@property --tw-duration{syntax: "*"; + inherits: false; +}@property --tw-ease{syntax: "*"; + inherits: false; +}@property --tw-content{syntax: "*"; + initial-value: ""; + inherits: false; +}@keyframes pulse{50%{opacity:.5}}@layer properties{@supports((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,::before,::after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}.article-content.prose{width:100%;max-width:65ch;margin:0 auto}.single-post-wrapper{display:flex;flex-direction:column;width:100%}@media(min-width:1280px){.single-post-wrapper{display:block}#main-content{display:block}#sidebar-toc{position:absolute;top:0;left:calc(50% + 32.5ch + 2rem);height:100%;width:256px}}#sidebar-toc .toc{position:sticky;top:6rem;max-height:calc(100vh - 8rem);overflow-y:auto;padding-right:1rem;z-index:10}.projects-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1.5rem}#resume-table p{padding:.5em}.iframe-wrapper{position:relative;padding-bottom:56.25%;padding-top:25px;height:0}.iframe-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}#resume-table{border-collapse:collapse}#resume-table .statements td{font-style:italic;padding:1em;text-align:center}#resume-table .header{padding-top:1em;padding-left:1em;font-weight:700;text-transform:uppercase;text-align:left}.google-blue{color:#4285f4;font-weight:bolder}.google-red{color:#ea4335;font-weight:bolder}.google-yellow{color:#fbbc04;font-weight:bolder}.google-green{color:#34a853;font-weight:bolder}.header-google-blue{border-bottom:4px solid #4285f4}.header-google-red{border-bottom:4px solid #ea4335}.header-google-yellow{border-bottom:4px solid #fbbc04}.header-google-green{border-bottom:4px solid #34a853}#resume-table td,#resume-table tr{border-width:0}#resume-table ul{margin-top:0;margin-bottom:0}#resume-table .section-header td{padding-top:.66em;font-weight:700}#resume-table .role{padding:.66em;text-align:left}#resume-table .dates{text-align:right;padding-right:1em}#resume-table .quote{text-align:center}#resume-table .twitter-blue{color:#1da1f2;font-weight:bolder}.center{text-align:center;padding:.5em}img[src$='#center']{display:block;margin:.7rem auto}img[src$='#floatleft']{float:left;margin:.7rem}img[src$='#floatright']{float:right;margin:.7rem}.homepage .content{text-align:left}.toc-right a.no-toc-link,.toc-inside a.no-toc-link{display:none!important}.medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform} \ No newline at end of file diff --git a/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css b/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css new file mode 100644 index 0000000..2710145 --- /dev/null +++ b/css/vendors/admonitions.53cd9f8afa9d9a8ac09093f668df057bc6d0f4bbd0886f39991a7b99934a7432.css @@ -0,0 +1 @@ +:root{--adm-bg: #fff;--adm-text: #000;--adm-code-bg: #f5f5f5;--adm-code-text: #24292e;--adm-blockquote-border: #e0e0e0;--adm-header-bg-opacity: .1;--adm-abstract: #209fb5;--adm-abstract-rgb: 32,159,181;--adm-caution: #e64553;--adm-caution-rgb: 230,69,83;--adm-code: #7287fd;--adm-code-rgb: 114,135,253;--adm-conclusion: #dd7878;--adm-conclusion-rgb: 221,120,120;--adm-danger: #fe640b;--adm-danger-rgb: 254,100,11;--adm-error: #d20f39;--adm-error-rgb: 210,15,57;--adm-example: #dc8a78;--adm-example-rgb: 220,138,120;--adm-experiment: #51bb2a;--adm-experiment-rgb: 81,187,42;--adm-goal: #e64553;--adm-goal-rgb: 230,69,83;--adm-idea: #df8e1d;--adm-idea-rgb: 223,142,29;--adm-important: #7d4dda;--adm-important-rgb: 125,77,218;--adm-info: #04a5e5;--adm-info-rgb: 4,165,229;--adm-memo: #e64553;--adm-memo-rgb: 230,69,83;--adm-note: #096ae1;--adm-note-rgb: 9,106,225;--adm-notify: #0d48bd;--adm-notify-rgb: 13,72,189;--adm-question: #179299;--adm-question-rgb: 23,146,153;--adm-quote: #7287fd;--adm-quote-rgb: 114,135,253;--adm-success: #40a02b;--adm-success-rgb: 64,160,43;--adm-task: #8839ef;--adm-task-rgb: 136,57,239;--adm-tip: #179299;--adm-tip-rgb: 23,146,153;--adm-warning: #df8e1d;--adm-warning-rgb: 223,142,29}html[data-theme="dark"],body[data-theme="dark"],html[data-bs-theme="dark"],html[data-scheme="dark"],body[data-scheme="dark"],html[data-color-mode="dark"],body[data-color-mode="dark"],body.dark,body.dark-mode,body.dark-theme,body.theme-dark,html.dark,html.dark-mode,html.dark-theme,html.theme-dark{--adm-bg: #1d1e20;--adm-text: #e6e6e6;--adm-code-bg: #313244;--adm-code-text: #cdd6f4;--adm-blockquote-border: #45475a;--adm-header-bg-opacity: .1;--adm-abstract: #209fb5;--adm-abstract-rgb: 32,159,181;--adm-caution: #e64553;--adm-caution-rgb: 230,69,83;--adm-code: #7287fd;--adm-code-rgb: 114,135,253;--adm-conclusion: #dd7878;--adm-conclusion-rgb: 221,120,120;--adm-danger: #fe640b;--adm-danger-rgb: 254,100,11;--adm-error: #d20f39;--adm-error-rgb: 210,15,57;--adm-example: #dc8a78;--adm-example-rgb: 220,138,120;--adm-experiment: #51bb2a;--adm-experiment-rgb: 81,187,42;--adm-goal: #e64553;--adm-goal-rgb: 230,69,83;--adm-idea: #df8e1d;--adm-idea-rgb: 223,142,29;--adm-important: #7d4dda;--adm-important-rgb: 125,77,218;--adm-info: #04a5e5;--adm-info-rgb: 4,165,229;--adm-memo: #e64553;--adm-memo-rgb: 230,69,83;--adm-note: #096ae1;--adm-note-rgb: 9,106,225;--adm-notify: #0d48bd;--adm-notify-rgb: 13,72,189;--adm-question: #179299;--adm-question-rgb: 23,146,153;--adm-quote: #7287fd;--adm-quote-rgb: 114,135,253;--adm-success: #40a02b;--adm-success-rgb: 64,160,43;--adm-task: #8839ef;--adm-task-rgb: 136,57,239;--adm-tip: #179299;--adm-tip-rgb: 23,146,153;--adm-warning: #df8e1d;--adm-warning-rgb: 223,142,29}.admonition{margin:1rem 0;border-radius:4px;box-shadow:0 1px 3px rgba(0,0,0,0.12);transition:box-shadow 0.3s ease;overflow:hidden;position:relative}.admonition-header{padding:0.5rem 1rem;display:flex;align-items:center;font-weight:600;font-size:1.1rem;border-radius:4px 4px 0 0;transition:color 0.3s ease;position:relative;z-index:1;color:var(--adm-type-header, var(--adm-type-color))}.admonition-header svg{width:1.1em;height:1.1em;margin-right:0.5rem;fill:currentColor;flex-shrink:0;transition:fill 0.3s ease}.admonition-header span{flex-grow:1}.admonition-content{padding:1rem;border-radius:0 0 4px 4px;transition:background-color 0.3s ease, color 0.3s ease;position:relative;background-color:var(--adm-bg);color:var(--adm-text)}.admonition-content p{margin-top:0;margin-bottom:0.75rem}.admonition-content ul,.admonition-content ol{margin-top:0;margin-bottom:0.75rem;padding-left:1.5rem}.admonition-content blockquote{margin:0 0 0.75rem 0;padding-left:1rem;border-left:3px solid var(--adm-blockquote-border);font-style:italic;transition:border-color 0.3s ease, color 0.3s ease;color:inherit}.admonition-content code:not(pre>code){padding:0.2em 0.4em;border-radius:3px;font-size:0.9em;transition:background-color 0.3s ease, color 0.3s ease;background-color:var(--adm-code-bg);color:var(--adm-code-text)}.admonition-content pre{margin:0 0 0.75rem 0;padding:0.8rem 1rem;border-radius:3px;overflow-x:auto;transition:background-color 0.3s ease;background-color:var(--adm-code-bg)}.admonition-content pre code{background-color:transparent !important;color:var(--adm-code-text);padding:0;font-size:inherit;border-radius:0}.admonition-content>*:last-child{margin-bottom:0}.admonition--headless .admonition-content{border-radius:4px}.admonition.abstract{border-left:4px solid var(--adm-abstract);background-color:rgba(var(--adm-abstract-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-abstract);--adm-type-header: var(--adm-abstract-header, var(--adm-abstract))}.admonition.caution{border-left:4px solid var(--adm-caution);background-color:rgba(var(--adm-caution-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-caution);--adm-type-header: var(--adm-caution-header, var(--adm-caution))}.admonition.code{border-left:4px solid var(--adm-code);background-color:rgba(var(--adm-code-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-code);--adm-type-header: var(--adm-code-header, var(--adm-code))}.admonition.conclusion{border-left:4px solid var(--adm-conclusion);background-color:rgba(var(--adm-conclusion-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-conclusion);--adm-type-header: var(--adm-conclusion-header, var(--adm-conclusion))}.admonition.danger{border-left:4px solid var(--adm-danger);background-color:rgba(var(--adm-danger-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-danger);--adm-type-header: var(--adm-danger-header, var(--adm-danger))}.admonition.error{border-left:4px solid var(--adm-error);background-color:rgba(var(--adm-error-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-error);--adm-type-header: var(--adm-error-header, var(--adm-error))}.admonition.example{border-left:4px solid var(--adm-example);background-color:rgba(var(--adm-example-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-example);--adm-type-header: var(--adm-example-header, var(--adm-example))}.admonition.experiment{border-left:4px solid var(--adm-experiment);background-color:rgba(var(--adm-experiment-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-experiment);--adm-type-header: var(--adm-experiment-header, var(--adm-experiment))}.admonition.goal{border-left:4px solid var(--adm-goal);background-color:rgba(var(--adm-goal-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-goal);--adm-type-header: var(--adm-goal-header, var(--adm-goal))}.admonition.idea{border-left:4px solid var(--adm-idea);background-color:rgba(var(--adm-idea-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-idea);--adm-type-header: var(--adm-idea-header, var(--adm-idea))}.admonition.important{border-left:4px solid var(--adm-important);background-color:rgba(var(--adm-important-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-important);--adm-type-header: var(--adm-important-header, var(--adm-important))}.admonition.info{border-left:4px solid var(--adm-info);background-color:rgba(var(--adm-info-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-info);--adm-type-header: var(--adm-info-header, var(--adm-info))}.admonition.memo{border-left:4px solid var(--adm-memo);background-color:rgba(var(--adm-memo-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-memo);--adm-type-header: var(--adm-memo-header, var(--adm-memo))}.admonition.note{border-left:4px solid var(--adm-note);background-color:rgba(var(--adm-note-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-note);--adm-type-header: var(--adm-note-header, var(--adm-note))}.admonition.notify{border-left:4px solid var(--adm-notify);background-color:rgba(var(--adm-notify-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-notify);--adm-type-header: var(--adm-notify-header, var(--adm-notify))}.admonition.question{border-left:4px solid var(--adm-question);background-color:rgba(var(--adm-question-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-question);--adm-type-header: var(--adm-question-header, var(--adm-question))}.admonition.quote{border-left:4px solid var(--adm-quote);background-color:rgba(var(--adm-quote-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-quote);--adm-type-header: var(--adm-quote-header, var(--adm-quote))}.admonition.success{border-left:4px solid var(--adm-success);background-color:rgba(var(--adm-success-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-success);--adm-type-header: var(--adm-success-header, var(--adm-success))}.admonition.task{border-left:4px solid var(--adm-task);background-color:rgba(var(--adm-task-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-task);--adm-type-header: var(--adm-task-header, var(--adm-task))}.admonition.tip{border-left:4px solid var(--adm-tip);background-color:rgba(var(--adm-tip-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-tip);--adm-type-header: var(--adm-tip-header, var(--adm-tip))}.admonition.warning{border-left:4px solid var(--adm-warning);background-color:rgba(var(--adm-warning-rgb), var(--adm-header-bg-opacity));--adm-type-color: var(--adm-warning);--adm-type-header: var(--adm-warning-header, var(--adm-warning))}.admonition>summary{list-style:none;cursor:pointer;position:relative;z-index:2}.admonition>summary::-webkit-details-marker{display:none}.admonition>summary::after{content:">";display:inline-block;font-weight:bold;margin-left:0.6em;transition:transform 0.2s ease-in-out;transform-origin:center;color:currentColor}.admonition[open]>summary::after{transform:rotate(90deg)} diff --git a/favicon-16x16.png b/favicon-16x16.png new file mode 100644 index 0000000..28b8251 Binary files /dev/null and b/favicon-16x16.png differ diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 0000000..6af3cc0 Binary files /dev/null and b/favicon-32x32.png differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..db84c1b Binary files /dev/null and b/favicon.ico differ diff --git a/icons/icon.svg b/icons/icon.svg new file mode 100644 index 0000000..a6b3b30 --- /dev/null +++ b/icons/icon.svg @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..df58d2f --- /dev/null +++ b/index.html @@ -0,0 +1,18 @@ +wiki.wompmacho.com
Michael

Michael

aka Mitch / aka WompMacho

Hi there 👋
#

The goal of this site is to document my home apps, services, infrastructure and other projects I am working on. Additionally I am using it as a learning tool, to document things I already know, fill in some gaps, add to that knowledge and further refine my understanding on complicated topics. I find its much easier to master something if you are forced to explain it to someone else. With that spirit in mind, lemme see what I can float your way.

+Favorite Quote

Never attribute to malice what can be explained by incompetence

© +2026 +Michael

Powered by Hugo & Blowfish

\ No newline at end of file diff --git a/index.json b/index.json new file mode 100644 index 0000000..d5eecbb --- /dev/null +++ b/index.json @@ -0,0 +1 @@ +[{"content":"","date":"8 March 2026","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":" Liberal is bad. # Wait, wasn\u0026rsquo;t this group touting to be \u0026ldquo;liberal\u0026rdquo; once? Tell me more about why Liberal is bad. You know what… that person looks funny and bothers me and calls themself a liberal so I don’t wanna be in that catagory anymore. No wait, actually lets just demonize a group because fox news says so. NO WAIT, let\u0026rsquo;s not use words correctly because words, logic, facts\u0026hellip; These things don\u0026rsquo;t matter.\nquit being a fucking sheep # this sums up my thoughts on the matter\nYour browser does not support the video tag. ","date":"8 March 2026","externalUrl":null,"permalink":"/posts/liberal/","section":"Posts","summary":"Liberal is bad. # Wait, wasn’t this group touting to be “liberal” once? Tell me more about why Liberal is bad. You know what… that person looks funny and bothers me and calls themself a liberal so I don’t wanna be in that catagory anymore. No wait, actually lets just demonize a group because fox news says so. NO WAIT, let’s not use words correctly because words, logic, facts… These things don’t matter.\n","title":"Liberal","type":"posts"},{"content":"","date":"8 March 2026","externalUrl":null,"permalink":"/authors/wompmacho/","section":"Authors","summary":"","title":"Wompmacho","type":"authors"},{"content":"","date":"31 December 2025","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":" What is vaultwarden? # vaultwarden ia a alternative server implementation of the Bitwarden Client API, written in Rust and compatible with official Bitwarden clients, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal.\nDocker Compose Example # # vaultwarden -- https://github.com/dani-garcia/vaultwarden --- services: vaultwarden: image: vaultwarden/server:latest container_name: vaultwarden restart: unless-stopped environment: DOMAIN: \u0026#34;https://vaultwarden.wompmacho.com\u0026#34; ROCKET_PORT: 80 ROCKET_ENV: production volumes: - vaultwarden-mount:/data/ ports: - \u0026#39;9998:80\u0026#39; - \u0026#39;9999:443\u0026#39; volumes: vaultwarden-mount: name: vaultwarden-mount driver_opts: type: nfs o: addr=truenas,nolock,soft,rw device: :/mnt/store/vault/app/vaultwarden ","date":"23 February 2025","externalUrl":null,"permalink":"/projects/vaultwarden/","section":"Projects","summary":"What is vaultwarden? # vaultwarden ia a alternative server implementation of the Bitwarden Client API, written in Rust and compatible with official Bitwarden clients, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal.\n","title":"","type":"projects"},{"content":"","date":"23 February 2025","externalUrl":null,"permalink":"/projects/","section":"Projects","summary":"","title":"Projects","type":"projects"},{"content":"The Hidden Flaw of Performance Reviews.\nGoodhart\u0026rsquo;s law Goodhart\u0026rsquo;s law is an adage often stated as, \u0026ldquo;When a measure becomes a target, it ceases to be a good measure\u0026rdquo;. It is named after British economist Charles Goodhart, who is credited with expressing the core idea of the adage in a 1975 article on monetary policy in the United Kingdom:\nAny observed statistical regularity will tend to collapse once pressure is placed upon it for control purposes.\nIt was used to criticize the British Thatcher government for trying to conduct monetary policy on the basis of targets for broad and narrow money, but the law reflects a much more general phenomenon.\nIn other words, when we use a measure to reward performance, we provide an incentive to manipulate the measure in order to receive the reward. This can sometimes result in actions that actually reduce the effectiveness of the measured system while paradoxically improving the measurement of system performance.\n","date":"8 February 2025","externalUrl":null,"permalink":"/posts/performance_reviews/","section":"Posts","summary":"The Hidden Flaw of Performance Reviews.\n","title":"Performance Reviews","type":"posts"},{"content":" What is Audiobookshelf? # Audiobookshelf is a self-hosted, open-source server designed to manage and stream your personal audiobook and podcast collections. It acts as a private, web-based alternative to services like Audible, giving you full control over your media files. Key features include:\nDocker Compose Example # Audiobookshelf requires a websocket connection. # audiobookshelf - https://github.com/advplyr/audiobookshelf/blob/master/docker-compose.yml --- version: \u0026#34;3.7\u0026#34; services: audiobookshelf: container_name: audiobookshelf image: ghcr.io/advplyr/audiobookshelf:latest # ABS runs on port 13378 by default. If you want to change # the port, only change the external port, not the internal port ports: - 13378:80 volumes: # These volumes are needed to keep your library persistent # and allow media to be accessed by the ABS server. # The path to the left of the colon is the path on your computer, # and the path to the right of the colon is where the data is # available to ABS in Docker. # You can change these media directories or add as many as you want - /mnt/store/MediaServer/Audio_Books:/audiobooks - /mnt/store/MediaServer/podcasts:/podcasts - /mnt/store/app/audiobookshelf/metadata:/metadata # The config directory needs to be on the same physical machine # you are running ABS on - /app/audiobookshelf/config:/config restart: unless-stopped # You can use the following environment variable to run the ABS # docker container as a specific user. You will need to change # the UID and GID to the correct values for your user. #environment: # - user=1000:1000 ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/audiobookshelf/","section":"Projects","summary":"What is Audiobookshelf? # Audiobookshelf is a self-hosted, open-source server designed to manage and stream your personal audiobook and podcast collections. It acts as a private, web-based alternative to services like Audible, giving you full control over your media files. Key features include:\n","title":"audiobookshelf","type":"projects"},{"content":" Whats is code-server? # code-server is a self-hosted instance of Visual Studio Code that runs on a remote server and is accessible directly through your web browser. It effectively turns any machine with a CPU and RAM into a fully functional cloud-based development environment.\nDocker Compose Example # # code-server -- https://hub.docker.com/r/linuxserver/code-server --- services: code-server: image: lscr.io/linuxserver/code-server:latest container_name: code-server environment: - PUID=1000 - PGID=1000 - TZ=America/New_York - PASSWORD=password #optional - HASHED_PASSWORD= #optional - SUDO_PASSWORD=password #optional - SUDO_PASSWORD_HASH= #optional - PROXY_DOMAIN=code-server.domain.com #optional - DEFAULT_WORKSPACE=/apps #optional volumes: - code-server-nfs:/config - apps:/apps ports: - 8443:8443 restart: unless-stopped volumes: code-server-nfs: name: code-server-nfs driver_opts: type: nfs o: addr=truenas,nolock,soft,rw device: :/mnt/store/vault/app/code-server apps: name: apps driver_opts: type: nfs o: addr=truenas,nolock,soft,rw device: :/mnt/store/vault/app/ ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/code-server/code-server/","section":"Projects","summary":"Whats is code-server? # code-server is a self-hosted instance of Visual Studio Code that runs on a remote server and is accessible directly through your web browser. It effectively turns any machine with a CPU and RAM into a fully functional cloud-based development environment.\n","title":"code-server","type":"projects"},{"content":" What is Frigate? # Frigate is a complete and local NVR designed for Home Assistant with AI object detection. Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras.\n# frigate - https://docs.frigate.video/frigate/installation/ --- version: \u0026#34;3.9\u0026#34; services: frigate: container_name: frigate privileged: true # this may not be necessary for all setups restart: unless-stopped image: ghcr.io/blakeblackshear/frigate:stable shm_size: \u0026#34;64mb\u0026#34; # update for your cameras based on calculation above volumes: - /etc/localtime:/etc/localtime:ro - /app/frigate/config:/config - /mnt/store/app/frigate:/media/frigate - type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear target: /tmp/cache tmpfs: size: 1000000000 ports: - \u0026#34;5000:5000\u0026#34; - \u0026#34;8554:8554\u0026#34; # RTSP feeds - \u0026#34;8555:8555/tcp\u0026#34; # WebRTC over tcp - \u0026#34;8555:8555/udp\u0026#34; # WebRTC over udp environment: FRIGATE_RTSP_PASSWORD: \u0026#34;password\u0026#34; requires to set a config.yml in the /config volume.\nMy current config # Am not currently running the optimized setup for this, but testing things out.\nmqtt: enabled: false cameras: front: birdseye: order: 1 ffmpeg: inputs: - path: rtsp://USERNAME:PASSWORD@IPADDR:554/path_to_stream roles: - detect - record objects: track: - person detect: width: 1920 height: 1080 record: sync_recordings: True enabled: True retain: days: 7 mode: motion events: # Optional: Number of seconds before the event to include (default: shown below) pre_capture: 5 # Optional: Number of seconds after the event to include (default: shown below) post_capture: 5 detectors: cpu1: type: cpu num_threads: 3 # Include all cameras by default in Birdseye view birdseye: enabled: True mode: continuous width: 1280 height: 720 quality: 8 inactivity_threshold: 30 Proxy fixes # For nginx proxy - add this to advanced options for proxy host\nproxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; proxy_buffering off; proxy_request_buffering off; ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/frigate/","section":"Projects","summary":"What is Frigate? # Frigate is a complete and local NVR designed for Home Assistant with AI object detection. Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras.\n","title":"frigate","type":"projects"},{"content":" What is homarr? # homarr is a nice little dashboard app that can be used to organize your homelab with a simple webpage interface. Great for Quick links, updates on weather, time, seeing if a server is down, monitoring your webcams or torrents, etc.\nNote Personally I have moved on to homepage. Looks a little nicer in my opinion. Not the biggest fan of homarr interface, Though I may try again after some updates.\nDocker Compose Example # Note For docker support, extend a volume to the docker.sock\n/var/run/docker.sock:/var/run/docker.sock # homarr - docker compose --- version: \u0026#39;3\u0026#39; services: homarr: container_name: homarr image: ghcr.io/ajnart/homarr:latest restart: unless-stopped volumes: - /app/homarr/configs:/app/data/configs - /app/homarr/icons:/app/public/icons - /var/run/docker.sock:/var/run/docker.sock ports: - \u0026#39;7575:7575\u0026#39; ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/homarr/","section":"Projects","summary":"What is homarr? # homarr is a nice little dashboard app that can be used to organize your homelab with a simple webpage interface. Great for Quick links, updates on weather, time, seeing if a server is down, monitoring your webcams or torrents, etc.\n","title":"homarr","type":"projects"},{"content":" What is homepage? # homepage is an open-source, highly customizable, and static site-based dashboard designed to organize your self-hosted services into a beautiful, central hub.\nUnlike other dashboards that require complex databases or heavy backend services, homepage runs as a lightweight, Docker-based container that reads a single configuration file (YAML).\nDocker Compose Example # # homepage - docker compose --- services: homepage: container_name: homepage image: ghcr.io/gethomepage/homepage:latest restart: unless-stopped volumes: - /mnt/store/app/homepage/configs:/app/config # Make sure your local config directory exists - /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations ports: - 7676:3000 ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/homepage/","section":"Projects","summary":"What is homepage? # homepage is an open-source, highly customizable, and static site-based dashboard designed to organize your self-hosted services into a beautiful, central hub.\n","title":"homepage","type":"projects"},{"content":" What is jellyfin? # Jellyfin is a media server. I like it because its simple, free, doesnt require online accounts and lets you serve up your movies, tv shows and music. Is very similar to apps like Plex and Emby. You can manage your media and auto download things like episode names, artwork etc. Has plugin support and is basically trying to be a better open source version of Plex. It has apps/support for android, google tvs, firestick, iphone etc.\nDocker Compose Example # # Jellyfin - docker compose --- services: jellyfin: container_name: jellyfin image: lscr.io/linuxserver/jellyfin:latest environment: - PUID=0 - PGID=0 - TZ=America/New_York ports: - 8096:8096 - 8920:8920 #optional https - 7359:7359/udp #optional discovery - 1900:1900/udp #optional discovery volumes: - /app/jellyfin:/config\t# config for your jellyfin - /mnt/store/:/data/store # where your media lives (movies/tv etc.) restart: unless-stopped Note Recomend storing the metadata \u0026amp; cache on NAS and not on the OS docker host. The files start to get LARGE for jellyfin due to mass amount of metadata stored for media. Set this under the jellyfin general settings after jellyfin is running. {.is-warning}\nOnce you server is running, head over to the to your opened port (docker_container_ip:8096) to start the setup proccess. When adding libraries - select the content type, set the display name and then click the FOLDERS + option. This is where you will select the path to your media that you set up in the volumes.\n","date":"4 February 2025","externalUrl":null,"permalink":"/projects/jellyfin/","section":"Projects","summary":"What is jellyfin? # Jellyfin is a media server. I like it because its simple, free, doesnt require online accounts and lets you serve up your movies, tv shows and music. Is very similar to apps like Plex and Emby. You can manage your media and auto download things like episode names, artwork etc. Has plugin support and is basically trying to be a better open source version of Plex. It has apps/support for android, google tvs, firestick, iphone etc.\n","title":"jellyfin","type":"projects"},{"content":" What is jellyseer? # Jellyseerr is a free, open-source, and highly intuitive media request management tool designed for the Jellyfin (and Plex/Emby) ecosystem. It essentially acts as a \u0026ldquo;gateway\u0026rdquo; between your users and your media server.\nDocker Compose Example # # jellyseerr - docker compose --- services: jellyseerr: image: fallenbagel/jellyseerr:latest container_name: jellyseerr environment: - LOG_LEVEL=debug - TZ=America/New_York ports: - 5055:5055 volumes: - /mnt/store/app/jellyseerr/config:/app/config restart: unless-stopped ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/jellyseer/","section":"Projects","summary":"What is jellyseer? # Jellyseerr is a free, open-source, and highly intuitive media request management tool designed for the Jellyfin (and Plex/Emby) ecosystem. It essentially acts as a “gateway” between your users and your media server.\n","title":"jellyseer","type":"projects"},{"content":" What is linkstacks? # Linkstacks is a nice little linktr.ee clone that allows you to set up a simple link page. It can also be expanded to add multiple users and you can host multiple people\u0026rsquo;s pages with their own user accounts and everything.\nDocker Compose Example # # Linkstacks - docker compose version: \u0026#34;3.8\u0026#34; --- services: linkstack: container_name: \u0026#39;linkstack\u0026#39; hostname: \u0026#39;linkstack\u0026#39; image: \u0026#39;linkstackorg/linkstack:latest\u0026#39; user: \u0026#39;0:0\u0026#39; environment: TZ: \u0026#39;America/New_york\u0026#39; SERVER_ADMIN: \u0026#39;SERVER_ADMIN_EMAIL\u0026#39; HTTP_SERVER_NAME: \u0026#39;HTTP_DOMAIN_NAME\u0026#39; HTTPS_SERVER_NAME: \u0026#39;HTTPS_DOMAIN_NAME\u0026#39; LOG_LEVEL: \u0026#39;info\u0026#39; PHP_MEMORY_LIMIT: \u0026#39;256M\u0026#39; UPLOAD_MAX_FILESIZE: \u0026#39;8M\u0026#39; volumes: - \u0026#39;linkstack_data:/htdocs\u0026#39; #- \u0026#39;/app/linkstack/:/htdocs\u0026#39; ports: - \u0026#39;8190:443\u0026#39; restart: unless-stopped volumes: linkstack_data: ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/linkstack/","section":"Projects","summary":"What is linkstacks? # Linkstacks is a nice little linktr.ee clone that allows you to set up a simple link page. It can also be expanded to add multiple users and you can host multiple people’s pages with their own user accounts and everything.\n","title":"linkstacks","type":"projects"},{"content":" What is mkdocs? # MkDocs is a fast, simple, and extensible static site generator geared specifically toward building project documentation. It relies heavily on Markdown files, which makes it incredibly accessible for developers who want to write docs as easily as they write code.\nDocker Compose Example # Running mkdocs with material theme and plugins built in.\nInfo There is some setup of folders and things that are not automatic so wont work straight out of the box.\n# mkdocs -- https://squidfunk.github.io/mkdocs-material/ version: \u0026#39;3\u0026#39; services: mkdocs: container_name: \u0026#39;mkdocs\u0026#39; restart: unless-stopped image: squidfunk/mkdocs-material environment: - PUID=1000 - PGID=1000 volumes: #- /mnt/store/app/mkdocs/:/docs - docs_nfs:/docs stdin_open: true tty: true ports: - \u0026#34;9896:8000\u0026#34; volumes: docs_nfs: name: docs_nfs driver_opts: type: nfs o: addr=truenas,nolock,soft,ro device: :/mnt/store/vault/app/mkdocs ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/mkdocs/","section":"Projects","summary":"What is mkdocs? # MkDocs is a fast, simple, and extensible static site generator geared specifically toward building project documentation. It relies heavily on Markdown files, which makes it incredibly accessible for developers who want to write docs as easily as they write code.\n","title":"mkdocs","type":"projects"},{"content":" What is nginx-proxy-manager? # Nginx-proxy-manager is a simplified GUI for handling an nginx server configuration. Nginx is a reverse proxy server.\nA reverse proxy server is a type of proxy server that typically sits behind the firewall in a private network and directs client requests to the appropriate backend server. Nginx is a very common go-to. Nginx-proxy-manager is a nice gui version that has some built in tools, like handling SSL Certificates with Let\u0026rsquo;s Encrypt. Nginix can provide load balancing, Web acceleration, Security and anonymity for servers.\nPersonally I use nginx to proxy all my traffic to my dedicated servers so that I do not have to expose local hosts via port forwarding. This also allows me to do some extra encryption along the way and add additional security via access lists where I see fit. I can also reuse ports, which saves a lot of time for configurations.\nDocker Compose Example # # nginx-proxy-manager - docker compose --- version: \u0026#34;3.8\u0026#34; services: app: container_name: nginx-proxy-manager image: \u0026#34;jc21/nginx-proxy-manager:latest\u0026#34; restart: unless-stopped ports: - \u0026#34;80:80\u0026#34; - \u0026#34;81:81\u0026#34; - \u0026#34;443:443\u0026#34; volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt Nginx gives you that great routing to your internal networked servers. Also helps you set up your DNS both inside and outside the network. Can be a little confusing at first.\nFirst you will need a route you want to point to. In this case I will use this site.\nI want to be able to type in wiki.wompmacho.com and arrive here rather than remembering my IP address and having to set up multiple complicated port forwards in my router. Instead nginx allows me to open one port - 80 and direct all traffic to nginx. Then based on some rules I have set up I can point that traffic to my internal server. For this I will need a domain name server (DNS) to point to my external IP.\nDNS # A domain name server (DNS) allows me to make a name that can be easily looked up and point traffic to an Internet Protocol (IP) address that a server can easily understand.\nI can type in a name to a browser - my browser will ask my computers dns cache where is google.com and when not found - it will ask my router where is google.com which will then ask the dns server it is pointed to (typically your ISP) who then asks the dns server the ISP is pointing to\u0026hellip; and so on until eventually one of the DNS servers contain the information about google.com. Then it can retrieve the IP address of that server and send that information back down the line - adding it to its own cache as it goes so that it does not have to keep looking up this information. This will allow the browser to make requests to that server directly.\nIn order to make my dns name known so that people can find it on the internet easily, We will have to purchase the name from a host of an Authoritative DNS server. An Authoritative DNS server will not cache the info, but instead act as a primary resource of the configuration for a dns name so other dns servers can ask for that resource.\nIn this example I have purchased wompmacho.com from cloudflare who operate as a registrar and facilitates purchasing that name from a higher authoritative registry. Allowing me to point my external IP address to this address.\nOnce I have a DNS name I can use my registar (cloudflare) to point that name to my external IP address (my router\u0026rsquo;s IP address).\nwompmacho.com \u0026lt;\u0026gt; 175.222.222.222 Port forwarding # This traffic will then be requested from my router which should be typically set up to block incoming requests. In order to allow a request to my server hosting my site I will need to open a port (80) and allow traffic through my router\u0026rsquo;s firewall to my docker container that is hosting nginx-proxy-manager. Nginx will then redirect this again to my docker container for my site.\nA records # For my scenario my dns name is wompmacho.com but if I want to have multiple sites at my IP address I will need to be able to differentiate them. To do this I will use an A record. This allows me to split up my domain with multiple sub domains.\nwiki.wompmacho.com subdomain.wompmacho.com Setting up a proxy # This will point traffic to the same domain (wompmacho.com) but based on the sub-domain nginx will be able to direct and load balance traffic to my internal server hosting the wiki - in this case also my docker container. The wiki is hosted on a different port. We can point this proxy to that port.\nCloudflare DNS Proxy # An example of a dns service is Cloudflare. I switched over to cloudflare when google sold their awesome DNS. I have been loving it since the switch, there is a lot of info out there on services they offer and how to set things up. The biggest reason I switched over to cloudflare is their dns proxy. This allows my home IP to be proxied behind cloudflare services - and helps hide my servers location. This also allows me to utilize their services to block things like botnet attacks.\nSSL encryption # Secure Sockets Layer (SSL) is a security protocol that provides privacy, authentication, and integrity to Internet communications. SSL eventually evolved into Transport Layer Security (TLS). Using Nginx-proxy-manager we can connect our cloudflare DNS to our nginx server using SSL encryption. This is what that lock and https indicates on your browser - you are using a secured and verified connection to the server. This helps stop man in the middle attacks preventing people from spoofing the connection and spying on you.\nWe do this by adding a cloudflare certificate to nginx proxy manager and then setting up our proxy host to use this certificate on the SSL tab.\nNote this is is only for a secure connection between nginx \u0026lt;-\u0026gt; cloudflare The details page is referring to your internal setup - or where nginx should point the dns to.\norigin server \u0026lt;-\u0026gt; nginx Use https here only if you have ssl setup on your origin server and your server is set up to accept https, otherwise you make get bad gateway 502 errors.\n","date":"4 February 2025","externalUrl":null,"permalink":"/projects/nginx-proxy-manager/","section":"Projects","summary":"What is nginx-proxy-manager? # Nginx-proxy-manager is a simplified GUI for handling an nginx server configuration. Nginx is a reverse proxy server.\n","title":"nginx-proxy-manager","type":"projects"},{"content":" What is Portainer? # Portainer is a lightweight, powerful container management platform that provides a graphical user interface (GUI) to manage your Docker, Docker Swarm, and Kubernetes environments. It essentially sits on top of your container runtime, allowing you to control complex infrastructure without needing to master the command line.\nPortainer provides a very easy to understand user interface for deploying other docker containers. The great thing is, Portainer is a container itself, so it should run automatically following setup and allow you a nice gui interface for your docker environment via a web browser. I particularly love its dashboard because you get a great snapshot of your running containers, can easily restart and monitor your containers, but most importantly edit and deploy docker-compose files via the \u0026ldquo;stacks\u0026rdquo; page.\nPortainer CE is free version\nInstall Guide\nCreate the volume that Portainer Server will use to store its database\ndocker volume create portainer_data Download and install the Portainer Server container\ndocker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest Verify the container is running with docker ps\nroot@server:~# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES de5b28eb2fa9 portainer/portainer-ce:latest \u0026#34;/portainer\u0026#34; 2 weeks ago Up 9 days 0.0.0.0:8000-\u0026gt;8000/tcp, :::8000-\u0026gt;8000/tcp, 0.0.0.0:9443-\u0026gt;9443/tcp, :::9443-\u0026gt;9443/tcp portainer Navigate to https://HOST_IP_ADDRESS:9443 and create a user so you can log in to the Portainer web interface.\n","date":"4 February 2025","externalUrl":null,"permalink":"/projects/portainer/","section":"Projects","summary":"What is Portainer? # Portainer is a lightweight, powerful container management platform that provides a graphical user interface (GUI) to manage your Docker, Docker Swarm, and Kubernetes environments. It essentially sits on top of your container runtime, allowing you to control complex infrastructure without needing to master the command line.\n","title":"portainer","type":"projects"},{"content":" What is qBittorrent? # qBittorrent is a awesome, simple app that allows you to use classic QBittorrent in a docker container. I use QBittorrent because I can set it up with a VPN that only connects via the container directly. Effectively separating it from the rest of my network and allowing me to continue as normal while it is downloading. It will automatically stop the network if the VPN is not functioning correctly.\nDocker Compose Example # # qbittorrentvpn - docker compose # https://hub.docker.com/r/dyonr/qbittorrentvpn --- version: \u0026#34;2\u0026#34; services : qbittorrentvpn: container_name: qbittorrentvpn privileged: true image: dyonr/qbittorrentvpn environment : - VPN_ENABLED=true - VPN_USERNAME=VPN_USERNAME - VPN_PASSWORD=VPN_PASSWORD - LAN_NETWORK=10.0.0.0/24 - WEBUI_PORT_ENV=8080 - INCOMING_PORT_ENV=8999 ports : - 8080:8080 - 8999:8999 - 8999:8999/udp\tvolumes : - /app/QBittorrent/config:/config - /mnt/store/MediaServer/torrent:/downloads\trestart: unless-stopped To set up the VPN you will need to have an existing account with a VPN service. Username \u0026amp; Password for the vpn will be provided as a key by your vpn service. In my case I use Surfshark and have to go log into my account, navigate to the linux setup page and grab my generated Username key and Password key there.\nA credentials file on my docker host was generated by QBittorrent when running the first time.\n# download all availble server conf sudo wget https://my.surfshark.com/vpn/api/v1/server/configurations # cp the server you want to use into config folder /app/QBittorrent/config/openvpn Once you restart your qbittorrentvpn docker container you can test your vpn service with a torrent leak test. Use the + add torrent link button to Download the torrent and test that your VPN service is connected and working.\ntorrent-leak-test Magnet links # Use magnet link and item hash to avoid logins\nmagnet:?xt=urn:btih:${HASH} ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/qbittorent/","section":"Projects","summary":"What is qBittorrent? # qBittorrent is a awesome, simple app that allows you to use classic QBittorrent in a docker container. I use QBittorrent because I can set it up with a VPN that only connects via the container directly. Effectively separating it from the rest of my network and allowing me to continue as normal while it is downloading. It will automatically stop the network if the VPN is not functioning correctly.\n","title":"qBittorrent","type":"projects"},{"content":" What is uptime-kuma? # uptime-kuma is a neat little web monitoring application. Lotta dope things right out of the box, very gui / user friendly. Pretty much just add the stack, update the dir for config - and it works. Integrates with discord webhooks, great easy status page and dashboard.\nDocker Compose Example # # uptime-kuma - docker compose --- # https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install version: \u0026#39;3.3\u0026#39; services: uptime-kuma: container_name: uptime-kuma image: louislam/uptime-kuma:1 volumes: - /app/uptime-kuma/data:/app/data ports: - 3001:3001 # \u0026lt;Host Port\u0026gt;:\u0026lt;Container Port\u0026gt; restart: always ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/uptime-kuma/","section":"Projects","summary":"What is uptime-kuma? # uptime-kuma is a neat little web monitoring application. Lotta dope things right out of the box, very gui / user friendly. Pretty much just add the stack, update the dir for config - and it works. Integrates with discord webhooks, great easy status page and dashboard.\n","title":"uptime-kuma","type":"projects"},{"content":" What is webtop? # webtop is a awesome mini linux env I can use as a secure remote web-client for my home network.\nDocker Compose Example # # webtop - https://docs.linuxserver.io/images/docker-webtop/#lossless-mode --- services: webtop: image: lscr.io/linuxserver/webtop:latest container_name: webtop environment: - PUID=1000 - PGID=1000 - TZ=America/New_York - TITLE=Webtop #optional volumes: - /app/webtop/data:/config ports: - 7978:3000 - 7979:3001 restart: unless-stopped ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/webtop/","section":"Projects","summary":"What is webtop? # webtop is a awesome mini linux env I can use as a secure remote web-client for my home network.\n","title":"webtop","type":"projects"},{"content":" What is wikijs? # Wiki.js is a powerful, modern, and open-source wiki application built on Node.js. It is designed to be the central knowledge base for your home lab or professional projects, replacing traditional, clunky wiki platforms with a sleek, intuitive interface.\nI like it because of the useful Markdown editor that lets you nicely organize links, code etc. I can also backup the database to my NAS in nice MD files, so nothing gets lost if something is corrupted.\nDocker Compose Example # # wikijs - docker compose # https://github.com/linuxserver/docker-wikijs --- version: \u0026#34;3.8\u0026#34; services: wikijs: image: lscr.io/linuxserver/wikijs:latest container_name: wikijs environment: - PUID=0 - PGID=0 - TZ=Etc/UTC - DB_TYPE=sqlite #optional - DB_HOST= #optional - DB_PORT= #optional - DB_NAME= #optional - DB_USER= #optional - DB_PASS= #optional volumes: - /app/wiki/config:/config - /app/wiki/data:/data ports: - 3000:3000 restart: unless-stopped ","date":"4 February 2025","externalUrl":null,"permalink":"/projects/wikijs/","section":"Projects","summary":"What is wikijs? # Wiki.js is a powerful, modern, and open-source wiki application built on Node.js. It is designed to be the central knowledge base for your home lab or professional projects, replacing traditional, clunky wiki platforms with a sleek, intuitive interface.\n","title":"wikijs","type":"projects"},{"content":"Yo 👋\nIf you actually come to find this then props to ya man. Thanks for dropping by. idk if this will be worth ever doing, but this was fun for me to set up\u0026hellip; and who knows maybe this is of some use to others\u0026hellip; so fuck it \u0026ndash;\u0026gt; Enjoy.\n","date":"2 February 2025","externalUrl":null,"permalink":"/posts/firstpost/","section":"Posts","summary":"Yo 👋\nIf you actually come to find this then props to ya man. Thanks for dropping by. idk if this will be worth ever doing, but this was fun for me to set up… and who knows maybe this is of some use to others… so fuck it –\u003e Enjoy.\n","title":"First Post","type":"posts"},{"content":"this has changed a bit\u0026hellip; I will update later\u0026hellip;\nCamera Gear # Sony Alpha a6400 Sigma 16mm f/1.4 Gonine AC-PW20 NP-FW50 Dummy Battery Elgato Cam Link 4K Pixel Desk Camera Mount Stand Quick Release Plate Camera Tripod Mount Micro HDMI to HDMI Adapter Cable Lighting # GVM 1000D RGB Led Video Light Audio # Shure SM7b - Vocal Dynamic Microphone Shure SM57-LCE Cardioid Dynamic Mic Shure A2WS-BLK - pop filter PreSonus Revelator io24 Mic Arm Desk Mount Brainwavz XL Micro Suede Memory Foam Earpads IRL Setup # Alex Tech 10ft - 1/2 inch Cord Protector SIM Card Adapter Nano Micro NDI HDMI Encoder, TBS2603SE NDI USB to DC Convert Cable Cudy N300 WiFi Unlocked 4G LTE Sony FDR-X1000V/W 4K Action Cam Backpack Shoulder Chest Strap Clip Mount Bicycle \u0026amp; Motorcycle Phone Mount Portable Charger Power Bank Game PC # WD_BLACK 2TB SN850 NVMe Corsair Vengeance LPX 32GB - Mem Corsair Carbide Series Air 740 CORSAIR Hydro Series H115i ASUS ROG STRIX GeForce GTX 1080 Intel Core i7-7700K Asus Z170-A - MOBO Peripheral # Logitech G Pro Wireless Gaming Mouse Acer Predator XB272 bmiprz 27\u0026quot; CORSAIR K70 RGB MK.2 RAPIDFIRE Speakers - PreSonus Eris Single Monitor Desk Mount - Adjustable Gas Spring Stream PC # G.SKILL TridentZ Series 16GB Elgato Stream Deck AMD YD180XBCAEWOF Ryzen 7 1800X Nvidia GeForce GTX 1080 ASUS Prime X370-Pro - MOBO ","date":"12 July 2024","externalUrl":null,"permalink":"/stream/stream_gear/","section":"Stream","summary":"this has changed a bit… I will update later…\n","title":"Gear","type":"stream"},{"content":"","date":"12 July 2024","externalUrl":null,"permalink":"/stream/","section":"Stream","summary":"","title":"Stream","type":"stream"},{"content":" Experience Special Projects Lead (DT L3) - Google October 2024 - Current HwOps Special Projects Lead; Resolve technical incidents and escalations by performing analysis utilizing existing data models or leveraging custom built data infrastructure to formulate and interpret data to reach specific conclusions and next steps. Develop detailed reports and intuitive dashboards, communicating key insights for data driven analysis. File bugs against products, documentation, and procedures by documenting desired behavior or steps to reproduce, and driving bugs to resolution. Suggest code-level resolutions for complex issues by leveraging tools, tool development and effective communication with stakeholders. Identify opportunities to build or enable solutions that improve, support or empower OMs, Site Leads \u0026 DTs to solve issues by using self-service tools and documentation. Fostered team growth through mentorship, training course facilitation, collaboration with internal training teams, and technical writing development. Data Center Technician (DT L2) - Google July 2023 - October 2024 Site Operations hardware maintenance and networking, resolving critical issues and collaborating cross-functionally to address SLO deviations. Built and led an internal escalation team for weekend/holiday support, creating resources and onboarding leaders. Developed and documented new processes, championed project documentation, and contributed to technician hiring, onboarding, and training. Mentored Googlers and facilitated training programs. Transitioned into Leader Role as a Maintenance Lead / Escalation Point of Contact. Consulting / Freelance / Helping out Family Porch Light Properties LLC Jun 2020 - Jul 2023 Developed and implemented long-term systems, development, and planning strategies, including rebranding initiatives. Served as Hiring Manager, overseeing onboarding, system administration, and policy management. Managed social media, website development/design, SEO, and marketing campaigns (including Facebook Ads). Utilized Google Analytics and oversaw technology/security initiatives and traditional marketing. Videography, Photography, Film Media, Drone Services Jun 2020 - Jan 2023 Tabora Farm and Winery Dec 2019 - May 2020 Managed social media, website development/design, and SEO. Oversaw tax and licensing compliance for interstate wine shipments. Work Experience Continued Operations Engineer - Twitter Inc. Apr 2015 - Sep 2017 Led site operations teams and provided on-call support for multiple data centers/POPs, consistently exceeding SLOs goals. Managed, hired, onboarded, and trained operations engineers and staff. Served as a Twitter liaison and brand ambassador, reporting on emerging technologies. Provided on-site support to engineering teams, proactively monitored services, and managed projects including repairs, decommissioning, upgrades, installations, networking, and maintenance. Operations Technician (OTA/OA) - Google Nov 2012 - Mar 2015 Supported multiple sites on critical infrastructure projects, including server repairs, hardware qualifications, QA, NPI, HAT, disk sanitization, project management, decommissioning, upgrades, and backup library maintenance. Collaborated effectively to maintain Google's infrastructure and ensure operational excellence. Education Pennridge High School 2004 - 2009 Georgia State University - Computer Science 2012 - 2017 Skills Certificates Leadership, Mentoring UNIX / Linux / OS Networking, TCP/IP, DNS, DHCP Technical Writing \u0026 Documentation SQL, HTML, CSS, JS Java, Golang, Shell Scripting Docker, VMs, Baremetal LPIC-1 - Linux Professional Institute SUSE Certified Linux Administrator (SUSE CLA) Small Unmanned Aircraft System (Part 107) PDF Download ","date":"12 July 2024","externalUrl":null,"permalink":"/resume/","section":"HOME","summary":" Experience Special Projects Lead (DT L3) - Google October 2024 - Current HwOps Special Projects Lead; Resolve technical incidents and escalations by performing analysis utilizing existing data models or leveraging custom built data infrastructure to formulate and interpret data to reach specific conclusions and next steps. Develop detailed reports and intuitive dashboards, communicating key insights for data driven analysis. File bugs against products, documentation, and procedures by documenting desired behavior or steps to reproduce, and driving bugs to resolution. Suggest code-level resolutions for complex issues by leveraging tools, tool development and effective communication with stakeholders. Identify opportunities to build or enable solutions that improve, support or empower OMs, Site Leads \u0026 DTs to solve issues by using self-service tools and documentation. Fostered team growth through mentorship, training course facilitation, collaboration with internal training teams, and technical writing development. ","title":"Resume","type":"page"},{"content":" What is Pterodactyl? # Pterodactyl is a free, open-source game server management panel built with PHP, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users.\npterodactyl \u0026amp; ssl # ssl with pterodactyl is really annoying if you are using it behind a reverse proxy (nginx) - might be easier to run this on its own server so you can just use the default port 80 for web. reverse proxy is designed for normal web traffic, not game servers.\nIf you are annoying like me and wanna put things on a single server and save money\u0026hellip; here is what you can do.\nCreating SSL Certificates\nYoutube Guide\nWebserver Configuration\nNGINX Specific Configuration\nhttps://pterodactyl.io/panel/0.7/configuration.html # idk... couldn\u0026#39;t get it to work # OpenSSL Self-Signed Certificate Command: openssl req -sha256 -addext \u0026#34;subjectAltName = DNS:games.local\u0026#34; -newkey rsa:4096 -nodes -keyout privkeyselfsigned.pem -x509 -days 3650 -out fullchainselfsigned.pem # nginx-proxy-manager with cloudflare ssl cert setup # proxy side should be http # do not force ssl on cert side # go to http after getting to the site # .env file /var/www/pterodactyl/.env APP_URL=\u0026#34;http://domain\u0026#34; TRUSTED_PROXIES=* # you don\u0026#39;t have to do this - i\u0026#39;d rather not PTERODACTYL_TELEMETRY_ENABLED=false RECAPTCHA_ENABLED=false # config.yml /etc/pterodactyl/config.yml # use auto config remote: http: # nginx pterodactyl.conf /etc/nginx/sites-enabled/pterodactyl.conf # add to proxy-manager special settings proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; proxy_buffering off; proxy_request_buffering off; sudo systemctl restart nginx \u0026amp;\u0026amp; systemctl restart wings ","date":"4 May 2024","externalUrl":null,"permalink":"/projects/pterodactyl/","section":"Projects","summary":"What is Pterodactyl? # Pterodactyl is a free, open-source game server management panel built with PHP, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users.\n","title":"pterodactyl","type":"projects"},{"content":" What is a NAS? # A Network Attached Storage (NAS) device is essentially a small, self-contained computer that\u0026rsquo;s designed solely for storing and sharing files. Think of it as your own personal cloud storage, but instead of relying on a third-party service, you own and control the hardware.\nHere\u0026rsquo;s why someone might use a NAS:\nCentralized Storage: A NAS provides a single location to store all your files - documents, photos, videos, music, etc. This makes it easy to access your data from any device on your network. File Sharing: NAS devices make it simple to share files between multiple users and devices. This is great for families who want to share photos and videos, or for small businesses who need to collaborate on documents. Backup and Redundancy: Many NAS devices offer features like automatic backups and RAID configurations, which help protect your data from hard drive failures. Media Streaming: NAS devices can be used to stream media files (movies, music) to devices throughout your home, like smart TVs, game consoles, and mobile devices. Remote Access: Some NAS devices allow you to access your files remotely over the internet, so you can retrieve important documents or share photos even when you\u0026rsquo;re away from home. Essentially, a NAS is a versatile and convenient way to manage and share your digital data. It offers more control and privacy than cloud storage services, and it can be a valuable tool for both individuals and businesses.\nTrueNAS # TrueNAS is an Open Source NAS operating System / infrastructure solution. In addition to powerful scale-out storage capabilities, TrueNAS SCALE adds Linux Containers and VMs (KVM) so your organization can run workloads closer to data.\nWhy I switched # Recently I switched over to TrueNas from my off the shelf Terramaster device. I actually really liked the Terramaster, it allowed a 5 drive pool with raid 1 on a BTRFS filesystem. Which meant it was easy to upgrade the drives from 2TB \u0026ndash;\u0026gt; 6TB giving me a decent ~24TB size pool (one drive as parity). I got this originally so that I could safely back up my data and store my 10TB+ of VOD recordings from the Live Stream \u0026amp; Youtube. The Terramaster had some pretty big drawbacks. It was only really good for being a simple NAS share.\nThe proprietary operating System is actual hot garbage.\nthe GUI is extremely slow and freezes up a lot the built in docker containers and other special features rarely work the Recycle bin is hot garbage and runs even when you turn it off (discovered nothing had EVER been deleted) the underlying linux OS somehow struggles to do basic things like deleting files networking sometimes just broke, ignored static IPs and would ignore DNS due to not properly turning off ipv6 there is little to no documentation or support outside of Terramaster official forums, which is also hot garbage. Couple years later my data has continued to grow, including my jellyfin media and other hoarding, so I needed some space. This gave me a nice opertunity to upgrade. I have an older, but still nice PC sitting around as a spare, so this was a good chance to upgrade my NAS with some nice compute as well.\nWhy TrueNAS # I went with TrueNAS SCALE because it used the newer ZFS2 filesystem which allows for expansion of pools. This would allow me to buy some extra drives, move over my data and then expand using the old drive pool. SCALE also moved over to docker containerization. Side benefit of allowing me to host some extra containers if I want. Its also free and there is a lot of support / documentation out there. It has come a long way from the FreeBSD days.\nRefurbished Drives # I had some issues when getting sourcing drives. Things are still pretty expensive atm, so I went with just getting more 6TB and expanding the pool. Can upgrade size later when the prices chill out. Managed to find a good price on refurbished 6TB drives from amazon. However; when they arrived I found that they were all heavily used 4 years+ uptime, reused from some Datacenter somewhere. Fucking scummy Amazon seller. To top it off, some were SAS drives out of NETAPP appliances.\nFuck you Netapp Netapp is an older shit brand that would lock down their drives with special formatting that forced the customer to use only drives sourced from Netapp. These old Netapp appliances are starting to flood the market as newer / cheaper to run hardware is being deployed.\nSuccess Luckily, smart people can reformat the drives from their shit Data Integrity Feature (DIF) format back to a normal. This is a long and time consuming process (Took DAYS) as the entire drive has to be reformatted with a normal 512 chunk size.\nNote Thank you smart guy from reddit that pointed me to the smart guy on TrueNAS forum that showed me how to fix these un-usable drives.\nTrueNAS has sg_format built in. With this you can reformat all the drives at the same time.\n# formatting sg_format --format --size=512 /dev/sdb # progress sudo sg_turs --progress /dev/sdb Warning This still took multiple days with a 6TB drive :(\nSafely copying files # One problem I ran into was; how do I make sure everything is copied over safely from one pool to another? I could drag and drop folders, but that would have taken months and risked missing data. Best bet was to use rsync (which is also the fastest way to transfer). rsync has the added benefit of using checksum checking to verify all data is safely transferred with no errors. Luckily both systems were on linux, which made this easier.\nNote I started by doing this after logging into my old Terramaster NAS and performing the rsync operation from there. This was a bad idea and too longer, because the OS is slow and CPU can not handle handling all this plus 10GB networking at once. If you do this, do this from a system with a decent CPU.\nMount your systems together via the device with the best CPU #mount in fstab # \u0026lt;file system\u0026gt; \u0026lt;dir\u0026gt; \u0026lt;type\u0026gt; \u0026lt;options\u0026gt; \u0026lt;dump\u0026gt;\t\u0026lt;pass\u0026gt; nas:/mnt/md0/VODS /mnt/tnas/vods nfs defaults 0 0 Run rsync in the shell and move your folders using recursive options # Coping folders recursively with Progress \u0026amp; Stats sudo rsync -avh -A --no-perms --progress --stats /mnt/tnas/store/Backups/ /mnt/store/vault/Backups/ \u0026amp; Note rsync keeps logs and will run faster the next time around. Recommend running it a few times to add a extra verification that all your files have transferred.\nNote You can use --progress --stats and the \u0026amp; operator to send the job to the background. This will alow you to bring the job to the foreground whenever you want to check on progress. This is super useful when transferring terabytes of data.\nNote If doing this from TrueNAS, might be better to set this up as a one time cronjob. TrueNAS might kill this job if you lose connection to the shell while transferring.\nadd the job using the user interface (do not enable the job) run the job when you are ready to move files How to connect to a NAS # CIFS # Common Internet File System (CIFS) is a network file sharing protocol that allows applications on computers to read and write files and request other services from remote servers. Think of it as a way for your computer to talk to another computer (or storage device) to access files. It\u0026rsquo;s most commonly associated with Windows environments, but it\u0026rsquo;s used by other operating systems as well. It is relatively secure, requiring username / password login to remote systems.\nNote You might need this if you want to connect a Windows machine to one running linux like a common NAS (my use case).\nOne example of a use case is a jellyfin container that needs persistent data access for media (movies / tv shows) served from your nas. This will need this to be mounted to the OS docker is running on and pass this through with the volumes option in your docker compose file.\nTo add CIFS to Linux\nFor this you will also need the keyutils \u0026amp; cifs-utils packages. The keyutils package is a library and a set of utilities for accessing the kernel keyring facility. cifs-utils package provides a means for mounting SMB/CIFS shares on a Linux system.\napt-get install keyutils \u0026amp;\u0026amp; apt install cifs-utils -y Then we will need to mount the remote storage via fstab so that it will automatically mount to the OS every time the os boots.\ncreate a file in your home directory \u0026ldquo;~/.smb\u0026rdquo; vim ~/.smb Info The file should contain your NAS credentials (domain optional/depends on your nas settings)\nusername=NAS_USERNAME password=NAS_PASSWORD domain=NAS_DOMAIN_GROUP Create an entry in the fstab vim /etc/fstab Add an entry to the bottom line of the file # //{Nas_IP/Hostname}/{Nas_Mount_Point} /mnt/{mount_name_on_docker_os} cifs credentials=/[path_to_credentials].smb,x-systemd.automount 0 0 # Example: //nas.home/store /mnt/store cifs credentials=/home/wompmacho/.smb,x-systemd.automount 0 0 Save your file and re-mount all mount -a make sure your mount section of your docker compose matches the mount_name_on_docker_os and reboot your system # example: volumes: - /app/jellyfin/config:/config - /mnt/store:/data/store Success You can check that they are mounted by navigating to where you mounted the files\nwompmacho@docker:~$ cd /mnt/store/MediaServer/ Movies/ Music/ Torrent/ Tv Shows/ NFS # NFS (Network File System) is a distributed file system protocol that allows users to access files and directories over a network as if they were located on their local computer. It\u0026rsquo;s a way for your computer to talk to another computer (or storage device) to access files, similar to CIFS, but more commonly used in Unix/Linux environments.\nWarning There is NO SECURITY on NFS. It uses existing ACL groups to manage permissions. Only use this on a local network and for trusted devices.\nSuccess On TrueNAS you can limit access to on IP address or limit within your local domain.\nInfo One thing to consider when working with TrueNas:\nWhen creating the initial dataset in your pool, set the zfs aclmode on the dataset in question to passthrough. Special thanks to anodos you solved am issue plaguing me \u0026ndash;\u0026gt; Truenas Forum SMB # Server Message Block (SMB) is a network communication protocol that allows computers to share files, printers, and other resources with each other. It\u0026rsquo;s the foundation of file sharing in Windows environments, but it\u0026rsquo;s also used by other operating systems like macOS and Linux.\nTo connect to a SMB share on Windows:\nRight Click to add a Network Location Use the IP address or hostname of the NAS and the share path provided to your folder access For windows you will need to enter a username / password for access to the share\n","date":"4 May 2024","externalUrl":null,"permalink":"/projects/nas/","section":"Projects","summary":"NAS build and some tips and tricks to get things working with your docker containers","title":"NAS","type":"projects"},{"content":" IP Address # An Internet Protocol address (IP) address is a numerical label assigned to each device connected to a computer network that uses the Internet Protocol for communication. Think of it like a street address for your computer on the internet. It\u0026rsquo;s how devices find each other and exchange information.\nHere\u0026rsquo;s a breakdown:\nNumerical Identifier: An IP address is a set of numbers, typically represented in dotted decimal notation (e.g., 192.168.1.1). There are two main versions: IPv4 (the older version) and IPv6 (the newer version, which uses a different format to accommodate more addresses). Device Identification: Every device that connects to a network (computers, smartphones, tablets, servers, etc.) needs a unique IP address to be identified and communicate. Location Information: While not precise, parts of an IP address can provide some general information about the device\u0026rsquo;s location. Routing: IP addresses are used by routers to direct network traffic to the correct destination. When you send data over the internet, routers use IP addresses to figure out where to send it. In short, an IP address is a crucial element of networking. It\u0026rsquo;s the unique identifier that allows devices to communicate with each other over a network, whether it\u0026rsquo;s a local network or the vast expanse of the internet.\nIPv4 \u0026amp; IPv6 # IPv4 and IPv6 are two versions of the Internet Protocol (IP), which is the fundamental protocol that enables devices to communicate over the internet. They are essentially addressing systems that allow devices to be uniquely identified and located on a network.\nHere\u0026rsquo;s a breakdown:\nIPv4 (Internet Protocol version 4): This is the original version of IP, using 32-bit addresses represented in dotted decimal notation (e.g., 192.168.1.1). It offers roughly 4.3 billion unique addresses. Due to the explosive growth of the internet, IPv4 addresses are now largely exhausted.\nIPv6 (Internet Protocol version 6): This is the newer version of IP, designed to address the limitations of IPv4. It uses 128-bit addresses represented in hexadecimal notation (e.g., 2001:0db8:85a3:0000:0000:8a2e:0370:7334). IPv6 offers a vastly larger address space, virtually eliminating the problem of address exhaustion.\nKey Differences and Why IPv6 is Needed:\nAddress Space: IPv4 has a limited number of addresses, while IPv6 offers a practically unlimited number. Address Format: IPv4 uses dotted decimal notation, while IPv6 uses hexadecimal notation. Automatic Configuration: IPv6 supports more advanced automatic configuration features, simplifying network management. Security: IPv6 includes built-in security features, such as IPSec, which enhances network security. In short, IPv4 is the older, widely used addressing system that is now facing address exhaustion. IPv6 is the newer, more robust addressing system designed to replace IPv4 and provide the necessary address space for the continued growth of the internet. The transition to IPv6 is ongoing.\nDHCP # Dynamic Host Configuration Protocol (DHCP) is a network management protocol that automates the process of assigning IP addresses and other network configuration parameters to devices on a network. Think of it as a way to automatically give each device on your network its own \u0026ldquo;address\u0026rdquo; so it can communicate with other devices and the internet.\nHere\u0026rsquo;s a breakdown:\nAutomatic IP Assignment: DHCP eliminates the need to manually configure IP addresses for each device on a network. This is especially useful in large networks where it would be tedious to assign addresses manually. Lease-Based System: DHCP uses a \u0026ldquo;lease\u0026rdquo; system, where IP addresses are assigned to devices for a specific period of time. When the lease expires, the device must renew it or the IP address becomes available for other devices. This helps ensure that IP addresses are used efficiently. Centralized Management: DHCP allows network administrators to manage IP addresses from a central server. This simplifies network administration and makes it easier to track which devices have which IP addresses. Other Configuration Parameters: In addition to IP addresses, DHCP can also provide other network configuration parameters, such as subnet mask, default gateway, and DNS server addresses. Why someone might use DHCP:\nSimplified Network Administration: DHCP makes it much easier to manage IP addresses in a network, especially in large networks. Reduced Configuration Errors: Manual IP address configuration can lead to errors, such as duplicate IP addresses, which can cause network conflicts. DHCP helps prevent these errors. Efficient IP Address Usage: The lease-based system ensures that IP addresses are used efficiently and that addresses that are no longer in use are reclaimed. Plug-and-Play Networking: DHCP allows devices to connect to a network and automatically receive the necessary network configuration, making it easier to add new devices to the network. In short, DHCP is a valuable tool for network administrators that simplifies IP address management and makes networks more efficient and reliable.\nStatic IP # A static IP address is a manually assigned IP address that remains constant for a specific device on a network. Unlike a dynamic IP address (assigned by DHCP), a static IP doesn\u0026rsquo;t change. This makes it useful for devices that need a consistent and predictable address, such as servers, printers, or network devices. However, it requires manual configuration and careful management to avoid IP address conflicts.\nDNS # Domain Name System (DNS) is essentially the phone book of the internet. It translates human-readable domain names (like google.com) into the numerical IP addresses (like 172.217.160.142) that computers use to communicate with each other.\nHere\u0026rsquo;s a breakdown:\nHuman-Friendly to Machine-Friendly: We remember names like \u0026ldquo;google.com\u0026rdquo; easily, but computers communicate using IP addresses. DNS bridges this gap by converting domain names into their corresponding IP addresses. Distributed Database: DNS is a massive, distributed database. It\u0026rsquo;s not stored in one single location, but rather spread across a network of servers around the world. This makes it robust and efficient. Hierarchical Structure: DNS is organized in a hierarchical structure, like a tree. This structure helps to manage the vast number of domain names and IP addresses. Resolution Process: When you type a domain name into your browser, your computer initiates a DNS resolution process. It queries various DNS servers to find the IP address associated with that domain name. Why someone might use DNS:\nEasy Access to Websites: DNS allows us to access websites by using easy-to-remember domain names instead of complex IP addresses. Email Delivery: DNS is also used to route email to the correct mail servers. Internet Functionality: DNS is a fundamental component of the internet, without which we wouldn\u0026rsquo;t be able to easily browse the web or send emails. In short, DNS is a critical part of the internet infrastructure. It\u0026rsquo;s the system that allows us to use domain names to access websites and other internet resources, making the internet user-friendly and accessible.\nPROXY # A proxy acts as an intermediary between a client (like your computer) and a server (like a website). Instead of your computer directly connecting to the server, it connects to the proxy server, which then forwards the request to the server. The server\u0026rsquo;s response comes back to the proxy, which then forwards it to your computer. Think of it like a middleman.\nHere\u0026rsquo;s a breakdown:\nIntermediary: The core function of a proxy is to act as a go-between for client and server. Hiding IP Address: One common use of a proxy is to mask the client\u0026rsquo;s IP address. The server sees the proxy\u0026rsquo;s IP address, not the client\u0026rsquo;s, providing a degree of anonymity. Caching: Proxies often cache frequently accessed content. If a client requests something that\u0026rsquo;s already in the cache, the proxy can serve it directly, speeding up access. Filtering and Security: Proxies can be used to filter content, block access to certain websites, or scan for malware. This is common in corporate environments. Load Balancing: In some situations, proxies can distribute traffic across multiple servers, helping to balance the load and improve performance. In short, a proxy server provides a layer of separation between clients and servers, offering a variety of benefits related to privacy, security, performance, and network management.\nReverse Proxy # A reverse proxy sits in front of one or more backend servers, intercepting client requests and forwarding them to the appropriate server. It acts as a gateway, but unlike a regular proxy (which protects clients), a reverse proxy protects the servers. Clients connect to the reverse proxy, which then handles the connection to the actual servers.\nHere\u0026rsquo;s a breakdown:\nServer Protection: Reverse proxies shield backend servers from direct exposure to the internet, enhancing security by preventing direct attacks. Load Balancing: They can distribute client traffic across multiple servers, preventing any single server from becoming overloaded. Caching: Reverse proxies can cache content, reducing the load on backend servers and speeding up response times for clients. SSL Termination: They can handle SSL encryption and decryption, offloading this task from the backend servers. URL Rewriting: Reverse proxies can modify URLs, making them more user-friendly or hiding the internal structure of the backend servers. In short, a reverse proxy acts as a gatekeeper for backend servers, providing a range of benefits related to security, performance, scalability, and flexibility. It\u0026rsquo;s a common component in modern web architectures.\nSSL # Secure Sockets Layer (SSL) is a security protocol that creates an encrypted connection between a web server and a web browser. This ensures that any data exchanged between them remains private and secure. Think of it as a secret tunnel that prevents eavesdropping and tampering.\nHere\u0026rsquo;s a breakdown:\nEncryption: SSL encrypts the data transmitted between the browser and the server, making it unreadable to anyone who might try to intercept it. This protects sensitive information like passwords, credit card numbers, and personal details. Authentication: SSL verifies the identity of the website, assuring users that they are connecting to the legitimate website and not a fake one. This helps prevent phishing attacks. Data Integrity: SSL ensures that the data transmitted between the browser and the server is not altered or corrupted during transit. This guarantees that the information received is exactly what was sent. In short, SSL is a crucial security technology that protects online communication and helps build trust between websites and their users. It\u0026rsquo;s the foundation of secure online transactions and a vital component of a safe internet experience.\n","date":"27 April 2024","externalUrl":null,"permalink":"/projects/networking/","section":"Projects","summary":"IP Address # An Internet Protocol address (IP) address is a numerical label assigned to each device connected to a computer network that uses the Internet Protocol for communication. Think of it like a street address for your computer on the internet. It’s how devices find each other and exchange information.\n","title":"networking","type":"projects"},{"content":"The Pi-hole is a DNS sinkhole that protects your devices from unwanted content, without installing any client-side software. Useful for blocking ad services at a DNS level. It uses a list of known ad services stored on github, can add your own. It can also operate as a internal dns router and dhcp server.\nPihole Setup # If you have a raspberry-pi or another device, its super easy to get things going.\npihole setup. Any debian based system should be able to get things going quickly. Then all you need to do is set your devices to use your pihole as the primary dns server.\nDebian based one-step install\ncurl -sSL https://install.pi-hole.net | bash Note I find this to be a little flaky when it comes to DNS, often times OS will need reboots and cache to be cleared in order to actively start using pihole DNS.\nBrowsers also store dns info so many things can conflict before your DNS switches over. I find that using Pihole as primary DHCP server forces your devices to use the correct DNS server and fixes a lot of problems.\nAlso keep in mind that ipv6 can interfere if you are like me and have a ISP provider that tries to force their DNS\nSetup on Proxmox VM # My pihole is operating as a Debian GNU/Linux 12 (bookworm) virtual machine running on Proxmox. I use it as a internal DNS router \u0026amp; DHCP server which makes dns much easier in my case - due to my internet provider trying to force me to use there dns servers. This setup is a little weird and in-order to get everything to work a couple extra steps are need.\nWill need to setup your pihole as a dhcp server, disable the existing dhcp server on the router, reserve static ip addressed for proxmox and pihole so that it can connect to the gateway, set the pihole as primary dns server on proxmox, set proxmox to use dhcp rather than static ip and finally set pihole VM to automatically boot first so that when it connects to the gateway devices connected to the gateway are issued ip address from the pihole.\nWarning If you are using pihole for DHCP / DNS, keep in mind if the device goes down that is hosting your pihole server, so will your DNS / DHCP. This May prevent you from connecting to your network until you re-enable a dhcp server such as the one in your router.\nreserve a ip address in router/gateway for proxmox server \u0026amp; pihole\nset pihole to enable DHCP\nset proxmox to get DHCP on boot rather than Static IP which is default\nroot@laptop-proxmox:~# cat /etc/network/interfaces auto lo iface lo inet loopback iface enp3s0 inet manual auto vmbr0 iface vmbr0 inet dhcp bridge-ports enp3s0 bridge-stp off bridge-fd 0 iface wlp4s0 inet manual set proxmox default DNS server to pihole reserved address\nset pihole to automatically start on boot with highest priority boot order\nset sattic ip and gateway info for pihole netwoking configuration '\nDisable DHCP server in gateway / router settings\nIf router has option to set default DNS, set to pihole reserved address\n","date":"27 April 2024","externalUrl":null,"permalink":"/projects/pihole/","section":"Projects","summary":"The Pi-hole is a DNS sinkhole that protects your devices from unwanted content, without installing any client-side software. Useful for blocking ad services at a DNS level. It uses a list of known ad services stored on github, can add your own. It can also operate as a internal dns router and dhcp server.\n","title":"pihole","type":"projects"},{"content":" OBS # Stream Settings # Ignore stream service settings Video Encoder x264 1920x1080 Rate control CBR Bitrate 8000 Kbps Keyframe Interval 1s CPU Usage Medium Profile None Tune None x264 Options keyinit=90 Recording Settings # Recoding Format .mkv Audio Track All Automatic File Spliting Split Time 240 min Video # Common FPS Values 60 Advanced # Recording Filename Formatting %MM-%DD-%CCYY_%A_%hh-%mm-%p_%FPS Automatically Remux to MP4 Camera # Sony A6400 Resolution for stream 3840x2160 Specs Max Resolution 6000 x 4000 Image Ratio 1:1, 3:2, 16:9 Sensor 25 megapixels CMOS APS-C (23.5 x 15.6 mm) ISO Auto, 100-32000 (expands to 102800) ","date":"25 January 2024","externalUrl":null,"permalink":"/stream/stream_settings/","section":"Stream","summary":"OBS # Stream Settings # Ignore stream service settings Video Encoder x264 1920x1080 Rate control CBR Bitrate 8000 Kbps Keyframe Interval 1s CPU Usage Medium Profile None Tune None x264 Options keyinit=90 Recording Settings # Recoding Format .mkv Audio Track All Automatic File Spliting Split Time 240 min Video # Common FPS Values 60 Advanced # Recording Filename Formatting %MM-%DD-%CCYY_%A_%hh-%mm-%p_%FPS Automatically Remux to MP4 Camera # Sony A6400 Resolution for stream 3840x2160 Specs Max Resolution 6000 x 4000 Image Ratio 1:1, 3:2, 16:9 Sensor 25 megapixels CMOS APS-C (23.5 x 15.6 mm) ISO Auto, 100-32000 (expands to 102800)","title":"OBS Settings","type":"stream"},{"content":" What is Docker? # Docker is an awesome platform that anyone hoping to get into software / development or any homelab-er should become familiar with. Docker is a platform designed to help developers build, share, and run container applications. The most important aspect to docker is its ability to be implemented in version control via simple config files. This allowing a team of people to share a code base working in the same environments consistently.\nAlmost anything can be deployed as a service via docker. It is a fantastic tool to learn about apps, software, test operating systems, do things like home automation, run web servers, media servers, host your own proxy/reverse proxy, email, dns, network monitoring, websites etc.\nDocker Environment Setup # I am doing things with Ubuntu, so for my case I will follow this docker.com - GUIDE for setting up the initial docker environment on my ubuntu machine and then running the test hello-world docker container app to verify that my docker environment is working.\nSet up Docker\u0026rsquo;s apt repository. # Add Docker\u0026#39;s official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg # Add the repository to Apt sources: echo \\ \u0026#34;deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \\ $(. /etc/os-release \u0026amp;\u0026amp; echo \u0026#34;$VERSION_CODENAME\u0026#34;) stable\u0026#34; | \\ sudo tee /etc/apt/sources.list.d/docker.list \u0026gt; /dev/null sudo apt-get update Install the Docker packages. sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin Verify that the Docker Engine installation is successful by running the hello-world image. sudo docker run hello-world Docker Compose # .env Variables # Docker Files # Note dockerfile\nExample rebuild for mkdocs with some mods\nFROM squidfunk/mkdocs-material RUN pip install mkdocs-macros-plugin RUN pip install mkdocs-glightbox Mounting remote storage # ","date":"26 November 2023","externalUrl":null,"permalink":"/projects/docker/","section":"Projects","summary":"What is Docker? # Docker is an awesome platform that anyone hoping to get into software / development or any homelab-er should become familiar with. Docker is a platform designed to help developers build, share, and run container applications. The most important aspect to docker is its ability to be implemented in version control via simple config files. This allowing a team of people to share a code base working in the same environments consistently.\n","title":"Docker","type":"projects"},{"content":" 2024 Home Lab # 2023 Home Lab # 2020 Home Lab # 2019 Home Lab # ","date":"4 July 2023","externalUrl":null,"permalink":"/projects/lab_setup/","section":"Projects","summary":" 2024 Home Lab # ","title":"Lab Setup","type":"projects"},{"content":" Hi there 👋 # The goal of this site is to document my home apps, services, infrastructure and other projects I am working on. Additionally I am using it as a learning tool, to document things I already know, fill in some gaps, add to that knowledge and further refine my understanding on complicated topics. I find its much easier to master something if you are forced to explain it to someone else. With that spirit in mind, lemme see what I can float your way.\nFavorite Quote Never attribute to malice what can be explained by incompetence\n","date":"14 June 2023","externalUrl":null,"permalink":"/","section":"HOME","summary":"Hi there 👋 # The goal of this site is to document my home apps, services, infrastructure and other projects I am working on. Additionally I am using it as a learning tool, to document things I already know, fill in some gaps, add to that knowledge and further refine my understanding on complicated topics. I find its much easier to master something if you are forced to explain it to someone else. With that spirit in mind, lemme see what I can float your way.\n","title":"HOME","type":"page"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/search/","section":"HOME","summary":"search","title":"Search","type":"page"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":"","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"}] \ No newline at end of file diff --git a/index.xml b/index.xml new file mode 100644 index 0000000..8d3bc5f --- /dev/null +++ b/index.xml @@ -0,0 +1,356 @@ +HOME on wiki.wompmacho.comhttps://wiki.wompmacho.com/Recent content in HOME on wiki.wompmacho.comHugo -- gohugo.ioen© 2026 MichaelSun, 08 Mar 2026 00:00:00 +0000Liberalhttps://wiki.wompmacho.com/posts/liberal/Sun, 08 Mar 2026 00:00:00 +0000https://wiki.wompmacho.com/posts/liberal/<h2 class="relative group">Liberal is bad. + <div id="liberal-is-bad" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#liberal-is-bad" aria-label="Anchor">#</a> + </span> + +</h2> +<p>Wait, wasn&rsquo;t this group touting to be &ldquo;liberal&rdquo; once? Tell me more about why Liberal is bad. You know what… that person looks funny and bothers me and calls themself a liberal so I don’t wanna be in that catagory anymore. No wait, actually lets just demonize a group because fox news says so. NO WAIT, let&rsquo;s not use words correctly because words, logic, facts&hellip; These things don&rsquo;t matter.</p><link>https://wiki.wompmacho.com/projects/vaultwarden/</link><pubDate>Sun, 23 Feb 2025 00:00:00 +0000</pubDate><guid>https://wiki.wompmacho.com/projects/vaultwarden/</guid><description><h2 class="relative group">What is vaultwarden? + <div id="what-is-vaultwarden" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-vaultwarden" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>vaultwarden</code> ia a alternative server implementation of the Bitwarden Client API, written in +Rust and compatible with official Bitwarden clients, perfect for self-hosted +deployment where running the official resource-heavy service might not be ideal.</p></description></item><item><title>Performance Reviewshttps://wiki.wompmacho.com/posts/performance_reviews/Sat, 08 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/posts/performance_reviews/<p>The Hidden Flaw of Performance Reviews.</p>audiobookshelfhttps://wiki.wompmacho.com/projects/audiobookshelf/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/audiobookshelf/<h2 class="relative group">What is Audiobookshelf? + <div id="what-is-audiobookshelf" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-audiobookshelf" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Audiobookshelf</code> is a self-hosted, open-source server designed to manage and stream your personal audiobook and podcast collections. It acts as a private, web-based alternative to services like Audible, giving you full control over your media files. Key features include:</p>code-serverhttps://wiki.wompmacho.com/projects/code-server/code-server/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/code-server/code-server/<h2 class="relative group">Whats is code-server? + <div id="whats-is-code-server" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#whats-is-code-server" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>code-server</code> is a self-hosted instance of Visual Studio Code that runs on a remote server and is accessible directly through your web browser. It effectively turns any machine with a CPU and RAM into a fully functional cloud-based development environment.</p>frigatehttps://wiki.wompmacho.com/projects/frigate/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/frigate/<h2 class="relative group">What is Frigate? + <div id="what-is-frigate" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-frigate" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Frigate</code> is a complete and local NVR designed for Home Assistant with AI object detection. Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras.</p>homarrhttps://wiki.wompmacho.com/projects/homarr/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/homarr/<h2 class="relative group">What is homarr? + <div id="what-is-homarr" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-homarr" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>homarr</code> is a nice little dashboard app that can be used to organize your homelab with a simple webpage interface. Great for Quick links, updates on weather, time, seeing if a server is down, monitoring your webcams or torrents, etc.</p>homepagehttps://wiki.wompmacho.com/projects/homepage/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/homepage/<h2 class="relative group">What is homepage? + <div id="what-is-homepage" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-homepage" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>homepage</code> is an open-source, highly customizable, and static site-based dashboard designed to organize your self-hosted services into a beautiful, central hub.</p>jellyfinhttps://wiki.wompmacho.com/projects/jellyfin/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/jellyfin/<h2 class="relative group">What is jellyfin? + <div id="what-is-jellyfin" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-jellyfin" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Jellyfin</code> is a media server. I like it because its simple, free, doesnt require +online accounts and lets you serve up your movies, tv shows and music. Is very +similar to apps like Plex and Emby. You can manage your media and auto download +things like episode names, artwork etc. Has plugin support and is basically +trying to be a better open source version of Plex. It has apps/support for +android, google tvs, firestick, iphone etc.</p>jellyseerhttps://wiki.wompmacho.com/projects/jellyseer/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/jellyseer/<h2 class="relative group">What is jellyseer? + <div id="what-is-jellyseer" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-jellyseer" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Jellyseerr</code> is a free, open-source, and highly intuitive media request management tool designed for the Jellyfin (and Plex/Emby) ecosystem. It essentially acts as a &ldquo;gateway&rdquo; between your users and your media server.</p>linkstackshttps://wiki.wompmacho.com/projects/linkstack/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/linkstack/<h2 class="relative group">What is linkstacks? + <div id="what-is-linkstacks" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-linkstacks" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Linkstacks</code> is a nice little linktr.ee clone that allows you to set up a simple +link page. It can also be expanded to add multiple users and you can host +multiple people&rsquo;s pages with their own user accounts and everything.</p>mkdocshttps://wiki.wompmacho.com/projects/mkdocs/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/mkdocs/<h2 class="relative group">What is mkdocs? + <div id="what-is-mkdocs" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-mkdocs" aria-label="Anchor">#</a> + </span> + +</h2> +<p>MkDocs is a fast, simple, and extensible static site generator geared specifically toward building project documentation. It relies heavily on Markdown files, which makes it incredibly accessible for developers who want to write docs as easily as they write code.</p>nginx-proxy-managerhttps://wiki.wompmacho.com/projects/nginx-proxy-manager/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/nginx-proxy-manager/<h2 class="relative group">What is nginx-proxy-manager? + <div id="what-is-nginx-proxy-manager" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-nginx-proxy-manager" aria-label="Anchor">#</a> + </span> + +</h2> +<p>Nginx-proxy-manager is a simplified GUI for handling an nginx server +configuration. Nginx is a reverse proxy server.</p>portainerhttps://wiki.wompmacho.com/projects/portainer/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/portainer/<h2 class="relative group">What is Portainer? + <div id="what-is-portainer" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-portainer" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Portainer</code> is a lightweight, powerful container management platform that provides a graphical user interface (GUI) to manage your Docker, Docker Swarm, and Kubernetes environments. It essentially sits on top of your container runtime, allowing you to control complex infrastructure without needing to master the command line.</p>qBittorrenthttps://wiki.wompmacho.com/projects/qbittorent/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/qbittorent/<h2 class="relative group">What is qBittorrent? + <div id="what-is-qbittorrent" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-qbittorrent" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>qBittorrent</code> is a awesome, simple app that allows you to use classic QBittorrent in a docker +container. I use QBittorrent because I can set it up with a VPN that only +connects via the container directly. Effectively separating it from the rest of +my network and allowing me to continue as normal while it is downloading. It +will automatically stop the network if the VPN is not functioning correctly.</p>uptime-kumahttps://wiki.wompmacho.com/projects/uptime-kuma/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/uptime-kuma/<h2 class="relative group">What is uptime-kuma? + <div id="what-is-uptime-kuma" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-uptime-kuma" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>uptime-kuma</code> is a neat little web monitoring application. Lotta dope things right +out of the box, very gui / user friendly. Pretty much just add the stack, update +the dir for config - and it works. Integrates with discord webhooks, great easy +status page and dashboard.</p>webtophttps://wiki.wompmacho.com/projects/webtop/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/webtop/<h2 class="relative group">What is webtop? + <div id="what-is-webtop" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-webtop" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>webtop</code> is a awesome mini linux env I can use as a secure remote web-client for my home +network.</p>wikijshttps://wiki.wompmacho.com/projects/wikijs/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/wikijs/<h2 class="relative group">What is wikijs? + <div id="what-is-wikijs" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-wikijs" aria-label="Anchor">#</a> + </span> + +</h2> +<p>Wiki.js is a powerful, modern, and open-source wiki application built on Node.js. It is designed to be the central knowledge base for your home lab or professional projects, replacing traditional, clunky wiki platforms with a sleek, intuitive interface.</p>First Posthttps://wiki.wompmacho.com/posts/firstpost/Sun, 02 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/posts/firstpost/<p>Yo 👋</p> +<p>If you actually come to find this then props to ya man. Thanks for dropping by. idk if this will be worth ever doing, but this was fun for me to set up&hellip; and who knows maybe this is of some use to others&hellip; so fuck it &ndash;&gt; Enjoy.</p>Gearhttps://wiki.wompmacho.com/stream/stream_gear/Fri, 12 Jul 2024 03:11:33 +0000https://wiki.wompmacho.com/stream/stream_gear/<p>this has changed a bit&hellip; I will update later&hellip;</p>Resumehttps://wiki.wompmacho.com/resume/Fri, 12 Jul 2024 02:40:50 +0000https://wiki.wompmacho.com/resume/<table id="resume-table"> +<!----------------------------------Experience---------------------------------> + <tr> + <td colspan="3" class="header header-google-red">Experience</td> + </tr> + + <tr class="section-header"> + <td colspan="2" class="role">Special Projects Lead (DT L3) - <span class="google-blue">G</span><span class="google-red">o</span><span class="google-yellow">o</span><span class="google-blue">g</span><span class="google-green">l</span><span class="google-red">e</span></td> + <td class="dates">October 2024 - <span class="google-green">Current</span></td> + </tr> + + <tr> + <td colspan="3"> + <p> + HwOps Special Projects Lead; Resolve technical incidents and escalations by performing analysis utilizing existing data models or leveraging custom built data infrastructure to formulate and interpret data to reach specific conclusions and next steps. Develop detailed reports and intuitive dashboards, communicating key insights for data driven analysis. File bugs against products, documentation, and procedures by documenting desired behavior or steps to reproduce, and driving bugs to resolution. Suggest code-level resolutions for complex issues by leveraging tools, tool development and effective communication with stakeholders. Identify opportunities to build or enable solutions that improve, support or empower OMs, Site Leads & DTs to solve issues by using self-service tools and documentation. Fostered team growth through mentorship, training course facilitation, collaboration with internal training teams, and technical writing development. + </p>pterodactylhttps://wiki.wompmacho.com/projects/pterodactyl/Sat, 04 May 2024 20:00:25 +0000https://wiki.wompmacho.com/projects/pterodactyl/<h2 class="relative group">What is Pterodactyl? + <div id="what-is-pterodactyl" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-pterodactyl" aria-label="Anchor">#</a> + </span> + +</h2> +<p><a href="https://pterodactyl.io/" target="_blank" rel="noreferrer">Pterodactyl</a> is a free, open-source game server management panel built with PHP, +React, and Go. Designed with security in mind, Pterodactyl runs all game servers +in isolated Docker containers while exposing a beautiful and intuitive UI to end +users.</p>NAShttps://wiki.wompmacho.com/projects/nas/Sat, 04 May 2024 00:00:00 +0000https://wiki.wompmacho.com/projects/nas/NAS build and some tips and tricks to get things working with your docker containersnetworkinghttps://wiki.wompmacho.com/projects/networking/Sat, 27 Apr 2024 23:53:26 +0000https://wiki.wompmacho.com/projects/networking/<h2 class="relative group">IP Address + <div id="ip-address" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#ip-address" aria-label="Anchor">#</a> + </span> + +</h2> +<p>An Internet Protocol address (IP) address is a numerical label assigned to each +device connected to a computer network that uses the Internet Protocol for +communication. Think of it like a street address for your computer on the +internet. It&rsquo;s how devices find each other and exchange information.</p>piholehttps://wiki.wompmacho.com/projects/pihole/Sat, 27 Apr 2024 23:53:26 +0000https://wiki.wompmacho.com/projects/pihole/<p>The Pi-hole is a DNS sinkhole that protects your devices from unwanted content, +without installing any client-side software. Useful for blocking ad services at +a DNS level. It uses a list of known ad services stored on github, can add your +own. It can also operate as a internal dns router and dhcp server.</p>OBS Settingshttps://wiki.wompmacho.com/stream/stream_settings/Thu, 25 Jan 2024 22:28:32 +0000https://wiki.wompmacho.com/stream/stream_settings/<h2 class="relative group">OBS + <div id="obs" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#obs" aria-label="Anchor">#</a> + </span> + +</h2> + +<h3 class="relative group">Stream Settings + <div id="stream-settings" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#stream-settings" aria-label="Anchor">#</a> + </span> + +</h3> +<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Ignore stream service settings +</span></span><span class="line"><span class="cl">Video Encoder +</span></span><span class="line"><span class="cl"> x264 +</span></span><span class="line"><span class="cl"> 1920x1080 +</span></span><span class="line"><span class="cl">Rate control +</span></span><span class="line"><span class="cl"> CBR +</span></span><span class="line"><span class="cl">Bitrate +</span></span><span class="line"><span class="cl"> 8000 Kbps +</span></span><span class="line"><span class="cl">Keyframe Interval +</span></span><span class="line"><span class="cl"> 1s +</span></span><span class="line"><span class="cl">CPU Usage +</span></span><span class="line"><span class="cl"> Medium +</span></span><span class="line"><span class="cl">Profile +</span></span><span class="line"><span class="cl"> None +</span></span><span class="line"><span class="cl">Tune +</span></span><span class="line"><span class="cl"> None +</span></span><span class="line"><span class="cl">x264 Options +</span></span><span class="line"><span class="cl"> keyinit=90</span></span></code></pre></div></div> + +<h3 class="relative group">Recording Settings + <div id="recording-settings" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#recording-settings" aria-label="Anchor">#</a> + </span> + +</h3> +<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Recoding Format +</span></span><span class="line"><span class="cl"> .mkv +</span></span><span class="line"><span class="cl">Audio Track +</span></span><span class="line"><span class="cl"> All +</span></span><span class="line"><span class="cl">Automatic File Spliting +</span></span><span class="line"><span class="cl"> Split Time +</span></span><span class="line"><span class="cl"> 240 min</span></span></code></pre></div></div> + +<h3 class="relative group">Video + <div id="video" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#video" aria-label="Anchor">#</a> + </span> + +</h3> +<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Common FPS Values +</span></span><span class="line"><span class="cl"> 60</span></span></code></pre></div></div> + +<h3 class="relative group">Advanced + <div id="advanced" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#advanced" aria-label="Anchor">#</a> + </span> + +</h3> +<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Recording Filename Formatting +</span></span><span class="line"><span class="cl"> %MM-%DD-%CCYY_%A_%hh-%mm-%p_%FPS +</span></span><span class="line"><span class="cl"> Automatically Remux to MP4</span></span></code></pre></div></div> + +<h2 class="relative group">Camera + <div id="camera" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#camera" aria-label="Anchor">#</a> + </span> + +</h2> +<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Sony A6400 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl">Resolution for stream +</span></span><span class="line"><span class="cl"> 3840x2160 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl">Specs +</span></span><span class="line"><span class="cl"> Max Resolution +</span></span><span class="line"><span class="cl"> 6000 x 4000 +</span></span><span class="line"><span class="cl"> Image Ratio +</span></span><span class="line"><span class="cl"> 1:1, 3:2, 16:9 +</span></span><span class="line"><span class="cl"> Sensor +</span></span><span class="line"><span class="cl"> 25 megapixels +</span></span><span class="line"><span class="cl"> CMOS +</span></span><span class="line"><span class="cl"> APS-C (23.5 x 15.6 mm) +</span></span><span class="line"><span class="cl"> ISO +</span></span><span class="line"><span class="cl"> Auto, 100-32000 (expands to 102800)</span></span></code></pre></div></div>Dockerhttps://wiki.wompmacho.com/projects/docker/Sun, 26 Nov 2023 01:14:53 +0000https://wiki.wompmacho.com/projects/docker/<h2 class="relative group">What is Docker? + <div id="what-is-docker" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-docker" aria-label="Anchor">#</a> + </span> + +</h2> +<p>Docker is an awesome platform that anyone hoping to get into software / +development or any homelab-er should become familiar with. Docker is a platform +designed to help developers build, share, and run container applications. The +most important aspect to docker is its ability to be implemented in version +control via simple config files. This allowing a team of people to share a code +base working in the same environments consistently.</p>Lab Setuphttps://wiki.wompmacho.com/projects/lab_setup/Tue, 04 Jul 2023 05:33:31 +0000https://wiki.wompmacho.com/projects/lab_setup/<hr> + +<h2 class="relative group">2024 Home Lab + <div id="2024-home-lab" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#2024-home-lab" aria-label="Anchor">#</a> + </span> + +</h2> +<p><figure><img + class="my-0 rounded-md" + loading="lazy" + decoding="async" + fetchpriority="auto" + alt="sc_apartment_network_diagram_2024.png" + width="5107" + height="2785" + src="./projects/lab_setup/sc_apartment_network_diagram_2024_hu_2c9a83a8151fefc2.png" + srcset="./projects/lab_setup/sc_apartment_network_diagram_2024_hu_2c9a83a8151fefc2.png 800w, ./projects/lab_setup/sc_apartment_network_diagram_2024_hu_17b83b685ee9112e.png 1280w" + sizes="(min-width: 768px) 50vw, 65vw" + data-zoom-src="./projects/lab_setup/sc_apartment_network_diagram_2024.png"></figure> +</p>Searchhttps://wiki.wompmacho.com/search/Mon, 01 Jan 0001 00:00:00 +0000https://wiki.wompmacho.com/search/search \ No newline at end of file diff --git a/js/appearance.min.6f41174b3a05b680820fe08cadbfa5fb7a7ca347b76a0955cdc68b9d8aca1ce24f0547e138cea33bcc7904d551a90afcb1cc7f2d9fe8557075d501419046c08c.js b/js/appearance.min.6f41174b3a05b680820fe08cadbfa5fb7a7ca347b76a0955cdc68b9d8aca1ce24f0547e138cea33bcc7904d551a90afcb1cc7f2d9fe8557075d501419046c08c.js new file mode 100644 index 0000000..fc8ae8d --- /dev/null +++ b/js/appearance.min.6f41174b3a05b680820fe08cadbfa5fb7a7ca347b76a0955cdc68b9d8aca1ce24f0547e138cea33bcc7904d551a90afcb1cc7f2d9fe8557075d501419046c08c.js @@ -0,0 +1 @@ +const sitePreference=document.documentElement.getAttribute("data-default-appearance"),userPreference=localStorage.getItem("appearance");(sitePreference==="dark"&&userPreference===null||userPreference==="dark")&&document.documentElement.classList.add("dark"),document.documentElement.getAttribute("data-auto-appearance")==="true"&&(window.matchMedia&&window.matchMedia("(prefers-color-scheme: dark)").matches&&userPreference!=="light"&&document.documentElement.classList.add("dark"),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{e.matches?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")}));var updateMeta,getTargetAppearance,updateMermaidTheme=()=>{if(typeof mermaid!="undefined"){const e=document.documentElement.classList.contains("dark"),t=document.querySelectorAll("pre.mermaid");t.forEach(e=>{e.getAttribute("data-processed")?(e.removeAttribute("data-processed"),e.innerHTML=e.getAttribute("data-graph")):e.setAttribute("data-graph",e.textContent)}),e?(initMermaidDark(),mermaid.run()):(initMermaidLight(),mermaid.run())}};window.addEventListener("DOMContentLoaded",e=>{const t=document.getElementById("appearance-switcher"),n=document.getElementById("appearance-switcher-mobile");updateMeta(),this.updateLogo?.(getTargetAppearance()),updateMermaidTheme(),t&&(t.addEventListener("click",()=>{document.documentElement.classList.toggle("dark");var e=getTargetAppearance();localStorage.setItem("appearance",e),updateMeta(),updateMermaidTheme(),this.updateLogo?.(e)}),t.addEventListener("contextmenu",e=>{e.preventDefault(),localStorage.removeItem("appearance")})),n&&(n.addEventListener("click",()=>{document.documentElement.classList.toggle("dark");var e=getTargetAppearance();localStorage.setItem("appearance",e),updateMeta(),updateMermaidTheme(),this.updateLogo?.(e)}),n.addEventListener("contextmenu",e=>{e.preventDefault(),localStorage.removeItem("appearance")}))}),updateMeta=()=>{var e=document.querySelector("body"),t=getComputedStyle(e);document.querySelector('meta[name="theme-color"]').setAttribute("content",t.backgroundColor)},getTargetAppearance=()=>document.documentElement.classList.contains("dark")?"dark":"light",window.addEventListener("DOMContentLoaded",e=>{const t=document.getElementById("top-scroller"),n=document.getElementById("site-footer");t&&n&&t.getBoundingClientRect().top>n.getBoundingClientRect().top&&(t.hidden=!0)}) \ No newline at end of file diff --git a/js/background-blur.min.605b3b942818f0ab5a717ae446135ec46b8ee5a2ad12ae56fb90dc2a76ce30c388f9fec8bcc18db15bd47e3fa8a09d779fa12aa9c184cf614a315bc72c6c163d.js b/js/background-blur.min.605b3b942818f0ab5a717ae446135ec46b8ee5a2ad12ae56fb90dc2a76ce30c388f9fec8bcc18db15bd47e3fa8a09d779fa12aa9c184cf614a315bc72c6c163d.js new file mode 100644 index 0000000..673a02d --- /dev/null +++ b/js/background-blur.min.605b3b942818f0ab5a717ae446135ec46b8ee5a2ad12ae56fb90dc2a76ce30c388f9fec8bcc18db15bd47e3fa8a09d779fa12aa9c184cf614a315bc72c6c163d.js @@ -0,0 +1 @@ +function setBackgroundBlur(e,t=300,n=!1,s=!1){if(!e){console.error("data-blur-id is null");return}const o=document.getElementById(e);if(!o)return;n?(o.setAttribute("aria-hidden","true"),s?o.style.display="":(o.style.display="none",o.style.opacity="0")):(o.style.display="",o.removeAttribute("aria-hidden"));const i=()=>{if(!n||s){const e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;o.style.opacity=e/t}};o.setAttribute("role","presentation"),o.setAttribute("tabindex","-1"),window.addEventListener("scroll",i),i()}document.querySelectorAll("script[data-blur-id]").forEach(e=>{const t=e.getAttribute("data-blur-id"),n=Number(e.getAttribute("data-scroll-divisor")||300),s=t==="menu-blur",o=JSON.parse(localStorage.getItem("a11ySettings")||"{}"),i=o.disableBlur;setBackgroundBlur(t,n,i,s)}) \ No newline at end of file diff --git a/js/main.bundle.min.bdda7dece6cbaf08deef7d254f7f842f3261c2524d247905127c9a20decc03f1011a2950048464c79272c1ce0705a49a41147f39f2b95163bb71d404b33263ef.js b/js/main.bundle.min.bdda7dece6cbaf08deef7d254f7f842f3261c2524d247905127c9a20decc03f1011a2950048464c79272c1ce0705a49a41147f39f2b95163bb71d404b33263ef.js new file mode 100644 index 0000000..befb996 --- /dev/null +++ b/js/main.bundle.min.bdda7dece6cbaf08deef7d254f7f842f3261c2524d247905127c9a20decc03f1011a2950048464c79272c1ce0705a49a41147f39f2b95163bb71d404b33263ef.js @@ -0,0 +1,16 @@ +function scrollToTop(){const e=document.getElementById("scroll-to-top");window.scrollY>window.innerHeight*.5?(e.classList.remove("translate-y-4","opacity-0"),e.classList.add("translate-y-0","opacity-100")):(e.classList.remove("translate-y-0","opacity-100"),e.classList.add("translate-y-4","opacity-0"))}window.addEventListener("scroll",scrollToTop),window.addEventListener("load",scrollToTop),e=this,t=function(){"use strict";function R(e,t){var n,s=Object.keys(e);return Object.getOwnPropertySymbols&&(n=Object.getOwnPropertySymbols(e),t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),s.push.apply(s,n)),s}function h(e){for(var t,n=1;ne.length)&&(t=e.length);for(var n=0,s=new Array(t);n0&&0[0]!==arguments[0]?arguments[0]:{},s=n.getFn,i=0[0]===s?e.getFn:s,o=n.fieldNormWeight,r=0[0]===o?e.fieldNormWeight:o;t(this,a),this.norm=function(){var n=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:1,s=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:3,e=new Map,t=10**s;return{get:function(s){if(o=s.match(ce).length,e.has(o))return e.get(o);var o,a=1/o**(.5*n),i=parseFloat(Math.round(a*t)/t);return e.set(o,i),i},clear:function(){e.clear()}}}(r,3),this.getFn=i,this.isCreated=!1,this.setIndexRecords()}return n(a,[{key:"setSources",value:function(){var e=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[];this.docs=e}},{key:"setIndexRecords",value:function(){var e=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[];this.records=e}},{key:"setKeys",value:function(){var t=this,e=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[];this.keys=e,this._keysMap={},e.forEach(function(e,n){t._keysMap[e.id]=n})}},{key:"create",value:function(){var e=this;!this.isCreated&&this.docs.length&&(this.isCreated=!0,o(this.docs[0])?this.docs.forEach(function(t,n){e._addString(t,n)}):this.docs.forEach(function(t,n){e._addObject(t,n)}),this.norm.clear())}},{key:"add",value:function(e){var t=this.size();o(e)?this._addString(e,t):this._addObject(e,t)}},{key:"removeAt",value:function(e){this.records.splice(e,1);for(var t=e,n=this.size();t2&&0[0]!==arguments[2]?arguments[2]:{},i=o.getFn,r=0[0]===i?e.getFn:i,a=o.fieldNormWeight,c=0[0]===a?e.fieldNormWeight:a,s=new E({getFn:r,fieldNormWeight:c});return s.setKeys(t.map(H)),s.setSources(n),s.create(),s}function p(t){var s,n=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{},d=n.errors,f=0[0]===d?0:d,l=n.currentLocation,u=0[0]===l?0:l,a=n.expectedLocation,h=0[0]===a?0:a,r=n.distance,c=0[0]===r?e.distance:r,i=n.ignoreLocation,m=0[0]===i?e.ignoreLocation:i,o=f/t.length;return m?o:(s=Math.abs(h-u),c?o+s/c:s?1:o)}a=32;function K(t,n,s){var o,r,f,v,b,w,k,A,H,c=arguments.length>3&&0[0]!==arguments[3]?arguments[3]:{},F=c.location,$=0[0]===F?e.location:F,R=c.distance,C=0[0]===R?e.distance:R,N=c.threshold,V=0[0]===N?e.threshold:N,I=c.findAllMatches,W=0[0]===I?e.findAllMatches:I,P=c.minMatchCharLength,z=0[0]===P?e.minMatchCharLength:P,B=c.includeMatches,D=0[0]===B?e.includeMatches:B,L=c.ignoreLocation,y=0[0]===L?e.ignoreLocation:L;if(n.length>a)throw new Error("Pattern length exceeds max of ".concat(a,"."));for(var _,d=n.length,g=t.length,i=Math.max(0,Math.min($,g)),m=V,h=i,x=z>1||D,S=x?Array(g):[];(_=t.indexOf(n,h))>-1;)if(H=p(n,{currentLocation:_,expectedLocation:i,distance:C,ignoreLocation:y}),m=Math.min(H,m),h=_+d,x)for(b=0;b=T;o-=1)if(v=o-1,A=s[t.charAt(v)],x&&(S[v]=+!!A),u[o]=(u[o+1]<<1|1)&A,l&&(u[o]|=(O[o+1]|O[o])<<1|1|O[o+1]),u[o]&U&&(E=p(n,{errors:l,currentLocation:v,expectedLocation:i,distance:C,ignoreLocation:y}))<=m){if(m=E,(h=v)<=i)break;T=Math.max(1,2*i-h)}if(p(n,{errors:l+1,currentLocation:i,expectedLocation:i,distance:C,ignoreLocation:y})>m)break;O=u}return w={isMatch:h>=0,score:Math.max(.001,E)},x&&(k=function(){for(var i,s=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:[],a=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:e.minMatchCharLength,o=[],t=-1,r=-1,n=0,c=s.length;n=a&&o.push([t,r]),t=-1);return s[n-1]&&n-t>=a&&o.push([t,n-1]),o}(S,z),k.length?D&&(w.indices=k):w.isMatch=!1),w}function ee(e){for(var s,n={},t=0,o=e.length;t1&&0[0]!==arguments[1]?arguments[1]:{},h=o.location,A=0[0]===h?e.location:h,u=o.threshold,E=0[0]===u?e.threshold:u,v=o.distance,F=0[0]===v?e.distance:v,f=o.includeMatches,S=0[0]===f?e.includeMatches:f,g=o.findAllMatches,k=0[0]===g?e.findAllMatches:g,d=o.minMatchCharLength,O=0[0]===d?e.minMatchCharLength:d,y=o.isCaseSensitive,_=0[0]===y?e.isCaseSensitive:y,w=o.ignoreDiacritics,j=0[0]===w?e.ignoreDiacritics:w,b=o.ignoreLocation,C=0[0]===b?e.ignoreLocation:b;if(t(this,s),this.options={location:A,threshold:E,distance:F,includeMatches:S,findAllMatches:k,minMatchCharLength:O,isCaseSensitive:_,ignoreDiacritics:j,ignoreLocation:C},n=_?n:n.toLowerCase(),n=j?m(n):n,this.pattern=n,this.chunks=[],this.pattern.length)if(r=function(e,t){x.chunks.push({pattern:e,alphabet:ee(e),startIndex:t})},i=this.pattern.length,i>a){for(var c=0,p=i%a,M=i-p;c1&&0[0]!==arguments[1]?arguments[1]:{},r=s.location,O=0[0]===r?e.location:r,l=s.threshold,g=0[0]===l?e.threshold:l,u=s.distance,_=0[0]===u?e.distance:u,m=s.includeMatches,j=0[0]===m?e.includeMatches:m,p=s.findAllMatches,v=0[0]===p?e.findAllMatches:p,a=s.minMatchCharLength,b=0[0]===a?e.minMatchCharLength:a,f=s.isCaseSensitive,y=0[0]===f?e.isCaseSensitive:f,h=s.ignoreDiacritics,w=0[0]===h?e.ignoreDiacritics:h,c=s.ignoreLocation,x=0[0]===c?e.ignoreLocation:c;return t(this,o),(d=i.call(this,n))._bitapSearch=new V(n,{location:O,threshold:g,distance:_,includeMatches:j,findAllMatches:v,minMatchCharLength:b,isCaseSensitive:y,ignoreDiacritics:w,ignoreLocation:x}),d}return n(o,[{key:"search",value:function(e){return this._bitapSearch.searchIn(e)}}],[{key:"type",get:function(){return"fuzzy"}},{key:"multiRegex",get:function(){return/^"(.*)"$/}},{key:"singleRegex",get:function(){return/^(.*)$/}}]),o}(c),U=function(e){r(s,e);var o=l(s);function s(e){return t(this,s),o.call(this,e)}return n(s,[{key:"search",value:function(e){for(var t,o,n=0,s=[],i=this.pattern.length;(t=e.indexOf(this.pattern,n))>-1;)n=t+i,s.push([t,n-1]);return o=!!s.length,{isMatch:o,score:o?0:1,indices:s}}}],[{key:"type",get:function(){return"include"}},{key:"multiRegex",get:function(){return/^'"(.*)"$/}},{key:"singleRegex",get:function(){return/^'(.*)$/}}]),s}(c),j=[Z,U,se,Y,X,G,Q,S],I=j.length,te=/ +(?=(?:[^"]*"[^"]*")*[^"]*$)/,ne=new Set([S.type,U.type]),q=function(){function s(n){var o=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{},a=o.isCaseSensitive,r=0[0]===a?e.isCaseSensitive:a,c=o.ignoreDiacritics,l=0[0]===c?e.ignoreDiacritics:c,d=o.includeMatches,O=0[0]===d?e.includeMatches:d,h=o.minMatchCharLength,v=0[0]===h?e.minMatchCharLength:h,f=o.ignoreLocation,_=0[0]===f?e.ignoreLocation:f,g=o.findAllMatches,b=0[0]===g?e.findAllMatches:g,i=o.location,y=0[0]===i?e.location:i,p=o.threshold,w=0[0]===p?e.threshold:p,u=o.distance,x=0[0]===u?e.distance:u;t(this,s),this.query=null,this.options={isCaseSensitive:r,ignoreDiacritics:l,includeMatches:O,minMatchCharLength:v,findAllMatches:b,ignoreLocation:_,location:y,threshold:w,distance:x},n=r?n:n.toLowerCase(),n=l?m(n):n,this.pattern=n,this.query=function(e){var t=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{};return e.split("|").map(function(e){for(var a,r,c,l,d=e.trim().split(te).filter(function(e){return e&&!!e.trim()}),s=[],o=0,h=d.length;o2&&0[0]!==arguments[2]?arguments[2]:{}).auto,s=0[0]===n||n;return b(e)||(e=T(e)),function e(n){var r,c,d,u,a=Object.keys(n),l=function(e){return!!e[D]}(n);if(!l&&a.length>1&&!b(n))return e(T(n));if(function(e){return!i(e)&&B(e)&&!b(e)}(n)){if(r=l?n[D]:a[0],c=l?n[le]:n[r],!o(c))throw new Error(function(e){return"Invalid value for key ".concat(e)}(r));return d={keyId:_(r),pattern:c},s&&(d.searcher=w(c,t)),d}return u={children:[],operator:a[0]},a.forEach(function(t){var s=n[t];i(s)&&s.forEach(function(t){u.children.push(e(t))})}),u}(e)}function me(e,t){var n=e.matches;t.matches=[],s(n)&&n.forEach(function(e){if(s(e.indices)&&e.indices.length){var n={indices:e.indices,value:e.value};e.key&&(n.key=e.key.src),e.idx>-1&&(n.refIndex=e.idx),t.matches.push(n)}})}function fe(e,t){t.score=e.score}return u=function(){function a(n){var s=arguments.length>1&&0[0]!==arguments[1]?arguments[1]:{},o=arguments.length>2?arguments[2]:0[0];t(this,a),this.options=h(h({},e),s),this.options.useExtendedSearch,this._keyStore=new pe(this.options.keys),this.setCollection(n,o)}return n(a,[{key:"setCollection",value:function(e,t){if(this._docs=e,t&&!(t instanceof E))throw new Error("Incorrect 'index' type");this._myIndex=t||L(this.options.keys,this._docs,{getFn:this.options.getFn,fieldNormWeight:this.options.fieldNormWeight})}},{key:"add",value:function(e){s(e)&&(this._docs.push(e),this._myIndex.add(e))}},{key:"remove",value:function(){for(var t,o=arguments.length>0&&0[0]!==arguments[0]?arguments[0]:function(){return!1},n=[],e=0,s=this._docs.length;e1&&0[0]!==arguments[1]?arguments[1]:{}).limit,i=0[0]===a?-1:a,n=this.options,r=n.includeMatches,c=n.includeScore,l=n.shouldSort,d=n.sortFn,u=n.ignoreFieldNorm,s=o(t)?o(this._docs[0])?this._searchStringList(t):this._searchObjectList(t):this._searchLogical(t);return function(t,n){var s=n.ignoreFieldNorm,o=0[0]===s?e.ignoreFieldNorm:s;t.forEach(function(e){var t=1;e.matches.forEach(function(e){var n=e.key,a=e.norm,s=e.score,i=n?n.weight:null;t*=(0===s&&i?Number.EPSILON:s)**((i||1)*(o?1:a))}),e.score=t})}(s,{ignoreFieldNorm:u}),l&&s.sort(d),$(i)&&i>-1&&(s=s.slice(0,i)),function(t,n){var o=arguments.length>2&&0[0]!==arguments[2]?arguments[2]:{},i=o.includeMatches,r=0[0]===i?e.includeMatches:i,a=o.includeScore,c=0[0]===a?e.includeScore:a,s=[];return r&&s.push(me),c&&s.push(fe),t.map(function(e){var t=e.idx,o={item:n[t],refIndex:t};return s.length&&s.forEach(function(t){t(e,o)}),o})}(s,this._docs,{includeMatches:r,includeScore:c})}},{key:"_searchStringList",value:function(e){var n=w(e,this.options),o=this._myIndex.records,t=[];return o.forEach(function(e){var o=e.v,a=e.i,r=e.n;if(s(o)){var i=n.searchIn(o),c=i.isMatch,l=i.score,d=i.indices;c&&t.push({item:o,idx:a,matches:[{score:l,value:o,norm:r,indices:d}]})}}),t}},{key:"_searchLogical",value:function(e){var n=this,i=he(e,this.options),a=function e(t,s,o){if(!t.children){var c,l=t.keyId,u=t.searcher,i=n._findMatches({key:n._keyStore.get(l),value:n._myIndex.getValueForItemAtKeyId(s,l),searcher:u});return i&&i.length?[{idx:o,item:s,matches:i}]:[]}for(var a=[],r=0,h=t.children.length;r1&&0[0]!==arguments[1]?arguments[1]:{},o=s.getFn,a=0[0]===o?e.getFn:o,i=s.fieldNormWeight,r=0[0]===i?e.fieldNormWeight:i,c=t.keys,l=t.records,n=new E({getFn:a,fieldNormWeight:r});return n.setKeys(c),n.setIndexRecords(l),n},u.config=e,function(){f.push.apply(f,arguments)}(q),u},"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).Fuse=t();var e,t,fuse,scriptBundle,copyText,copiedText,showButton=document.getElementById("search-button"),showButtonMobile=document.getElementById("search-button-mobile"),hideButton=document.getElementById("close-search-button"),wrapper=document.getElementById("search-wrapper"),modal=document.getElementById("search-modal"),input=document.getElementById("search-query"),output=document.getElementById("search-results"),first=output.firstChild,last=output.lastChild,searchVisible=!1,indexed=!1,hasResults=!1;showButton?showButton.addEventListener("click",displaySearch):null,showButtonMobile?showButtonMobile.addEventListener("click",displaySearch):null,hideButton.addEventListener("click",hideSearch),wrapper.addEventListener("click",hideSearch),modal.addEventListener("click",function(e){return e.stopPropagation(),e.stopImmediatePropagation(),!1}),document.addEventListener("keydown",function(e){if(e.key=="/"){const t=document.activeElement,n=t.tagName,s=n==="INPUT"||n==="TEXTAREA"||t.isContentEditable;!searchVisible&&!s&&(e.preventDefault(),displaySearch())}e.key=="Escape"&&hideSearch(),e.key=="ArrowDown"&&searchVisible&&hasResults&&(e.preventDefault(),document.activeElement==input?first.focus():document.activeElement==last?last.focus():document.activeElement.parentElement.nextSibling.firstElementChild.focus()),e.key=="ArrowUp"&&searchVisible&&hasResults&&(e.preventDefault(),document.activeElement==input?input.focus():document.activeElement==first?input.focus():document.activeElement.parentElement.previousSibling.firstElementChild.focus()),e.key=="Enter"&&searchVisible&&hasResults&&(e.preventDefault(),document.activeElement==input?first.focus():document.activeElement.click())}),input.onkeyup=function(){executeQuery(this.value)};function displaySearch(){indexed||buildIndex(),searchVisible||(document.body.style.overflow="hidden",wrapper.style.visibility="visible",input.focus(),searchVisible=!0)}function hideSearch(){searchVisible&&(document.body.style.overflow="visible",wrapper.style.visibility="hidden",input.value="",output.innerHTML="",document.activeElement.blur(),searchVisible=!1)}function fetchJSON(e,t){var n=new XMLHttpRequest;n.onreadystatechange=function(){if(n.readyState===4&&n.status===200){var e=JSON.parse(n.responseText);t&&t(e)}},n.open("GET",e),n.send()}function buildIndex(){var e=wrapper.getAttribute("data-url"),e=e.replace(/\/?$/,"/");fetchJSON(e+"index.json",function(e){var t={shouldSort:!0,ignoreLocation:!0,threshold:0,includeMatches:!0,keys:[{name:"title",weight:.8},{name:"section",weight:.2},{name:"summary",weight:.6},{name:"content",weight:.4}]};fuse=new Fuse(e,t),indexed=!0})}function executeQuery(e){let n=fuse.search(e),t="";n.length>0?(n.forEach(function(e){var o,i,a=e.item.summary,s=document.createElement("div");s.innerHTML=a,e.item.summary=s.textContent||s.innerText||"",o=e.item.externalUrl?e.item.title+''+e.item.externalUrl+"":e.item.title,i=e.item.externalUrl?'target="_blank" rel="noopener" href="'+e.item.externalUrl+'"':'href="'+e.item.permalink+'"',t=t+`
  • + +
    +
    + ${o} +
    +
    ${e.item.section}·${e.item.date?e.item.date:""}
    +
    ${e.item.summary}
    +
    +
    +
    +
    +
  • `}),hasResults=!0):(t="",hasResults=!1),output.innerHTML=t,n.length>0&&(first=output.firstChild.firstElementChild,last=output.lastChild.firstElementChild)}scriptBundle=document.getElementById("script-bundle"),copyText=scriptBundle?.getAttribute("data-copy")||"Copy",copiedText=scriptBundle?.getAttribute("data-copied")||"Copied";function createCopyButton(e){const t=document.createElement("button");t.className="copy-button",t.type="button",t.ariaLabel=copyText,t.innerText=copyText,t.addEventListener("click",()=>copyCodeToClipboard(t,e)),e.insertBefore(t,e.firstChild)}async function copyCodeToClipboard(e,t){const n=getCodeText(t);function s(e,t){const n=document.createElement("textArea");n.contentEditable="true",n.readOnly="false",n.className="copy-textarea",n.value=e,t.insertBefore(n,t.firstChild);const s=document.createRange();s.selectNodeContents(n);const o=window.getSelection();o.removeAllRanges(),o.addRange(s),n.focus(),n.setSelectionRange(0,999999),document.execCommand("copy"),t.removeChild(n)}try{result=await navigator.permissions.query({name:"clipboard-write"}),result.state=="granted"||result.state=="prompt"?await navigator.clipboard.writeText(n):s(n,t)}catch{s(n,t)}finally{e.blur(),e.innerText=copiedText,setTimeout(function(){e.innerText=copyText},2e3)}}function getCodeText(e){const t=e.querySelector(".highlight");if(!t)return"";const n=t.querySelector("code"),s=n?.querySelectorAll(".cl"),o=t?.querySelector(".lntable .lntd:last-child code");if(!n)return"";if(s.length>0){const e=Array.from(s).map(e=>e.textContent.replace(/\n$/,""));return e.join(` +`)}return o?o.textContent.trim():n.textContent.trim()}window.addEventListener("DOMContentLoaded",e=>{document.querySelectorAll(".highlight-wrapper").forEach(e=>createCopyButton(e))}),document.getElementById("katex-render")&&document.getElementById("katex-render").addEventListener("load",()=>{renderMathInElement(document.body)}),function(){"use strict";var e=[];window.addEventListener("beforeprint",function(){for(var n=document.querySelectorAll("details:not([open])"),t=0;t1&&void 0!==arguments[1]?arguments[1]:{},c=window.Promise||function(e){function t(){}e(t,t)},u=function(e){var t=e.target;t!==N?-1!==O.indexOf(t)&&w({target:t}):E()},s=function(){if(!A&&T.original){var e=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(k-e)>S.scrollOffset&&setTimeout(E,150)}},f=function(e){var t=e.key||e.keyCode;"Escape"!==t&&"Esc"!==t&&27!==t||E()},p=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=t;if(t.background&&(N.style.background=t.background),t.container&&t.container instanceof Object&&(n.container=e({},S.container,t.container)),t.template){var i=o(t.template)?t.template:document.querySelector(t.template);n.template=i}return S=e({},S,n),O.forEach((function(e){e.dispatchEvent(a("medium-zoom:update",{detail:{zoom:j}}))})),j},g=function(){var o=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return t(e({},S,o))},v=function(){for(var e=arguments.length,t=Array(e),o=0;o0?t.reduce((function(e,t){return[].concat(e,i(t))}),[]):O;return n.forEach((function(e){e.classList.remove("medium-zoom-image"),e.dispatchEvent(a("medium-zoom:detach",{detail:{zoom:j}}))})),O=O.filter((function(e){return-1===n.indexOf(e)})),j},z=function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return O.forEach((function(n){n.addEventListener("medium-zoom:"+e,t,o)})),x.push({type:"medium-zoom:"+e,listener:t,options:o}),j},y=function(e,t){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return O.forEach((function(n){n.removeEventListener("medium-zoom:"+e,t,o)})),x=x.filter((function(o){return!(o.type==="medium-zoom:"+e&&o.listener.toString()===t.toString())})),j},b=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=t.target,r=function(){var t={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},i=void 0,r=void 0;if(S.container)if(S.container instanceof Object)i=(t=e({},t,S.container)).width-t.left-t.right-2*S.margin,r=t.height-t.top-t.bottom-2*S.margin;else{var d=(o(S.container)?S.container:document.querySelector(S.container)).getBoundingClientRect(),a=d.width,m=d.height,l=d.left,c=d.top;t=e({},t,{width:a,height:m,left:l,top:c})}i=i||t.width-2*S.margin,r=r||t.height-2*S.margin;var u=T.zoomedHd||T.original,s=n(u)?i:u.naturalWidth||i,f=n(u)?r:u.naturalHeight||r,p=u.getBoundingClientRect(),g=p.top,v=p.left,h=p.width,z=p.height,y=Math.min(Math.max(h,s),i)/h,b=Math.min(Math.max(z,f),r)/z,E=Math.min(y,b),w="scale("+E+") translate3d("+((i-h)/2-v+S.margin+t.left)/E+"px, "+((r-z)/2-g+S.margin+t.top)/E+"px, 0)";T.zoomed.style.transform=w,T.zoomedHd&&(T.zoomedHd.style.transform=w)};return new c((function(e){if(i&&-1===O.indexOf(i))e(j);else{if(T.zoomed)e(j);else{if(i)T.original=i;else{if(!(O.length>0))return void e(j);var t=O;T.original=t[0]}if(T.original.dispatchEvent(a("medium-zoom:open",{detail:{zoom:j}})),k=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,A=!0,T.zoomed=d(T.original),document.body.appendChild(N),S.template){var n=o(S.template)?S.template:document.querySelector(S.template);T.template=document.createElement("div"),T.template.appendChild(n.content.cloneNode(!0)),document.body.appendChild(T.template)}if(T.original.parentElement&&"PICTURE"===T.original.parentElement.tagName&&T.original.currentSrc&&(T.zoomed.src=T.original.currentSrc),document.body.appendChild(T.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),T.original.classList.add("medium-zoom-image--hidden"),T.zoomed.classList.add("medium-zoom-image--opened"),T.zoomed.addEventListener("click",E),T.zoomed.addEventListener("transitionend",(function t(){A=!1,T.zoomed.removeEventListener("transitionend",t),T.original.dispatchEvent(a("medium-zoom:opened",{detail:{zoom:j}})),e(j)})),T.original.getAttribute("data-zoom-src")){T.zoomedHd=T.zoomed.cloneNode(),T.zoomedHd.removeAttribute("srcset"),T.zoomedHd.removeAttribute("sizes"),T.zoomedHd.removeAttribute("loading"),T.zoomedHd.src=T.zoomed.getAttribute("data-zoom-src"),T.zoomedHd.onerror=function(){clearInterval(m),console.warn("Unable to reach the zoom image target "+T.zoomedHd.src),T.zoomedHd=null,r()};var m=setInterval((function(){T.zoomedHd.complete&&(clearInterval(m),T.zoomedHd.classList.add("medium-zoom-image--opened"),T.zoomedHd.addEventListener("click",E),document.body.appendChild(T.zoomedHd),r())}),10)}else if(T.original.hasAttribute("srcset")){T.zoomedHd=T.zoomed.cloneNode(),T.zoomedHd.removeAttribute("sizes"),T.zoomedHd.removeAttribute("loading");var l=T.zoomedHd.addEventListener("load",(function(){T.zoomedHd.removeEventListener("load",l),T.zoomedHd.classList.add("medium-zoom-image--opened"),T.zoomedHd.addEventListener("click",E),document.body.appendChild(T.zoomedHd),r()}))}else r()}}}))},E=function(){return new c((function(e){if(!A&&T.original){A=!0,document.body.classList.remove("medium-zoom--opened"),T.zoomed.style.transform="",T.zoomedHd&&(T.zoomedHd.style.transform=""),T.template&&(T.template.style.transition="opacity 150ms",T.template.style.opacity=0),T.original.dispatchEvent(a("medium-zoom:close",{detail:{zoom:j}})),T.zoomed.addEventListener("transitionend",(function t(){T.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(T.zoomed),T.zoomedHd&&document.body.removeChild(T.zoomedHd),document.body.removeChild(N),T.zoomed.classList.remove("medium-zoom-image--opened"),T.template&&document.body.removeChild(T.template),A=!1,T.zoomed.removeEventListener("transitionend",t),T.original.dispatchEvent(a("medium-zoom:closed",{detail:{zoom:j}})),T.original=null,T.zoomed=null,T.zoomedHd=null,T.template=null,e(j)}))}else e(j)}))},w=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=e.target;return T.original?E():b({target:t})},L=function(){return S},H=function(){return O},C=function(){return T.original},O=[],x=[],A=!1,k=0,S=l,T={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(m)?S=m:(m||"string"==typeof m)&&v(m),S=e({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},S);var N=r(S.background);document.addEventListener("click",u),document.addEventListener("keyup",f),document.addEventListener("scroll",s),window.addEventListener("resize",E);var j={open:b,close:E,toggle:w,update:p,clone:g,attach:v,detach:h,on:z,off:y,getOptions:L,getImages:H,getZoomedImage:C};return j}})); diff --git a/me/me_stream_doom.PNG b/me/me_stream_doom.PNG new file mode 100644 index 0000000..f29ecdf Binary files /dev/null and b/me/me_stream_doom.PNG differ diff --git a/me/wampyDance_hu_1961b32b8fcd82d8.gif b/me/wampyDance_hu_1961b32b8fcd82d8.gif new file mode 100644 index 0000000..a0ff7d7 Binary files /dev/null and b/me/wampyDance_hu_1961b32b8fcd82d8.gif differ diff --git a/me/wampyDance_hu_9755a36fc051c5d4.gif b/me/wampyDance_hu_9755a36fc051c5d4.gif new file mode 100644 index 0000000..b9e733b Binary files /dev/null and b/me/wampyDance_hu_9755a36fc051c5d4.gif differ diff --git a/me/wampyDance_hu_b2853a171a07037c.gif b/me/wampyDance_hu_b2853a171a07037c.gif new file mode 100644 index 0000000..e67b928 Binary files /dev/null and b/me/wampyDance_hu_b2853a171a07037c.gif differ diff --git a/posts/firstpost/index.html b/posts/firstpost/index.html new file mode 100644 index 0000000..33c13e5 --- /dev/null +++ b/posts/firstpost/index.html @@ -0,0 +1,27 @@ +First Post · wiki.wompmacho.com

    First Post

    ··51 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    Yo 👋

    If you actually come to find this then props to ya man. Thanks for dropping by. idk if this will be worth ever doing, but this was fun for me to set up… and who knows maybe this is of some use to others… so fuck it –> Enjoy.

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/posts/index.html b/posts/index.html new file mode 100644 index 0000000..94a0bae --- /dev/null +++ b/posts/index.html @@ -0,0 +1,18 @@ +Posts · wiki.wompmacho.com

    Posts

    2026

    Liberal

    ·95 words·1 min
    Liberal is bad. # Wait, wasn’t this group touting to be “liberal” once? Tell me more about why Liberal is bad. You know what… that person looks funny and bothers me and calls themself a liberal so I don’t wanna be in that catagory anymore. No wait, actually lets just demonize a group because fox news says so. NO WAIT, let’s not use words correctly because words, logic, facts… These things don’t matter.

    2025

    First Post

    ··51 words·1 min
    Yo 👋 +If you actually come to find this then props to ya man. Thanks for dropping by. idk if this will be worth ever doing, but this was fun for me to set up… and who knows maybe this is of some use to others… so fuck it –> Enjoy.

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/posts/index.xml b/posts/index.xml new file mode 100644 index 0000000..a847f49 --- /dev/null +++ b/posts/index.xml @@ -0,0 +1,11 @@ +Posts on wiki.wompmacho.comhttps://wiki.wompmacho.com/posts/Recent content in Posts on wiki.wompmacho.comHugo -- gohugo.ioen© 2026 MichaelSun, 08 Mar 2026 00:00:00 +0000Liberalhttps://wiki.wompmacho.com/posts/liberal/Sun, 08 Mar 2026 00:00:00 +0000https://wiki.wompmacho.com/posts/liberal/<h2 class="relative group">Liberal is bad. + <div id="liberal-is-bad" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#liberal-is-bad" aria-label="Anchor">#</a> + </span> + +</h2> +<p>Wait, wasn&rsquo;t this group touting to be &ldquo;liberal&rdquo; once? Tell me more about why Liberal is bad. You know what… that person looks funny and bothers me and calls themself a liberal so I don’t wanna be in that catagory anymore. No wait, actually lets just demonize a group because fox news says so. NO WAIT, let&rsquo;s not use words correctly because words, logic, facts&hellip; These things don&rsquo;t matter.</p>Performance Reviewshttps://wiki.wompmacho.com/posts/performance_reviews/Sat, 08 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/posts/performance_reviews/<p>The Hidden Flaw of Performance Reviews.</p>First Posthttps://wiki.wompmacho.com/posts/firstpost/Sun, 02 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/posts/firstpost/<p>Yo 👋</p> +<p>If you actually come to find this then props to ya man. Thanks for dropping by. idk if this will be worth ever doing, but this was fun for me to set up&hellip; and who knows maybe this is of some use to others&hellip; so fuck it &ndash;&gt; Enjoy.</p> \ No newline at end of file diff --git a/posts/liberal/RDT_20250206_005732.mp4 b/posts/liberal/RDT_20250206_005732.mp4 new file mode 100644 index 0000000..fda46e5 Binary files /dev/null and b/posts/liberal/RDT_20250206_005732.mp4 differ diff --git a/posts/liberal/Screenshot_20250205-234147.png b/posts/liberal/Screenshot_20250205-234147.png new file mode 100644 index 0000000..b9a364b Binary files /dev/null and b/posts/liberal/Screenshot_20250205-234147.png differ diff --git a/posts/liberal/Screenshot_20250205-234147_hu_6661e0456bcce423.png b/posts/liberal/Screenshot_20250205-234147_hu_6661e0456bcce423.png new file mode 100644 index 0000000..54d3144 Binary files /dev/null and b/posts/liberal/Screenshot_20250205-234147_hu_6661e0456bcce423.png differ diff --git a/posts/liberal/index.html b/posts/liberal/index.html new file mode 100644 index 0000000..737f177 --- /dev/null +++ b/posts/liberal/index.html @@ -0,0 +1,27 @@ +Liberal · wiki.wompmacho.com

    Liberal

    ·95 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    Liberal is bad.
    #

    Wait, wasn’t this group touting to be “liberal” once? Tell me more about why Liberal is bad. You know what… that person looks funny and bothers me and calls themself a liberal so I don’t wanna be in that catagory anymore. No wait, actually lets just demonize a group because fox news says so. NO WAIT, let’s not use words correctly because words, logic, facts… These things don’t matter.

    what is a lib

    quit being a fucking sheep
    #

    this sums up my thoughts on the matter

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/posts/performance_reviews/index.html b/posts/performance_reviews/index.html new file mode 100644 index 0000000..0cfe53d --- /dev/null +++ b/posts/performance_reviews/index.html @@ -0,0 +1,28 @@ +Performance Reviews · wiki.wompmacho.com

    Performance Reviews

    ··158 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    The Hidden Flaw of Performance Reviews.

    +Goodhart’s law

    Goodhart’s law is an adage often stated as, “When a measure becomes a target, it ceases to be a good measure”. It is named after British economist Charles Goodhart, who is credited with expressing the core idea of the adage in a 1975 article on monetary policy in the United Kingdom:

    Any observed statistical regularity will tend to collapse once pressure is placed upon it for control purposes.

    It was used to criticize the British Thatcher government for trying to conduct monetary policy on the basis of targets for broad and narrow money, but the law reflects a much more general phenomenon.

    In other words, when we use a measure to reward performance, we provide an incentive to manipulate the measure in order to receive the reward. This can sometimes result in actions that actually reduce the effectiveness of the measured system while paradoxically improving the measurement of system performance.

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/audiobookshelf/index.html b/projects/audiobookshelf/index.html new file mode 100644 index 0000000..15a80e5 --- /dev/null +++ b/projects/audiobookshelf/index.html @@ -0,0 +1,59 @@ +audiobookshelf · wiki.wompmacho.com

    audiobookshelf

    ·233 words·2 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is Audiobookshelf?
    #

    Audiobookshelf is a self-hosted, open-source server designed to manage and stream your personal audiobook and podcast collections. It acts as a private, web-based alternative to services like Audible, giving you full control over your media files. Key features include:

    Docker Compose Example
    #

    +Audiobookshelf requires a websocket connection.
    # audiobookshelf - https://github.com/advplyr/audiobookshelf/blob/master/docker-compose.yml
    +---
    +version: "3.7"
    +services:
    +  audiobookshelf:
    +    container_name: audiobookshelf
    +    image: ghcr.io/advplyr/audiobookshelf:latest
    +    # ABS runs on port 13378 by default. If you want to change
    +    # the port, only change the external port, not the internal port
    +    ports:
    +      - 13378:80
    +    volumes:
    +      # These volumes are needed to keep your library persistent
    +      # and allow media to be accessed by the ABS server.
    +      # The path to the left of the colon is the path on your computer,
    +      # and the path to the right of the colon is where the data is
    +      # available to ABS in Docker.
    +      
    +      # You can change these media directories or add as many as you want
    +      - /mnt/store/MediaServer/Audio_Books:/audiobooks
    +      - /mnt/store/MediaServer/podcasts:/podcasts
    +      - /mnt/store/app/audiobookshelf/metadata:/metadata
    +      
    +      # The config directory needs to be on the same physical machine
    +      # you are running ABS on
    +      - /app/audiobookshelf/config:/config
    +    restart: unless-stopped
    +    # You can use the following environment variable to run the ABS
    +    # docker container as a specific user. You will need to change
    +    # the UID and GID to the correct values for your user.
    +    #environment:
    +    #  - user=1000:1000

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/code-server/code-server/index.html b/projects/code-server/code-server/index.html new file mode 100644 index 0000000..c52dbda --- /dev/null +++ b/projects/code-server/code-server/index.html @@ -0,0 +1,62 @@ +code-server · wiki.wompmacho.com

    code-server

    ·115 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    Whats is code-server?
    #

    code-server is a self-hosted instance of Visual Studio Code that runs on a remote server and is accessible directly through your web browser. It effectively turns any machine with a CPU and RAM into a fully functional cloud-based development environment.

    Docker Compose Example
    #

    # code-server -- https://hub.docker.com/r/linuxserver/code-server
    +---
    +services:
    +  code-server:
    +    image: lscr.io/linuxserver/code-server:latest
    +    container_name: code-server
    +    environment:
    +      - PUID=1000
    +      - PGID=1000
    +      - TZ=America/New_York
    +      - PASSWORD=password #optional
    +      - HASHED_PASSWORD= #optional
    +      - SUDO_PASSWORD=password #optional
    +      - SUDO_PASSWORD_HASH= #optional
    +      - PROXY_DOMAIN=code-server.domain.com #optional
    +      - DEFAULT_WORKSPACE=/apps #optional
    +    volumes:
    +      - code-server-nfs:/config
    +      - apps:/apps
    +    ports:
    +      - 8443:8443
    +    restart: unless-stopped
    +
    +volumes:
    +  code-server-nfs:
    +    name: code-server-nfs
    +    driver_opts:
    +      type: nfs
    +      o: addr=truenas,nolock,soft,rw
    +      device: :/mnt/store/vault/app/code-server
    +  apps:
    +    name: apps
    +    driver_opts:
    +      type: nfs
    +      o: addr=truenas,nolock,soft,rw
    +      device: :/mnt/store/vault/app/

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/docker/index.html b/projects/docker/index.html new file mode 100644 index 0000000..e26a61c --- /dev/null +++ b/projects/docker/index.html @@ -0,0 +1,55 @@ +Docker · wiki.wompmacho.com

    Docker

    ··299 words·2 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is Docker?
    #

    Docker is an awesome platform that anyone hoping to get into software / +development or any homelab-er should become familiar with. Docker is a platform +designed to help developers build, share, and run container applications. The +most important aspect to docker is its ability to be implemented in version +control via simple config files. This allowing a team of people to share a code +base working in the same environments consistently.

    Almost anything can be deployed as a service via docker. It is a fantastic tool +to learn about apps, software, test operating systems, do things like home +automation, run web servers, media servers, host your own proxy/reverse proxy, +email, dns, network monitoring, websites etc.


    Docker Environment Setup
    #

    I am doing things with Ubuntu, so for my case I will follow this docker.com - +GUIDE for setting up the +initial docker environment on my ubuntu machine and then running the test +hello-world docker container app to verify that my docker environment is +working.

    • Set up Docker’s apt repository.
    # Add Docker's official GPG key:
    +sudo apt-get update
    +sudo apt-get install ca-certificates curl gnupg
    +sudo install -m 0755 -d /etc/apt/keyrings
    +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    +sudo chmod a+r /etc/apt/keyrings/docker.gpg
    +
    +# Add the repository to Apt sources:
    +echo \
    +  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
    +  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
    +  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    +sudo apt-get update
    • Install the Docker packages.
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    • Verify that the Docker Engine installation is successful by running the +hello-world image.
    sudo docker run hello-world

    Docker Compose
    #

    .env Variables
    #

    Docker Files
    #

    +Note

    dockerfile

    Example rebuild for mkdocs with some mods

     FROM squidfunk/mkdocs-material
    + RUN pip install mkdocs-macros-plugin
    + RUN pip install mkdocs-glightbox

    Mounting remote storage
    #

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/frigate/index.html b/projects/frigate/index.html new file mode 100644 index 0000000..479718b --- /dev/null +++ b/projects/frigate/index.html @@ -0,0 +1,100 @@ +frigate · wiki.wompmacho.com

    frigate

    ·271 words·2 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is Frigate?
    #

    Frigate is a complete and local NVR designed for Home Assistant with AI object detection. Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras.

    # frigate - https://docs.frigate.video/frigate/installation/
    +---
    +version: "3.9"
    +services:
    +  frigate:
    +    container_name: frigate
    +    privileged: true # this may not be necessary for all setups
    +    restart: unless-stopped
    +    image: ghcr.io/blakeblackshear/frigate:stable
    +    shm_size: "64mb" # update for your cameras based on calculation above
    +    volumes:
    +      - /etc/localtime:/etc/localtime:ro
    +      - /app/frigate/config:/config
    +      - /mnt/store/app/frigate:/media/frigate
    +      - type: tmpfs # Optional: 1GB of memory, reduces SSD/SD Card wear
    +        target: /tmp/cache
    +        tmpfs:
    +          size: 1000000000
    +    ports:
    +      - "5000:5000"
    +      - "8554:8554" # RTSP feeds
    +      - "8555:8555/tcp" # WebRTC over tcp
    +      - "8555:8555/udp" # WebRTC over udp
    +    environment:
    +      FRIGATE_RTSP_PASSWORD: "password"

    requires to set a config.yml in the /config volume.

    My current config
    #

    Am not currently running the optimized setup for this, but testing things out.

    mqtt:
    +  enabled: false
    +cameras:
    +  front:
    +    birdseye:
    +      order: 1
    +    ffmpeg:
    +      inputs:
    +        - path: rtsp://USERNAME:PASSWORD@IPADDR:554/path_to_stream
    +          roles:
    +            - detect
    +            - record
    +    objects:
    +      track:
    +        - person
    +    detect:
    +      width: 1920
    +      height: 1080
    +
    +    record:
    +      sync_recordings: True
    +      enabled: True
    +      retain:
    +        days: 7
    +        mode: motion
    +      events:
    +        # Optional: Number of seconds before the event to include (default: shown below)
    +        pre_capture: 5
    +        # Optional: Number of seconds after the event to include (default: shown below)
    +        post_capture: 5
    +
    +detectors:
    +    cpu1:
    +      type: cpu
    +      num_threads: 3
    +
    +# Include all cameras by default in Birdseye view
    +birdseye:
    +  enabled: True
    +  mode: continuous
    +  width: 1280
    +  height: 720
    +  quality: 8
    +  inactivity_threshold: 30

    Proxy fixes
    #

    For nginx proxy - add this to advanced options for proxy host

    proxy_set_header X-Real-IP $remote_addr;
    +proxy_set_header Host $host;
    +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    +proxy_set_header X-Forwarded-Proto $scheme;
    +proxy_redirect off;
    +proxy_buffering off;
    +proxy_request_buffering off;

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/homarr/index.html b/projects/homarr/index.html new file mode 100644 index 0000000..0b575ce --- /dev/null +++ b/projects/homarr/index.html @@ -0,0 +1,42 @@ +homarr · wiki.wompmacho.com

    homarr

    ·115 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is homarr?
    #

    homarr is a nice little dashboard app that can be used to organize your homelab with a simple webpage interface. Great for Quick links, updates on weather, time, seeing if a server is down, monitoring your webcams or torrents, etc.

    +Note

    Personally I have moved on to homepage. Looks a little nicer in my opinion. Not the biggest fan of homarr interface, Though I may try again after some updates.

    Docker Compose Example
    #

    +Note

    For docker support, extend a volume to the docker.sock

    • /var/run/docker.sock:/var/run/docker.sock
    # homarr - docker compose
    +---
    +version: '3'
    +services:
    +  homarr:
    +    container_name: homarr
    +    image: ghcr.io/ajnart/homarr:latest
    +    restart: unless-stopped
    +    volumes:
    +      - /app/homarr/configs:/app/data/configs
    +      - /app/homarr/icons:/app/public/icons
    +      - /var/run/docker.sock:/var/run/docker.sock
    +    ports:
    +      - '7575:7575'

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/homepage/index.html b/projects/homepage/index.html new file mode 100644 index 0000000..dc47576 --- /dev/null +++ b/projects/homepage/index.html @@ -0,0 +1,38 @@ +homepage · wiki.wompmacho.com

    homepage

    ·89 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is homepage?
    #

    homepage is an open-source, highly customizable, and static site-based dashboard designed to organize your self-hosted services into a beautiful, central hub.

    Unlike other dashboards that require complex databases or heavy backend services, homepage runs as a lightweight, Docker-based container that reads a single configuration file (YAML).

    Docker Compose Example
    #

    # homepage - docker compose
    +--- 
    +services:
    +  homepage:
    +    container_name: homepage
    +    image: ghcr.io/gethomepage/homepage:latest
    +    restart: unless-stopped
    +    volumes:
    +      - /mnt/store/app/homepage/configs:/app/config # Make sure your local config directory exists
    +      - /var/run/docker.sock:/var/run/docker.sock # (optional) For docker integrations
    +    ports:
    +      - 7676:3000

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/index.html b/projects/index.html new file mode 100644 index 0000000..f60d027 --- /dev/null +++ b/projects/index.html @@ -0,0 +1,17 @@ +Projects · wiki.wompmacho.com

    Projects

    2025

    ·81 words·1 min
    What is vaultwarden? # vaultwarden ia a alternative server implementation of the Bitwarden Client API, written in Rust and compatible with official Bitwarden clients, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal.

    wikijs

    ·135 words·1 min
    What is wikijs? # Wiki.js is a powerful, modern, and open-source wiki application built on Node.js. It is designed to be the central knowledge base for your home lab or professional projects, replacing traditional, clunky wiki platforms with a sleek, intuitive interface.

    webtop

    ·58 words·1 min
    What is webtop? # webtop is a awesome mini linux env I can use as a secure remote web-client for my home network.

    uptime-kuma

    ·82 words·1 min
    What is uptime-kuma? # uptime-kuma is a neat little web monitoring application. Lotta dope things right out of the box, very gui / user friendly. Pretty much just add the stack, update the dir for config - and it works. Integrates with discord webhooks, great easy status page and dashboard.

    qBittorrent

    ·279 words·2 mins
    What is qBittorrent? # qBittorrent is a awesome, simple app that allows you to use classic QBittorrent in a docker container. I use QBittorrent because I can set it up with a VPN that only connects via the container directly. Effectively separating it from the rest of my network and allowing me to continue as normal while it is downloading. It will automatically stop the network if the VPN is not functioning correctly.

    portainer

    ·224 words·2 mins
    What is Portainer? # Portainer is a lightweight, powerful container management platform that provides a graphical user interface (GUI) to manage your Docker, Docker Swarm, and Kubernetes environments. It essentially sits on top of your container runtime, allowing you to control complex infrastructure without needing to master the command line.

    nginx-proxy-manager

    ·1053 words·5 mins
    What is nginx-proxy-manager? # Nginx-proxy-manager is a simplified GUI for handling an nginx server configuration. Nginx is a reverse proxy server.

    mkdocs

    ·120 words·1 min
    What is mkdocs? # MkDocs is a fast, simple, and extensible static site generator geared specifically toward building project documentation. It relies heavily on Markdown files, which makes it incredibly accessible for developers who want to write docs as easily as they write code.

    linkstacks

    ·93 words·1 min
    What is linkstacks? # Linkstacks is a nice little linktr.ee clone that allows you to set up a simple link page. It can also be expanded to add multiple users and you can host multiple people’s pages with their own user accounts and everything.

    jellyseer

    ·65 words·1 min
    What is jellyseer? # Jellyseerr is a free, open-source, and highly intuitive media request management tool designed for the Jellyfin (and Plex/Emby) ecosystem. It essentially acts as a “gateway” between your users and your media server.

    jellyfin

    ·238 words·2 mins
    What is jellyfin? # Jellyfin is a media server. I like it because its simple, free, doesnt require online accounts and lets you serve up your movies, tv shows and music. Is very similar to apps like Plex and Emby. You can manage your media and auto download things like episode names, artwork etc. Has plugin support and is basically trying to be a better open source version of Plex. It has apps/support for android, google tvs, firestick, iphone etc.

    homepage

    ·89 words·1 min
    What is homepage? # homepage is an open-source, highly customizable, and static site-based dashboard designed to organize your self-hosted services into a beautiful, central hub.

    homarr

    ·115 words·1 min
    What is homarr? # homarr is a nice little dashboard app that can be used to organize your homelab with a simple webpage interface. Great for Quick links, updates on weather, time, seeing if a server is down, monitoring your webcams or torrents, etc.

    frigate

    ·271 words·2 mins
    What is Frigate? # Frigate is a complete and local NVR designed for Home Assistant with AI object detection. Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras.

    code-server

    ·115 words·1 min
    Whats is code-server? # code-server is a self-hosted instance of Visual Studio Code that runs on a remote server and is accessible directly through your web browser. It effectively turns any machine with a CPU and RAM into a fully functional cloud-based development environment.

    audiobookshelf

    ·233 words·2 mins
    What is Audiobookshelf? # Audiobookshelf is a self-hosted, open-source server designed to manage and stream your personal audiobook and podcast collections. It acts as a private, web-based alternative to services like Audible, giving you full control over your media files. Key features include:

    2024

    pterodactyl

    ··253 words·2 mins
    What is Pterodactyl? # Pterodactyl is a free, open-source game server management panel built with PHP, React, and Go. Designed with security in mind, Pterodactyl runs all game servers in isolated Docker containers while exposing a beautiful and intuitive UI to end users.

    NAS

    ··1790 words·9 mins
    NAS build and some tips and tricks to get things working with your docker containers

    pihole

    ··528 words·3 mins
    The Pi-hole is a DNS sinkhole that protects your devices from unwanted content, without installing any client-side software. Useful for blocking ad services at a DNS level. It uses a list of known ad services stored on github, can add your own. It can also operate as a internal dns router and dhcp server.

    networking

    ··1675 words·8 mins
    IP Address # An Internet Protocol address (IP) address is a numerical label assigned to each device connected to a computer network that uses the Internet Protocol for communication. Think of it like a street address for your computer on the internet. It’s how devices find each other and exchange information.

    2023

    Docker

    ··299 words·2 mins
    What is Docker? # Docker is an awesome platform that anyone hoping to get into software / development or any homelab-er should become familiar with. Docker is a platform designed to help developers build, share, and run container applications. The most important aspect to docker is its ability to be implemented in version control via simple config files. This allowing a team of people to share a code base working in the same environments consistently.

    Lab Setup

    ··16 words·1 min
    2024 Home Lab #

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/index.xml b/projects/index.xml new file mode 100644 index 0000000..4e8a987 --- /dev/null +++ b/projects/index.xml @@ -0,0 +1,227 @@ +Projects on wiki.wompmacho.comhttps://wiki.wompmacho.com/projects/Recent content in Projects on wiki.wompmacho.comHugo -- gohugo.ioen© 2026 MichaelSun, 08 Mar 2026 00:00:00 +0000<link>https://wiki.wompmacho.com/projects/vaultwarden/</link><pubDate>Sun, 23 Feb 2025 00:00:00 +0000</pubDate><guid>https://wiki.wompmacho.com/projects/vaultwarden/</guid><description><h2 class="relative group">What is vaultwarden? + <div id="what-is-vaultwarden" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-vaultwarden" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>vaultwarden</code> ia a alternative server implementation of the Bitwarden Client API, written in +Rust and compatible with official Bitwarden clients, perfect for self-hosted +deployment where running the official resource-heavy service might not be ideal.</p></description></item><item><title>audiobookshelfhttps://wiki.wompmacho.com/projects/audiobookshelf/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/audiobookshelf/<h2 class="relative group">What is Audiobookshelf? + <div id="what-is-audiobookshelf" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-audiobookshelf" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Audiobookshelf</code> is a self-hosted, open-source server designed to manage and stream your personal audiobook and podcast collections. It acts as a private, web-based alternative to services like Audible, giving you full control over your media files. Key features include:</p>code-serverhttps://wiki.wompmacho.com/projects/code-server/code-server/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/code-server/code-server/<h2 class="relative group">Whats is code-server? + <div id="whats-is-code-server" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#whats-is-code-server" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>code-server</code> is a self-hosted instance of Visual Studio Code that runs on a remote server and is accessible directly through your web browser. It effectively turns any machine with a CPU and RAM into a fully functional cloud-based development environment.</p>frigatehttps://wiki.wompmacho.com/projects/frigate/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/frigate/<h2 class="relative group">What is Frigate? + <div id="what-is-frigate" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-frigate" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Frigate</code> is a complete and local NVR designed for Home Assistant with AI object detection. Uses OpenCV and Tensorflow to perform realtime object detection locally for IP cameras.</p>homarrhttps://wiki.wompmacho.com/projects/homarr/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/homarr/<h2 class="relative group">What is homarr? + <div id="what-is-homarr" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-homarr" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>homarr</code> is a nice little dashboard app that can be used to organize your homelab with a simple webpage interface. Great for Quick links, updates on weather, time, seeing if a server is down, monitoring your webcams or torrents, etc.</p>homepagehttps://wiki.wompmacho.com/projects/homepage/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/homepage/<h2 class="relative group">What is homepage? + <div id="what-is-homepage" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-homepage" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>homepage</code> is an open-source, highly customizable, and static site-based dashboard designed to organize your self-hosted services into a beautiful, central hub.</p>jellyfinhttps://wiki.wompmacho.com/projects/jellyfin/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/jellyfin/<h2 class="relative group">What is jellyfin? + <div id="what-is-jellyfin" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-jellyfin" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Jellyfin</code> is a media server. I like it because its simple, free, doesnt require +online accounts and lets you serve up your movies, tv shows and music. Is very +similar to apps like Plex and Emby. You can manage your media and auto download +things like episode names, artwork etc. Has plugin support and is basically +trying to be a better open source version of Plex. It has apps/support for +android, google tvs, firestick, iphone etc.</p>jellyseerhttps://wiki.wompmacho.com/projects/jellyseer/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/jellyseer/<h2 class="relative group">What is jellyseer? + <div id="what-is-jellyseer" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-jellyseer" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Jellyseerr</code> is a free, open-source, and highly intuitive media request management tool designed for the Jellyfin (and Plex/Emby) ecosystem. It essentially acts as a &ldquo;gateway&rdquo; between your users and your media server.</p>linkstackshttps://wiki.wompmacho.com/projects/linkstack/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/linkstack/<h2 class="relative group">What is linkstacks? + <div id="what-is-linkstacks" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-linkstacks" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Linkstacks</code> is a nice little linktr.ee clone that allows you to set up a simple +link page. It can also be expanded to add multiple users and you can host +multiple people&rsquo;s pages with their own user accounts and everything.</p>mkdocshttps://wiki.wompmacho.com/projects/mkdocs/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/mkdocs/<h2 class="relative group">What is mkdocs? + <div id="what-is-mkdocs" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-mkdocs" aria-label="Anchor">#</a> + </span> + +</h2> +<p>MkDocs is a fast, simple, and extensible static site generator geared specifically toward building project documentation. It relies heavily on Markdown files, which makes it incredibly accessible for developers who want to write docs as easily as they write code.</p>nginx-proxy-managerhttps://wiki.wompmacho.com/projects/nginx-proxy-manager/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/nginx-proxy-manager/<h2 class="relative group">What is nginx-proxy-manager? + <div id="what-is-nginx-proxy-manager" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-nginx-proxy-manager" aria-label="Anchor">#</a> + </span> + +</h2> +<p>Nginx-proxy-manager is a simplified GUI for handling an nginx server +configuration. Nginx is a reverse proxy server.</p>portainerhttps://wiki.wompmacho.com/projects/portainer/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/portainer/<h2 class="relative group">What is Portainer? + <div id="what-is-portainer" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-portainer" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>Portainer</code> is a lightweight, powerful container management platform that provides a graphical user interface (GUI) to manage your Docker, Docker Swarm, and Kubernetes environments. It essentially sits on top of your container runtime, allowing you to control complex infrastructure without needing to master the command line.</p>qBittorrenthttps://wiki.wompmacho.com/projects/qbittorent/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/qbittorent/<h2 class="relative group">What is qBittorrent? + <div id="what-is-qbittorrent" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-qbittorrent" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>qBittorrent</code> is a awesome, simple app that allows you to use classic QBittorrent in a docker +container. I use QBittorrent because I can set it up with a VPN that only +connects via the container directly. Effectively separating it from the rest of +my network and allowing me to continue as normal while it is downloading. It +will automatically stop the network if the VPN is not functioning correctly.</p>uptime-kumahttps://wiki.wompmacho.com/projects/uptime-kuma/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/uptime-kuma/<h2 class="relative group">What is uptime-kuma? + <div id="what-is-uptime-kuma" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-uptime-kuma" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>uptime-kuma</code> is a neat little web monitoring application. Lotta dope things right +out of the box, very gui / user friendly. Pretty much just add the stack, update +the dir for config - and it works. Integrates with discord webhooks, great easy +status page and dashboard.</p>webtophttps://wiki.wompmacho.com/projects/webtop/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/webtop/<h2 class="relative group">What is webtop? + <div id="what-is-webtop" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-webtop" aria-label="Anchor">#</a> + </span> + +</h2> +<p><code>webtop</code> is a awesome mini linux env I can use as a secure remote web-client for my home +network.</p>wikijshttps://wiki.wompmacho.com/projects/wikijs/Tue, 04 Feb 2025 00:00:00 +0000https://wiki.wompmacho.com/projects/wikijs/<h2 class="relative group">What is wikijs? + <div id="what-is-wikijs" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-wikijs" aria-label="Anchor">#</a> + </span> + +</h2> +<p>Wiki.js is a powerful, modern, and open-source wiki application built on Node.js. It is designed to be the central knowledge base for your home lab or professional projects, replacing traditional, clunky wiki platforms with a sleek, intuitive interface.</p>pterodactylhttps://wiki.wompmacho.com/projects/pterodactyl/Sat, 04 May 2024 20:00:25 +0000https://wiki.wompmacho.com/projects/pterodactyl/<h2 class="relative group">What is Pterodactyl? + <div id="what-is-pterodactyl" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-pterodactyl" aria-label="Anchor">#</a> + </span> + +</h2> +<p><a href="https://pterodactyl.io/" target="_blank" rel="noreferrer">Pterodactyl</a> is a free, open-source game server management panel built with PHP, +React, and Go. Designed with security in mind, Pterodactyl runs all game servers +in isolated Docker containers while exposing a beautiful and intuitive UI to end +users.</p>NAShttps://wiki.wompmacho.com/projects/nas/Sat, 04 May 2024 00:00:00 +0000https://wiki.wompmacho.com/projects/nas/NAS build and some tips and tricks to get things working with your docker containersnetworkinghttps://wiki.wompmacho.com/projects/networking/Sat, 27 Apr 2024 23:53:26 +0000https://wiki.wompmacho.com/projects/networking/<h2 class="relative group">IP Address + <div id="ip-address" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#ip-address" aria-label="Anchor">#</a> + </span> + +</h2> +<p>An Internet Protocol address (IP) address is a numerical label assigned to each +device connected to a computer network that uses the Internet Protocol for +communication. Think of it like a street address for your computer on the +internet. It&rsquo;s how devices find each other and exchange information.</p>piholehttps://wiki.wompmacho.com/projects/pihole/Sat, 27 Apr 2024 23:53:26 +0000https://wiki.wompmacho.com/projects/pihole/<p>The Pi-hole is a DNS sinkhole that protects your devices from unwanted content, +without installing any client-side software. Useful for blocking ad services at +a DNS level. It uses a list of known ad services stored on github, can add your +own. It can also operate as a internal dns router and dhcp server.</p>Dockerhttps://wiki.wompmacho.com/projects/docker/Sun, 26 Nov 2023 01:14:53 +0000https://wiki.wompmacho.com/projects/docker/<h2 class="relative group">What is Docker? + <div id="what-is-docker" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#what-is-docker" aria-label="Anchor">#</a> + </span> + +</h2> +<p>Docker is an awesome platform that anyone hoping to get into software / +development or any homelab-er should become familiar with. Docker is a platform +designed to help developers build, share, and run container applications. The +most important aspect to docker is its ability to be implemented in version +control via simple config files. This allowing a team of people to share a code +base working in the same environments consistently.</p>Lab Setuphttps://wiki.wompmacho.com/projects/lab_setup/Tue, 04 Jul 2023 05:33:31 +0000https://wiki.wompmacho.com/projects/lab_setup/<hr> + +<h2 class="relative group">2024 Home Lab + <div id="2024-home-lab" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#2024-home-lab" aria-label="Anchor">#</a> + </span> + +</h2> +<p><figure><img + class="my-0 rounded-md" + loading="lazy" + decoding="async" + fetchpriority="auto" + alt="sc_apartment_network_diagram_2024.png" + width="5107" + height="2785" + src="../projects/lab_setup/sc_apartment_network_diagram_2024_hu_2c9a83a8151fefc2.png" + srcset="../projects/lab_setup/sc_apartment_network_diagram_2024_hu_2c9a83a8151fefc2.png 800w, ../projects/lab_setup/sc_apartment_network_diagram_2024_hu_17b83b685ee9112e.png 1280w" + sizes="(min-width: 768px) 50vw, 65vw" + data-zoom-src="../projects/lab_setup/sc_apartment_network_diagram_2024.png"></figure> +</p> \ No newline at end of file diff --git a/projects/jellyfin/index.html b/projects/jellyfin/index.html new file mode 100644 index 0000000..4a638ee --- /dev/null +++ b/projects/jellyfin/index.html @@ -0,0 +1,57 @@ +jellyfin · wiki.wompmacho.com

    jellyfin

    ·238 words·2 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is jellyfin?
    #

    Jellyfin is a media server. I like it because its simple, free, doesnt require +online accounts and lets you serve up your movies, tv shows and music. Is very +similar to apps like Plex and Emby. You can manage your media and auto download +things like episode names, artwork etc. Has plugin support and is basically +trying to be a better open source version of Plex. It has apps/support for +android, google tvs, firestick, iphone etc.

    Docker Compose Example
    #

    # Jellyfin - docker compose
    +---
    +services:
    +  jellyfin:
    +    container_name: jellyfin
    +    image: lscr.io/linuxserver/jellyfin:latest
    +    environment:
    +      - PUID=0
    +      - PGID=0
    +      - TZ=America/New_York
    +    ports:
    +      - 8096:8096
    +      - 8920:8920 #optional https
    +      - 7359:7359/udp #optional discovery
    +      - 1900:1900/udp #optional discovery
    +    volumes:
    +      - /app/jellyfin:/config			# config for your jellyfin
    +      - /mnt/store/:/data/store 	# where your media lives (movies/tv etc.)
    +    restart: unless-stopped
    +Note

    Recomend storing the metadata & cache on NAS and not on the OS docker host. +The files start to get LARGE for jellyfin due to mass amount of metadata stored +for media. Set this under the jellyfin general settings after jellyfin is +running. {.is-warning}

    Once you server is running, head over to the to your opened port (docker_container_ip:8096) to start the setup proccess. When adding libraries - +select the content type, set the display name and then click the FOLDERS + +option. This is where you will select the path to your media that you set up in +the volumes.

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/jellyseer/index.html b/projects/jellyseer/index.html new file mode 100644 index 0000000..8a481b6 --- /dev/null +++ b/projects/jellyseer/index.html @@ -0,0 +1,40 @@ +jellyseer · wiki.wompmacho.com

    jellyseer

    ·65 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is jellyseer?
    #

    Jellyseerr is a free, open-source, and highly intuitive media request management tool designed for the Jellyfin (and Plex/Emby) ecosystem. It essentially acts as a “gateway” between your users and your media server.

    Docker Compose Example
    #

    # jellyseerr - docker compose
    +---
    +services:
    +  jellyseerr:
    +    image: fallenbagel/jellyseerr:latest
    +    container_name: jellyseerr
    +    environment:
    +      - LOG_LEVEL=debug
    +      - TZ=America/New_York
    +    ports:
    +      - 5055:5055
    +    volumes:
    +      - /mnt/store/app/jellyseerr/config:/app/config
    +    restart: unless-stopped

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/lab_setup/atl_home_network_2019.jpg b/projects/lab_setup/atl_home_network_2019.jpg new file mode 100644 index 0000000..66f07bf Binary files /dev/null and b/projects/lab_setup/atl_home_network_2019.jpg differ diff --git a/projects/lab_setup/atl_home_network_2019_hu_56da88e3b750160d.jpg b/projects/lab_setup/atl_home_network_2019_hu_56da88e3b750160d.jpg new file mode 100644 index 0000000..dda57af Binary files /dev/null and b/projects/lab_setup/atl_home_network_2019_hu_56da88e3b750160d.jpg differ diff --git a/projects/lab_setup/index.html b/projects/lab_setup/index.html new file mode 100644 index 0000000..84cb5e8 --- /dev/null +++ b/projects/lab_setup/index.html @@ -0,0 +1,25 @@ +Lab Setup · wiki.wompmacho.com

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/lab_setup/nc_home_network_diagram_white_background_2020.jpg b/projects/lab_setup/nc_home_network_diagram_white_background_2020.jpg new file mode 100644 index 0000000..c4d1d34 Binary files /dev/null and b/projects/lab_setup/nc_home_network_diagram_white_background_2020.jpg differ diff --git a/projects/lab_setup/nc_home_network_diagram_white_background_2020_hu_1a9b1da9ffcb7b88.jpg b/projects/lab_setup/nc_home_network_diagram_white_background_2020_hu_1a9b1da9ffcb7b88.jpg new file mode 100644 index 0000000..1b530ee Binary files /dev/null and b/projects/lab_setup/nc_home_network_diagram_white_background_2020_hu_1a9b1da9ffcb7b88.jpg differ diff --git a/projects/lab_setup/nc_home_network_diagram_white_background_2020_hu_b0963ad045bcb96a.jpg b/projects/lab_setup/nc_home_network_diagram_white_background_2020_hu_b0963ad045bcb96a.jpg new file mode 100644 index 0000000..1d142fd Binary files /dev/null and b/projects/lab_setup/nc_home_network_diagram_white_background_2020_hu_b0963ad045bcb96a.jpg differ diff --git a/projects/lab_setup/sc_apartment_network_diagram_2024.png b/projects/lab_setup/sc_apartment_network_diagram_2024.png new file mode 100644 index 0000000..1d2998a Binary files /dev/null and b/projects/lab_setup/sc_apartment_network_diagram_2024.png differ diff --git a/projects/lab_setup/sc_apartment_network_diagram_2024_hu_17b83b685ee9112e.png b/projects/lab_setup/sc_apartment_network_diagram_2024_hu_17b83b685ee9112e.png new file mode 100644 index 0000000..3d23e43 Binary files /dev/null and b/projects/lab_setup/sc_apartment_network_diagram_2024_hu_17b83b685ee9112e.png differ diff --git a/projects/lab_setup/sc_apartment_network_diagram_2024_hu_2c9a83a8151fefc2.png b/projects/lab_setup/sc_apartment_network_diagram_2024_hu_2c9a83a8151fefc2.png new file mode 100644 index 0000000..279a54b Binary files /dev/null and b/projects/lab_setup/sc_apartment_network_diagram_2024_hu_2c9a83a8151fefc2.png differ diff --git a/projects/lab_setup/sc_apartment_network_diagram_nov_2023.png b/projects/lab_setup/sc_apartment_network_diagram_nov_2023.png new file mode 100644 index 0000000..c53c9de Binary files /dev/null and b/projects/lab_setup/sc_apartment_network_diagram_nov_2023.png differ diff --git a/projects/lab_setup/sc_apartment_network_diagram_nov_2023_hu_6564c18990399983.png b/projects/lab_setup/sc_apartment_network_diagram_nov_2023_hu_6564c18990399983.png new file mode 100644 index 0000000..d7ad4d7 Binary files /dev/null and b/projects/lab_setup/sc_apartment_network_diagram_nov_2023_hu_6564c18990399983.png differ diff --git a/projects/lab_setup/sc_apartment_network_diagram_nov_2023_hu_d002965f0c845ba0.png b/projects/lab_setup/sc_apartment_network_diagram_nov_2023_hu_d002965f0c845ba0.png new file mode 100644 index 0000000..819dc10 Binary files /dev/null and b/projects/lab_setup/sc_apartment_network_diagram_nov_2023_hu_d002965f0c845ba0.png differ diff --git a/projects/linkstack/index.html b/projects/linkstack/index.html new file mode 100644 index 0000000..f2e1afd --- /dev/null +++ b/projects/linkstack/index.html @@ -0,0 +1,54 @@ +linkstacks · wiki.wompmacho.com

    linkstacks

    ·93 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is linkstacks?
    #

    Linkstacks is a nice little linktr.ee clone that allows you to set up a simple +link page. It can also be expanded to add multiple users and you can host +multiple people’s pages with their own user accounts and everything.

    Docker Compose Example
    #

    # Linkstacks - docker compose
    +version: "3.8"
    +---
    +services:
    +  linkstack:
    +    container_name: 'linkstack'
    +    hostname: 'linkstack'
    +    image: 'linkstackorg/linkstack:latest'
    +    user: '0:0'
    +    environment:
    +      TZ: 'America/New_york'
    +      SERVER_ADMIN: 'SERVER_ADMIN_EMAIL'
    +      HTTP_SERVER_NAME: 'HTTP_DOMAIN_NAME'
    +      HTTPS_SERVER_NAME: 'HTTPS_DOMAIN_NAME'
    +      LOG_LEVEL: 'info'
    +      PHP_MEMORY_LIMIT: '256M'
    +      UPLOAD_MAX_FILESIZE: '8M'
    +    volumes:
    +      - 'linkstack_data:/htdocs'
    +      #- '/app/linkstack/:/htdocs'
    +    ports:
    +      - '8190:443'
    +    restart: unless-stopped
    +
    +volumes:
    +  linkstack_data:

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/mkdocs/index.html b/projects/mkdocs/index.html new file mode 100644 index 0000000..5ece4d8 --- /dev/null +++ b/projects/mkdocs/index.html @@ -0,0 +1,54 @@ +mkdocs · wiki.wompmacho.com

    mkdocs

    ·120 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is mkdocs?
    #

    MkDocs is a fast, simple, and extensible static site generator geared specifically toward building project documentation. It relies heavily on Markdown files, which makes it incredibly accessible for developers who want to write docs as easily as they write code.

    Docker Compose Example
    #

    Running mkdocs with material +theme and plugins built in.

    +Info

    There is some setup of folders and things that are not automatic so +wont work straight out of the box.

    # mkdocs -- https://squidfunk.github.io/mkdocs-material/
    +version: '3'
    +services:
    +  mkdocs:
    +    container_name: 'mkdocs'
    +    restart: unless-stopped
    +    image: squidfunk/mkdocs-material
    +    environment:
    +      - PUID=1000
    +      - PGID=1000
    +    volumes:
    +      #- /mnt/store/app/mkdocs/:/docs
    +      - docs_nfs:/docs
    +    stdin_open: true
    +    tty: true    
    +    ports:
    +      - "9896:8000"
    +
    +volumes:
    +  docs_nfs:
    +    name: docs_nfs
    +    driver_opts:
    +      type: nfs
    +      o: addr=truenas,nolock,soft,ro
    +      device: :/mnt/store/vault/app/mkdocs

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/nas/adding_smb_windows.png b/projects/nas/adding_smb_windows.png new file mode 100644 index 0000000..4e6271a Binary files /dev/null and b/projects/nas/adding_smb_windows.png differ diff --git a/projects/nas/adding_smb_windows_hu_1770d3cb42fccbe6.png b/projects/nas/adding_smb_windows_hu_1770d3cb42fccbe6.png new file mode 100644 index 0000000..d21a7ea Binary files /dev/null and b/projects/nas/adding_smb_windows_hu_1770d3cb42fccbe6.png differ diff --git a/projects/nas/creating_a_cronjob_with_truenas.png b/projects/nas/creating_a_cronjob_with_truenas.png new file mode 100644 index 0000000..97299cb Binary files /dev/null and b/projects/nas/creating_a_cronjob_with_truenas.png differ diff --git a/projects/nas/creating_a_cronjob_with_truenas_hu_51b5dbf0d2c34288.png b/projects/nas/creating_a_cronjob_with_truenas_hu_51b5dbf0d2c34288.png new file mode 100644 index 0000000..5232961 Binary files /dev/null and b/projects/nas/creating_a_cronjob_with_truenas_hu_51b5dbf0d2c34288.png differ diff --git a/projects/nas/creating_a_cronjob_with_truenas_hu_618deb92057f058a.png b/projects/nas/creating_a_cronjob_with_truenas_hu_618deb92057f058a.png new file mode 100644 index 0000000..842c2cb Binary files /dev/null and b/projects/nas/creating_a_cronjob_with_truenas_hu_618deb92057f058a.png differ diff --git a/projects/nas/index.html b/projects/nas/index.html new file mode 100644 index 0000000..e0a3240 --- /dev/null +++ b/projects/nas/index.html @@ -0,0 +1,124 @@ +NAS · wiki.wompmacho.com

    NAS

    ··1790 words·9 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is a NAS?
    #

    A Network Attached Storage (NAS) device is essentially a small, self-contained +computer that’s designed solely for storing and sharing files. Think of it as +your own personal cloud storage, but instead of relying on a third-party +service, you own and control the hardware.

    Here’s why someone might use a NAS:

    • Centralized Storage: A NAS provides a single location to store all your +files - documents, photos, videos, music, etc. This makes it easy to access +your data from any device on your network.
    • File Sharing: NAS devices make it simple to share files between multiple +users and devices. This is great for families who want to share photos and +videos, or for small businesses who need to collaborate on documents.
    • Backup and Redundancy: Many NAS devices offer features like automatic +backups and RAID configurations, which help protect your data from hard drive +failures.
    • Media Streaming: NAS devices can be used to stream media files (movies, +music) to devices throughout your home, like smart TVs, game consoles, and +mobile devices.
    • Remote Access: Some NAS devices allow you to access your files remotely +over the internet, so you can retrieve important documents or share photos +even when you’re away from home.

    Essentially, a NAS is a versatile and convenient way to manage and share your +digital data. It offers more control and privacy than cloud storage services, +and it can be a valuable tool for both individuals and businesses.


    TrueNAS
    #

    TrueNAS is an Open Source NAS operating System / infrastructure solution. In +addition to powerful scale-out storage capabilities, TrueNAS SCALE adds Linux +Containers and VMs (KVM) so your organization can run workloads closer to data.

    Why I switched
    #

    Recently I switched over to TrueNas from my off the shelf +Terramaster +device. I actually really liked the Terramaster, it allowed a 5 drive pool with +raid 1 on a BTRFS filesystem. Which meant it was easy to upgrade the drives from +2TB –> 6TB giving me a decent ~24TB size pool (one drive as parity). I got +this originally so that I could safely back up my data and store my 10TB+ of VOD +recordings from the Live Stream & Youtube. The Terramaster had some pretty big +drawbacks. It was only really good for being a simple NAS share.

    The proprietary operating System is actual hot garbage.

    • the GUI is extremely slow and freezes up a lot
    • the built in docker containers and other special features rarely work
    • the Recycle bin is hot garbage and runs even when you turn it off (discovered +nothing had EVER been deleted)
    • the underlying linux OS somehow struggles to do basic things like deleting +files
    • networking sometimes just broke, ignored static IPs and would ignore DNS due +to not properly turning off ipv6
    • there is little to no documentation or support outside of Terramaster official +forums, which is also hot garbage.

    Couple years later my data has continued to grow, including my +jellyfin media and other hoarding, so I +needed some space. This gave me a nice opertunity to upgrade. I have an older, +but still nice PC sitting around as a spare, so this was a good chance to +upgrade my NAS with some nice compute as well.

    Why TrueNAS
    #

    I went with TrueNAS SCALE because it used the newer ZFS2 +filesystem which allows for expansion +of pools. This would allow me to buy some extra drives, move over my data and +then expand using the old drive pool. SCALE also moved over to docker +containerization. Side benefit of allowing me to host some extra containers if I +want. Its also free and there is a lot of support / documentation out there. It +has come a long way from the FreeBSD days.

    Refurbished Drives
    #

    I had some issues when getting sourcing drives. Things are still pretty +expensive atm, so I went with just getting more 6TB and expanding the pool. Can +upgrade size later when the prices chill out. Managed to find a good price on +refurbished 6TB drives from amazon. However; when they arrived I found that +they were all heavily used 4 years+ uptime, reused from some Datacenter +somewhere. Fucking scummy Amazon seller. To top it off, some were SAS drives +out of NETAPP appliances.

    +Fuck you Netapp

    Netapp is an older shit brand that would lock down their drives with special +formatting that forced the customer to use only drives sourced from Netapp. +These old Netapp appliances are starting to flood the market as newer / +cheaper to run hardware is being deployed.

    +Success

    Luckily, smart people can reformat the drives from their shit Data Integrity +Feature (DIF) format back to a normal. This is a long and time consuming process +(Took DAYS) as the entire drive has to be reformatted with a normal 512 chunk +size.

    +Note

    Thank you smart guy from reddit that pointed me to the smart guy on TrueNAS forum that showed me how to fix these un-usable drives.

    TrueNAS has sg_format built in. With this you can reformat all the drives at the same time.

    # formatting
    +sg_format --format --size=512 /dev/sdb
    +
    +# progress
    +sudo sg_turs --progress /dev/sdb
    +Warning

    This still took multiple days with a 6TB drive :(

    Safely copying files
    #

    One problem I ran into was; how do I make sure everything is copied over safely from one pool to another? I could drag and drop folders, but that would have taken months and risked missing data. Best bet was to use rsync (which is also the fastest way to transfer). rsync has the added benefit of using checksum checking to verify all data is safely transferred with no errors. Luckily both systems were on linux, which made this easier.

    +Note

    I started by doing this after logging into my old Terramaster NAS and performing the rsync operation from there. This was a bad idea and too longer, because the OS is slow and CPU can not handle handling all this plus 10GB networking at once. If you do this, do this from a system with a decent CPU.

    • Mount your systems together via the device with the best CPU
    #mount in fstab
    +# <file system>     <dir>       <type>   <options>   <dump>	<pass>
    +nas:/mnt/md0/VODS /mnt/tnas/vods  nfs      defaults    0       0
    • Run rsync in the shell and move your folders using recursive options
    # Coping folders recursively with Progress & Stats
    +sudo rsync -avh -A --no-perms --progress --stats /mnt/tnas/store/Backups/ /mnt/store/vault/Backups/ &
    +Note

    rsync keeps logs and will run faster the next time around. Recommend running it a few times to add a extra verification that all your files have transferred.

    +Note

    You can use --progress --stats and the & operator to send the job to the background. This will alow you to bring the job to the foreground whenever you want to check on progress. This is super useful when transferring terabytes of data.

    +Note

    If doing this from TrueNAS, might be better to set this up as a one time cronjob. TrueNAS might kill this job if you lose connection to the shell while transferring.

    • add the job using the user interface (do not enable the job)

    adding a cron job

    • run the job when you are ready to move files

    running a cron job

    How to connect to a NAS
    #

    CIFS
    #

    Common Internet File System (CIFS) is a network file sharing protocol that +allows applications on computers to read and write files and request other +services from remote servers. Think of it as a way for your computer to talk to +another computer (or storage device) to access files. It’s most commonly +associated with Windows environments, but it’s used by other operating systems +as well. It is relatively secure, requiring username / password login to remote +systems.

    +Note

    You might need this if you want to connect a Windows machine to one +running linux like a common NAS (my use case).

    One example of a use case is a jellyfin container that needs persistent data +access for media (movies / tv shows) served from your nas. This will need this +to be mounted to the OS docker is running on and pass this through with the +volumes option in your docker compose file.

    To add CIFS to Linux

    For this you will also need the keyutils & cifs-utils packages. The keyutils +package is a library and a set of utilities for accessing the kernel keyring +facility. cifs-utils package provides a means for mounting SMB/CIFS shares on a +Linux system.

    apt-get install keyutils && apt install cifs-utils -y

    Then we will need to mount the remote storage via fstab so that it will +automatically mount to the OS every time the os boots.

    • create a file in your home directory “~/.smb”
    vim ~/.smb
    +Info

    The file should contain your NAS credentials (domain optional/depends +on your nas settings)

    username=NAS_USERNAME
    +password=NAS_PASSWORD 
    +domain=NAS_DOMAIN_GROUP 
    • Create an entry in the fstab
    vim /etc/fstab
    • Add an entry to the bottom line of the file
    # //{Nas_IP/Hostname}/{Nas_Mount_Point} /mnt/{mount_name_on_docker_os} cifs credentials=/[path_to_credentials].smb,x-systemd.automount 0 0
    +
    +# Example:
    +//nas.home/store /mnt/store cifs credentials=/home/wompmacho/.smb,x-systemd.automount 0 0
    • Save your file and re-mount all
    mount -a
    • make sure your mount section of your docker compose matches the +mount_name_on_docker_os and reboot your system
    # example:
    +    volumes:
    +      - /app/jellyfin/config:/config
    +      - /mnt/store:/data/store
    +Success

    You can check that they are mounted by navigating to where you mounted the files

    wompmacho@docker:~$ cd /mnt/store/MediaServer/
    +Movies/   Music/    Torrent/  Tv Shows/

    NFS
    #

    NFS (Network File System) is a distributed file system protocol that allows users to access files and directories over a network as if they were located on their local computer. It’s a way for your computer to talk to another computer (or storage device) to access files, similar to CIFS, but more commonly used in Unix/Linux environments.

    +Warning

    There is NO SECURITY on NFS. It uses existing ACL groups to manage permissions. Only use this on a local network and for trusted devices.

    +Success

    On TrueNAS you can limit access to on IP address or limit within your local domain.

    alt text

    +Info

    One thing to consider when working with TrueNas:

    • When creating the initial dataset in your pool, set the zfs aclmode on the dataset in question to passthrough.
    • Special thanks to anodos you solved am issue plaguing me –> Truenas Forum

    SMB
    #

    Server Message Block (SMB) is a network communication protocol that allows computers to share files, printers, and other resources with each other. It’s the foundation of file sharing in Windows environments, but it’s also used by other operating systems like macOS and Linux.

    To connect to a SMB share on Windows:

    • Right Click to add a Network Location

    adding a network location

    • Use the IP address or hostname of the NAS and the share path provided to your folder access

    selecting the network path for smb

    +

    For windows you will need to enter a username / password for access to the share

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/nas/running_cron_job.png b/projects/nas/running_cron_job.png new file mode 100644 index 0000000..c72835e Binary files /dev/null and b/projects/nas/running_cron_job.png differ diff --git a/projects/nas/running_cron_job_hu_31352cabefb72187.png b/projects/nas/running_cron_job_hu_31352cabefb72187.png new file mode 100644 index 0000000..09ca378 Binary files /dev/null and b/projects/nas/running_cron_job_hu_31352cabefb72187.png differ diff --git a/projects/nas/running_cron_job_hu_81e17926592fc756.png b/projects/nas/running_cron_job_hu_81e17926592fc756.png new file mode 100644 index 0000000..1f95109 Binary files /dev/null and b/projects/nas/running_cron_job_hu_81e17926592fc756.png differ diff --git a/projects/nas/selecting_network_path_for_smb.png b/projects/nas/selecting_network_path_for_smb.png new file mode 100644 index 0000000..e4a2ad3 Binary files /dev/null and b/projects/nas/selecting_network_path_for_smb.png differ diff --git a/projects/nas/selecting_network_path_for_smb_hu_43bbdf15c29d1371.png b/projects/nas/selecting_network_path_for_smb_hu_43bbdf15c29d1371.png new file mode 100644 index 0000000..cb7c925 Binary files /dev/null and b/projects/nas/selecting_network_path_for_smb_hu_43bbdf15c29d1371.png differ diff --git a/projects/nas/truenas_nfs_limit_to_local_network.png b/projects/nas/truenas_nfs_limit_to_local_network.png new file mode 100644 index 0000000..28556da Binary files /dev/null and b/projects/nas/truenas_nfs_limit_to_local_network.png differ diff --git a/projects/nas/truenas_nfs_limit_to_local_network_hu_91b02d52bd853f28.png b/projects/nas/truenas_nfs_limit_to_local_network_hu_91b02d52bd853f28.png new file mode 100644 index 0000000..8cd11cf Binary files /dev/null and b/projects/nas/truenas_nfs_limit_to_local_network_hu_91b02d52bd853f28.png differ diff --git a/projects/networking/index.html b/projects/networking/index.html new file mode 100644 index 0000000..d0373ee --- /dev/null +++ b/projects/networking/index.html @@ -0,0 +1,137 @@ +networking · wiki.wompmacho.com

    networking

    ··1675 words·8 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    IP Address
    #

    An Internet Protocol address (IP) address is a numerical label assigned to each +device connected to a computer network that uses the Internet Protocol for +communication. Think of it like a street address for your computer on the +internet. It’s how devices find each other and exchange information.

    Here’s a breakdown:

    • Numerical Identifier: An IP address is a set of numbers, typically +represented in dotted decimal notation (e.g., 192.168.1.1). There are two +main versions: IPv4 (the older version) and IPv6 (the newer version, which +uses a different format to accommodate more addresses).
    • Device Identification: Every device that connects to a network (computers, +smartphones, tablets, servers, etc.) needs a unique IP address to be +identified and communicate.
    • Location Information: While not precise, parts of an IP address can +provide some general information about the device’s location.
    • Routing: IP addresses are used by routers to direct network traffic to the +correct destination. When you send data over the internet, routers use IP +addresses to figure out where to send it.

    In short, an IP address is a crucial element of networking. It’s the unique +identifier that allows devices to communicate with each other over a network, +whether it’s a local network or the vast expanse of the internet.


    IPv4 & IPv6
    #

    IPv4 and IPv6 are two versions of the Internet Protocol (IP), which is the +fundamental protocol that enables devices to communicate over the internet. +They are essentially addressing systems that allow devices to be uniquely +identified and located on a network.

    Here’s a breakdown:

    • IPv4 (Internet Protocol version 4): This is the original version of IP, +using 32-bit addresses represented in dotted decimal notation (e.g., +192.168.1.1). It offers roughly 4.3 billion unique addresses. Due to the +explosive growth of the internet, IPv4 addresses are now largely exhausted.

    • IPv6 (Internet Protocol version 6): This is the newer version of IP, +designed to address the limitations of IPv4. It uses 128-bit addresses +represented in hexadecimal notation (e.g., +2001:0db8:85a3:0000:0000:8a2e:0370:7334). IPv6 offers a vastly larger address +space, virtually eliminating the problem of address exhaustion.

    Key Differences and Why IPv6 is Needed:

    • Address Space: IPv4 has a limited number of addresses, while IPv6 offers a +practically unlimited number.
    • Address Format: IPv4 uses dotted decimal notation, while IPv6 uses +hexadecimal notation.
    • Automatic Configuration: IPv6 supports more advanced automatic +configuration features, simplifying network management.
    • Security: IPv6 includes built-in security features, such as IPSec, which +enhances network security.

    In short, IPv4 is the older, widely used addressing system that is now facing +address exhaustion. IPv6 is the newer, more robust addressing system designed to +replace IPv4 and provide the necessary address space for the continued growth of +the internet. The transition to IPv6 is ongoing.


    DHCP
    #

    Dynamic Host Configuration Protocol (DHCP) is a network management protocol that +automates the process of assigning IP addresses and other network configuration +parameters to devices on a network. Think of it as a way to automatically give +each device on your network its own “address” so it can communicate with other +devices and the internet.

    Here’s a breakdown:

    • Automatic IP Assignment: DHCP eliminates the need to manually configure IP +addresses for each device on a network. This is especially useful in large +networks where it would be tedious to assign addresses manually.
    • Lease-Based System: DHCP uses a “lease” system, where IP addresses are +assigned to devices for a specific period of time. When the lease expires, the +device must renew it or the IP address becomes available for other devices. +This helps ensure that IP addresses are used efficiently.
    • Centralized Management: DHCP allows network administrators to manage IP +addresses from a central server. This simplifies network administration and +makes it easier to track which devices have which IP addresses.
    • Other Configuration Parameters: In addition to IP addresses, DHCP can also +provide other network configuration parameters, such as subnet mask, default +gateway, and DNS server addresses.

    Why someone might use DHCP:

    • Simplified Network Administration: DHCP makes it much easier to manage IP +addresses in a network, especially in large networks.
    • Reduced Configuration Errors: Manual IP address configuration can lead to +errors, such as duplicate IP addresses, which can cause network conflicts. +DHCP helps prevent these errors.
    • Efficient IP Address Usage: The lease-based system ensures that IP +addresses are used efficiently and that addresses that are no longer in use +are reclaimed.
    • Plug-and-Play Networking: DHCP allows devices to connect to a network and +automatically receive the necessary network configuration, making it easier to +add new devices to the network.

    In short, DHCP is a valuable tool for network administrators that simplifies IP +address management and makes networks more efficient and reliable.


    Static IP
    #

    A static IP address is a manually assigned IP address that remains constant for +a specific device on a network. Unlike a dynamic IP address (assigned by DHCP), +a static IP doesn’t change. This makes it useful for devices that need a +consistent and predictable address, such as servers, printers, or network +devices. However, it requires manual configuration and careful management to +avoid IP address conflicts.


    DNS
    #

    Domain Name System (DNS) is essentially the phone book of the internet. It +translates human-readable domain names (like google.com) into the numerical +IP addresses (like 172.217.160.142) that computers use to communicate with each +other.

    Here’s a breakdown:

    • Human-Friendly to Machine-Friendly: We remember names like “google.com” +easily, but computers communicate using IP addresses. DNS bridges this gap by +converting domain names into their corresponding IP addresses.
    • Distributed Database: DNS is a massive, distributed database. It’s not +stored in one single location, but rather spread across a network of servers +around the world. This makes it robust and efficient.
    • Hierarchical Structure: DNS is organized in a hierarchical structure, like +a tree. This structure helps to manage the vast number of domain names and IP +addresses.
    • Resolution Process: When you type a domain name into your browser, your +computer initiates a DNS resolution process. It queries various DNS servers to +find the IP address associated with that domain name.

    Why someone might use DNS:

    • Easy Access to Websites: DNS allows us to access websites by using +easy-to-remember domain names instead of complex IP addresses.
    • Email Delivery: DNS is also used to route email to the correct mail +servers.
    • Internet Functionality: DNS is a fundamental component of the internet, +without which we wouldn’t be able to easily browse the web or send emails.

    In short, DNS is a critical part of the internet infrastructure. It’s the system +that allows us to use domain names to access websites and other internet +resources, making the internet user-friendly and accessible.


    PROXY
    #

    A proxy acts as an intermediary between a client (like your computer) and a +server (like a website). Instead of your computer directly connecting to the +server, it connects to the proxy server, which then forwards the request to the +server. The server’s response comes back to the proxy, which then forwards it to +your computer. Think of it like a middleman.

    Here’s a breakdown:

    • Intermediary: The core function of a proxy is to act as a go-between for +client and server.
    • Hiding IP Address: One common use of a proxy is to mask the client’s IP +address. The server sees the proxy’s IP address, not the client’s, providing a +degree of anonymity.
    • Caching: Proxies often cache frequently accessed content. If a client +requests something that’s already in the cache, the proxy can serve it +directly, speeding up access.
    • Filtering and Security: Proxies can be used to filter content, block +access to certain websites, or scan for malware. This is common in corporate +environments.
    • Load Balancing: In some situations, proxies can distribute traffic across +multiple servers, helping to balance the load and improve performance.

    In short, a proxy server provides a layer of separation between clients and +servers, offering a variety of benefits related to privacy, security, +performance, and network management.


    Reverse Proxy
    #

    A reverse proxy sits in front of one or more backend servers, intercepting +client requests and forwarding them to the appropriate server. It acts as a +gateway, but unlike a regular proxy (which protects clients), a reverse proxy +protects the servers. Clients connect to the reverse proxy, which then handles +the connection to the actual servers.

    Here’s a breakdown:

    • Server Protection: Reverse proxies shield backend servers from direct +exposure to the internet, enhancing security by preventing direct attacks.
    • Load Balancing: They can distribute client traffic across multiple +servers, preventing any single server from becoming overloaded.
    • Caching: Reverse proxies can cache content, reducing the load on backend +servers and speeding up response times for clients.
    • SSL Termination: They can handle SSL encryption and decryption, offloading +this task from the backend servers.
    • URL Rewriting: Reverse proxies can modify URLs, making them more +user-friendly or hiding the internal structure of the backend servers.

    In short, a reverse proxy acts as a gatekeeper for backend servers, providing a +range of benefits related to security, performance, scalability, and +flexibility. It’s a common component in modern web architectures.

    SSL
    #

    Secure Sockets Layer (SSL) is a security protocol that creates an encrypted +connection between a web server and a web browser. This ensures that any data +exchanged between them remains private and secure. Think of it as a secret +tunnel that prevents eavesdropping and tampering.

    Here’s a breakdown:

    • Encryption: SSL encrypts the data transmitted between the browser and the +server, making it unreadable to anyone who might try to intercept it. This +protects sensitive information like passwords, credit card numbers, and +personal details.
    • Authentication: SSL verifies the identity of the website, assuring users +that they are connecting to the legitimate website and not a fake one. This +helps prevent phishing attacks.
    • Data Integrity: SSL ensures that the data transmitted between the browser +and the server is not altered or corrupted during transit. This guarantees +that the information received is exactly what was sent.

    In short, SSL is a crucial security technology that protects online +communication and helps build trust between websites and their users. It’s the +foundation of secure online transactions and a vital component of a safe +internet experience.

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/nginx-proxy-manager/cloudflare_ssl_example.png b/projects/nginx-proxy-manager/cloudflare_ssl_example.png new file mode 100644 index 0000000..fc932e3 Binary files /dev/null and b/projects/nginx-proxy-manager/cloudflare_ssl_example.png differ diff --git a/projects/nginx-proxy-manager/cloudflare_ssl_setup_example.png b/projects/nginx-proxy-manager/cloudflare_ssl_setup_example.png new file mode 100644 index 0000000..b3989f0 Binary files /dev/null and b/projects/nginx-proxy-manager/cloudflare_ssl_setup_example.png differ diff --git a/projects/nginx-proxy-manager/index.html b/projects/nginx-proxy-manager/index.html new file mode 100644 index 0000000..2240c83 --- /dev/null +++ b/projects/nginx-proxy-manager/index.html @@ -0,0 +1,104 @@ +nginx-proxy-manager · wiki.wompmacho.com

    nginx-proxy-manager

    ·1053 words·5 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is nginx-proxy-manager?
    #

    Nginx-proxy-manager is a simplified GUI for handling an nginx server +configuration. Nginx is a reverse proxy server.

    A reverse proxy server is a type of proxy server that typically sits behind the +firewall in a private network and directs client requests to the appropriate +backend server. Nginx is a very common go-to. Nginx-proxy-manager is a nice gui +version that has some built in tools, like handling SSL Certificates with Let’s +Encrypt. Nginix can provide load balancing, Web acceleration, Security and +anonymity for servers.

    Personally I use nginx to proxy all my traffic to my dedicated servers so that I +do not have to expose local hosts via port forwarding. This also allows me to do +some extra encryption along the way and add additional security via access lists +where I see fit. I can also reuse ports, which saves a lot of time for +configurations.

    Docker Compose Example
    #

    # nginx-proxy-manager - docker compose
    +---
    +version: "3.8"
    +services:
    +  app:
    +    container_name: nginx-proxy-manager
    +    image: "jc21/nginx-proxy-manager:latest"
    +    restart: unless-stopped
    +    ports:
    +      - "80:80"
    +      - "81:81"
    +      - "443:443"
    +    volumes:
    +      - ./data:/data
    +      - ./letsencrypt:/etc/letsencrypt

    Nginx gives you that great routing to your internal networked servers. Also +helps you set up your DNS both inside and outside the network. Can be a little +confusing at first.

    First you will need a route you want to point to. In this case I will use this +site.

    I want to be able to type in wiki.wompmacho.com and arrive here rather than +remembering my IP address and having to set up multiple complicated port +forwards in my router. Instead nginx allows me to open one port - 80 and direct +all traffic to nginx. Then based on some rules I have set up I can point that +traffic to my internal server. For this I will need a domain name server (DNS) +to point to my external IP.

    DNS
    #

    A domain name server (DNS) allows me to make a name that can be easily looked up +and point traffic to an Internet Protocol (IP) address that a server can easily +understand.

    I can type in a name to a browser - my browser will ask my computers dns cache +where is google.com and when not found - it will ask my router where is +google.com which will then ask the dns server it is pointed to (typically your +ISP) who then asks the dns server the ISP is pointing to… and so on until +eventually one of the DNS servers contain the information about google.com. +Then it can retrieve the IP address of that server and send that information +back down the line - adding it to its own cache as it goes so that it does not +have to keep looking up this information. This will allow the browser to make +requests to that server directly.

    In order to make my dns name known so that people can find it on the internet +easily, We will have to purchase the name from a host of an Authoritative DNS +server. An Authoritative DNS server will not cache the info, but instead act as +a primary resource of the configuration for a dns name so other dns servers can +ask for that resource.

    In this example I have purchased wompmacho.com from cloudflare who operate +as a registrar and facilitates purchasing that name from a higher authoritative +registry. Allowing me to point my external IP address to this address.

    Once I have a DNS name I can use my registar (cloudflare) to point that name to +my external IP address (my router’s IP address).

    +wompmacho.com <> 175.222.222.222

    Port forwarding
    #

    This traffic will then be requested from my router which should be typically +set up to block incoming requests. In order to allow a request to my server +hosting my site I will need to open a port (80) and allow traffic through my +router’s firewall to my docker container that is hosting nginx-proxy-manager. +Nginx will then redirect this again to my docker container for my site.

    A records
    #

    For my scenario my dns name is wompmacho.com but if I want to have multiple +sites at my IP address I will need to be able to differentiate them. To do this +I will use an A record. This allows me to split up my domain with multiple sub +domains.

    • wiki.wompmacho.com
    • subdomain.wompmacho.com

    Setting up a proxy
    #

    This will point traffic to the same domain (wompmacho.com) but based on the +sub-domain nginx will be able to direct and load balance traffic to my internal +server hosting the wiki - in this case also my docker container. The wiki is +hosted on a different port. We can point this proxy to that port.

    nginx_proxy_host_setup.png

    Cloudflare DNS Proxy
    #

    An example of a dns service is Cloudflare. I switched over to cloudflare when +google sold their awesome DNS. I have been loving it since the switch, there is +a lot of info out there on services they offer and how to set things up. The +biggest reason I switched over to cloudflare is their dns proxy. This allows my +home IP to be proxied behind cloudflare services - and helps hide my servers +location. This also allows me to utilize their services to block things like +botnet attacks.

    cloudflare_ssl_example.png

    SSL encryption
    #

    Secure Sockets Layer (SSL) is a security protocol that provides privacy, +authentication, and integrity to Internet communications. SSL eventually evolved +into Transport Layer Security (TLS). Using Nginx-proxy-manager we can connect +our cloudflare DNS to our nginx server using SSL encryption. This is what that +lock and https indicates on your browser - you are using a secured and +verified connection to the server. This helps stop man in the middle attacks +preventing people from spoofing the connection and spying on you.

    ssl_connection_lock.png

    We do this by adding a cloudflare certificate to nginx proxy manager and then +setting up our proxy host to use this certificate on the SSL tab.

    cloudflare_ssl_setup_example.png

    nginx_ssl_setup_example.png

    +Note this is is only for a secure connection between nginx <-> cloudflare

    The details page is referring to your internal setup - or where nginx should +point the dns to.

    +origin server <-> nginx

    Use https here only if you have ssl setup on your origin server and your server +is set up to accept https, otherwise you make get bad gateway 502 errors.

    nginx_ssl_internal_scheme_example.png

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/nginx-proxy-manager/nginx_proxy_host_setup.png b/projects/nginx-proxy-manager/nginx_proxy_host_setup.png new file mode 100644 index 0000000..1284f4b Binary files /dev/null and b/projects/nginx-proxy-manager/nginx_proxy_host_setup.png differ diff --git a/projects/nginx-proxy-manager/nginx_ssl_internal_scheme_example.png b/projects/nginx-proxy-manager/nginx_ssl_internal_scheme_example.png new file mode 100644 index 0000000..7cd316a Binary files /dev/null and b/projects/nginx-proxy-manager/nginx_ssl_internal_scheme_example.png differ diff --git a/projects/nginx-proxy-manager/nginx_ssl_setup_example.png b/projects/nginx-proxy-manager/nginx_ssl_setup_example.png new file mode 100644 index 0000000..2cec2fb Binary files /dev/null and b/projects/nginx-proxy-manager/nginx_ssl_setup_example.png differ diff --git a/projects/nginx-proxy-manager/ssl_connection_lock.png b/projects/nginx-proxy-manager/ssl_connection_lock.png new file mode 100644 index 0000000..5a1c253 Binary files /dev/null and b/projects/nginx-proxy-manager/ssl_connection_lock.png differ diff --git a/projects/pihole/index.html b/projects/pihole/index.html new file mode 100644 index 0000000..3d58392 --- /dev/null +++ b/projects/pihole/index.html @@ -0,0 +1,61 @@ +pihole · wiki.wompmacho.com

    pihole

    ··528 words·3 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    The Pi-hole is a DNS sinkhole that protects your devices from unwanted content, +without installing any client-side software. Useful for blocking ad services at +a DNS level. It uses a list of known ad services stored on github, can add your +own. It can also operate as a internal dns router and dhcp server.

    Pihole Setup
    #

    If you have a raspberry-pi or another device, its super easy to get things +going.

    Any debian based system should be able to get things going quickly. Then all you +need to do is set your devices to use your pihole as the primary dns server.

    Debian based one-step install

    curl -sSL https://install.pi-hole.net | bash
    +Note

    I find this to be a little flaky when it comes to DNS, often times OS will need reboots and cache to be cleared in order to actively start using pihole DNS.

    Browsers also store dns info so many things can conflict before your DNS +switches over. I find that using Pihole as primary DHCP server forces your +devices to use the correct DNS server and fixes a lot of problems.

    Also keep in mind that ipv6 can interfere if you are like me and have a ISP +provider that tries to force their DNS


    Setup on Proxmox VM
    #

    My pihole is operating as a Debian GNU/Linux 12 (bookworm) virtual machine +running on Proxmox. I use it as a internal DNS router & DHCP server which makes +dns much easier in my case - due to my internet provider trying to force me to +use there dns servers. This setup is a little weird and in-order to get +everything to work a couple extra steps are need.

    Will need to setup your pihole as a dhcp server, disable the existing dhcp +server on the router, reserve static ip addressed for proxmox and pihole so that +it can connect to the gateway, set the pihole as primary dns server on proxmox, +set proxmox to use dhcp rather than static ip and finally set pihole VM to +automatically boot first so that when it connects to the gateway devices +connected to the gateway are issued ip address from the pihole.

    +Warning

    If you are using pihole for DHCP / DNS, keep in mind if the device goes down +that is hosting your pihole server, so will your DNS / DHCP. This May prevent +you from connecting to your network until you re-enable a dhcp server such as +the one in your router.

    • reserve a ip address in router/gateway for proxmox server & pihole

      reserved_ip_example.png

    • set pihole to enable DHCP

      pihole_dhcp_example.png

    • set proxmox to get DHCP on boot rather than Static IP which is default

      root@laptop-proxmox:~# cat /etc/network/interfaces
      +auto lo
      +iface lo inet loopback
      +
      +iface enp3s0 inet manual
      +
      +auto vmbr0
      +iface vmbr0 inet dhcp
      +        bridge-ports enp3s0
      +        bridge-stp off
      +        bridge-fd 0
      +
      +iface wlp4s0 inet manual
    • set proxmox default DNS server to pihole reserved address

      proxmox_dns_example.png

    • set pihole to automatically start on boot with highest priority boot order

      pihole_boot_order.png

    • set sattic ip and gateway info for pihole netwoking configuration '

      pihole_network_settings_proxmox_example.png

    • Disable DHCP server in gateway / router settings

      router_disable_dhcp_example.png

    • If router has option to set default DNS, set to pihole reserved address

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/pihole/pihole_boot_order.png b/projects/pihole/pihole_boot_order.png new file mode 100644 index 0000000..c8ad596 Binary files /dev/null and b/projects/pihole/pihole_boot_order.png differ diff --git a/projects/pihole/pihole_dhcp_example.png b/projects/pihole/pihole_dhcp_example.png new file mode 100644 index 0000000..10a7f1d Binary files /dev/null and b/projects/pihole/pihole_dhcp_example.png differ diff --git a/projects/pihole/pihole_dhcp_example_hu_a595c896e700628e.png b/projects/pihole/pihole_dhcp_example_hu_a595c896e700628e.png new file mode 100644 index 0000000..8f25b25 Binary files /dev/null and b/projects/pihole/pihole_dhcp_example_hu_a595c896e700628e.png differ diff --git a/projects/pihole/pihole_network_settings_proxmox_example.png b/projects/pihole/pihole_network_settings_proxmox_example.png new file mode 100644 index 0000000..16f36b8 Binary files /dev/null and b/projects/pihole/pihole_network_settings_proxmox_example.png differ diff --git a/projects/pihole/pihole_network_settings_proxmox_example_hu_721be3cece9dfd1c.png b/projects/pihole/pihole_network_settings_proxmox_example_hu_721be3cece9dfd1c.png new file mode 100644 index 0000000..850fe1b Binary files /dev/null and b/projects/pihole/pihole_network_settings_proxmox_example_hu_721be3cece9dfd1c.png differ diff --git a/projects/pihole/pihole_network_settings_proxmox_example_hu_9e9d0ed6beb98b36.png b/projects/pihole/pihole_network_settings_proxmox_example_hu_9e9d0ed6beb98b36.png new file mode 100644 index 0000000..042acab Binary files /dev/null and b/projects/pihole/pihole_network_settings_proxmox_example_hu_9e9d0ed6beb98b36.png differ diff --git a/projects/pihole/proxmox_dns_example.png b/projects/pihole/proxmox_dns_example.png new file mode 100644 index 0000000..0eae8d3 Binary files /dev/null and b/projects/pihole/proxmox_dns_example.png differ diff --git a/projects/pihole/proxmox_dns_example_hu_7b7c16218999ce03.png b/projects/pihole/proxmox_dns_example_hu_7b7c16218999ce03.png new file mode 100644 index 0000000..1f30a38 Binary files /dev/null and b/projects/pihole/proxmox_dns_example_hu_7b7c16218999ce03.png differ diff --git a/projects/pihole/reserved_ip_example.png b/projects/pihole/reserved_ip_example.png new file mode 100644 index 0000000..7eddf4e Binary files /dev/null and b/projects/pihole/reserved_ip_example.png differ diff --git a/projects/pihole/reserved_ip_example_hu_cc982695c0dac657.png b/projects/pihole/reserved_ip_example_hu_cc982695c0dac657.png new file mode 100644 index 0000000..954816d Binary files /dev/null and b/projects/pihole/reserved_ip_example_hu_cc982695c0dac657.png differ diff --git a/projects/pihole/router_disable_dhcp_example.png b/projects/pihole/router_disable_dhcp_example.png new file mode 100644 index 0000000..eb9f027 Binary files /dev/null and b/projects/pihole/router_disable_dhcp_example.png differ diff --git a/projects/portainer/index.html b/projects/portainer/index.html new file mode 100644 index 0000000..45e2858 --- /dev/null +++ b/projects/portainer/index.html @@ -0,0 +1,36 @@ +portainer · wiki.wompmacho.com

    portainer

    ·224 words·2 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is Portainer?
    #

    Portainer is a lightweight, powerful container management platform that provides a graphical user interface (GUI) to manage your Docker, Docker Swarm, and Kubernetes environments. It essentially sits on top of your container runtime, allowing you to control complex infrastructure without needing to master the command line.

    Portainer provides a very easy to understand user interface for deploying other docker containers. The great thing is, Portainer +is a container itself, so it should run automatically following setup and allow +you a nice gui interface for your docker environment via a web browser. I +particularly love its dashboard because you get a great snapshot of your running +containers, can easily restart and monitor your containers, but most importantly +edit and deploy docker-compose files via the “stacks” page.

    • Portainer CE is free version

    • Install +Guide

    • Create the volume that Portainer Server will use to store its database

      docker volume create portainer_data
    • Download and install the Portainer Server container

      docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
    • Verify the container is running with docker ps

      root@server:~# docker ps
      +CONTAINER ID   IMAGE                          COMMAND                  CREATED       STATUS      PORTS                                                                                  NAMES             
      +de5b28eb2fa9   portainer/portainer-ce:latest  "/portainer"             2 weeks ago   Up 9 days   0.0.0.0:8000->8000/tcp, :::8000->8000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp   portainer
    • Navigate to https://HOST_IP_ADDRESS:9443 and create a user so you can log in +to the Portainer web interface.

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/pterodactyl/index.html b/projects/pterodactyl/index.html new file mode 100644 index 0000000..bff59be --- /dev/null +++ b/projects/pterodactyl/index.html @@ -0,0 +1,72 @@ +pterodactyl · wiki.wompmacho.com

    pterodactyl

    ··253 words·2 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is Pterodactyl?
    #

    Pterodactyl is a free, open-source game server management panel built with PHP, +React, and Go. Designed with security in mind, Pterodactyl runs all game servers +in isolated Docker containers while exposing a beautiful and intuitive UI to end +users.

    pterodactyl & ssl
    #

    ssl with pterodactyl is really annoying if you are using it behind a reverse +proxy (nginx) - might be easier to run this on its own server so you can just +use the default port 80 for web. reverse proxy is designed for normal web +traffic, not game servers.

    If you are annoying like me and wanna put things on a single server and save +money… here is what you can do.

    • Creating SSL +Certificates

    • Youtube Guide

    • Webserver +Configuration

    • NGINX Specific +Configuration

      https://pterodactyl.io/panel/0.7/configuration.html
      +# idk... couldn't get it to work
      +# OpenSSL Self-Signed Certificate Command:
      +openssl req -sha256 -addext "subjectAltName = DNS:games.local" -newkey rsa:4096 -nodes -keyout privkeyselfsigned.pem -x509 -days 3650 -out fullchainselfsigned.pem
      +
      +
      +# nginx-proxy-manager with cloudflare ssl cert setup
      +# proxy side should be http
      +# do not force ssl on cert side
      +# go to http after getting to the site
      +
      +# .env file
      +/var/www/pterodactyl/.env
      +APP_URL="http://domain"
      +TRUSTED_PROXIES=*
      +# you don't have to do this - i'd rather not
      +PTERODACTYL_TELEMETRY_ENABLED=false
      +RECAPTCHA_ENABLED=false
      +
      +# config.yml
      +/etc/pterodactyl/config.yml
      +# use auto config remote: http:
      +
      +# nginx pterodactyl.conf
      +/etc/nginx/sites-enabled/pterodactyl.conf
      +
      +# add to proxy-manager special settings
      +proxy_set_header X-Real-IP $remote_addr;
      +proxy_set_header Host $host;
      +proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      +proxy_set_header X-Forwarded-Proto $scheme;
      +proxy_redirect off;
      +proxy_buffering off;
      +proxy_request_buffering off;
      +
      +sudo systemctl restart nginx && systemctl restart wings

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/qbittorent/index.html b/projects/qbittorent/index.html new file mode 100644 index 0000000..79612cd --- /dev/null +++ b/projects/qbittorent/index.html @@ -0,0 +1,64 @@ +qBittorrent · wiki.wompmacho.com

    qBittorrent

    ·279 words·2 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is qBittorrent?
    #

    qBittorrent is a awesome, simple app that allows you to use classic QBittorrent in a docker +container. I use QBittorrent because I can set it up with a VPN that only +connects via the container directly. Effectively separating it from the rest of +my network and allowing me to continue as normal while it is downloading. It +will automatically stop the network if the VPN is not functioning correctly.

    Docker Compose Example
    #

    # qbittorrentvpn - docker compose
    +# https://hub.docker.com/r/dyonr/qbittorrentvpn
    +---
    +version: "2"
    +services :
    +  qbittorrentvpn:
    +    container_name: qbittorrentvpn
    +    privileged: true
    +    image: dyonr/qbittorrentvpn
    +    environment :
    +      - VPN_ENABLED=true
    +      - VPN_USERNAME=VPN_USERNAME
    +      - VPN_PASSWORD=VPN_PASSWORD
    +      - LAN_NETWORK=10.0.0.0/24
    +      - WEBUI_PORT_ENV=8080
    +      - INCOMING_PORT_ENV=8999
    +    ports :
    +      - 8080:8080
    +      - 8999:8999
    +      - 8999:8999/udp	
    +    volumes :
    +      - /app/QBittorrent/config:/config
    +      - /mnt/store/MediaServer/torrent:/downloads	
    +    restart: unless-stopped

    To set up the VPN you will need to have an existing account with a VPN service. +Username & Password for the vpn will be provided as a key by your vpn service. +In my case I use Surfshark and have to go log into my account, navigate to the +linux setup page and grab my generated Username key and Password key there.

    A credentials file on my docker host was generated by QBittorrent when running +the first time.

    # download all availble server conf
    +sudo wget https://my.surfshark.com/vpn/api/v1/server/configurations
    +
    +# cp the server you want to use into config folder
    +/app/QBittorrent/config/openvpn 

    Once you restart your qbittorrentvpn docker container you can test your vpn +service with a torrent leak test. Use the + add torrent link button to Download +the torrent and test that your VPN service is connected and working.

    Magnet links#

    Use magnet link and item hash to avoid logins

    magnet:?xt=urn:btih:${HASH}

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/uptime-kuma/index.html b/projects/uptime-kuma/index.html new file mode 100644 index 0000000..26df6a0 --- /dev/null +++ b/projects/uptime-kuma/index.html @@ -0,0 +1,42 @@ +uptime-kuma · wiki.wompmacho.com

    uptime-kuma

    ·82 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is uptime-kuma?
    #

    uptime-kuma is a neat little web monitoring application. Lotta dope things right +out of the box, very gui / user friendly. Pretty much just add the stack, update +the dir for config - and it works. Integrates with discord webhooks, great easy +status page and dashboard.

    Docker Compose Example
    #

    # uptime-kuma - docker compose
    +---
    +# https://github.com/louislam/uptime-kuma/wiki/%F0%9F%94%A7-How-to-Install
    +version: '3.3'
    +services:
    +  uptime-kuma:
    +    container_name: uptime-kuma
    +    image: louislam/uptime-kuma:1
    +    volumes:
    +      - /app/uptime-kuma/data:/app/data
    +    ports:
    +      - 3001:3001  # <Host Port>:<Container Port>
    +    restart: always

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/vaultwarden/index.html b/projects/vaultwarden/index.html new file mode 100644 index 0000000..25c0ace --- /dev/null +++ b/projects/vaultwarden/index.html @@ -0,0 +1,51 @@ +· wiki.wompmacho.com

    ·81 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is vaultwarden?
    #

    vaultwarden ia a alternative server implementation of the Bitwarden Client API, written in +Rust and compatible with official Bitwarden clients, perfect for self-hosted +deployment where running the official resource-heavy service might not be ideal.

    Docker Compose Example
    #

    # vaultwarden -- https://github.com/dani-garcia/vaultwarden
    +---
    +services:
    +  vaultwarden:
    +    image: vaultwarden/server:latest
    +    container_name: vaultwarden
    +    restart: unless-stopped
    +    environment:
    +      DOMAIN: "https://vaultwarden.wompmacho.com"
    +      ROCKET_PORT: 80
    +      ROCKET_ENV: production
    +    volumes:
    +      - vaultwarden-mount:/data/
    +    ports:
    +      - '9998:80'
    +      - '9999:443'
    +
    +volumes:
    +  vaultwarden-mount:
    +    name: vaultwarden-mount
    +    driver_opts:
    +      type: nfs
    +      o: addr=truenas,nolock,soft,rw
    +      device: :/mnt/store/vault/app/vaultwarden

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/webtop/index.html b/projects/webtop/index.html new file mode 100644 index 0000000..4672ef4 --- /dev/null +++ b/projects/webtop/index.html @@ -0,0 +1,44 @@ +webtop · wiki.wompmacho.com

    webtop

    ·58 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is webtop?
    #

    webtop is a awesome mini linux env I can use as a secure remote web-client for my home +network.

    Docker Compose Example
    #

    # webtop - https://docs.linuxserver.io/images/docker-webtop/#lossless-mode
    +---
    +services:
    +  webtop:
    +    image: lscr.io/linuxserver/webtop:latest
    +    container_name: webtop
    +    environment:
    +      - PUID=1000
    +      - PGID=1000
    +      - TZ=America/New_York
    +      - TITLE=Webtop #optional
    +    volumes:
    +      - /app/webtop/data:/config
    +    ports:
    +      - 7978:3000
    +      - 7979:3001
    +    restart: unless-stopped

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/projects/wikijs/index.html b/projects/wikijs/index.html new file mode 100644 index 0000000..70de603 --- /dev/null +++ b/projects/wikijs/index.html @@ -0,0 +1,52 @@ +wikijs · wiki.wompmacho.com

    wikijs

    ·135 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    What is wikijs?
    #

    Wiki.js is a powerful, modern, and open-source wiki application built on Node.js. It is designed to be the central knowledge base for your home lab or professional projects, replacing traditional, clunky wiki platforms with a sleek, intuitive interface.

    I like it because of the useful Markdown editor that lets you nicely organize +links, code etc. I can also backup the database to my NAS in nice MD files, so +nothing gets lost if something is corrupted.

    Docker Compose Example
    #

    # wikijs - docker compose
    +# https://github.com/linuxserver/docker-wikijs
    +---
    +version: "3.8"
    +services:
    +  wikijs:
    +    image: lscr.io/linuxserver/wikijs:latest
    +    container_name: wikijs
    +    environment:
    +      - PUID=0
    +      - PGID=0
    +      - TZ=Etc/UTC
    +      - DB_TYPE=sqlite #optional
    +      - DB_HOST= #optional
    +      - DB_PORT= #optional
    +      - DB_NAME= #optional
    +      - DB_USER= #optional
    +      - DB_PASS= #optional
    +    volumes:
    +      - /app/wiki/config:/config
    +      - /app/wiki/data:/data
    +    ports:
    +      - 3000:3000
    +    restart: unless-stopped

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/resume/index.html b/resume/index.html new file mode 100644 index 0000000..fa74c6e --- /dev/null +++ b/resume/index.html @@ -0,0 +1,26 @@ +Resume · wiki.wompmacho.com

    Resume

    ··491 words·3 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow
    Experience
    Special Projects Lead (DT L3) - GoogleOctober 2024 - Current

    HwOps Special Projects Lead; Resolve technical incidents and escalations by performing analysis utilizing existing data models or leveraging custom built data infrastructure to formulate and interpret data to reach specific conclusions and next steps. Develop detailed reports and intuitive dashboards, communicating key insights for data driven analysis. File bugs against products, documentation, and procedures by documenting desired behavior or steps to reproduce, and driving bugs to resolution. Suggest code-level resolutions for complex issues by leveraging tools, tool development and effective communication with stakeholders. Identify opportunities to build or enable solutions that improve, support or empower OMs, Site Leads & DTs to solve issues by using self-service tools and documentation. Fostered team growth through mentorship, training course facilitation, collaboration with internal training teams, and technical writing development.

    Data Center Technician (DT L2) - GoogleJuly 2023 - October 2024

    Site Operations hardware maintenance and networking, resolving critical issues and collaborating cross-functionally to address SLO deviations. Built and led an internal escalation team for weekend/holiday support, creating resources and onboarding leaders. Developed and documented new processes, championed project documentation, and contributed to technician hiring, onboarding, and training. Mentored Googlers and facilitated training programs. Transitioned into Leader Role as a Maintenance Lead / Escalation Point of Contact.

    Consulting / Freelance / Helping out Family
    Porch Light Properties LLCJun 2020 - Jul 2023

    Developed and implemented long-term systems, development, and planning strategies, including rebranding initiatives. Served as Hiring Manager, overseeing onboarding, system administration, and policy management. Managed social media, website development/design, SEO, and marketing campaigns (including Facebook Ads). Utilized Google Analytics and oversaw technology/security initiatives and traditional marketing.

    Videography, Photography, Film Media, Drone ServicesJun 2020 - Jan 2023
    Tabora Farm and WineryDec 2019 - May 2020

    Managed social media, website development/design, and SEO. Oversaw tax and licensing compliance for interstate wine shipments.

    Work Experience Continued
    Operations Engineer - Inc.Apr 2015 - Sep 2017

    Led site operations teams and provided on-call support for multiple data centers/POPs, consistently exceeding SLOs goals. Managed, hired, onboarded, and trained operations engineers and staff. Served as a Twitter liaison and brand ambassador, reporting on emerging technologies. Provided on-site support to engineering teams, proactively monitored services, and managed projects including repairs, decommissioning, upgrades, installations, networking, and maintenance.

    Operations Technician (OTA/OA) - GoogleNov 2012 - Mar 2015

    Supported multiple sites on critical infrastructure projects, including server repairs, hardware qualifications, QA, NPI, HAT, disk sanitization, project management, decommissioning, upgrades, and backup library maintenance. Collaborated effectively to maintain Google's infrastructure and ensure operational excellence.

    Education
    Pennridge High School2004 - 2009
    Georgia State University - Computer Science2012 - 2017
    SkillsCertificates
    • Leadership, Mentoring
    • UNIX / Linux / OS
    • Networking, TCP/IP, DNS, DHCP
    • Technical Writing & Documentation
    • SQL, HTML, CSS, JS
    • Java, Golang, Shell Scripting
    • Docker, VMs, Baremetal
    • LPIC-1 - Linux Professional Institute
    • SUSE Certified Linux Administrator (SUSE CLA)
    • Small Unmanned Aircraft System (Part 107)

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..24875db --- /dev/null +++ b/robots.txt @@ -0,0 +1,3 @@ +User-agent: * +Allow: / +Sitemap: https://wiki.wompmacho.com/sitemap.xml diff --git a/search/index.html b/search/index.html new file mode 100644 index 0000000..f610b3a --- /dev/null +++ b/search/index.html @@ -0,0 +1,25 @@ +Search · wiki.wompmacho.com

    Search

    · +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/series/index.html b/series/index.html new file mode 100644 index 0000000..fe77675 --- /dev/null +++ b/series/index.html @@ -0,0 +1,17 @@ +Series · wiki.wompmacho.com

    Series

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/series/index.xml b/series/index.xml new file mode 100644 index 0000000..18a1c56 --- /dev/null +++ b/series/index.xml @@ -0,0 +1 @@ +Series on wiki.wompmacho.comhttps://wiki.wompmacho.com/series/Recent content in Series on wiki.wompmacho.comHugo -- gohugo.ioen© 2026 Michael \ No newline at end of file diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..e546d0a --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://wiki.wompmacho.com/authors/2026-03-08T00:00:00+00:00daily0.5https://wiki.wompmacho.com/posts/liberal/2026-03-08T00:00:00+00:00daily0.5https://wiki.wompmacho.com/authors/wompmacho/2026-03-08T00:00:00+00:00daily0.5https://wiki.wompmacho.com/posts/2025-12-31T18:07:42+00:00daily0.5https://wiki.wompmacho.com/projects/vaultwarden/2025-02-23T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/2026-03-08T00:00:00+00:00daily0.5https://wiki.wompmacho.com/posts/performance_reviews/2026-01-06T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/audiobookshelf/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/code-server/code-server/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/frigate/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/homarr/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/homepage/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/jellyfin/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/jellyseer/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/linkstack/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/mkdocs/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/nginx-proxy-manager/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/portainer/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/qbittorent/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/uptime-kuma/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/webtop/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/wikijs/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/posts/firstpost/2026-01-06T00:00:00+00:00daily0.5https://wiki.wompmacho.com/stream/stream_gear/2025-02-02T00:00:00+00:00daily0.5https://wiki.wompmacho.com/stream/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/resume/2025-02-08T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/pterodactyl/2025-02-08T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/nas/2024-05-11T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/networking/2025-02-08T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/pihole/2025-02-08T00:00:00+00:00daily0.5https://wiki.wompmacho.com/stream/stream_settings/2025-02-04T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/docker/2025-02-11T00:00:00+00:00daily0.5https://wiki.wompmacho.com/projects/lab_setup/2026-03-08T00:00:00+00:00daily0.5https://wiki.wompmacho.com/2025-01-02T00:00:00+00:00daily0.5https://wiki.wompmacho.com/categories/daily0.5https://wiki.wompmacho.com/search/daily0.5https://wiki.wompmacho.com/series/daily0.5https://wiki.wompmacho.com/tags/daily0.5 \ No newline at end of file diff --git a/stream/index.html b/stream/index.html new file mode 100644 index 0000000..d6e8a0a --- /dev/null +++ b/stream/index.html @@ -0,0 +1,17 @@ +Stream · wiki.wompmacho.com

    Stream

    2024

    Gear

    ··225 words·2 mins
    this has changed a bit… I will update later…

    OBS Settings

    ··98 words·1 min
    OBS # Stream Settings # Ignore stream service settings Video Encoder x264 1920x1080 Rate control CBR Bitrate 8000 Kbps Keyframe Interval 1s CPU Usage Medium Profile None Tune None x264 Options keyinit=90 Recording Settings # Recoding Format .mkv Audio Track All Automatic File Spliting Split Time 240 min Video # Common FPS Values 60 Advanced # Recording Filename Formatting %MM-%DD-%CCYY_%A_%hh-%mm-%p_%FPS Automatically Remux to MP4 Camera # Sony A6400 Resolution for stream 3840x2160 Specs Max Resolution 6000 x 4000 Image Ratio 1:1, 3:2, 16:9 Sensor 25 megapixels CMOS APS-C (23.5 x 15.6 mm) ISO Auto, 100-32000 (expands to 102800)

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/stream/index.xml b/stream/index.xml new file mode 100644 index 0000000..6ed5c6a --- /dev/null +++ b/stream/index.xml @@ -0,0 +1,105 @@ +Stream on wiki.wompmacho.comhttps://wiki.wompmacho.com/stream/Recent content in Stream on wiki.wompmacho.comHugo -- gohugo.ioen© 2026 MichaelTue, 04 Feb 2025 00:00:00 +0000Gearhttps://wiki.wompmacho.com/stream/stream_gear/Fri, 12 Jul 2024 03:11:33 +0000https://wiki.wompmacho.com/stream/stream_gear/<p>this has changed a bit&hellip; I will update later&hellip;</p>OBS Settingshttps://wiki.wompmacho.com/stream/stream_settings/Thu, 25 Jan 2024 22:28:32 +0000https://wiki.wompmacho.com/stream/stream_settings/<h2 class="relative group">OBS + <div id="obs" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#obs" aria-label="Anchor">#</a> + </span> + +</h2> + +<h3 class="relative group">Stream Settings + <div id="stream-settings" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#stream-settings" aria-label="Anchor">#</a> + </span> + +</h3> +<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Ignore stream service settings +</span></span><span class="line"><span class="cl">Video Encoder +</span></span><span class="line"><span class="cl"> x264 +</span></span><span class="line"><span class="cl"> 1920x1080 +</span></span><span class="line"><span class="cl">Rate control +</span></span><span class="line"><span class="cl"> CBR +</span></span><span class="line"><span class="cl">Bitrate +</span></span><span class="line"><span class="cl"> 8000 Kbps +</span></span><span class="line"><span class="cl">Keyframe Interval +</span></span><span class="line"><span class="cl"> 1s +</span></span><span class="line"><span class="cl">CPU Usage +</span></span><span class="line"><span class="cl"> Medium +</span></span><span class="line"><span class="cl">Profile +</span></span><span class="line"><span class="cl"> None +</span></span><span class="line"><span class="cl">Tune +</span></span><span class="line"><span class="cl"> None +</span></span><span class="line"><span class="cl">x264 Options +</span></span><span class="line"><span class="cl"> keyinit=90</span></span></code></pre></div></div> + +<h3 class="relative group">Recording Settings + <div id="recording-settings" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#recording-settings" aria-label="Anchor">#</a> + </span> + +</h3> +<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Recoding Format +</span></span><span class="line"><span class="cl"> .mkv +</span></span><span class="line"><span class="cl">Audio Track +</span></span><span class="line"><span class="cl"> All +</span></span><span class="line"><span class="cl">Automatic File Spliting +</span></span><span class="line"><span class="cl"> Split Time +</span></span><span class="line"><span class="cl"> 240 min</span></span></code></pre></div></div> + +<h3 class="relative group">Video + <div id="video" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#video" aria-label="Anchor">#</a> + </span> + +</h3> +<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Common FPS Values +</span></span><span class="line"><span class="cl"> 60</span></span></code></pre></div></div> + +<h3 class="relative group">Advanced + <div id="advanced" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#advanced" aria-label="Anchor">#</a> + </span> + +</h3> +<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Recording Filename Formatting +</span></span><span class="line"><span class="cl"> %MM-%DD-%CCYY_%A_%hh-%mm-%p_%FPS +</span></span><span class="line"><span class="cl"> Automatically Remux to MP4</span></span></code></pre></div></div> + +<h2 class="relative group">Camera + <div id="camera" class="anchor"></div> + + <span + class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"> + <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#camera" aria-label="Anchor">#</a> + </span> + +</h2> +<div class="highlight-wrapper"><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Sony A6400 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl">Resolution for stream +</span></span><span class="line"><span class="cl"> 3840x2160 +</span></span><span class="line"><span class="cl"> +</span></span><span class="line"><span class="cl">Specs +</span></span><span class="line"><span class="cl"> Max Resolution +</span></span><span class="line"><span class="cl"> 6000 x 4000 +</span></span><span class="line"><span class="cl"> Image Ratio +</span></span><span class="line"><span class="cl"> 1:1, 3:2, 16:9 +</span></span><span class="line"><span class="cl"> Sensor +</span></span><span class="line"><span class="cl"> 25 megapixels +</span></span><span class="line"><span class="cl"> CMOS +</span></span><span class="line"><span class="cl"> APS-C (23.5 x 15.6 mm) +</span></span><span class="line"><span class="cl"> ISO +</span></span><span class="line"><span class="cl"> Auto, 100-32000 (expands to 102800)</span></span></code></pre></div></div> \ No newline at end of file diff --git a/stream/stream_gear/index.html b/stream/stream_gear/index.html new file mode 100644 index 0000000..6d16b12 --- /dev/null +++ b/stream/stream_gear/index.html @@ -0,0 +1,26 @@ +Gear · wiki.wompmacho.com

    Gear

    ··225 words·2 mins· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    this has changed a bit… I will update later…

    Camera Gear
    #

    Lighting
    #

    Audio
    #

    IRL Setup
    #

    Game PC
    #

    Peripheral
    #

    Stream PC
    #

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/stream/stream_settings/index.html b/stream/stream_settings/index.html new file mode 100644 index 0000000..2a95a65 --- /dev/null +++ b/stream/stream_settings/index.html @@ -0,0 +1,66 @@ +OBS Settings · wiki.wompmacho.com

    OBS Settings

    ··98 words·1 min· +
    Michael
    Author
    Michael
    some dude that works on datacenters, plays guitar, streams, has a lot of side projects and unhealthy addiction to ow

    OBS
    #

    Stream Settings
    #

    Ignore stream service settings
    +Video Encoder 
    +	x264
    +	1920x1080
    +Rate control
    +	CBR
    +Bitrate
    +	8000 Kbps
    +Keyframe Interval
    +	1s
    +CPU Usage
    +	Medium
    +Profile
    +	None
    +Tune
    +	None
    +x264 Options
    +	keyinit=90

    Recording Settings
    #

    Recoding Format
    +	.mkv
    +Audio Track
    +	All
    +Automatic File Spliting
    +  Split Time
    +    240 min

    Video
    #

    Common FPS Values
    +	60

    Advanced
    #

    Recording Filename Formatting
    +	%MM-%DD-%CCYY_%A_%hh-%mm-%p_%FPS
    +  Automatically Remux to MP4

    Camera
    #

    Sony A6400
    +
    +Resolution for stream
    +	3840x2160
    +
    +Specs
    +  Max Resolution
    +    6000 x 4000
    +  Image Ratio
    +    1:1, 3:2, 16:9
    +  Sensor
    +    25 megapixels
    +    CMOS
    +    APS-C (23.5 x 15.6 mm)
    +  ISO
    +    Auto, 100-32000 (expands to 102800)

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/tags/index.html b/tags/index.html new file mode 100644 index 0000000..6148cf8 --- /dev/null +++ b/tags/index.html @@ -0,0 +1,17 @@ +Tags · wiki.wompmacho.com

    Tags

    © +2026 +Michael

    Powered by Hugo & Blowfish

    \ No newline at end of file diff --git a/tags/index.xml b/tags/index.xml new file mode 100644 index 0000000..3f1ee65 --- /dev/null +++ b/tags/index.xml @@ -0,0 +1 @@ +Tags on wiki.wompmacho.comhttps://wiki.wompmacho.com/tags/Recent content in Tags on wiki.wompmacho.comHugo -- gohugo.ioen© 2026 Michael \ No newline at end of file