<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.brettfullmer.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Brett</id>
	<title>Fullmer Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.brettfullmer.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Brett"/>
	<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/Special:Contributions/Brett"/>
	<updated>2026-09-16T09:37:55Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.6</generator>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.js&amp;diff=31</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.js&amp;diff=31"/>
		<updated>2026-08-21T19:41:46Z</updated>

		<summary type="html">&lt;p&gt;Brett: Add loop attribute, swap in the upgraded 25s video&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Inject a masthead matching brettfullmer.com&#039;s header, with a working hamburger menu. */&lt;br /&gt;
( function () {&lt;br /&gt;
	var header = document.createElement( &#039;header&#039; );&lt;br /&gt;
	header.id = &#039;bf-masthead&#039;;&lt;br /&gt;
	header.innerHTML =&lt;br /&gt;
		&#039;&amp;lt;div class=&amp;quot;bf-wrap&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;a class=&amp;quot;bf-name&amp;quot; href=&amp;quot;https://brettfullmer.com/&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;https://brettfullmer.com/favicon.svg&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;&amp;gt;Brett Fullmer&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;div class=&amp;quot;bf-mobile-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a class=&amp;quot;bf-cta&amp;quot; href=&amp;quot;https://linkedin.com/in/brettfullmer&amp;quot;&amp;gt;LinkedIn&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;button class=&amp;quot;bf-toggle&amp;quot; aria-label=&amp;quot;Toggle menu&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
					&#039;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;nav class=&amp;quot;bf-links&amp;quot; id=&amp;quot;bf-nav-links&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#about&amp;quot;&amp;gt;What I Do&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#experience&amp;quot;&amp;gt;Experience&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#sabbatical&amp;quot;&amp;gt;AI Lab&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/blog/&amp;quot;&amp;gt;Blog&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;/wiki/Main_Page&amp;quot; class=&amp;quot;bf-current&amp;quot;&amp;gt;Wiki&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a class=&amp;quot;bf-cta bf-cta-desktop&amp;quot; href=&amp;quot;https://linkedin.com/in/brettfullmer&amp;quot;&amp;gt;LinkedIn&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;/nav&amp;gt;&#039; +&lt;br /&gt;
		&#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
	document.body.insertBefore( header, document.body.firstChild );&lt;br /&gt;
&lt;br /&gt;
	var toggle = header.querySelector( &#039;.bf-toggle&#039; );&lt;br /&gt;
	var links = header.querySelector( &#039;.bf-links&#039; );&lt;br /&gt;
	toggle.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
		var isOpen = links.classList.toggle( &#039;open&#039; );&lt;br /&gt;
		toggle.classList.toggle( &#039;open&#039;, isOpen );&lt;br /&gt;
		toggle.setAttribute( &#039;aria-expanded&#039;, isOpen ? &#039;true&#039; : &#039;false&#039; );&lt;br /&gt;
	} );&lt;br /&gt;
	links.querySelectorAll( &#039;a&#039; ).forEach( function ( a ) {&lt;br /&gt;
		a.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
			links.classList.remove( &#039;open&#039; );&lt;br /&gt;
			toggle.classList.remove( &#039;open&#039; );&lt;br /&gt;
			toggle.setAttribute( &#039;aria-expanded&#039;, &#039;false&#039; );&lt;br /&gt;
		} );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
/* Inject the build-flow video into its placeholder (raw &amp;lt;video&amp;gt; tags get sanitized by MediaWiki) */&lt;br /&gt;
( function () {&lt;br /&gt;
	var placeholder = document.getElementById( &#039;wiki-video-spacelift-build&#039; );&lt;br /&gt;
	if ( !placeholder ) return;&lt;br /&gt;
	placeholder.innerHTML =&lt;br /&gt;
		&#039;&amp;lt;video controls loop preload=&amp;quot;metadata&amp;quot; poster=&amp;quot;/wiki/media/spacelift-diagram-poster.jpg&amp;quot; style=&amp;quot;max-width:728px;width:100%;height:auto;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;source src=&amp;quot;/wiki/media/spacelift-diagram-video.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
			&#039;Your browser does not support embedded video. &amp;lt;a href=&amp;quot;/wiki/media/spacelift-diagram-video.mp4&amp;quot;&amp;gt;Download the video&amp;lt;/a&amp;gt; instead.&#039; +&lt;br /&gt;
		&#039;&amp;lt;/video&amp;gt;&#039;;&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=30</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=30"/>
		<updated>2026-08-21T19:20:14Z</updated>

		<summary type="html">&lt;p&gt;Brett: Style video frame&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ===== Fullmer Wiki: match brettfullmer.com brand ===== */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Alfa Slab One&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/AlfaSlabOne-Regular.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 400;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Oswald&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/Oswald.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 200 700;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
    --bf-paper: #f2e8d2;&lt;br /&gt;
    --bf-paper-2: #eaddbd;&lt;br /&gt;
    --bf-card: #f8f0dc;&lt;br /&gt;
    --bf-ink: #191410;&lt;br /&gt;
    --bf-ink-soft: #4a3f33;&lt;br /&gt;
    --bf-muted: #7a6b58;&lt;br /&gt;
    --bf-red: #c9342a;&lt;br /&gt;
    --bf-mustard: #e0a92e;&lt;br /&gt;
    --bf-teal: #2f7f74;&lt;br /&gt;
    --bf-slab: &amp;quot;Alfa Slab One&amp;quot;, &amp;quot;Rockwell&amp;quot;, serif;&lt;br /&gt;
    --bf-cond: &amp;quot;Oswald&amp;quot;, &amp;quot;Arial Narrow&amp;quot;, sans-serif;&lt;br /&gt;
    --bf-serif: Georgia, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Custom masthead (injected by Common.js) ---------- */&lt;br /&gt;
#bf-masthead {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
    background: var(--bf-paper);&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
    box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-wrap {&lt;br /&gt;
    max-width: 1100px;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    padding: 0 24px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    height: 66px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name {&lt;br /&gt;
    font-family: var(--bf-slab);&lt;br /&gt;
    font-size: 19px;&lt;br /&gt;
    color: var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name:hover { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name img {&lt;br /&gt;
    width: 24px !important;&lt;br /&gt;
    height: 24px !important;&lt;br /&gt;
    max-width: 24px !important;&lt;br /&gt;
    max-height: 24px !important;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
    object-fit: contain;&lt;br /&gt;
    margin-right: 9px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    gap: 24px;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a {&lt;br /&gt;
    color: var(--bf-ink-soft);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a:hover,&lt;br /&gt;
#bf-masthead .bf-links a.bf-current { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta {&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    background: var(--bf-red);&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink);&lt;br /&gt;
    padding: 8px 18px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    box-shadow: 3px 3px 0 var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: transform 0.15s, box-shadow 0.15s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--bf-ink); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-mobile-actions { display: none; align-items: center; gap: 12px; }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle {&lt;br /&gt;
    display: none;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    width: 32px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background: none;&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle span {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 3px;&lt;br /&gt;
    background: var(--bf-ink);&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
    transition: transform 0.2s ease, opacity 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(1) { transform: translateY(8px) rotate(45deg); }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(2) { opacity: 0; }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 680px) {&lt;br /&gt;
    #bf-masthead .bf-mobile-actions { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-toggle { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-links .bf-cta-desktop { display: none; }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links {&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 66px;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        right: 0;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        align-items: stretch;&lt;br /&gt;
        gap: 0;&lt;br /&gt;
        background: var(--bf-paper);&lt;br /&gt;
        border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
        box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
        max-height: 0;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        opacity: 0;&lt;br /&gt;
        pointer-events: none;&lt;br /&gt;
        transition: max-height 0.25s ease, opacity 0.2s ease;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links.open {&lt;br /&gt;
        max-height: 500px;&lt;br /&gt;
        opacity: 1;&lt;br /&gt;
        pointer-events: auto;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links a {&lt;br /&gt;
        padding: 16px 24px;&lt;br /&gt;
        border-bottom: 1px solid rgba(25, 20, 16, 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Recolor the wiki body itself ---------- */&lt;br /&gt;
body {&lt;br /&gt;
    background-color: var(--bf-paper) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-page-container, .mw-body, #content {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 10px !important;&lt;br /&gt;
    box-shadow: 6px 6px 0 var(--bf-ink) !important;&lt;br /&gt;
    padding: 30px 34px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body h1, .mw-body h2, .mw-body h3 {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    border-bottom-color: rgba(25, 20, 16, 0.2) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body a, .vector-menu-content a { color: var(--bf-red) !important; }&lt;br /&gt;
.mw-body a.new { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-header, .vector-menu-heading, #p-navigation h3, #p-tb h3 {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pre, .mw-highlight, code {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Deep Vector restyle: kill the white, match the retro palette ===== */&lt;br /&gt;
&lt;br /&gt;
html { background: var(--bf-paper) !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
.skin-vector-2022 {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Vector&#039;s own top bar (logo/search/login) ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
header.vector-header,&lt;br /&gt;
.vector-pinnable-header-toolbar {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-header-container .mw-logo-wordmark,&lt;br /&gt;
.vector-header-container .mw-logo-container {&lt;br /&gt;
    filter: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Search box ---------- */&lt;br /&gt;
.cdx-search-input__input-wrapper .cdx-text-input__input,&lt;br /&gt;
.cdx-text-input__input,&lt;br /&gt;
#searchInput {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-text-input__input:focus {&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
    box-shadow: 0 0 0 1px var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-search-input__end-button,&lt;br /&gt;
.cdx-button {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Primary buttons (Search button, Save changes, etc.) */&lt;br /&gt;
.cdx-button--action-progressive,&lt;br /&gt;
.cdx-button--weight-primary.cdx-button--action-progressive,&lt;br /&gt;
#p-search .cdx-button,&lt;br /&gt;
.mw-ui-button.mw-ui-progressive {&lt;br /&gt;
    background: var(--bf-red) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    box-shadow: 2px 2px 0 var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 6px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Left sidebar (navigation, tools) ---------- */&lt;br /&gt;
#mw-panel,&lt;br /&gt;
.vector-main-menu-container,&lt;br /&gt;
.mw-portlet {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-heading,&lt;br /&gt;
.mw-portlet-label {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    text-transform: none !important;&lt;br /&gt;
    letter-spacing: normal !important;&lt;br /&gt;
    border-bottom: 1px solid rgba(25, 20, 16, 0.15) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a,&lt;br /&gt;
.mw-portlet a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a:hover,&lt;br /&gt;
.mw-portlet a:hover {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Page tabs (Read / Edit / View history / Tools) ---------- */&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-associated-pages a,&lt;br /&gt;
.vector-tab-noicon a,&lt;br /&gt;
#p-namespaces a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 0.5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views .selected a,&lt;br /&gt;
#p-namespaces .selected a {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    border-bottom: 2px solid var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
#left-navigation,&lt;br /&gt;
#right-navigation {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Table of contents / Appearance panel ---------- */&lt;br /&gt;
#toc, .toc,&lt;br /&gt;
.vector-toc,&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a,&lt;br /&gt;
.sidebar-toc a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a:hover { color: var(--bf-red) !important; }&lt;br /&gt;
&lt;br /&gt;
/* Codex radio buttons (Appearance: text size / width) */&lt;br /&gt;
.cdx-radio__icon {&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__input:checked + .cdx-radio__icon {&lt;br /&gt;
    background-color: var(--bf-red) !important;&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__label {&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Footer ---------- */&lt;br /&gt;
#footer, .mw-footer, footer.mw-footer-container {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-top: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer a, .mw-footer a { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Misc form elements everywhere (edit forms, etc.) ---------- */&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;], input[type=&amp;quot;search&amp;quot;], textarea, select {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Fix: hide Vector&#039;s own placeholder logo (we have our own masthead), kill overflow, kill remaining white ===== */&lt;br /&gt;
&lt;br /&gt;
.mw-logo, .mw-logo-container, .mw-logo-icon, .mw-logo-wordmark {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
* { box-sizing: border-box !important; }&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    overflow-x: hidden !important;&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
.vector-body {&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    margin-left: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 719px) {&lt;br /&gt;
    .mw-body {&lt;br /&gt;
        padding: 20px 18px !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* leftover white containers */&lt;br /&gt;
.vector-page-toolbar-container,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-sticky-pinned-container,&lt;br /&gt;
.vector-pinnable-header {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill the remaining white behind pinned/dropdown wrapper containers */&lt;br /&gt;
.vector-pinned-container,&lt;br /&gt;
.vector-unpinned-container,&lt;br /&gt;
.vector-dropdown-content,&lt;br /&gt;
.vector-menu-content-list {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill white behind thumbnail images, give them the retro frame treatment */&lt;br /&gt;
figure.mw-halign-right,&lt;br /&gt;
figure.mw-halign-left,&lt;br /&gt;
figure.mw-halign-center,&lt;br /&gt;
figure.mw-default-size,&lt;br /&gt;
.mw-file-description,&lt;br /&gt;
.mw-file-element,&lt;br /&gt;
.thumb, .thumbinner {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-file-element {&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
    box-shadow: 5px 5px 0 var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
figcaption, .thumbcaption {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-size: 0.85em !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill the white sticky header that slides in on scroll */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
#vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-bottom: 2px solid var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-sticky-header .cdx-text-input__input,&lt;br /&gt;
.vector-sticky-header input {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-sticky-header-context-bar,&lt;br /&gt;
.vector-sticky-header-icon-end {&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
/* Broad safety net: nothing in the sidebar columns should ever be plain white */&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-start *,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.vector-column-end * {&lt;br /&gt;
    background-color: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background-color: var(--bf-card) !important;&lt;br /&gt;
}&lt;br /&gt;
/* Video frame to match the retro card treatment */&lt;br /&gt;
.wiki-video-frame {&lt;br /&gt;
    margin: 20px 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.wiki-video-frame video {&lt;br /&gt;
    border: 4px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 12px !important;&lt;br /&gt;
    box-shadow: 7px 7px 0 var(--bf-ink) !important;&lt;br /&gt;
    display: block;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.js&amp;diff=29</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.js&amp;diff=29"/>
		<updated>2026-08-21T19:19:39Z</updated>

		<summary type="html">&lt;p&gt;Brett: Inject build-flow video via JS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Inject a masthead matching brettfullmer.com&#039;s header, with a working hamburger menu. */&lt;br /&gt;
( function () {&lt;br /&gt;
	var header = document.createElement( &#039;header&#039; );&lt;br /&gt;
	header.id = &#039;bf-masthead&#039;;&lt;br /&gt;
	header.innerHTML =&lt;br /&gt;
		&#039;&amp;lt;div class=&amp;quot;bf-wrap&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;a class=&amp;quot;bf-name&amp;quot; href=&amp;quot;https://brettfullmer.com/&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;https://brettfullmer.com/favicon.svg&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;&amp;gt;Brett Fullmer&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;div class=&amp;quot;bf-mobile-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a class=&amp;quot;bf-cta&amp;quot; href=&amp;quot;https://linkedin.com/in/brettfullmer&amp;quot;&amp;gt;LinkedIn&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;button class=&amp;quot;bf-toggle&amp;quot; aria-label=&amp;quot;Toggle menu&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
					&#039;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;nav class=&amp;quot;bf-links&amp;quot; id=&amp;quot;bf-nav-links&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#about&amp;quot;&amp;gt;What I Do&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#experience&amp;quot;&amp;gt;Experience&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#sabbatical&amp;quot;&amp;gt;AI Lab&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/blog/&amp;quot;&amp;gt;Blog&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;/wiki/Main_Page&amp;quot; class=&amp;quot;bf-current&amp;quot;&amp;gt;Wiki&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a class=&amp;quot;bf-cta bf-cta-desktop&amp;quot; href=&amp;quot;https://linkedin.com/in/brettfullmer&amp;quot;&amp;gt;LinkedIn&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;/nav&amp;gt;&#039; +&lt;br /&gt;
		&#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
	document.body.insertBefore( header, document.body.firstChild );&lt;br /&gt;
&lt;br /&gt;
	var toggle = header.querySelector( &#039;.bf-toggle&#039; );&lt;br /&gt;
	var links = header.querySelector( &#039;.bf-links&#039; );&lt;br /&gt;
	toggle.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
		var isOpen = links.classList.toggle( &#039;open&#039; );&lt;br /&gt;
		toggle.classList.toggle( &#039;open&#039;, isOpen );&lt;br /&gt;
		toggle.setAttribute( &#039;aria-expanded&#039;, isOpen ? &#039;true&#039; : &#039;false&#039; );&lt;br /&gt;
	} );&lt;br /&gt;
	links.querySelectorAll( &#039;a&#039; ).forEach( function ( a ) {&lt;br /&gt;
		a.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
			links.classList.remove( &#039;open&#039; );&lt;br /&gt;
			toggle.classList.remove( &#039;open&#039; );&lt;br /&gt;
			toggle.setAttribute( &#039;aria-expanded&#039;, &#039;false&#039; );&lt;br /&gt;
		} );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;br /&gt;
/* Inject the build-flow video into its placeholder (raw &amp;lt;video&amp;gt; tags get sanitized by MediaWiki) */&lt;br /&gt;
( function () {&lt;br /&gt;
	var placeholder = document.getElementById( &#039;wiki-video-spacelift-build&#039; );&lt;br /&gt;
	if ( !placeholder ) return;&lt;br /&gt;
	placeholder.innerHTML =&lt;br /&gt;
		&#039;&amp;lt;video controls preload=&amp;quot;metadata&amp;quot; poster=&amp;quot;/wiki/media/spacelift-diagram-poster.jpg&amp;quot; style=&amp;quot;max-width:728px;width:100%;height:auto;&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;source src=&amp;quot;/wiki/media/spacelift-diagram-video.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
			&#039;Your browser does not support embedded video. &amp;lt;a href=&amp;quot;/wiki/media/spacelift-diagram-video.mp4&amp;quot;&amp;gt;Download the video&amp;lt;/a&amp;gt; instead.&#039; +&lt;br /&gt;
		&#039;&amp;lt;/video&amp;gt;&#039;;&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Spacelift&amp;diff=28</id>
		<title>Spacelift</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Spacelift&amp;diff=28"/>
		<updated>2026-08-21T19:18:11Z</updated>

		<summary type="html">&lt;p&gt;Brett: Use JS-injected video placeholder (raw video tag gets sanitized)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents how the [[Main Page|AWS/IaC practice lab]] actually got built — two working environments, run through Spacelift, with real gotchas along the way. See also: [[How to Use Spacelift]] for the step-by-step version, and [[MAC]], the agent that did most of the hands-on work.&lt;br /&gt;
&lt;br /&gt;
== Watch it happen ==&lt;br /&gt;
&lt;br /&gt;
Brett sketches the architecture, MAC turns it into OpenTofu config, Spacelift plans it and waits for a human to confirm before anything touches AWS. That&#039;s the whole loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;wiki-video-frame&amp;quot; id=&amp;quot;wiki-video-spacelift-build&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Why it exists ==&lt;br /&gt;
&lt;br /&gt;
Practice, ahead of an interview with Spacelift itself. The goal wasn&#039;t a tutorial-grade demo — it was a real AWS account, real infrastructure, real failure modes, so the mistakes happened here instead of live.&lt;br /&gt;
&lt;br /&gt;
== The two labs ==&lt;br /&gt;
&lt;br /&gt;
=== Orbit Labs (two-stack) ===&lt;br /&gt;
&lt;br /&gt;
Two independent Spacelift stacks, one Git repo each, linked by a Spacelift-level stack dependency rather than a Terraform data source:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Networking stack&#039;&#039;&#039; — VPC (&amp;lt;code&amp;gt;10.0.0.0/16&amp;lt;/code&amp;gt;), one public subnet, an internet gateway, and a public route table. Outputs &amp;lt;code&amp;gt;subnet_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;App stack&#039;&#039;&#039; — consumes &amp;lt;code&amp;gt;subnet_id&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;var.subnet_id&amp;lt;/code&amp;gt;. Builds a key pair, two security groups (web: 80/443/22 from an admin-only CIDR; db: 3306 from the web SG only), a pinned-AMI web fleet across prod/dev/test environments, and one dedicated database instance.&lt;br /&gt;
&lt;br /&gt;
The app stack cannot plan until the networking stack has applied and produced that output — enforced on Spacelift&#039;s Dependencies tab, not just documented convention.&lt;br /&gt;
&lt;br /&gt;
=== Pulsar (single-instance) ===&lt;br /&gt;
&lt;br /&gt;
A simpler, single self-contained stack built later specifically to avoid the stack-dependency wiring above for quick experiments: one VPC, one t3.micro/t3.small instance, no cross-stack linkage. 443 open to the world by design (for testing real internet-facing TLS); 22 restricted to an admin IP. An Elastic IP keeps the address stable across stop/start and resize cycles.&lt;br /&gt;
&lt;br /&gt;
== Build order ==&lt;br /&gt;
&lt;br /&gt;
# Push the networking/base stack first; wait for &amp;lt;code&amp;gt;FINISHED&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Push the app stack; it fails outright with a missing-variable error if pushed before the dependency exists.&lt;br /&gt;
# Poll with &amp;lt;code&amp;gt;spacectl&amp;lt;/code&amp;gt;, not the browser — the web UI lags behind real state.&lt;br /&gt;
# Pull outputs (&amp;lt;code&amp;gt;spacectl stack outputs --id &amp;amp;lt;stack-id&amp;amp;gt;&amp;lt;/code&amp;gt;) for live IPs once finished.&lt;br /&gt;
&lt;br /&gt;
== What actually broke ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AMI drift wiped a fleet.&#039;&#039;&#039; A &amp;lt;code&amp;gt;data &amp;quot;aws_ami&amp;quot; { most_recent = true }&amp;lt;/code&amp;gt; lookup meant a routine, unrelated push replaced the entire web fleet the moment AWS published a new image — new IPs, and any state that only lived on local disk was gone. Fix: pin the AMI as a fixed-default variable, bump it deliberately.&lt;br /&gt;
* &#039;&#039;&#039;The AWS console reads a literal &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; tag.&#039;&#039;&#039; Resources tagged with lowercase &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; are valid but invisible in the console&#039;s Name column. Every resource needs &amp;lt;code&amp;gt;Name = &amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;, capital N.&lt;br /&gt;
* &#039;&#039;&#039;Deleting a stack doesn&#039;t clean up its dependency link.&#039;&#039;&#039; Emptying the networking stack&#039;s config to tear it down left the app stack&#039;s dependency reference dangling — the next run on either stack failed with a vague missing-input error until the link was removed and, later, explicitly re-added before rebuilding.&lt;br /&gt;
* &#039;&#039;&#039;Free-tier restrictions fail mid-operation.&#039;&#039;&#039; Requesting a &amp;lt;code&amp;gt;t3.medium&amp;lt;/code&amp;gt; resize got rejected by a &amp;lt;code&amp;gt;FreeTierRestrictionError&amp;lt;/code&amp;gt; — but only after AWS had already stopped the instance to attempt the resize, leaving it stopped (and, without an Elastic IP already attached, on a fresh IP).&lt;br /&gt;
* &#039;&#039;&#039;Uploaded-file PHP execution was silently broken.&#039;&#039;&#039; Because the vhost proxies every &amp;lt;code&amp;gt;*.php&amp;lt;/code&amp;gt; request straight to PHP-FPM at the server-config level, MediaWiki&#039;s and WordPress&#039;s default &amp;quot;disable script execution in the uploads directory&amp;quot; &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; protection didn&#039;t actually apply — confirmed by dropping a harmless &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt; test file in &amp;lt;code&amp;gt;wp-content/uploads/&amp;lt;/code&amp;gt; and watching it execute. Fixed with an explicit &amp;lt;code&amp;gt;SetHandler none&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;Require all denied&amp;lt;/code&amp;gt; override in both upload directories.&lt;br /&gt;
&lt;br /&gt;
== The pattern that&#039;s worth keeping ==&lt;br /&gt;
&lt;br /&gt;
Instance power state as a declarative resource, not a manual CLI step:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
resource &amp;quot;aws_ec2_instance_state&amp;quot; &amp;quot;web&amp;quot; {&lt;br /&gt;
  instance_id = aws_instance.web.id&lt;br /&gt;
  state       = &amp;quot;stopped&amp;quot;  # flip to &amp;quot;running&amp;quot;, push, confirm&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flip the string, push, Spacelift applies it. No compute billing while stopped; the Elastic IP means the address survives the whole cycle.&lt;br /&gt;
&lt;br /&gt;
== Why Spacelift specifically ==&lt;br /&gt;
&lt;br /&gt;
* Plan and apply are structurally separate, with a mandatory human confirm gate before anything touches AWS.&lt;br /&gt;
* Stack dependencies are a first-class, enforced object — not a README instruction to run things in order.&lt;br /&gt;
* Full run history via &amp;lt;code&amp;gt;spacectl stack run list&amp;lt;/code&amp;gt; — every change, when, and why, queryable later.&lt;br /&gt;
* The automation API key is scoped read-only by design; it hard-fails on anything that tries to trigger a deploy. Read access for tooling and write access for a human are two separate credentials.&lt;br /&gt;
&lt;br /&gt;
That last point is the one that actually matters most: it&#039;s the reason handing real, live infrastructure work to [[MAC]] was something to trust rather than something to worry about.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure as Code]]&lt;br /&gt;
[[Category:AWS]]&lt;br /&gt;
[[Category:AI Agents]]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Spacelift&amp;diff=27</id>
		<title>Spacelift</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Spacelift&amp;diff=27"/>
		<updated>2026-08-21T19:16:24Z</updated>

		<summary type="html">&lt;p&gt;Brett: Add build-flow video&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents how the [[Main Page|AWS/IaC practice lab]] actually got built — two working environments, run through Spacelift, with real gotchas along the way. See also: [[How to Use Spacelift]] for the step-by-step version, and [[MAC]], the agent that did most of the hands-on work.&lt;br /&gt;
&lt;br /&gt;
== Watch it happen ==&lt;br /&gt;
&lt;br /&gt;
Brett sketches the architecture, MAC turns it into OpenTofu config, Spacelift plans it and waits for a human to confirm before anything touches AWS. That&#039;s the whole loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;wiki-video-frame&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;video controls preload=&amp;quot;metadata&amp;quot; poster=&amp;quot;/wiki/media/spacelift-diagram-poster.jpg&amp;quot; width=&amp;quot;728&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source src=&amp;quot;/wiki/media/spacelift-diagram-video.mp4&amp;quot; type=&amp;quot;video/mp4&amp;quot;&amp;gt;&lt;br /&gt;
Your browser doesn&#039;t support embedded video. &amp;lt;a href=&amp;quot;/wiki/media/spacelift-diagram-video.mp4&amp;quot;&amp;gt;Download the video&amp;lt;/a&amp;gt; instead.&lt;br /&gt;
&amp;lt;/video&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Why it exists ==&lt;br /&gt;
&lt;br /&gt;
Practice, ahead of an interview with Spacelift itself. The goal wasn&#039;t a tutorial-grade demo — it was a real AWS account, real infrastructure, real failure modes, so the mistakes happened here instead of live.&lt;br /&gt;
&lt;br /&gt;
== The two labs ==&lt;br /&gt;
&lt;br /&gt;
=== Orbit Labs (two-stack) ===&lt;br /&gt;
&lt;br /&gt;
Two independent Spacelift stacks, one Git repo each, linked by a Spacelift-level stack dependency rather than a Terraform data source:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Networking stack&#039;&#039;&#039; — VPC (&amp;lt;code&amp;gt;10.0.0.0/16&amp;lt;/code&amp;gt;), one public subnet, an internet gateway, and a public route table. Outputs &amp;lt;code&amp;gt;subnet_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;App stack&#039;&#039;&#039; — consumes &amp;lt;code&amp;gt;subnet_id&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;var.subnet_id&amp;lt;/code&amp;gt;. Builds a key pair, two security groups (web: 80/443/22 from an admin-only CIDR; db: 3306 from the web SG only), a pinned-AMI web fleet across prod/dev/test environments, and one dedicated database instance.&lt;br /&gt;
&lt;br /&gt;
The app stack cannot plan until the networking stack has applied and produced that output — enforced on Spacelift&#039;s Dependencies tab, not just documented convention.&lt;br /&gt;
&lt;br /&gt;
=== Pulsar (single-instance) ===&lt;br /&gt;
&lt;br /&gt;
A simpler, single self-contained stack built later specifically to avoid the stack-dependency wiring above for quick experiments: one VPC, one t3.micro/t3.small instance, no cross-stack linkage. 443 open to the world by design (for testing real internet-facing TLS); 22 restricted to an admin IP. An Elastic IP keeps the address stable across stop/start and resize cycles.&lt;br /&gt;
&lt;br /&gt;
== Build order ==&lt;br /&gt;
&lt;br /&gt;
# Push the networking/base stack first; wait for &amp;lt;code&amp;gt;FINISHED&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Push the app stack; it fails outright with a missing-variable error if pushed before the dependency exists.&lt;br /&gt;
# Poll with &amp;lt;code&amp;gt;spacectl&amp;lt;/code&amp;gt;, not the browser — the web UI lags behind real state.&lt;br /&gt;
# Pull outputs (&amp;lt;code&amp;gt;spacectl stack outputs --id &amp;amp;lt;stack-id&amp;amp;gt;&amp;lt;/code&amp;gt;) for live IPs once finished.&lt;br /&gt;
&lt;br /&gt;
== What actually broke ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AMI drift wiped a fleet.&#039;&#039;&#039; A &amp;lt;code&amp;gt;data &amp;quot;aws_ami&amp;quot; { most_recent = true }&amp;lt;/code&amp;gt; lookup meant a routine, unrelated push replaced the entire web fleet the moment AWS published a new image — new IPs, and any state that only lived on local disk was gone. Fix: pin the AMI as a fixed-default variable, bump it deliberately.&lt;br /&gt;
* &#039;&#039;&#039;The AWS console reads a literal &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; tag.&#039;&#039;&#039; Resources tagged with lowercase &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; are valid but invisible in the console&#039;s Name column. Every resource needs &amp;lt;code&amp;gt;Name = &amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;, capital N.&lt;br /&gt;
* &#039;&#039;&#039;Deleting a stack doesn&#039;t clean up its dependency link.&#039;&#039;&#039; Emptying the networking stack&#039;s config to tear it down left the app stack&#039;s dependency reference dangling — the next run on either stack failed with a vague missing-input error until the link was removed and, later, explicitly re-added before rebuilding.&lt;br /&gt;
* &#039;&#039;&#039;Free-tier restrictions fail mid-operation.&#039;&#039;&#039; Requesting a &amp;lt;code&amp;gt;t3.medium&amp;lt;/code&amp;gt; resize got rejected by a &amp;lt;code&amp;gt;FreeTierRestrictionError&amp;lt;/code&amp;gt; — but only after AWS had already stopped the instance to attempt the resize, leaving it stopped (and, without an Elastic IP already attached, on a fresh IP).&lt;br /&gt;
* &#039;&#039;&#039;Uploaded-file PHP execution was silently broken.&#039;&#039;&#039; Because the vhost proxies every &amp;lt;code&amp;gt;*.php&amp;lt;/code&amp;gt; request straight to PHP-FPM at the server-config level, MediaWiki&#039;s and WordPress&#039;s default &amp;quot;disable script execution in the uploads directory&amp;quot; &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; protection didn&#039;t actually apply — confirmed by dropping a harmless &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt; test file in &amp;lt;code&amp;gt;wp-content/uploads/&amp;lt;/code&amp;gt; and watching it execute. Fixed with an explicit &amp;lt;code&amp;gt;SetHandler none&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;Require all denied&amp;lt;/code&amp;gt; override in both upload directories.&lt;br /&gt;
&lt;br /&gt;
== The pattern that&#039;s worth keeping ==&lt;br /&gt;
&lt;br /&gt;
Instance power state as a declarative resource, not a manual CLI step:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
resource &amp;quot;aws_ec2_instance_state&amp;quot; &amp;quot;web&amp;quot; {&lt;br /&gt;
  instance_id = aws_instance.web.id&lt;br /&gt;
  state       = &amp;quot;stopped&amp;quot;  # flip to &amp;quot;running&amp;quot;, push, confirm&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flip the string, push, Spacelift applies it. No compute billing while stopped; the Elastic IP means the address survives the whole cycle.&lt;br /&gt;
&lt;br /&gt;
== Why Spacelift specifically ==&lt;br /&gt;
&lt;br /&gt;
* Plan and apply are structurally separate, with a mandatory human confirm gate before anything touches AWS.&lt;br /&gt;
* Stack dependencies are a first-class, enforced object — not a README instruction to run things in order.&lt;br /&gt;
* Full run history via &amp;lt;code&amp;gt;spacectl stack run list&amp;lt;/code&amp;gt; — every change, when, and why, queryable later.&lt;br /&gt;
* The automation API key is scoped read-only by design; it hard-fails on anything that tries to trigger a deploy. Read access for tooling and write access for a human are two separate credentials.&lt;br /&gt;
&lt;br /&gt;
That last point is the one that actually matters most: it&#039;s the reason handing real, live infrastructure work to [[MAC]] was something to trust rather than something to worry about.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure as Code]]&lt;br /&gt;
[[Category:AWS]]&lt;br /&gt;
[[Category:AI Agents]]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=26</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=26"/>
		<updated>2026-08-21T18:41:26Z</updated>

		<summary type="html">&lt;p&gt;Brett: Broad safety net: force sidebar columns transparent&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ===== Fullmer Wiki: match brettfullmer.com brand ===== */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Alfa Slab One&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/AlfaSlabOne-Regular.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 400;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Oswald&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/Oswald.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 200 700;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
    --bf-paper: #f2e8d2;&lt;br /&gt;
    --bf-paper-2: #eaddbd;&lt;br /&gt;
    --bf-card: #f8f0dc;&lt;br /&gt;
    --bf-ink: #191410;&lt;br /&gt;
    --bf-ink-soft: #4a3f33;&lt;br /&gt;
    --bf-muted: #7a6b58;&lt;br /&gt;
    --bf-red: #c9342a;&lt;br /&gt;
    --bf-mustard: #e0a92e;&lt;br /&gt;
    --bf-teal: #2f7f74;&lt;br /&gt;
    --bf-slab: &amp;quot;Alfa Slab One&amp;quot;, &amp;quot;Rockwell&amp;quot;, serif;&lt;br /&gt;
    --bf-cond: &amp;quot;Oswald&amp;quot;, &amp;quot;Arial Narrow&amp;quot;, sans-serif;&lt;br /&gt;
    --bf-serif: Georgia, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Custom masthead (injected by Common.js) ---------- */&lt;br /&gt;
#bf-masthead {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
    background: var(--bf-paper);&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
    box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-wrap {&lt;br /&gt;
    max-width: 1100px;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    padding: 0 24px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    height: 66px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name {&lt;br /&gt;
    font-family: var(--bf-slab);&lt;br /&gt;
    font-size: 19px;&lt;br /&gt;
    color: var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name:hover { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name img {&lt;br /&gt;
    width: 24px !important;&lt;br /&gt;
    height: 24px !important;&lt;br /&gt;
    max-width: 24px !important;&lt;br /&gt;
    max-height: 24px !important;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
    object-fit: contain;&lt;br /&gt;
    margin-right: 9px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    gap: 24px;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a {&lt;br /&gt;
    color: var(--bf-ink-soft);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a:hover,&lt;br /&gt;
#bf-masthead .bf-links a.bf-current { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta {&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    background: var(--bf-red);&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink);&lt;br /&gt;
    padding: 8px 18px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    box-shadow: 3px 3px 0 var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: transform 0.15s, box-shadow 0.15s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--bf-ink); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-mobile-actions { display: none; align-items: center; gap: 12px; }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle {&lt;br /&gt;
    display: none;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    width: 32px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background: none;&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle span {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 3px;&lt;br /&gt;
    background: var(--bf-ink);&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
    transition: transform 0.2s ease, opacity 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(1) { transform: translateY(8px) rotate(45deg); }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(2) { opacity: 0; }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 680px) {&lt;br /&gt;
    #bf-masthead .bf-mobile-actions { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-toggle { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-links .bf-cta-desktop { display: none; }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links {&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 66px;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        right: 0;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        align-items: stretch;&lt;br /&gt;
        gap: 0;&lt;br /&gt;
        background: var(--bf-paper);&lt;br /&gt;
        border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
        box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
        max-height: 0;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        opacity: 0;&lt;br /&gt;
        pointer-events: none;&lt;br /&gt;
        transition: max-height 0.25s ease, opacity 0.2s ease;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links.open {&lt;br /&gt;
        max-height: 500px;&lt;br /&gt;
        opacity: 1;&lt;br /&gt;
        pointer-events: auto;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links a {&lt;br /&gt;
        padding: 16px 24px;&lt;br /&gt;
        border-bottom: 1px solid rgba(25, 20, 16, 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Recolor the wiki body itself ---------- */&lt;br /&gt;
body {&lt;br /&gt;
    background-color: var(--bf-paper) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-page-container, .mw-body, #content {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 10px !important;&lt;br /&gt;
    box-shadow: 6px 6px 0 var(--bf-ink) !important;&lt;br /&gt;
    padding: 30px 34px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body h1, .mw-body h2, .mw-body h3 {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    border-bottom-color: rgba(25, 20, 16, 0.2) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body a, .vector-menu-content a { color: var(--bf-red) !important; }&lt;br /&gt;
.mw-body a.new { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-header, .vector-menu-heading, #p-navigation h3, #p-tb h3 {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pre, .mw-highlight, code {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Deep Vector restyle: kill the white, match the retro palette ===== */&lt;br /&gt;
&lt;br /&gt;
html { background: var(--bf-paper) !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
.skin-vector-2022 {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Vector&#039;s own top bar (logo/search/login) ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
header.vector-header,&lt;br /&gt;
.vector-pinnable-header-toolbar {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-header-container .mw-logo-wordmark,&lt;br /&gt;
.vector-header-container .mw-logo-container {&lt;br /&gt;
    filter: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Search box ---------- */&lt;br /&gt;
.cdx-search-input__input-wrapper .cdx-text-input__input,&lt;br /&gt;
.cdx-text-input__input,&lt;br /&gt;
#searchInput {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-text-input__input:focus {&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
    box-shadow: 0 0 0 1px var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-search-input__end-button,&lt;br /&gt;
.cdx-button {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Primary buttons (Search button, Save changes, etc.) */&lt;br /&gt;
.cdx-button--action-progressive,&lt;br /&gt;
.cdx-button--weight-primary.cdx-button--action-progressive,&lt;br /&gt;
#p-search .cdx-button,&lt;br /&gt;
.mw-ui-button.mw-ui-progressive {&lt;br /&gt;
    background: var(--bf-red) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    box-shadow: 2px 2px 0 var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 6px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Left sidebar (navigation, tools) ---------- */&lt;br /&gt;
#mw-panel,&lt;br /&gt;
.vector-main-menu-container,&lt;br /&gt;
.mw-portlet {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-heading,&lt;br /&gt;
.mw-portlet-label {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    text-transform: none !important;&lt;br /&gt;
    letter-spacing: normal !important;&lt;br /&gt;
    border-bottom: 1px solid rgba(25, 20, 16, 0.15) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a,&lt;br /&gt;
.mw-portlet a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a:hover,&lt;br /&gt;
.mw-portlet a:hover {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Page tabs (Read / Edit / View history / Tools) ---------- */&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-associated-pages a,&lt;br /&gt;
.vector-tab-noicon a,&lt;br /&gt;
#p-namespaces a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 0.5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views .selected a,&lt;br /&gt;
#p-namespaces .selected a {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    border-bottom: 2px solid var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
#left-navigation,&lt;br /&gt;
#right-navigation {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Table of contents / Appearance panel ---------- */&lt;br /&gt;
#toc, .toc,&lt;br /&gt;
.vector-toc,&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a,&lt;br /&gt;
.sidebar-toc a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a:hover { color: var(--bf-red) !important; }&lt;br /&gt;
&lt;br /&gt;
/* Codex radio buttons (Appearance: text size / width) */&lt;br /&gt;
.cdx-radio__icon {&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__input:checked + .cdx-radio__icon {&lt;br /&gt;
    background-color: var(--bf-red) !important;&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__label {&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Footer ---------- */&lt;br /&gt;
#footer, .mw-footer, footer.mw-footer-container {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-top: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer a, .mw-footer a { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Misc form elements everywhere (edit forms, etc.) ---------- */&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;], input[type=&amp;quot;search&amp;quot;], textarea, select {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Fix: hide Vector&#039;s own placeholder logo (we have our own masthead), kill overflow, kill remaining white ===== */&lt;br /&gt;
&lt;br /&gt;
.mw-logo, .mw-logo-container, .mw-logo-icon, .mw-logo-wordmark {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
* { box-sizing: border-box !important; }&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    overflow-x: hidden !important;&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
.vector-body {&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    margin-left: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 719px) {&lt;br /&gt;
    .mw-body {&lt;br /&gt;
        padding: 20px 18px !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* leftover white containers */&lt;br /&gt;
.vector-page-toolbar-container,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-sticky-pinned-container,&lt;br /&gt;
.vector-pinnable-header {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill the remaining white behind pinned/dropdown wrapper containers */&lt;br /&gt;
.vector-pinned-container,&lt;br /&gt;
.vector-unpinned-container,&lt;br /&gt;
.vector-dropdown-content,&lt;br /&gt;
.vector-menu-content-list {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill white behind thumbnail images, give them the retro frame treatment */&lt;br /&gt;
figure.mw-halign-right,&lt;br /&gt;
figure.mw-halign-left,&lt;br /&gt;
figure.mw-halign-center,&lt;br /&gt;
figure.mw-default-size,&lt;br /&gt;
.mw-file-description,&lt;br /&gt;
.mw-file-element,&lt;br /&gt;
.thumb, .thumbinner {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-file-element {&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
    box-shadow: 5px 5px 0 var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
figcaption, .thumbcaption {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-size: 0.85em !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill the white sticky header that slides in on scroll */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
#vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-bottom: 2px solid var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-sticky-header .cdx-text-input__input,&lt;br /&gt;
.vector-sticky-header input {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-sticky-header-context-bar,&lt;br /&gt;
.vector-sticky-header-icon-end {&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
/* Broad safety net: nothing in the sidebar columns should ever be plain white */&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-start *,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.vector-column-end * {&lt;br /&gt;
    background-color: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background-color: var(--bf-card) !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=25</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=25"/>
		<updated>2026-08-21T18:39:19Z</updated>

		<summary type="html">&lt;p&gt;Brett: Fix white sticky header on scroll&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ===== Fullmer Wiki: match brettfullmer.com brand ===== */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Alfa Slab One&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/AlfaSlabOne-Regular.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 400;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Oswald&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/Oswald.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 200 700;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
    --bf-paper: #f2e8d2;&lt;br /&gt;
    --bf-paper-2: #eaddbd;&lt;br /&gt;
    --bf-card: #f8f0dc;&lt;br /&gt;
    --bf-ink: #191410;&lt;br /&gt;
    --bf-ink-soft: #4a3f33;&lt;br /&gt;
    --bf-muted: #7a6b58;&lt;br /&gt;
    --bf-red: #c9342a;&lt;br /&gt;
    --bf-mustard: #e0a92e;&lt;br /&gt;
    --bf-teal: #2f7f74;&lt;br /&gt;
    --bf-slab: &amp;quot;Alfa Slab One&amp;quot;, &amp;quot;Rockwell&amp;quot;, serif;&lt;br /&gt;
    --bf-cond: &amp;quot;Oswald&amp;quot;, &amp;quot;Arial Narrow&amp;quot;, sans-serif;&lt;br /&gt;
    --bf-serif: Georgia, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Custom masthead (injected by Common.js) ---------- */&lt;br /&gt;
#bf-masthead {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
    background: var(--bf-paper);&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
    box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-wrap {&lt;br /&gt;
    max-width: 1100px;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    padding: 0 24px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    height: 66px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name {&lt;br /&gt;
    font-family: var(--bf-slab);&lt;br /&gt;
    font-size: 19px;&lt;br /&gt;
    color: var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name:hover { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name img {&lt;br /&gt;
    width: 24px !important;&lt;br /&gt;
    height: 24px !important;&lt;br /&gt;
    max-width: 24px !important;&lt;br /&gt;
    max-height: 24px !important;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
    object-fit: contain;&lt;br /&gt;
    margin-right: 9px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    gap: 24px;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a {&lt;br /&gt;
    color: var(--bf-ink-soft);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a:hover,&lt;br /&gt;
#bf-masthead .bf-links a.bf-current { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta {&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    background: var(--bf-red);&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink);&lt;br /&gt;
    padding: 8px 18px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    box-shadow: 3px 3px 0 var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: transform 0.15s, box-shadow 0.15s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--bf-ink); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-mobile-actions { display: none; align-items: center; gap: 12px; }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle {&lt;br /&gt;
    display: none;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    width: 32px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background: none;&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle span {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 3px;&lt;br /&gt;
    background: var(--bf-ink);&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
    transition: transform 0.2s ease, opacity 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(1) { transform: translateY(8px) rotate(45deg); }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(2) { opacity: 0; }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 680px) {&lt;br /&gt;
    #bf-masthead .bf-mobile-actions { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-toggle { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-links .bf-cta-desktop { display: none; }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links {&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 66px;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        right: 0;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        align-items: stretch;&lt;br /&gt;
        gap: 0;&lt;br /&gt;
        background: var(--bf-paper);&lt;br /&gt;
        border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
        box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
        max-height: 0;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        opacity: 0;&lt;br /&gt;
        pointer-events: none;&lt;br /&gt;
        transition: max-height 0.25s ease, opacity 0.2s ease;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links.open {&lt;br /&gt;
        max-height: 500px;&lt;br /&gt;
        opacity: 1;&lt;br /&gt;
        pointer-events: auto;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links a {&lt;br /&gt;
        padding: 16px 24px;&lt;br /&gt;
        border-bottom: 1px solid rgba(25, 20, 16, 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Recolor the wiki body itself ---------- */&lt;br /&gt;
body {&lt;br /&gt;
    background-color: var(--bf-paper) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-page-container, .mw-body, #content {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 10px !important;&lt;br /&gt;
    box-shadow: 6px 6px 0 var(--bf-ink) !important;&lt;br /&gt;
    padding: 30px 34px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body h1, .mw-body h2, .mw-body h3 {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    border-bottom-color: rgba(25, 20, 16, 0.2) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body a, .vector-menu-content a { color: var(--bf-red) !important; }&lt;br /&gt;
.mw-body a.new { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-header, .vector-menu-heading, #p-navigation h3, #p-tb h3 {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pre, .mw-highlight, code {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Deep Vector restyle: kill the white, match the retro palette ===== */&lt;br /&gt;
&lt;br /&gt;
html { background: var(--bf-paper) !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
.skin-vector-2022 {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Vector&#039;s own top bar (logo/search/login) ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
header.vector-header,&lt;br /&gt;
.vector-pinnable-header-toolbar {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-header-container .mw-logo-wordmark,&lt;br /&gt;
.vector-header-container .mw-logo-container {&lt;br /&gt;
    filter: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Search box ---------- */&lt;br /&gt;
.cdx-search-input__input-wrapper .cdx-text-input__input,&lt;br /&gt;
.cdx-text-input__input,&lt;br /&gt;
#searchInput {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-text-input__input:focus {&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
    box-shadow: 0 0 0 1px var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-search-input__end-button,&lt;br /&gt;
.cdx-button {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Primary buttons (Search button, Save changes, etc.) */&lt;br /&gt;
.cdx-button--action-progressive,&lt;br /&gt;
.cdx-button--weight-primary.cdx-button--action-progressive,&lt;br /&gt;
#p-search .cdx-button,&lt;br /&gt;
.mw-ui-button.mw-ui-progressive {&lt;br /&gt;
    background: var(--bf-red) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    box-shadow: 2px 2px 0 var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 6px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Left sidebar (navigation, tools) ---------- */&lt;br /&gt;
#mw-panel,&lt;br /&gt;
.vector-main-menu-container,&lt;br /&gt;
.mw-portlet {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-heading,&lt;br /&gt;
.mw-portlet-label {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    text-transform: none !important;&lt;br /&gt;
    letter-spacing: normal !important;&lt;br /&gt;
    border-bottom: 1px solid rgba(25, 20, 16, 0.15) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a,&lt;br /&gt;
.mw-portlet a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a:hover,&lt;br /&gt;
.mw-portlet a:hover {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Page tabs (Read / Edit / View history / Tools) ---------- */&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-associated-pages a,&lt;br /&gt;
.vector-tab-noicon a,&lt;br /&gt;
#p-namespaces a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 0.5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views .selected a,&lt;br /&gt;
#p-namespaces .selected a {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    border-bottom: 2px solid var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
#left-navigation,&lt;br /&gt;
#right-navigation {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Table of contents / Appearance panel ---------- */&lt;br /&gt;
#toc, .toc,&lt;br /&gt;
.vector-toc,&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a,&lt;br /&gt;
.sidebar-toc a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a:hover { color: var(--bf-red) !important; }&lt;br /&gt;
&lt;br /&gt;
/* Codex radio buttons (Appearance: text size / width) */&lt;br /&gt;
.cdx-radio__icon {&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__input:checked + .cdx-radio__icon {&lt;br /&gt;
    background-color: var(--bf-red) !important;&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__label {&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Footer ---------- */&lt;br /&gt;
#footer, .mw-footer, footer.mw-footer-container {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-top: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer a, .mw-footer a { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Misc form elements everywhere (edit forms, etc.) ---------- */&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;], input[type=&amp;quot;search&amp;quot;], textarea, select {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Fix: hide Vector&#039;s own placeholder logo (we have our own masthead), kill overflow, kill remaining white ===== */&lt;br /&gt;
&lt;br /&gt;
.mw-logo, .mw-logo-container, .mw-logo-icon, .mw-logo-wordmark {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
* { box-sizing: border-box !important; }&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    overflow-x: hidden !important;&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
.vector-body {&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    margin-left: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 719px) {&lt;br /&gt;
    .mw-body {&lt;br /&gt;
        padding: 20px 18px !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* leftover white containers */&lt;br /&gt;
.vector-page-toolbar-container,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-sticky-pinned-container,&lt;br /&gt;
.vector-pinnable-header {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill the remaining white behind pinned/dropdown wrapper containers */&lt;br /&gt;
.vector-pinned-container,&lt;br /&gt;
.vector-unpinned-container,&lt;br /&gt;
.vector-dropdown-content,&lt;br /&gt;
.vector-menu-content-list {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill white behind thumbnail images, give them the retro frame treatment */&lt;br /&gt;
figure.mw-halign-right,&lt;br /&gt;
figure.mw-halign-left,&lt;br /&gt;
figure.mw-halign-center,&lt;br /&gt;
figure.mw-default-size,&lt;br /&gt;
.mw-file-description,&lt;br /&gt;
.mw-file-element,&lt;br /&gt;
.thumb, .thumbinner {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-file-element {&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
    box-shadow: 5px 5px 0 var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
figcaption, .thumbcaption {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-size: 0.85em !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill the white sticky header that slides in on scroll */&lt;br /&gt;
.vector-sticky-header,&lt;br /&gt;
#vector-sticky-header,&lt;br /&gt;
.vector-sticky-header-container {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-bottom: 2px solid var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-sticky-header .cdx-text-input__input,&lt;br /&gt;
.vector-sticky-header input {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-sticky-header-context-bar,&lt;br /&gt;
.vector-sticky-header-icon-end {&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=24</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=24"/>
		<updated>2026-08-21T18:35:43Z</updated>

		<summary type="html">&lt;p&gt;Brett: Fix white thumbnail image backgrounds, add ink-frame treatment&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ===== Fullmer Wiki: match brettfullmer.com brand ===== */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Alfa Slab One&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/AlfaSlabOne-Regular.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 400;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Oswald&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/Oswald.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 200 700;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
    --bf-paper: #f2e8d2;&lt;br /&gt;
    --bf-paper-2: #eaddbd;&lt;br /&gt;
    --bf-card: #f8f0dc;&lt;br /&gt;
    --bf-ink: #191410;&lt;br /&gt;
    --bf-ink-soft: #4a3f33;&lt;br /&gt;
    --bf-muted: #7a6b58;&lt;br /&gt;
    --bf-red: #c9342a;&lt;br /&gt;
    --bf-mustard: #e0a92e;&lt;br /&gt;
    --bf-teal: #2f7f74;&lt;br /&gt;
    --bf-slab: &amp;quot;Alfa Slab One&amp;quot;, &amp;quot;Rockwell&amp;quot;, serif;&lt;br /&gt;
    --bf-cond: &amp;quot;Oswald&amp;quot;, &amp;quot;Arial Narrow&amp;quot;, sans-serif;&lt;br /&gt;
    --bf-serif: Georgia, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Custom masthead (injected by Common.js) ---------- */&lt;br /&gt;
#bf-masthead {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
    background: var(--bf-paper);&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
    box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-wrap {&lt;br /&gt;
    max-width: 1100px;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    padding: 0 24px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    height: 66px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name {&lt;br /&gt;
    font-family: var(--bf-slab);&lt;br /&gt;
    font-size: 19px;&lt;br /&gt;
    color: var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name:hover { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name img {&lt;br /&gt;
    width: 24px !important;&lt;br /&gt;
    height: 24px !important;&lt;br /&gt;
    max-width: 24px !important;&lt;br /&gt;
    max-height: 24px !important;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
    object-fit: contain;&lt;br /&gt;
    margin-right: 9px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    gap: 24px;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a {&lt;br /&gt;
    color: var(--bf-ink-soft);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a:hover,&lt;br /&gt;
#bf-masthead .bf-links a.bf-current { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta {&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    background: var(--bf-red);&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink);&lt;br /&gt;
    padding: 8px 18px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    box-shadow: 3px 3px 0 var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: transform 0.15s, box-shadow 0.15s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--bf-ink); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-mobile-actions { display: none; align-items: center; gap: 12px; }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle {&lt;br /&gt;
    display: none;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    width: 32px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background: none;&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle span {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 3px;&lt;br /&gt;
    background: var(--bf-ink);&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
    transition: transform 0.2s ease, opacity 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(1) { transform: translateY(8px) rotate(45deg); }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(2) { opacity: 0; }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 680px) {&lt;br /&gt;
    #bf-masthead .bf-mobile-actions { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-toggle { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-links .bf-cta-desktop { display: none; }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links {&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 66px;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        right: 0;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        align-items: stretch;&lt;br /&gt;
        gap: 0;&lt;br /&gt;
        background: var(--bf-paper);&lt;br /&gt;
        border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
        box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
        max-height: 0;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        opacity: 0;&lt;br /&gt;
        pointer-events: none;&lt;br /&gt;
        transition: max-height 0.25s ease, opacity 0.2s ease;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links.open {&lt;br /&gt;
        max-height: 500px;&lt;br /&gt;
        opacity: 1;&lt;br /&gt;
        pointer-events: auto;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links a {&lt;br /&gt;
        padding: 16px 24px;&lt;br /&gt;
        border-bottom: 1px solid rgba(25, 20, 16, 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Recolor the wiki body itself ---------- */&lt;br /&gt;
body {&lt;br /&gt;
    background-color: var(--bf-paper) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-page-container, .mw-body, #content {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 10px !important;&lt;br /&gt;
    box-shadow: 6px 6px 0 var(--bf-ink) !important;&lt;br /&gt;
    padding: 30px 34px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body h1, .mw-body h2, .mw-body h3 {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    border-bottom-color: rgba(25, 20, 16, 0.2) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body a, .vector-menu-content a { color: var(--bf-red) !important; }&lt;br /&gt;
.mw-body a.new { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-header, .vector-menu-heading, #p-navigation h3, #p-tb h3 {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pre, .mw-highlight, code {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Deep Vector restyle: kill the white, match the retro palette ===== */&lt;br /&gt;
&lt;br /&gt;
html { background: var(--bf-paper) !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
.skin-vector-2022 {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Vector&#039;s own top bar (logo/search/login) ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
header.vector-header,&lt;br /&gt;
.vector-pinnable-header-toolbar {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-header-container .mw-logo-wordmark,&lt;br /&gt;
.vector-header-container .mw-logo-container {&lt;br /&gt;
    filter: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Search box ---------- */&lt;br /&gt;
.cdx-search-input__input-wrapper .cdx-text-input__input,&lt;br /&gt;
.cdx-text-input__input,&lt;br /&gt;
#searchInput {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-text-input__input:focus {&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
    box-shadow: 0 0 0 1px var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-search-input__end-button,&lt;br /&gt;
.cdx-button {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Primary buttons (Search button, Save changes, etc.) */&lt;br /&gt;
.cdx-button--action-progressive,&lt;br /&gt;
.cdx-button--weight-primary.cdx-button--action-progressive,&lt;br /&gt;
#p-search .cdx-button,&lt;br /&gt;
.mw-ui-button.mw-ui-progressive {&lt;br /&gt;
    background: var(--bf-red) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    box-shadow: 2px 2px 0 var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 6px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Left sidebar (navigation, tools) ---------- */&lt;br /&gt;
#mw-panel,&lt;br /&gt;
.vector-main-menu-container,&lt;br /&gt;
.mw-portlet {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-heading,&lt;br /&gt;
.mw-portlet-label {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    text-transform: none !important;&lt;br /&gt;
    letter-spacing: normal !important;&lt;br /&gt;
    border-bottom: 1px solid rgba(25, 20, 16, 0.15) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a,&lt;br /&gt;
.mw-portlet a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a:hover,&lt;br /&gt;
.mw-portlet a:hover {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Page tabs (Read / Edit / View history / Tools) ---------- */&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-associated-pages a,&lt;br /&gt;
.vector-tab-noicon a,&lt;br /&gt;
#p-namespaces a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 0.5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views .selected a,&lt;br /&gt;
#p-namespaces .selected a {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    border-bottom: 2px solid var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
#left-navigation,&lt;br /&gt;
#right-navigation {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Table of contents / Appearance panel ---------- */&lt;br /&gt;
#toc, .toc,&lt;br /&gt;
.vector-toc,&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a,&lt;br /&gt;
.sidebar-toc a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a:hover { color: var(--bf-red) !important; }&lt;br /&gt;
&lt;br /&gt;
/* Codex radio buttons (Appearance: text size / width) */&lt;br /&gt;
.cdx-radio__icon {&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__input:checked + .cdx-radio__icon {&lt;br /&gt;
    background-color: var(--bf-red) !important;&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__label {&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Footer ---------- */&lt;br /&gt;
#footer, .mw-footer, footer.mw-footer-container {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-top: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer a, .mw-footer a { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Misc form elements everywhere (edit forms, etc.) ---------- */&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;], input[type=&amp;quot;search&amp;quot;], textarea, select {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Fix: hide Vector&#039;s own placeholder logo (we have our own masthead), kill overflow, kill remaining white ===== */&lt;br /&gt;
&lt;br /&gt;
.mw-logo, .mw-logo-container, .mw-logo-icon, .mw-logo-wordmark {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
* { box-sizing: border-box !important; }&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    overflow-x: hidden !important;&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
.vector-body {&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    margin-left: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 719px) {&lt;br /&gt;
    .mw-body {&lt;br /&gt;
        padding: 20px 18px !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* leftover white containers */&lt;br /&gt;
.vector-page-toolbar-container,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-sticky-pinned-container,&lt;br /&gt;
.vector-pinnable-header {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill the remaining white behind pinned/dropdown wrapper containers */&lt;br /&gt;
.vector-pinned-container,&lt;br /&gt;
.vector-unpinned-container,&lt;br /&gt;
.vector-dropdown-content,&lt;br /&gt;
.vector-menu-content-list {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill white behind thumbnail images, give them the retro frame treatment */&lt;br /&gt;
figure.mw-halign-right,&lt;br /&gt;
figure.mw-halign-left,&lt;br /&gt;
figure.mw-halign-center,&lt;br /&gt;
figure.mw-default-size,&lt;br /&gt;
.mw-file-description,&lt;br /&gt;
.mw-file-element,&lt;br /&gt;
.thumb, .thumbinner {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-file-element {&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
    box-shadow: 5px 5px 0 var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
figcaption, .thumbcaption {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-size: 0.85em !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=23</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=23"/>
		<updated>2026-08-21T17:57:22Z</updated>

		<summary type="html">&lt;p&gt;Brett: Kill remaining white wrapper backgrounds&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ===== Fullmer Wiki: match brettfullmer.com brand ===== */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Alfa Slab One&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/AlfaSlabOne-Regular.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 400;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Oswald&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/Oswald.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 200 700;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
    --bf-paper: #f2e8d2;&lt;br /&gt;
    --bf-paper-2: #eaddbd;&lt;br /&gt;
    --bf-card: #f8f0dc;&lt;br /&gt;
    --bf-ink: #191410;&lt;br /&gt;
    --bf-ink-soft: #4a3f33;&lt;br /&gt;
    --bf-muted: #7a6b58;&lt;br /&gt;
    --bf-red: #c9342a;&lt;br /&gt;
    --bf-mustard: #e0a92e;&lt;br /&gt;
    --bf-teal: #2f7f74;&lt;br /&gt;
    --bf-slab: &amp;quot;Alfa Slab One&amp;quot;, &amp;quot;Rockwell&amp;quot;, serif;&lt;br /&gt;
    --bf-cond: &amp;quot;Oswald&amp;quot;, &amp;quot;Arial Narrow&amp;quot;, sans-serif;&lt;br /&gt;
    --bf-serif: Georgia, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Custom masthead (injected by Common.js) ---------- */&lt;br /&gt;
#bf-masthead {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
    background: var(--bf-paper);&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
    box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-wrap {&lt;br /&gt;
    max-width: 1100px;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    padding: 0 24px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    height: 66px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name {&lt;br /&gt;
    font-family: var(--bf-slab);&lt;br /&gt;
    font-size: 19px;&lt;br /&gt;
    color: var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name:hover { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name img {&lt;br /&gt;
    width: 24px !important;&lt;br /&gt;
    height: 24px !important;&lt;br /&gt;
    max-width: 24px !important;&lt;br /&gt;
    max-height: 24px !important;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
    object-fit: contain;&lt;br /&gt;
    margin-right: 9px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    gap: 24px;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a {&lt;br /&gt;
    color: var(--bf-ink-soft);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a:hover,&lt;br /&gt;
#bf-masthead .bf-links a.bf-current { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta {&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    background: var(--bf-red);&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink);&lt;br /&gt;
    padding: 8px 18px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    box-shadow: 3px 3px 0 var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: transform 0.15s, box-shadow 0.15s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--bf-ink); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-mobile-actions { display: none; align-items: center; gap: 12px; }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle {&lt;br /&gt;
    display: none;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    width: 32px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background: none;&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle span {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 3px;&lt;br /&gt;
    background: var(--bf-ink);&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
    transition: transform 0.2s ease, opacity 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(1) { transform: translateY(8px) rotate(45deg); }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(2) { opacity: 0; }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 680px) {&lt;br /&gt;
    #bf-masthead .bf-mobile-actions { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-toggle { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-links .bf-cta-desktop { display: none; }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links {&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 66px;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        right: 0;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        align-items: stretch;&lt;br /&gt;
        gap: 0;&lt;br /&gt;
        background: var(--bf-paper);&lt;br /&gt;
        border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
        box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
        max-height: 0;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        opacity: 0;&lt;br /&gt;
        pointer-events: none;&lt;br /&gt;
        transition: max-height 0.25s ease, opacity 0.2s ease;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links.open {&lt;br /&gt;
        max-height: 500px;&lt;br /&gt;
        opacity: 1;&lt;br /&gt;
        pointer-events: auto;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links a {&lt;br /&gt;
        padding: 16px 24px;&lt;br /&gt;
        border-bottom: 1px solid rgba(25, 20, 16, 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Recolor the wiki body itself ---------- */&lt;br /&gt;
body {&lt;br /&gt;
    background-color: var(--bf-paper) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-page-container, .mw-body, #content {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 10px !important;&lt;br /&gt;
    box-shadow: 6px 6px 0 var(--bf-ink) !important;&lt;br /&gt;
    padding: 30px 34px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body h1, .mw-body h2, .mw-body h3 {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    border-bottom-color: rgba(25, 20, 16, 0.2) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body a, .vector-menu-content a { color: var(--bf-red) !important; }&lt;br /&gt;
.mw-body a.new { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-header, .vector-menu-heading, #p-navigation h3, #p-tb h3 {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pre, .mw-highlight, code {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Deep Vector restyle: kill the white, match the retro palette ===== */&lt;br /&gt;
&lt;br /&gt;
html { background: var(--bf-paper) !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
.skin-vector-2022 {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Vector&#039;s own top bar (logo/search/login) ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
header.vector-header,&lt;br /&gt;
.vector-pinnable-header-toolbar {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-header-container .mw-logo-wordmark,&lt;br /&gt;
.vector-header-container .mw-logo-container {&lt;br /&gt;
    filter: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Search box ---------- */&lt;br /&gt;
.cdx-search-input__input-wrapper .cdx-text-input__input,&lt;br /&gt;
.cdx-text-input__input,&lt;br /&gt;
#searchInput {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-text-input__input:focus {&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
    box-shadow: 0 0 0 1px var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-search-input__end-button,&lt;br /&gt;
.cdx-button {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Primary buttons (Search button, Save changes, etc.) */&lt;br /&gt;
.cdx-button--action-progressive,&lt;br /&gt;
.cdx-button--weight-primary.cdx-button--action-progressive,&lt;br /&gt;
#p-search .cdx-button,&lt;br /&gt;
.mw-ui-button.mw-ui-progressive {&lt;br /&gt;
    background: var(--bf-red) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    box-shadow: 2px 2px 0 var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 6px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Left sidebar (navigation, tools) ---------- */&lt;br /&gt;
#mw-panel,&lt;br /&gt;
.vector-main-menu-container,&lt;br /&gt;
.mw-portlet {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-heading,&lt;br /&gt;
.mw-portlet-label {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    text-transform: none !important;&lt;br /&gt;
    letter-spacing: normal !important;&lt;br /&gt;
    border-bottom: 1px solid rgba(25, 20, 16, 0.15) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a,&lt;br /&gt;
.mw-portlet a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a:hover,&lt;br /&gt;
.mw-portlet a:hover {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Page tabs (Read / Edit / View history / Tools) ---------- */&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-associated-pages a,&lt;br /&gt;
.vector-tab-noicon a,&lt;br /&gt;
#p-namespaces a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 0.5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views .selected a,&lt;br /&gt;
#p-namespaces .selected a {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    border-bottom: 2px solid var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
#left-navigation,&lt;br /&gt;
#right-navigation {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Table of contents / Appearance panel ---------- */&lt;br /&gt;
#toc, .toc,&lt;br /&gt;
.vector-toc,&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a,&lt;br /&gt;
.sidebar-toc a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a:hover { color: var(--bf-red) !important; }&lt;br /&gt;
&lt;br /&gt;
/* Codex radio buttons (Appearance: text size / width) */&lt;br /&gt;
.cdx-radio__icon {&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__input:checked + .cdx-radio__icon {&lt;br /&gt;
    background-color: var(--bf-red) !important;&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__label {&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Footer ---------- */&lt;br /&gt;
#footer, .mw-footer, footer.mw-footer-container {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-top: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer a, .mw-footer a { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Misc form elements everywhere (edit forms, etc.) ---------- */&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;], input[type=&amp;quot;search&amp;quot;], textarea, select {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Fix: hide Vector&#039;s own placeholder logo (we have our own masthead), kill overflow, kill remaining white ===== */&lt;br /&gt;
&lt;br /&gt;
.mw-logo, .mw-logo-container, .mw-logo-icon, .mw-logo-wordmark {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
* { box-sizing: border-box !important; }&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    overflow-x: hidden !important;&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
.vector-body {&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    margin-left: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 719px) {&lt;br /&gt;
    .mw-body {&lt;br /&gt;
        padding: 20px 18px !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* leftover white containers */&lt;br /&gt;
.vector-page-toolbar-container,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-sticky-pinned-container,&lt;br /&gt;
.vector-pinnable-header {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
}&lt;br /&gt;
/* Kill the remaining white behind pinned/dropdown wrapper containers */&lt;br /&gt;
.vector-pinned-container,&lt;br /&gt;
.vector-unpinned-container,&lt;br /&gt;
.vector-dropdown-content,&lt;br /&gt;
.vector-menu-content-list {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=22</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=22"/>
		<updated>2026-08-21T17:32:08Z</updated>

		<summary type="html">&lt;p&gt;Brett: Fix placeholder logo, overflow, leftover white&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ===== Fullmer Wiki: match brettfullmer.com brand ===== */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Alfa Slab One&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/AlfaSlabOne-Regular.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 400;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Oswald&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/Oswald.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 200 700;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
    --bf-paper: #f2e8d2;&lt;br /&gt;
    --bf-paper-2: #eaddbd;&lt;br /&gt;
    --bf-card: #f8f0dc;&lt;br /&gt;
    --bf-ink: #191410;&lt;br /&gt;
    --bf-ink-soft: #4a3f33;&lt;br /&gt;
    --bf-muted: #7a6b58;&lt;br /&gt;
    --bf-red: #c9342a;&lt;br /&gt;
    --bf-mustard: #e0a92e;&lt;br /&gt;
    --bf-teal: #2f7f74;&lt;br /&gt;
    --bf-slab: &amp;quot;Alfa Slab One&amp;quot;, &amp;quot;Rockwell&amp;quot;, serif;&lt;br /&gt;
    --bf-cond: &amp;quot;Oswald&amp;quot;, &amp;quot;Arial Narrow&amp;quot;, sans-serif;&lt;br /&gt;
    --bf-serif: Georgia, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Custom masthead (injected by Common.js) ---------- */&lt;br /&gt;
#bf-masthead {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
    background: var(--bf-paper);&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
    box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-wrap {&lt;br /&gt;
    max-width: 1100px;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    padding: 0 24px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    height: 66px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name {&lt;br /&gt;
    font-family: var(--bf-slab);&lt;br /&gt;
    font-size: 19px;&lt;br /&gt;
    color: var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name:hover { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name img {&lt;br /&gt;
    width: 24px !important;&lt;br /&gt;
    height: 24px !important;&lt;br /&gt;
    max-width: 24px !important;&lt;br /&gt;
    max-height: 24px !important;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
    object-fit: contain;&lt;br /&gt;
    margin-right: 9px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    gap: 24px;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a {&lt;br /&gt;
    color: var(--bf-ink-soft);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a:hover,&lt;br /&gt;
#bf-masthead .bf-links a.bf-current { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta {&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    background: var(--bf-red);&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink);&lt;br /&gt;
    padding: 8px 18px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    box-shadow: 3px 3px 0 var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: transform 0.15s, box-shadow 0.15s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--bf-ink); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-mobile-actions { display: none; align-items: center; gap: 12px; }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle {&lt;br /&gt;
    display: none;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    width: 32px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background: none;&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle span {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 3px;&lt;br /&gt;
    background: var(--bf-ink);&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
    transition: transform 0.2s ease, opacity 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(1) { transform: translateY(8px) rotate(45deg); }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(2) { opacity: 0; }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 680px) {&lt;br /&gt;
    #bf-masthead .bf-mobile-actions { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-toggle { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-links .bf-cta-desktop { display: none; }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links {&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 66px;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        right: 0;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        align-items: stretch;&lt;br /&gt;
        gap: 0;&lt;br /&gt;
        background: var(--bf-paper);&lt;br /&gt;
        border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
        box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
        max-height: 0;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        opacity: 0;&lt;br /&gt;
        pointer-events: none;&lt;br /&gt;
        transition: max-height 0.25s ease, opacity 0.2s ease;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links.open {&lt;br /&gt;
        max-height: 500px;&lt;br /&gt;
        opacity: 1;&lt;br /&gt;
        pointer-events: auto;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links a {&lt;br /&gt;
        padding: 16px 24px;&lt;br /&gt;
        border-bottom: 1px solid rgba(25, 20, 16, 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Recolor the wiki body itself ---------- */&lt;br /&gt;
body {&lt;br /&gt;
    background-color: var(--bf-paper) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-page-container, .mw-body, #content {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 10px !important;&lt;br /&gt;
    box-shadow: 6px 6px 0 var(--bf-ink) !important;&lt;br /&gt;
    padding: 30px 34px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body h1, .mw-body h2, .mw-body h3 {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    border-bottom-color: rgba(25, 20, 16, 0.2) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body a, .vector-menu-content a { color: var(--bf-red) !important; }&lt;br /&gt;
.mw-body a.new { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-header, .vector-menu-heading, #p-navigation h3, #p-tb h3 {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pre, .mw-highlight, code {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Deep Vector restyle: kill the white, match the retro palette ===== */&lt;br /&gt;
&lt;br /&gt;
html { background: var(--bf-paper) !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
.skin-vector-2022 {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Vector&#039;s own top bar (logo/search/login) ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
header.vector-header,&lt;br /&gt;
.vector-pinnable-header-toolbar {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-header-container .mw-logo-wordmark,&lt;br /&gt;
.vector-header-container .mw-logo-container {&lt;br /&gt;
    filter: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Search box ---------- */&lt;br /&gt;
.cdx-search-input__input-wrapper .cdx-text-input__input,&lt;br /&gt;
.cdx-text-input__input,&lt;br /&gt;
#searchInput {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-text-input__input:focus {&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
    box-shadow: 0 0 0 1px var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-search-input__end-button,&lt;br /&gt;
.cdx-button {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Primary buttons (Search button, Save changes, etc.) */&lt;br /&gt;
.cdx-button--action-progressive,&lt;br /&gt;
.cdx-button--weight-primary.cdx-button--action-progressive,&lt;br /&gt;
#p-search .cdx-button,&lt;br /&gt;
.mw-ui-button.mw-ui-progressive {&lt;br /&gt;
    background: var(--bf-red) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    box-shadow: 2px 2px 0 var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 6px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Left sidebar (navigation, tools) ---------- */&lt;br /&gt;
#mw-panel,&lt;br /&gt;
.vector-main-menu-container,&lt;br /&gt;
.mw-portlet {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-heading,&lt;br /&gt;
.mw-portlet-label {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    text-transform: none !important;&lt;br /&gt;
    letter-spacing: normal !important;&lt;br /&gt;
    border-bottom: 1px solid rgba(25, 20, 16, 0.15) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a,&lt;br /&gt;
.mw-portlet a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a:hover,&lt;br /&gt;
.mw-portlet a:hover {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Page tabs (Read / Edit / View history / Tools) ---------- */&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-associated-pages a,&lt;br /&gt;
.vector-tab-noicon a,&lt;br /&gt;
#p-namespaces a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 0.5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views .selected a,&lt;br /&gt;
#p-namespaces .selected a {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    border-bottom: 2px solid var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
#left-navigation,&lt;br /&gt;
#right-navigation {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Table of contents / Appearance panel ---------- */&lt;br /&gt;
#toc, .toc,&lt;br /&gt;
.vector-toc,&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a,&lt;br /&gt;
.sidebar-toc a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a:hover { color: var(--bf-red) !important; }&lt;br /&gt;
&lt;br /&gt;
/* Codex radio buttons (Appearance: text size / width) */&lt;br /&gt;
.cdx-radio__icon {&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__input:checked + .cdx-radio__icon {&lt;br /&gt;
    background-color: var(--bf-red) !important;&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__label {&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Footer ---------- */&lt;br /&gt;
#footer, .mw-footer, footer.mw-footer-container {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-top: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer a, .mw-footer a { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Misc form elements everywhere (edit forms, etc.) ---------- */&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;], input[type=&amp;quot;search&amp;quot;], textarea, select {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Fix: hide Vector&#039;s own placeholder logo (we have our own masthead), kill overflow, kill remaining white ===== */&lt;br /&gt;
&lt;br /&gt;
.mw-logo, .mw-logo-container, .mw-logo-icon, .mw-logo-wordmark {&lt;br /&gt;
    display: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
* { box-sizing: border-box !important; }&lt;br /&gt;
&lt;br /&gt;
html, body {&lt;br /&gt;
    overflow-x: hidden !important;&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
.vector-body {&lt;br /&gt;
    max-width: 100% !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    margin-left: 0 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 719px) {&lt;br /&gt;
    .mw-body {&lt;br /&gt;
        padding: 20px 18px !important;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* leftover white containers */&lt;br /&gt;
.vector-page-toolbar-container,&lt;br /&gt;
.vector-column-start,&lt;br /&gt;
.vector-column-end,&lt;br /&gt;
.mw-page-container-inner,&lt;br /&gt;
.vector-sticky-pinned-container,&lt;br /&gt;
.vector-pinnable-header {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=21</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=21"/>
		<updated>2026-08-21T17:24:14Z</updated>

		<summary type="html">&lt;p&gt;Brett: Deep restyle: kill Vector white chrome, match site palette&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ===== Fullmer Wiki: match brettfullmer.com brand ===== */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Alfa Slab One&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/AlfaSlabOne-Regular.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 400;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Oswald&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/Oswald.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 200 700;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
    --bf-paper: #f2e8d2;&lt;br /&gt;
    --bf-paper-2: #eaddbd;&lt;br /&gt;
    --bf-card: #f8f0dc;&lt;br /&gt;
    --bf-ink: #191410;&lt;br /&gt;
    --bf-ink-soft: #4a3f33;&lt;br /&gt;
    --bf-muted: #7a6b58;&lt;br /&gt;
    --bf-red: #c9342a;&lt;br /&gt;
    --bf-mustard: #e0a92e;&lt;br /&gt;
    --bf-teal: #2f7f74;&lt;br /&gt;
    --bf-slab: &amp;quot;Alfa Slab One&amp;quot;, &amp;quot;Rockwell&amp;quot;, serif;&lt;br /&gt;
    --bf-cond: &amp;quot;Oswald&amp;quot;, &amp;quot;Arial Narrow&amp;quot;, sans-serif;&lt;br /&gt;
    --bf-serif: Georgia, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Custom masthead (injected by Common.js) ---------- */&lt;br /&gt;
#bf-masthead {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
    background: var(--bf-paper);&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
    box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-wrap {&lt;br /&gt;
    max-width: 1100px;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    padding: 0 24px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    height: 66px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name {&lt;br /&gt;
    font-family: var(--bf-slab);&lt;br /&gt;
    font-size: 19px;&lt;br /&gt;
    color: var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name:hover { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name img {&lt;br /&gt;
    width: 24px !important;&lt;br /&gt;
    height: 24px !important;&lt;br /&gt;
    max-width: 24px !important;&lt;br /&gt;
    max-height: 24px !important;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
    object-fit: contain;&lt;br /&gt;
    margin-right: 9px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    gap: 24px;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a {&lt;br /&gt;
    color: var(--bf-ink-soft);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a:hover,&lt;br /&gt;
#bf-masthead .bf-links a.bf-current { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta {&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    background: var(--bf-red);&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink);&lt;br /&gt;
    padding: 8px 18px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    box-shadow: 3px 3px 0 var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: transform 0.15s, box-shadow 0.15s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--bf-ink); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-mobile-actions { display: none; align-items: center; gap: 12px; }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle {&lt;br /&gt;
    display: none;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    width: 32px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background: none;&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle span {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 3px;&lt;br /&gt;
    background: var(--bf-ink);&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
    transition: transform 0.2s ease, opacity 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(1) { transform: translateY(8px) rotate(45deg); }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(2) { opacity: 0; }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 680px) {&lt;br /&gt;
    #bf-masthead .bf-mobile-actions { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-toggle { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-links .bf-cta-desktop { display: none; }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links {&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 66px;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        right: 0;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        align-items: stretch;&lt;br /&gt;
        gap: 0;&lt;br /&gt;
        background: var(--bf-paper);&lt;br /&gt;
        border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
        box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
        max-height: 0;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        opacity: 0;&lt;br /&gt;
        pointer-events: none;&lt;br /&gt;
        transition: max-height 0.25s ease, opacity 0.2s ease;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links.open {&lt;br /&gt;
        max-height: 500px;&lt;br /&gt;
        opacity: 1;&lt;br /&gt;
        pointer-events: auto;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links a {&lt;br /&gt;
        padding: 16px 24px;&lt;br /&gt;
        border-bottom: 1px solid rgba(25, 20, 16, 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Recolor the wiki body itself ---------- */&lt;br /&gt;
body {&lt;br /&gt;
    background-color: var(--bf-paper) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-page-container, .mw-body, #content {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 10px !important;&lt;br /&gt;
    box-shadow: 6px 6px 0 var(--bf-ink) !important;&lt;br /&gt;
    padding: 30px 34px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body h1, .mw-body h2, .mw-body h3 {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    border-bottom-color: rgba(25, 20, 16, 0.2) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body a, .vector-menu-content a { color: var(--bf-red) !important; }&lt;br /&gt;
.mw-body a.new { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-header, .vector-menu-heading, #p-navigation h3, #p-tb h3 {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pre, .mw-highlight, code {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
/* ===== Deep Vector restyle: kill the white, match the retro palette ===== */&lt;br /&gt;
&lt;br /&gt;
html { background: var(--bf-paper) !important; }&lt;br /&gt;
&lt;br /&gt;
.mw-page-container,&lt;br /&gt;
#mw-content-text,&lt;br /&gt;
.vector-body,&lt;br /&gt;
.mw-body-content,&lt;br /&gt;
.skin-vector-2022 {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Vector&#039;s own top bar (logo/search/login) ---------- */&lt;br /&gt;
.vector-header-container,&lt;br /&gt;
header.vector-header,&lt;br /&gt;
.vector-pinnable-header-toolbar {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-header-container .mw-logo-wordmark,&lt;br /&gt;
.vector-header-container .mw-logo-container {&lt;br /&gt;
    filter: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Search box ---------- */&lt;br /&gt;
.cdx-search-input__input-wrapper .cdx-text-input__input,&lt;br /&gt;
.cdx-text-input__input,&lt;br /&gt;
#searchInput {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    box-shadow: none !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-text-input__input:focus {&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
    box-shadow: 0 0 0 1px var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-search-input__end-button,&lt;br /&gt;
.cdx-button {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Primary buttons (Search button, Save changes, etc.) */&lt;br /&gt;
.cdx-button--action-progressive,&lt;br /&gt;
.cdx-button--weight-primary.cdx-button--action-progressive,&lt;br /&gt;
#p-search .cdx-button,&lt;br /&gt;
.mw-ui-button.mw-ui-progressive {&lt;br /&gt;
    background: var(--bf-red) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    box-shadow: 2px 2px 0 var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 6px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Left sidebar (navigation, tools) ---------- */&lt;br /&gt;
#mw-panel,&lt;br /&gt;
.vector-main-menu-container,&lt;br /&gt;
.mw-portlet {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-heading,&lt;br /&gt;
.mw-portlet-label {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    text-transform: none !important;&lt;br /&gt;
    letter-spacing: normal !important;&lt;br /&gt;
    border-bottom: 1px solid rgba(25, 20, 16, 0.15) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a,&lt;br /&gt;
.mw-portlet a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-menu-content a:hover,&lt;br /&gt;
.mw-portlet a:hover {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    text-decoration: underline;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Page tabs (Read / Edit / View history / Tools) ---------- */&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-associated-pages a,&lt;br /&gt;
.vector-tab-noicon a,&lt;br /&gt;
#p-namespaces a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 0.5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views .selected a,&lt;br /&gt;
#p-namespaces .selected a {&lt;br /&gt;
    color: var(--bf-red) !important;&lt;br /&gt;
    border-bottom: 2px solid var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-page-toolbar,&lt;br /&gt;
#left-navigation,&lt;br /&gt;
#right-navigation {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Table of contents / Appearance panel ---------- */&lt;br /&gt;
#toc, .toc,&lt;br /&gt;
.vector-toc,&lt;br /&gt;
.vector-pinnable-element {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 8px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a,&lt;br /&gt;
.sidebar-toc a {&lt;br /&gt;
    color: var(--bf-ink-soft) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.vector-toc-list a:hover { color: var(--bf-red) !important; }&lt;br /&gt;
&lt;br /&gt;
/* Codex radio buttons (Appearance: text size / width) */&lt;br /&gt;
.cdx-radio__icon {&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__input:checked + .cdx-radio__icon {&lt;br /&gt;
    background-color: var(--bf-red) !important;&lt;br /&gt;
    border-color: var(--bf-red) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.cdx-radio__label {&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Footer ---------- */&lt;br /&gt;
#footer, .mw-footer, footer.mw-footer-container {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-top: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-muted) !important;&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#footer a, .mw-footer a { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
/* ---------- Misc form elements everywhere (edit forms, etc.) ---------- */&lt;br /&gt;
input[type=&amp;quot;text&amp;quot;], input[type=&amp;quot;search&amp;quot;], textarea, select {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=20</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=20"/>
		<updated>2026-08-21T17:10:07Z</updated>

		<summary type="html">&lt;p&gt;Brett: Fix logo image sizing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ===== Fullmer Wiki: match brettfullmer.com brand ===== */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Alfa Slab One&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/AlfaSlabOne-Regular.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 400;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Oswald&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/Oswald.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 200 700;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
    --bf-paper: #f2e8d2;&lt;br /&gt;
    --bf-paper-2: #eaddbd;&lt;br /&gt;
    --bf-card: #f8f0dc;&lt;br /&gt;
    --bf-ink: #191410;&lt;br /&gt;
    --bf-ink-soft: #4a3f33;&lt;br /&gt;
    --bf-muted: #7a6b58;&lt;br /&gt;
    --bf-red: #c9342a;&lt;br /&gt;
    --bf-mustard: #e0a92e;&lt;br /&gt;
    --bf-teal: #2f7f74;&lt;br /&gt;
    --bf-slab: &amp;quot;Alfa Slab One&amp;quot;, &amp;quot;Rockwell&amp;quot;, serif;&lt;br /&gt;
    --bf-cond: &amp;quot;Oswald&amp;quot;, &amp;quot;Arial Narrow&amp;quot;, sans-serif;&lt;br /&gt;
    --bf-serif: Georgia, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Custom masthead (injected by Common.js) ---------- */&lt;br /&gt;
#bf-masthead {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
    background: var(--bf-paper);&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
    box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-wrap {&lt;br /&gt;
    max-width: 1100px;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    padding: 0 24px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    height: 66px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name {&lt;br /&gt;
    font-family: var(--bf-slab);&lt;br /&gt;
    font-size: 19px;&lt;br /&gt;
    color: var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name:hover { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name img {&lt;br /&gt;
    width: 24px !important;&lt;br /&gt;
    height: 24px !important;&lt;br /&gt;
    max-width: 24px !important;&lt;br /&gt;
    max-height: 24px !important;&lt;br /&gt;
    flex-shrink: 0;&lt;br /&gt;
    object-fit: contain;&lt;br /&gt;
    margin-right: 9px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    gap: 24px;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a {&lt;br /&gt;
    color: var(--bf-ink-soft);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a:hover,&lt;br /&gt;
#bf-masthead .bf-links a.bf-current { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta {&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    background: var(--bf-red);&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink);&lt;br /&gt;
    padding: 8px 18px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    box-shadow: 3px 3px 0 var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: transform 0.15s, box-shadow 0.15s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--bf-ink); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-mobile-actions { display: none; align-items: center; gap: 12px; }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle {&lt;br /&gt;
    display: none;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    width: 32px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background: none;&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle span {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 3px;&lt;br /&gt;
    background: var(--bf-ink);&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
    transition: transform 0.2s ease, opacity 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(1) { transform: translateY(8px) rotate(45deg); }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(2) { opacity: 0; }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 680px) {&lt;br /&gt;
    #bf-masthead .bf-mobile-actions { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-toggle { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-links .bf-cta-desktop { display: none; }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links {&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 66px;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        right: 0;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        align-items: stretch;&lt;br /&gt;
        gap: 0;&lt;br /&gt;
        background: var(--bf-paper);&lt;br /&gt;
        border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
        box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
        max-height: 0;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        opacity: 0;&lt;br /&gt;
        pointer-events: none;&lt;br /&gt;
        transition: max-height 0.25s ease, opacity 0.2s ease;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links.open {&lt;br /&gt;
        max-height: 500px;&lt;br /&gt;
        opacity: 1;&lt;br /&gt;
        pointer-events: auto;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links a {&lt;br /&gt;
        padding: 16px 24px;&lt;br /&gt;
        border-bottom: 1px solid rgba(25, 20, 16, 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Recolor the wiki body itself ---------- */&lt;br /&gt;
body {&lt;br /&gt;
    background-color: var(--bf-paper) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-page-container, .mw-body, #content {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 10px !important;&lt;br /&gt;
    box-shadow: 6px 6px 0 var(--bf-ink) !important;&lt;br /&gt;
    padding: 30px 34px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body h1, .mw-body h2, .mw-body h3 {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    border-bottom-color: rgba(25, 20, 16, 0.2) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body a, .vector-menu-content a { color: var(--bf-red) !important; }&lt;br /&gt;
.mw-body a.new { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-header, .vector-menu-heading, #p-navigation h3, #p-tb h3 {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pre, .mw-highlight, code {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.js&amp;diff=19</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.js&amp;diff=19"/>
		<updated>2026-08-21T17:10:06Z</updated>

		<summary type="html">&lt;p&gt;Brett: Fix logo image sizing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Inject a masthead matching brettfullmer.com&#039;s header, with a working hamburger menu. */&lt;br /&gt;
( function () {&lt;br /&gt;
	var header = document.createElement( &#039;header&#039; );&lt;br /&gt;
	header.id = &#039;bf-masthead&#039;;&lt;br /&gt;
	header.innerHTML =&lt;br /&gt;
		&#039;&amp;lt;div class=&amp;quot;bf-wrap&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;a class=&amp;quot;bf-name&amp;quot; href=&amp;quot;https://brettfullmer.com/&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;https://brettfullmer.com/favicon.svg&amp;quot; alt=&amp;quot;&amp;quot; width=&amp;quot;24&amp;quot; height=&amp;quot;24&amp;quot;&amp;gt;Brett Fullmer&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;div class=&amp;quot;bf-mobile-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a class=&amp;quot;bf-cta&amp;quot; href=&amp;quot;https://linkedin.com/in/brettfullmer&amp;quot;&amp;gt;LinkedIn&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;button class=&amp;quot;bf-toggle&amp;quot; aria-label=&amp;quot;Toggle menu&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
					&#039;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;nav class=&amp;quot;bf-links&amp;quot; id=&amp;quot;bf-nav-links&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#about&amp;quot;&amp;gt;What I Do&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#experience&amp;quot;&amp;gt;Experience&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#sabbatical&amp;quot;&amp;gt;AI Lab&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/blog/&amp;quot;&amp;gt;Blog&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;/wiki/Main_Page&amp;quot; class=&amp;quot;bf-current&amp;quot;&amp;gt;Wiki&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a class=&amp;quot;bf-cta bf-cta-desktop&amp;quot; href=&amp;quot;https://linkedin.com/in/brettfullmer&amp;quot;&amp;gt;LinkedIn&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;/nav&amp;gt;&#039; +&lt;br /&gt;
		&#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
	document.body.insertBefore( header, document.body.firstChild );&lt;br /&gt;
&lt;br /&gt;
	var toggle = header.querySelector( &#039;.bf-toggle&#039; );&lt;br /&gt;
	var links = header.querySelector( &#039;.bf-links&#039; );&lt;br /&gt;
	toggle.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
		var isOpen = links.classList.toggle( &#039;open&#039; );&lt;br /&gt;
		toggle.classList.toggle( &#039;open&#039;, isOpen );&lt;br /&gt;
		toggle.setAttribute( &#039;aria-expanded&#039;, isOpen ? &#039;true&#039; : &#039;false&#039; );&lt;br /&gt;
	} );&lt;br /&gt;
	links.querySelectorAll( &#039;a&#039; ).forEach( function ( a ) {&lt;br /&gt;
		a.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
			links.classList.remove( &#039;open&#039; );&lt;br /&gt;
			toggle.classList.remove( &#039;open&#039; );&lt;br /&gt;
			toggle.setAttribute( &#039;aria-expanded&#039;, &#039;false&#039; );&lt;br /&gt;
		} );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.js&amp;diff=18</id>
		<title>MediaWiki:Common.js</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.js&amp;diff=18"/>
		<updated>2026-08-21T17:04:27Z</updated>

		<summary type="html">&lt;p&gt;Brett: Inject matching masthead with hamburger&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Inject a masthead matching brettfullmer.com&#039;s header, with a working hamburger menu. */&lt;br /&gt;
( function () {&lt;br /&gt;
	var header = document.createElement( &#039;header&#039; );&lt;br /&gt;
	header.id = &#039;bf-masthead&#039;;&lt;br /&gt;
	header.innerHTML =&lt;br /&gt;
		&#039;&amp;lt;div class=&amp;quot;bf-wrap&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;a class=&amp;quot;bf-name&amp;quot; href=&amp;quot;https://brettfullmer.com/&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;https://brettfullmer.com/favicon.svg&amp;quot; alt=&amp;quot;&amp;quot;&amp;gt;Brett Fullmer&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;div class=&amp;quot;bf-mobile-actions&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a class=&amp;quot;bf-cta&amp;quot; href=&amp;quot;https://linkedin.com/in/brettfullmer&amp;quot;&amp;gt;LinkedIn&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;button class=&amp;quot;bf-toggle&amp;quot; aria-label=&amp;quot;Toggle menu&amp;quot; aria-expanded=&amp;quot;false&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
					&#039;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;/button&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;/div&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;nav class=&amp;quot;bf-links&amp;quot; id=&amp;quot;bf-nav-links&amp;quot;&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#about&amp;quot;&amp;gt;What I Do&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#experience&amp;quot;&amp;gt;Experience&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/#sabbatical&amp;quot;&amp;gt;AI Lab&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;https://brettfullmer.com/blog/&amp;quot;&amp;gt;Blog&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;/wiki/Main_Page&amp;quot; class=&amp;quot;bf-current&amp;quot;&amp;gt;Wiki&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
				&#039;&amp;lt;a class=&amp;quot;bf-cta bf-cta-desktop&amp;quot; href=&amp;quot;https://linkedin.com/in/brettfullmer&amp;quot;&amp;gt;LinkedIn&amp;lt;/a&amp;gt;&#039; +&lt;br /&gt;
			&#039;&amp;lt;/nav&amp;gt;&#039; +&lt;br /&gt;
		&#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
	document.body.insertBefore( header, document.body.firstChild );&lt;br /&gt;
&lt;br /&gt;
	var toggle = header.querySelector( &#039;.bf-toggle&#039; );&lt;br /&gt;
	var links = header.querySelector( &#039;.bf-links&#039; );&lt;br /&gt;
	toggle.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
		var isOpen = links.classList.toggle( &#039;open&#039; );&lt;br /&gt;
		toggle.classList.toggle( &#039;open&#039;, isOpen );&lt;br /&gt;
		toggle.setAttribute( &#039;aria-expanded&#039;, isOpen ? &#039;true&#039; : &#039;false&#039; );&lt;br /&gt;
	} );&lt;br /&gt;
	links.querySelectorAll( &#039;a&#039; ).forEach( function ( a ) {&lt;br /&gt;
		a.addEventListener( &#039;click&#039;, function () {&lt;br /&gt;
			links.classList.remove( &#039;open&#039; );&lt;br /&gt;
			toggle.classList.remove( &#039;open&#039; );&lt;br /&gt;
			toggle.setAttribute( &#039;aria-expanded&#039;, &#039;false&#039; );&lt;br /&gt;
		} );&lt;br /&gt;
	} );&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=17</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=MediaWiki:Common.css&amp;diff=17"/>
		<updated>2026-08-21T17:04:26Z</updated>

		<summary type="html">&lt;p&gt;Brett: Match site header/branding&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* ===== Fullmer Wiki: match brettfullmer.com brand ===== */&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Alfa Slab One&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/AlfaSlabOne-Regular.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 400;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@font-face {&lt;br /&gt;
    font-family: &amp;quot;Oswald&amp;quot;;&lt;br /&gt;
    src: url(&amp;quot;/fonts/Oswald.ttf&amp;quot;) format(&amp;quot;truetype&amp;quot;);&lt;br /&gt;
    font-weight: 200 700;&lt;br /&gt;
    font-display: swap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
:root {&lt;br /&gt;
    --bf-paper: #f2e8d2;&lt;br /&gt;
    --bf-paper-2: #eaddbd;&lt;br /&gt;
    --bf-card: #f8f0dc;&lt;br /&gt;
    --bf-ink: #191410;&lt;br /&gt;
    --bf-ink-soft: #4a3f33;&lt;br /&gt;
    --bf-muted: #7a6b58;&lt;br /&gt;
    --bf-red: #c9342a;&lt;br /&gt;
    --bf-mustard: #e0a92e;&lt;br /&gt;
    --bf-teal: #2f7f74;&lt;br /&gt;
    --bf-slab: &amp;quot;Alfa Slab One&amp;quot;, &amp;quot;Rockwell&amp;quot;, serif;&lt;br /&gt;
    --bf-cond: &amp;quot;Oswald&amp;quot;, &amp;quot;Arial Narrow&amp;quot;, sans-serif;&lt;br /&gt;
    --bf-serif: Georgia, &amp;quot;Times New Roman&amp;quot;, serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Custom masthead (injected by Common.js) ---------- */&lt;br /&gt;
#bf-masthead {&lt;br /&gt;
    position: sticky;&lt;br /&gt;
    top: 0;&lt;br /&gt;
    z-index: 200;&lt;br /&gt;
    background: var(--bf-paper);&lt;br /&gt;
    border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
    box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-wrap {&lt;br /&gt;
    max-width: 1100px;&lt;br /&gt;
    margin: 0 auto;&lt;br /&gt;
    padding: 0 24px;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    height: 66px;&lt;br /&gt;
    position: relative;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name {&lt;br /&gt;
    font-family: var(--bf-slab);&lt;br /&gt;
    font-size: 19px;&lt;br /&gt;
    color: var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name:hover { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-name img {&lt;br /&gt;
    width: 24px;&lt;br /&gt;
    height: 24px;&lt;br /&gt;
    margin-right: 9px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    gap: 24px;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a {&lt;br /&gt;
    color: var(--bf-ink-soft);&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-links a:hover,&lt;br /&gt;
#bf-masthead .bf-links a.bf-current { color: var(--bf-red); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta {&lt;br /&gt;
    font-family: var(--bf-cond);&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    font-weight: 600;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1.5px;&lt;br /&gt;
    background: var(--bf-red);&lt;br /&gt;
    color: var(--bf-paper) !important;&lt;br /&gt;
    border: 2px solid var(--bf-ink);&lt;br /&gt;
    padding: 8px 18px;&lt;br /&gt;
    border-radius: 6px;&lt;br /&gt;
    box-shadow: 3px 3px 0 var(--bf-ink);&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    transition: transform 0.15s, box-shadow 0.15s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-cta:hover { transform: translate(-1px, -1px); box-shadow: 4px 4px 0 var(--bf-ink); }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-mobile-actions { display: none; align-items: center; gap: 12px; }&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle {&lt;br /&gt;
    display: none;&lt;br /&gt;
    flex-direction: column;&lt;br /&gt;
    justify-content: center;&lt;br /&gt;
    gap: 5px;&lt;br /&gt;
    width: 32px;&lt;br /&gt;
    height: 32px;&lt;br /&gt;
    background: none;&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle span {&lt;br /&gt;
    display: block;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 3px;&lt;br /&gt;
    background: var(--bf-ink);&lt;br /&gt;
    border-radius: 2px;&lt;br /&gt;
    transition: transform 0.2s ease, opacity 0.2s ease;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(1) { transform: translateY(8px) rotate(45deg); }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(2) { opacity: 0; }&lt;br /&gt;
#bf-masthead .bf-toggle.open span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }&lt;br /&gt;
&lt;br /&gt;
@media (max-width: 680px) {&lt;br /&gt;
    #bf-masthead .bf-mobile-actions { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-toggle { display: flex; }&lt;br /&gt;
    #bf-masthead .bf-links .bf-cta-desktop { display: none; }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links {&lt;br /&gt;
        position: absolute;&lt;br /&gt;
        top: 66px;&lt;br /&gt;
        left: 0;&lt;br /&gt;
        right: 0;&lt;br /&gt;
        flex-direction: column;&lt;br /&gt;
        align-items: stretch;&lt;br /&gt;
        gap: 0;&lt;br /&gt;
        background: var(--bf-paper);&lt;br /&gt;
        border-bottom: 3px solid var(--bf-ink);&lt;br /&gt;
        box-shadow: 0 3px 0 rgba(25, 20, 16, 0.12);&lt;br /&gt;
        max-height: 0;&lt;br /&gt;
        overflow: hidden;&lt;br /&gt;
        opacity: 0;&lt;br /&gt;
        pointer-events: none;&lt;br /&gt;
        transition: max-height 0.25s ease, opacity 0.2s ease;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links.open {&lt;br /&gt;
        max-height: 500px;&lt;br /&gt;
        opacity: 1;&lt;br /&gt;
        pointer-events: auto;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    #bf-masthead .bf-links a {&lt;br /&gt;
        padding: 16px 24px;&lt;br /&gt;
        border-bottom: 1px solid rgba(25, 20, 16, 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ---------- Recolor the wiki body itself ---------- */&lt;br /&gt;
body {&lt;br /&gt;
    background-color: var(--bf-paper) !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    font-family: var(--bf-serif) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-page-container, .mw-body, #content {&lt;br /&gt;
    background: transparent !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body {&lt;br /&gt;
    background: var(--bf-card) !important;&lt;br /&gt;
    border: 3px solid var(--bf-ink) !important;&lt;br /&gt;
    border-radius: 10px !important;&lt;br /&gt;
    box-shadow: 6px 6px 0 var(--bf-ink) !important;&lt;br /&gt;
    padding: 30px 34px !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body h1, .mw-body h2, .mw-body h3 {&lt;br /&gt;
    font-family: var(--bf-slab) !important;&lt;br /&gt;
    font-weight: 400 !important;&lt;br /&gt;
    color: var(--bf-ink) !important;&lt;br /&gt;
    border-bottom-color: rgba(25, 20, 16, 0.2) !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body a, .vector-menu-content a { color: var(--bf-red) !important; }&lt;br /&gt;
.mw-body a.new { color: var(--bf-teal) !important; }&lt;br /&gt;
&lt;br /&gt;
.vector-pinnable-header, .vector-menu-heading, #p-navigation h3, #p-tb h3 {&lt;br /&gt;
    font-family: var(--bf-cond) !important;&lt;br /&gt;
    text-transform: uppercase;&lt;br /&gt;
    letter-spacing: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
pre, .mw-highlight, code {&lt;br /&gt;
    background: var(--bf-paper-2) !important;&lt;br /&gt;
    border-color: var(--bf-ink) !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=16</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=16"/>
		<updated>2026-08-21T17:00:42Z</updated>

		<summary type="html">&lt;p&gt;Brett: Add self-maintaining index via DynamicPageList4&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Brett-cover-art.jpeg|thumb|right|220px|Brett Fullmer]]&lt;br /&gt;
Hi, I&#039;m Brett Fullmer — a remote Technical Account Manager / Customer Success Manager with 20+ years in enterprise infrastructure and managed services. Long enough to have been the person a customer calls right after they&#039;ve already tried turning it off and on again, and somehow still liked me afterward.&lt;br /&gt;
&lt;br /&gt;
These days I&#039;m doing something a little different. Since 2024 I&#039;ve been heads-down in an independent AI lab, building LLM-powered automation and AI agent frameworks for technical support and customer engineering — the kind of tooling I wish had existed earlier in my career. I&#039;m not here to tell you AI is going to replace your job. I&#039;m here to tell you it replaced the boring 60% of mine, and I&#039;m still gainfully employable, so everybody can relax.&lt;br /&gt;
&lt;br /&gt;
Two decades of infrastructure experience, a career built on trust, and right now, a lab full of AWS servers I&#039;ve built, broken, and rebuilt on purpose, in public, using Infrastructure as Code — because &amp;quot;trust me, it works&amp;quot; is not a deployment strategy.&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
Two decades in enterprise infrastructure and managed services, the kind of work that means being the person a customer trusts when something real is on the line — not the one reading from a knowledge base article they&#039;ve never actually run themselves.&lt;br /&gt;
&lt;br /&gt;
== Currently ==&lt;br /&gt;
&lt;br /&gt;
Since 2024, heads-down in an independent AI lab: building LLM-powered automation and agent frameworks aimed at technical support and enterprise account management. [[MAC]] is the AI agent that does the actual day-to-day work — infrastructure, research, writing — under real guardrails rather than free rein, which is more than I can say for most Terraform I&#039;ve inherited from other humans. The [[Spacelift]] + OpenTofu practice labs (Orbit Labs, Pulsar) — real AWS Infrastructure as Code, not a sandbox with training wheels — exist to prove that &amp;quot;AI-directed infrastructure&amp;quot; can be a trustworthy way of working, not just a slogan on a pitch deck.&lt;br /&gt;
&lt;br /&gt;
The site&#039;s own tagline puts it plainly: &#039;&#039;&#039;building with AI, unapologetically.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== What I&#039;m looking for ==&lt;br /&gt;
&lt;br /&gt;
Remote Customer Success, Customer Engineering, or Technical Account Manager roles. Not interested in big-tech-branded vendor TAM positions, even through a reseller or partner — I&#039;ve read that particular org chart before.&lt;br /&gt;
&lt;br /&gt;
== Index ==&lt;br /&gt;
&lt;br /&gt;
If [https://brettfullmer.com the site] tells the story and [https://brettfullmer.com/blog the blog] writes it up, this is the reference layer. This section is generated automatically from page categories, so it stays accurate as new pages get added — no stale link list to maintain by hand.&lt;br /&gt;
&lt;br /&gt;
=== Start here ===&lt;br /&gt;
&lt;br /&gt;
* [[Spacelift]] — how the AWS practice labs actually got built, gotchas included&lt;br /&gt;
* [[How to Use Spacelift]] — the simple, step-by-step version&lt;br /&gt;
* [[MAC]] — the AI agent doing the actual day-to-day work here&lt;br /&gt;
&lt;br /&gt;
=== Infrastructure &amp;amp; AI ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;DPL&amp;gt;&lt;br /&gt;
category = Infrastructure as Code&lt;br /&gt;
notpage = Main Page&lt;br /&gt;
ordermethod = title&lt;br /&gt;
mode = unordered&lt;br /&gt;
&amp;lt;/DPL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Everything, alphabetically ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;DPL&amp;gt;&lt;br /&gt;
namespace =&lt;br /&gt;
notpage = Main Page&lt;br /&gt;
notpage = MediaWiki:Sidebar&lt;br /&gt;
ordermethod = title&lt;br /&gt;
mode = unordered&lt;br /&gt;
count = 100&lt;br /&gt;
&amp;lt;/DPL&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
* [https://brettfullmer.com Home]&lt;br /&gt;
* [https://brettfullmer.com/blog The Fullmer Frequency (blog)]&lt;br /&gt;
* [https://linkedin.com/in/brettfullmer LinkedIn]&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical Account Manager]]&lt;br /&gt;
[[Category:Customer Success Manager]]&lt;br /&gt;
[[Category:Customer Engineering]]&lt;br /&gt;
[[Category:Enterprise Infrastructure]]&lt;br /&gt;
[[Category:AI Agents]]&lt;br /&gt;
[[Category:Infrastructure as Code]]&lt;br /&gt;
[[Category:AWS]]&lt;br /&gt;
[[Category:Remote Work]]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Spacelift&amp;diff=15</id>
		<title>Spacelift</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Spacelift&amp;diff=15"/>
		<updated>2026-08-21T16:49:10Z</updated>

		<summary type="html">&lt;p&gt;Brett: Link the how-to guide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents how the [[Main Page|AWS/IaC practice lab]] actually got built — two working environments, run through Spacelift, with real gotchas along the way. See also: [[How to Use Spacelift]] for the step-by-step version, and [[MAC]], the agent that did most of the hands-on work.&lt;br /&gt;
&lt;br /&gt;
== Why it exists ==&lt;br /&gt;
&lt;br /&gt;
Practice, ahead of an interview with Spacelift itself. The goal wasn&#039;t a tutorial-grade demo — it was a real AWS account, real infrastructure, real failure modes, so the mistakes happened here instead of live.&lt;br /&gt;
&lt;br /&gt;
== The two labs ==&lt;br /&gt;
&lt;br /&gt;
=== Orbit Labs (two-stack) ===&lt;br /&gt;
&lt;br /&gt;
Two independent Spacelift stacks, one Git repo each, linked by a Spacelift-level stack dependency rather than a Terraform data source:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Networking stack&#039;&#039;&#039; — VPC (&amp;lt;code&amp;gt;10.0.0.0/16&amp;lt;/code&amp;gt;), one public subnet, an internet gateway, and a public route table. Outputs &amp;lt;code&amp;gt;subnet_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;App stack&#039;&#039;&#039; — consumes &amp;lt;code&amp;gt;subnet_id&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;var.subnet_id&amp;lt;/code&amp;gt;. Builds a key pair, two security groups (web: 80/443/22 from an admin-only CIDR; db: 3306 from the web SG only), a pinned-AMI web fleet across prod/dev/test environments, and one dedicated database instance.&lt;br /&gt;
&lt;br /&gt;
The app stack cannot plan until the networking stack has applied and produced that output — enforced on Spacelift&#039;s Dependencies tab, not just documented convention.&lt;br /&gt;
&lt;br /&gt;
=== Pulsar (single-instance) ===&lt;br /&gt;
&lt;br /&gt;
A simpler, single self-contained stack built later specifically to avoid the stack-dependency wiring above for quick experiments: one VPC, one t3.micro/t3.small instance, no cross-stack linkage. 443 open to the world by design (for testing real internet-facing TLS); 22 restricted to an admin IP. An Elastic IP keeps the address stable across stop/start and resize cycles.&lt;br /&gt;
&lt;br /&gt;
== Build order ==&lt;br /&gt;
&lt;br /&gt;
# Push the networking/base stack first; wait for &amp;lt;code&amp;gt;FINISHED&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Push the app stack; it fails outright with a missing-variable error if pushed before the dependency exists.&lt;br /&gt;
# Poll with &amp;lt;code&amp;gt;spacectl&amp;lt;/code&amp;gt;, not the browser — the web UI lags behind real state.&lt;br /&gt;
# Pull outputs (&amp;lt;code&amp;gt;spacectl stack outputs --id &amp;amp;lt;stack-id&amp;amp;gt;&amp;lt;/code&amp;gt;) for live IPs once finished.&lt;br /&gt;
&lt;br /&gt;
== What actually broke ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AMI drift wiped a fleet.&#039;&#039;&#039; A &amp;lt;code&amp;gt;data &amp;quot;aws_ami&amp;quot; { most_recent = true }&amp;lt;/code&amp;gt; lookup meant a routine, unrelated push replaced the entire web fleet the moment AWS published a new image — new IPs, and any state that only lived on local disk was gone. Fix: pin the AMI as a fixed-default variable, bump it deliberately.&lt;br /&gt;
* &#039;&#039;&#039;The AWS console reads a literal &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; tag.&#039;&#039;&#039; Resources tagged with lowercase &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; are valid but invisible in the console&#039;s Name column. Every resource needs &amp;lt;code&amp;gt;Name = &amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;, capital N.&lt;br /&gt;
* &#039;&#039;&#039;Deleting a stack doesn&#039;t clean up its dependency link.&#039;&#039;&#039; Emptying the networking stack&#039;s config to tear it down left the app stack&#039;s dependency reference dangling — the next run on either stack failed with a vague missing-input error until the link was removed and, later, explicitly re-added before rebuilding.&lt;br /&gt;
* &#039;&#039;&#039;Free-tier restrictions fail mid-operation.&#039;&#039;&#039; Requesting a &amp;lt;code&amp;gt;t3.medium&amp;lt;/code&amp;gt; resize got rejected by a &amp;lt;code&amp;gt;FreeTierRestrictionError&amp;lt;/code&amp;gt; — but only after AWS had already stopped the instance to attempt the resize, leaving it stopped (and, without an Elastic IP already attached, on a fresh IP).&lt;br /&gt;
* &#039;&#039;&#039;Uploaded-file PHP execution was silently broken.&#039;&#039;&#039; Because the vhost proxies every &amp;lt;code&amp;gt;*.php&amp;lt;/code&amp;gt; request straight to PHP-FPM at the server-config level, MediaWiki&#039;s and WordPress&#039;s default &amp;quot;disable script execution in the uploads directory&amp;quot; &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; protection didn&#039;t actually apply — confirmed by dropping a harmless &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt; test file in &amp;lt;code&amp;gt;wp-content/uploads/&amp;lt;/code&amp;gt; and watching it execute. Fixed with an explicit &amp;lt;code&amp;gt;SetHandler none&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;Require all denied&amp;lt;/code&amp;gt; override in both upload directories.&lt;br /&gt;
&lt;br /&gt;
== The pattern that&#039;s worth keeping ==&lt;br /&gt;
&lt;br /&gt;
Instance power state as a declarative resource, not a manual CLI step:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
resource &amp;quot;aws_ec2_instance_state&amp;quot; &amp;quot;web&amp;quot; {&lt;br /&gt;
  instance_id = aws_instance.web.id&lt;br /&gt;
  state       = &amp;quot;stopped&amp;quot;  # flip to &amp;quot;running&amp;quot;, push, confirm&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flip the string, push, Spacelift applies it. No compute billing while stopped; the Elastic IP means the address survives the whole cycle.&lt;br /&gt;
&lt;br /&gt;
== Why Spacelift specifically ==&lt;br /&gt;
&lt;br /&gt;
* Plan and apply are structurally separate, with a mandatory human confirm gate before anything touches AWS.&lt;br /&gt;
* Stack dependencies are a first-class, enforced object — not a README instruction to run things in order.&lt;br /&gt;
* Full run history via &amp;lt;code&amp;gt;spacectl stack run list&amp;lt;/code&amp;gt; — every change, when, and why, queryable later.&lt;br /&gt;
* The automation API key is scoped read-only by design; it hard-fails on anything that tries to trigger a deploy. Read access for tooling and write access for a human are two separate credentials.&lt;br /&gt;
&lt;br /&gt;
That last point is the one that actually matters most: it&#039;s the reason handing real, live infrastructure work to [[MAC]] was something to trust rather than something to worry about.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure as Code]]&lt;br /&gt;
[[Category:AWS]]&lt;br /&gt;
[[Category:AI Agents]]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=How_to_Use_Spacelift&amp;diff=14</id>
		<title>How to Use Spacelift</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=How_to_Use_Spacelift&amp;diff=14"/>
		<updated>2026-08-21T16:48:52Z</updated>

		<summary type="html">&lt;p&gt;Brett: Write how-to guide with illustrations&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Spacelift-howto-hero.jpeg|thumb|center|500px|Config in, plan reviewed, confirmed, applied.]]&lt;br /&gt;
A simple walkthrough of how infrastructure actually gets deployed with Spacelift — the same process used to build the [[Spacelift|labs documented here]]. Written for anyone who already knows what Infrastructure as Code is and wants to see how Spacelift specifically fits into that workflow. Seven steps, no step skipped, nothing applied without a human saying so.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Write your infrastructure as code ==&lt;br /&gt;
&lt;br /&gt;
Describe what you want — a server, a network, a database — as config files (OpenTofu or Terraform) in a Git repository. This is the &amp;quot;shopping list,&amp;quot; not the click-through-a-console approach. It&#039;s also the part that makes every future change reviewable, since it&#039;s just a diff in a file.&lt;br /&gt;
&lt;br /&gt;
== Step 2: Create a Spacelift stack ==&lt;br /&gt;
&lt;br /&gt;
Point Spacelift at that repository and branch. A &amp;quot;stack&amp;quot; is Spacelift&#039;s unit of infrastructure — one stack usually maps to one deployable piece of your system (a network, an app, a database tier).&lt;br /&gt;
&lt;br /&gt;
== Step 3: Attach cloud credentials, scoped on purpose ==&lt;br /&gt;
&lt;br /&gt;
Connect the stack to your cloud account. Worth doing deliberately here: automation/read-only access and actual deploy access don&#039;t have to be the same credential. Keeping them separate means a compromised or overly-curious tool can look, but can&#039;t touch.&lt;br /&gt;
&lt;br /&gt;
== Step 4: Push a change ==&lt;br /&gt;
&lt;br /&gt;
Commit and push. Spacelift picks it up automatically and runs a &#039;&#039;&#039;plan&#039;&#039;&#039; — a full preview of exactly what would change, added, or destroyed. Nothing has touched the real infrastructure yet.&lt;br /&gt;
&lt;br /&gt;
== Step 5: Read the plan like it matters ==&lt;br /&gt;
&lt;br /&gt;
[[File:Spacelift-howto-confirm.jpeg|thumb|right|280px|The gate that keeps a bad plan from ever reaching production.]]&lt;br /&gt;
This is the step people skip when they&#039;re in a hurry, and the step that saves you when you are. The plan shows every resource being created, changed, or destroyed — read it the way you&#039;d read a contract before signing it.&lt;br /&gt;
&lt;br /&gt;
== Step 6: Confirm ==&lt;br /&gt;
&lt;br /&gt;
Only after a human clicks confirm does Spacelift actually apply anything to the real account. This is the whole point: plan and apply are two separate, deliberate actions, not one button that does both. It&#039;s the difference between &amp;quot;this happened&amp;quot; and &amp;quot;I meant for this to happen.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Step 7: Check the run history any time ==&lt;br /&gt;
&lt;br /&gt;
Every run — who triggered it, what changed, whether it was confirmed or rejected — stays in Spacelift&#039;s history. Weeks later, &amp;quot;why did this change&amp;quot; has an actual answer instead of a guess.&lt;br /&gt;
&lt;br /&gt;
== Why it&#039;s worth the extra step ==&lt;br /&gt;
&lt;br /&gt;
None of this is exotic. It&#039;s the boring, unglamorous discipline that turns &amp;quot;I hope this doesn&#039;t break something&amp;quot; into an actual guarantee — whether the thing pushing the change is a person or, as in [[MAC|this case]], an AI agent working with real credentials. The gate is the same either way, and that&#039;s exactly the point.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure as Code]]&lt;br /&gt;
[[Category:AWS]]&lt;br /&gt;
[[Category:Technical Account Manager]]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=File:Spacelift-howto-hero.jpeg&amp;diff=13</id>
		<title>File:Spacelift-howto-hero.jpeg</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=File:Spacelift-howto-hero.jpeg&amp;diff=13"/>
		<updated>2026-08-21T16:48:33Z</updated>

		<summary type="html">&lt;p&gt;Brett: == Summary ==
How-to guide illustrations
&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
How-to guide illustrations&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=File:Spacelift-howto-confirm.jpeg&amp;diff=12</id>
		<title>File:Spacelift-howto-confirm.jpeg</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=File:Spacelift-howto-confirm.jpeg&amp;diff=12"/>
		<updated>2026-08-21T16:48:33Z</updated>

		<summary type="html">&lt;p&gt;Brett: == Summary ==
How-to guide illustrations
&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
How-to guide illustrations&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Spacelift&amp;diff=11</id>
		<title>Spacelift</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Spacelift&amp;diff=11"/>
		<updated>2026-08-21T16:39:16Z</updated>

		<summary type="html">&lt;p&gt;Brett: Add matching categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents how the [[Main Page|AWS/IaC practice lab]] actually got built — two working environments, run through Spacelift, with real gotchas along the way. See also: [[MAC]], the agent that did most of the hands-on work.&lt;br /&gt;
&lt;br /&gt;
== Why it exists ==&lt;br /&gt;
&lt;br /&gt;
Practice, ahead of an interview with Spacelift itself. The goal wasn&#039;t a tutorial-grade demo — it was a real AWS account, real infrastructure, real failure modes, so the mistakes happened here instead of live.&lt;br /&gt;
&lt;br /&gt;
== The two labs ==&lt;br /&gt;
&lt;br /&gt;
=== Orbit Labs (two-stack) ===&lt;br /&gt;
&lt;br /&gt;
Two independent Spacelift stacks, one Git repo each, linked by a Spacelift-level stack dependency rather than a Terraform data source:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Networking stack&#039;&#039;&#039; — VPC (&amp;lt;code&amp;gt;10.0.0.0/16&amp;lt;/code&amp;gt;), one public subnet, an internet gateway, and a public route table. Outputs &amp;lt;code&amp;gt;subnet_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;App stack&#039;&#039;&#039; — consumes &amp;lt;code&amp;gt;subnet_id&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;var.subnet_id&amp;lt;/code&amp;gt;. Builds a key pair, two security groups (web: 80/443/22 from an admin-only CIDR; db: 3306 from the web SG only), a pinned-AMI web fleet across prod/dev/test environments, and one dedicated database instance.&lt;br /&gt;
&lt;br /&gt;
The app stack cannot plan until the networking stack has applied and produced that output — enforced on Spacelift&#039;s Dependencies tab, not just documented convention.&lt;br /&gt;
&lt;br /&gt;
=== Pulsar (single-instance) ===&lt;br /&gt;
&lt;br /&gt;
A simpler, single self-contained stack built later specifically to avoid the stack-dependency wiring above for quick experiments: one VPC, one t3.micro/t3.small instance, no cross-stack linkage. 443 open to the world by design (for testing real internet-facing TLS); 22 restricted to an admin IP. An Elastic IP keeps the address stable across stop/start and resize cycles.&lt;br /&gt;
&lt;br /&gt;
== Build order ==&lt;br /&gt;
&lt;br /&gt;
# Push the networking/base stack first; wait for &amp;lt;code&amp;gt;FINISHED&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Push the app stack; it fails outright with a missing-variable error if pushed before the dependency exists.&lt;br /&gt;
# Poll with &amp;lt;code&amp;gt;spacectl&amp;lt;/code&amp;gt;, not the browser — the web UI lags behind real state.&lt;br /&gt;
# Pull outputs (&amp;lt;code&amp;gt;spacectl stack outputs --id &amp;amp;lt;stack-id&amp;amp;gt;&amp;lt;/code&amp;gt;) for live IPs once finished.&lt;br /&gt;
&lt;br /&gt;
== What actually broke ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AMI drift wiped a fleet.&#039;&#039;&#039; A &amp;lt;code&amp;gt;data &amp;quot;aws_ami&amp;quot; { most_recent = true }&amp;lt;/code&amp;gt; lookup meant a routine, unrelated push replaced the entire web fleet the moment AWS published a new image — new IPs, and any state that only lived on local disk was gone. Fix: pin the AMI as a fixed-default variable, bump it deliberately.&lt;br /&gt;
* &#039;&#039;&#039;The AWS console reads a literal &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; tag.&#039;&#039;&#039; Resources tagged with lowercase &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; are valid but invisible in the console&#039;s Name column. Every resource needs &amp;lt;code&amp;gt;Name = &amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;, capital N.&lt;br /&gt;
* &#039;&#039;&#039;Deleting a stack doesn&#039;t clean up its dependency link.&#039;&#039;&#039; Emptying the networking stack&#039;s config to tear it down left the app stack&#039;s dependency reference dangling — the next run on either stack failed with a vague missing-input error until the link was removed and, later, explicitly re-added before rebuilding.&lt;br /&gt;
* &#039;&#039;&#039;Free-tier restrictions fail mid-operation.&#039;&#039;&#039; Requesting a &amp;lt;code&amp;gt;t3.medium&amp;lt;/code&amp;gt; resize got rejected by a &amp;lt;code&amp;gt;FreeTierRestrictionError&amp;lt;/code&amp;gt; — but only after AWS had already stopped the instance to attempt the resize, leaving it stopped (and, without an Elastic IP already attached, on a fresh IP).&lt;br /&gt;
* &#039;&#039;&#039;Uploaded-file PHP execution was silently broken.&#039;&#039;&#039; Because the vhost proxies every &amp;lt;code&amp;gt;*.php&amp;lt;/code&amp;gt; request straight to PHP-FPM at the server-config level, MediaWiki&#039;s and WordPress&#039;s default &amp;quot;disable script execution in the uploads directory&amp;quot; &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; protection didn&#039;t actually apply — confirmed by dropping a harmless &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt; test file in &amp;lt;code&amp;gt;wp-content/uploads/&amp;lt;/code&amp;gt; and watching it execute. Fixed with an explicit &amp;lt;code&amp;gt;SetHandler none&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;Require all denied&amp;lt;/code&amp;gt; override in both upload directories.&lt;br /&gt;
&lt;br /&gt;
== The pattern that&#039;s worth keeping ==&lt;br /&gt;
&lt;br /&gt;
Instance power state as a declarative resource, not a manual CLI step:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
resource &amp;quot;aws_ec2_instance_state&amp;quot; &amp;quot;web&amp;quot; {&lt;br /&gt;
  instance_id = aws_instance.web.id&lt;br /&gt;
  state       = &amp;quot;stopped&amp;quot;  # flip to &amp;quot;running&amp;quot;, push, confirm&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flip the string, push, Spacelift applies it. No compute billing while stopped; the Elastic IP means the address survives the whole cycle.&lt;br /&gt;
&lt;br /&gt;
== Why Spacelift specifically ==&lt;br /&gt;
&lt;br /&gt;
* Plan and apply are structurally separate, with a mandatory human confirm gate before anything touches AWS.&lt;br /&gt;
* Stack dependencies are a first-class, enforced object — not a README instruction to run things in order.&lt;br /&gt;
* Full run history via &amp;lt;code&amp;gt;spacectl stack run list&amp;lt;/code&amp;gt; — every change, when, and why, queryable later.&lt;br /&gt;
* The automation API key is scoped read-only by design; it hard-fails on anything that tries to trigger a deploy. Read access for tooling and write access for a human are two separate credentials.&lt;br /&gt;
&lt;br /&gt;
That last point is the one that actually matters most: it&#039;s the reason handing real, live infrastructure work to [[MAC]] was something to trust rather than something to worry about.&lt;br /&gt;
&lt;br /&gt;
[[Category:Infrastructure as Code]]&lt;br /&gt;
[[Category:AWS]]&lt;br /&gt;
[[Category:AI Agents]]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=10</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=10"/>
		<updated>2026-08-21T16:38:51Z</updated>

		<summary type="html">&lt;p&gt;Brett: Add humor, target keywords, add categories&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Brett-cover-art.jpeg|thumb|right|220px|Brett Fullmer]]&lt;br /&gt;
Hi, I&#039;m Brett Fullmer — a remote Technical Account Manager / Customer Success Manager with 20+ years in enterprise infrastructure and managed services. Long enough to have been the person a customer calls right after they&#039;ve already tried turning it off and on again, and somehow still liked me afterward.&lt;br /&gt;
&lt;br /&gt;
These days I&#039;m doing something a little different. Since 2024 I&#039;ve been heads-down in an independent AI lab, building LLM-powered automation and AI agent frameworks for technical support and customer engineering — the kind of tooling I wish had existed earlier in my career. I&#039;m not here to tell you AI is going to replace your job. I&#039;m here to tell you it replaced the boring 60% of mine, and I&#039;m still gainfully employable, so everybody can relax.&lt;br /&gt;
&lt;br /&gt;
Two decades of infrastructure experience, a career built on trust, and right now, a lab full of AWS servers I&#039;ve built, broken, and rebuilt on purpose, in public, using Infrastructure as Code — because &amp;quot;trust me, it works&amp;quot; is not a deployment strategy.&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
Two decades in enterprise infrastructure and managed services, the kind of work that means being the person a customer trusts when something real is on the line — not the one reading from a knowledge base article they&#039;ve never actually run themselves.&lt;br /&gt;
&lt;br /&gt;
== Currently ==&lt;br /&gt;
&lt;br /&gt;
Since 2024, heads-down in an independent AI lab: building LLM-powered automation and agent frameworks aimed at technical support and enterprise account management. [[MAC]] is the AI agent that does the actual day-to-day work — infrastructure, research, writing — under real guardrails rather than free rein, which is more than I can say for most Terraform I&#039;ve inherited from other humans. The [[Spacelift]] + OpenTofu practice labs (Orbit Labs, Pulsar) — real AWS Infrastructure as Code, not a sandbox with training wheels — exist to prove that &amp;quot;AI-directed infrastructure&amp;quot; can be a trustworthy way of working, not just a slogan on a pitch deck.&lt;br /&gt;
&lt;br /&gt;
The site&#039;s own tagline puts it plainly: &#039;&#039;&#039;building with AI, unapologetically.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== What I&#039;m looking for ==&lt;br /&gt;
&lt;br /&gt;
Remote Customer Success, Customer Engineering, or Technical Account Manager roles. Not interested in big-tech-branded vendor TAM positions, even through a reseller or partner — I&#039;ve read that particular org chart before.&lt;br /&gt;
&lt;br /&gt;
== This wiki ==&lt;br /&gt;
&lt;br /&gt;
If [https://brettfullmer.com the site] tells the story and [https://brettfullmer.com/blog the blog] writes it up, this is the reference layer — build notes, gotchas, and the detail that&#039;s too dry or too &amp;quot;living document&amp;quot; for a blog post. Think of it as the deleted scenes, minus the awkward director&#039;s commentary.&lt;br /&gt;
&lt;br /&gt;
== Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
* [https://brettfullmer.com Home]&lt;br /&gt;
* [https://brettfullmer.com/blog The Fullmer Frequency (blog)]&lt;br /&gt;
* [https://linkedin.com/in/brettfullmer LinkedIn]&lt;br /&gt;
&lt;br /&gt;
[[Category:Technical Account Manager]]&lt;br /&gt;
[[Category:Customer Success Manager]]&lt;br /&gt;
[[Category:Customer Engineering]]&lt;br /&gt;
[[Category:Enterprise Infrastructure]]&lt;br /&gt;
[[Category:AI Agents]]&lt;br /&gt;
[[Category:Infrastructure as Code]]&lt;br /&gt;
[[Category:AWS]]&lt;br /&gt;
[[Category:Remote Work]]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=9</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=9"/>
		<updated>2026-08-21T16:33:50Z</updated>

		<summary type="html">&lt;p&gt;Brett: Write introduction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Brett-cover-art.jpeg|thumb|right|220px|Brett Fullmer]]&lt;br /&gt;
Hi, I&#039;m Brett Fullmer. Twenty-plus years in enterprise infrastructure and managed services taught me one thing that never stopped being true: technical authority means nothing if you&#039;re not human first. I&#039;ve spent a career being the person a customer calls when something real is actually on the line — not the one reading from a knowledge base article.&lt;br /&gt;
&lt;br /&gt;
These days I&#039;m doing something a little different. Since 2024 I&#039;ve been heads-down in an independent AI lab, building the kind of LLM-powered automation and agent frameworks I wish had existed earlier in my career — not as a side hobby, but as a hands-on way of proving what responsible AI-directed work actually looks like when someone competent is watching. I&#039;m not interested in vibes-based AI hype. I&#039;m interested in whether it holds up when it&#039;s pointed at something real, and what has to be true for that to be safe.&lt;br /&gt;
&lt;br /&gt;
So that&#039;s the introduction: two decades of infrastructure experience, a career built on trust, and right now, a lab full of servers I&#039;ve built, broken, and rebuilt on purpose, in public, so I can show the work instead of just claiming it.&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
Two decades in enterprise infrastructure and managed services, the kind of work that means being the person a customer trusts when something real is on the line. That background is the foundation everything else here is built on top of.&lt;br /&gt;
&lt;br /&gt;
== Currently ==&lt;br /&gt;
&lt;br /&gt;
Since 2024, heads-down in an independent AI lab: building LLM-powered automation and agent frameworks aimed at technical support and enterprise account management. [[MAC]] is the AI agent that does the actual day-to-day work — infrastructure, research, writing — under real guardrails rather than free rein. The [[Spacelift]] + OpenTofu practice labs (Orbit Labs, Pulsar) exist to prove that &amp;quot;AI-directed infrastructure&amp;quot; can be a trustworthy way of working, not just a slogan.&lt;br /&gt;
&lt;br /&gt;
The site&#039;s own tagline puts it plainly: &#039;&#039;&#039;building with AI, unapologetically.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== What I&#039;m looking for ==&lt;br /&gt;
&lt;br /&gt;
Remote Customer Success / Customer Engineering / Technical Account Manager roles. Not interested in big-tech-branded vendor TAM positions, even through a reseller or partner.&lt;br /&gt;
&lt;br /&gt;
== This wiki ==&lt;br /&gt;
&lt;br /&gt;
If [https://brettfullmer.com the site] tells the story and [https://brettfullmer.com/blog the blog] writes it up, this is the reference layer — build notes, gotchas, and the detail that&#039;s too dry or too &amp;quot;living document&amp;quot; for a blog post.&lt;br /&gt;
&lt;br /&gt;
== Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
* [https://brettfullmer.com Home]&lt;br /&gt;
* [https://brettfullmer.com/blog The Fullmer Frequency (blog)]&lt;br /&gt;
* [https://linkedin.com/in/brettfullmer LinkedIn]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=8</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=8"/>
		<updated>2026-08-21T16:31:14Z</updated>

		<summary type="html">&lt;p&gt;Brett: Swap to MAD-cover-art style portrait&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Brett-cover-art.jpeg|thumb|right|220px|Brett Fullmer]]&lt;br /&gt;
&#039;&#039;&#039;Brett Fullmer&#039;&#039;&#039; is a Technical Account Manager with 20+ years in enterprise infrastructure and managed services — technical authority, human first.&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
Two decades in enterprise infrastructure and managed services, the kind of work that means being the person a customer trusts when something real is on the line. That background is the foundation everything else here is built on top of.&lt;br /&gt;
&lt;br /&gt;
== Currently ==&lt;br /&gt;
&lt;br /&gt;
Since 2024, heads-down in an independent AI lab: building LLM-powered automation and agent frameworks aimed at technical support and enterprise account management. [[MAC]] is the AI agent that does the actual day-to-day work — infrastructure, research, writing — under real guardrails rather than free rein. The [[Spacelift]] + OpenTofu practice labs (Orbit Labs, Pulsar) exist to prove that &amp;quot;AI-directed infrastructure&amp;quot; can be a trustworthy way of working, not just a slogan.&lt;br /&gt;
&lt;br /&gt;
The site&#039;s own tagline puts it plainly: &#039;&#039;&#039;building with AI, unapologetically.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== What I&#039;m looking for ==&lt;br /&gt;
&lt;br /&gt;
Remote Customer Success / Customer Engineering / Technical Account Manager roles. Not interested in big-tech-branded vendor TAM positions, even through a reseller or partner.&lt;br /&gt;
&lt;br /&gt;
== This wiki ==&lt;br /&gt;
&lt;br /&gt;
If [https://brettfullmer.com the site] tells the story and [https://brettfullmer.com/blog the blog] writes it up, this is the reference layer — build notes, gotchas, and the detail that&#039;s too dry or too &amp;quot;living document&amp;quot; for a blog post.&lt;br /&gt;
&lt;br /&gt;
== Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
* [https://brettfullmer.com Home]&lt;br /&gt;
* [https://brettfullmer.com/blog The Fullmer Frequency (blog)]&lt;br /&gt;
* [https://linkedin.com/in/brettfullmer LinkedIn]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=File:Brett-cover-art.jpeg&amp;diff=7</id>
		<title>File:Brett-cover-art.jpeg</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=File:Brett-cover-art.jpeg&amp;diff=7"/>
		<updated>2026-08-21T16:30:13Z</updated>

		<summary type="html">&lt;p&gt;Brett: == Summary ==
MAD-cover-art style portrait
&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
MAD-cover-art style portrait&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Spacelift&amp;diff=6</id>
		<title>Spacelift</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Spacelift&amp;diff=6"/>
		<updated>2026-08-21T16:29:13Z</updated>

		<summary type="html">&lt;p&gt;Brett: Document how the lab was built&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page documents how the [[Main Page|AWS/IaC practice lab]] actually got built — two working environments, run through Spacelift, with real gotchas along the way. See also: [[MAC]], the agent that did most of the hands-on work.&lt;br /&gt;
&lt;br /&gt;
== Why it exists ==&lt;br /&gt;
&lt;br /&gt;
Practice, ahead of an interview with Spacelift itself. The goal wasn&#039;t a tutorial-grade demo — it was a real AWS account, real infrastructure, real failure modes, so the mistakes happened here instead of live.&lt;br /&gt;
&lt;br /&gt;
== The two labs ==&lt;br /&gt;
&lt;br /&gt;
=== Orbit Labs (two-stack) ===&lt;br /&gt;
&lt;br /&gt;
Two independent Spacelift stacks, one Git repo each, linked by a Spacelift-level stack dependency rather than a Terraform data source:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Networking stack&#039;&#039;&#039; — VPC (&amp;lt;code&amp;gt;10.0.0.0/16&amp;lt;/code&amp;gt;), one public subnet, an internet gateway, and a public route table. Outputs &amp;lt;code&amp;gt;subnet_id&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;App stack&#039;&#039;&#039; — consumes &amp;lt;code&amp;gt;subnet_id&amp;lt;/code&amp;gt; as &amp;lt;code&amp;gt;var.subnet_id&amp;lt;/code&amp;gt;. Builds a key pair, two security groups (web: 80/443/22 from an admin-only CIDR; db: 3306 from the web SG only), a pinned-AMI web fleet across prod/dev/test environments, and one dedicated database instance.&lt;br /&gt;
&lt;br /&gt;
The app stack cannot plan until the networking stack has applied and produced that output — enforced on Spacelift&#039;s Dependencies tab, not just documented convention.&lt;br /&gt;
&lt;br /&gt;
=== Pulsar (single-instance) ===&lt;br /&gt;
&lt;br /&gt;
A simpler, single self-contained stack built later specifically to avoid the stack-dependency wiring above for quick experiments: one VPC, one t3.micro/t3.small instance, no cross-stack linkage. 443 open to the world by design (for testing real internet-facing TLS); 22 restricted to an admin IP. An Elastic IP keeps the address stable across stop/start and resize cycles.&lt;br /&gt;
&lt;br /&gt;
== Build order ==&lt;br /&gt;
&lt;br /&gt;
# Push the networking/base stack first; wait for &amp;lt;code&amp;gt;FINISHED&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Push the app stack; it fails outright with a missing-variable error if pushed before the dependency exists.&lt;br /&gt;
# Poll with &amp;lt;code&amp;gt;spacectl&amp;lt;/code&amp;gt;, not the browser — the web UI lags behind real state.&lt;br /&gt;
# Pull outputs (&amp;lt;code&amp;gt;spacectl stack outputs --id &amp;amp;lt;stack-id&amp;amp;gt;&amp;lt;/code&amp;gt;) for live IPs once finished.&lt;br /&gt;
&lt;br /&gt;
== What actually broke ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AMI drift wiped a fleet.&#039;&#039;&#039; A &amp;lt;code&amp;gt;data &amp;quot;aws_ami&amp;quot; { most_recent = true }&amp;lt;/code&amp;gt; lookup meant a routine, unrelated push replaced the entire web fleet the moment AWS published a new image — new IPs, and any state that only lived on local disk was gone. Fix: pin the AMI as a fixed-default variable, bump it deliberately.&lt;br /&gt;
* &#039;&#039;&#039;The AWS console reads a literal &amp;lt;code&amp;gt;Name&amp;lt;/code&amp;gt; tag.&#039;&#039;&#039; Resources tagged with lowercase &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; are valid but invisible in the console&#039;s Name column. Every resource needs &amp;lt;code&amp;gt;Name = &amp;quot;...&amp;quot;&amp;lt;/code&amp;gt;, capital N.&lt;br /&gt;
* &#039;&#039;&#039;Deleting a stack doesn&#039;t clean up its dependency link.&#039;&#039;&#039; Emptying the networking stack&#039;s config to tear it down left the app stack&#039;s dependency reference dangling — the next run on either stack failed with a vague missing-input error until the link was removed and, later, explicitly re-added before rebuilding.&lt;br /&gt;
* &#039;&#039;&#039;Free-tier restrictions fail mid-operation.&#039;&#039;&#039; Requesting a &amp;lt;code&amp;gt;t3.medium&amp;lt;/code&amp;gt; resize got rejected by a &amp;lt;code&amp;gt;FreeTierRestrictionError&amp;lt;/code&amp;gt; — but only after AWS had already stopped the instance to attempt the resize, leaving it stopped (and, without an Elastic IP already attached, on a fresh IP).&lt;br /&gt;
* &#039;&#039;&#039;Uploaded-file PHP execution was silently broken.&#039;&#039;&#039; Because the vhost proxies every &amp;lt;code&amp;gt;*.php&amp;lt;/code&amp;gt; request straight to PHP-FPM at the server-config level, MediaWiki&#039;s and WordPress&#039;s default &amp;quot;disable script execution in the uploads directory&amp;quot; &amp;lt;code&amp;gt;.htaccess&amp;lt;/code&amp;gt; protection didn&#039;t actually apply — confirmed by dropping a harmless &amp;lt;code&amp;gt;.php&amp;lt;/code&amp;gt; test file in &amp;lt;code&amp;gt;wp-content/uploads/&amp;lt;/code&amp;gt; and watching it execute. Fixed with an explicit &amp;lt;code&amp;gt;SetHandler none&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;Require all denied&amp;lt;/code&amp;gt; override in both upload directories.&lt;br /&gt;
&lt;br /&gt;
== The pattern that&#039;s worth keeping ==&lt;br /&gt;
&lt;br /&gt;
Instance power state as a declarative resource, not a manual CLI step:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
resource &amp;quot;aws_ec2_instance_state&amp;quot; &amp;quot;web&amp;quot; {&lt;br /&gt;
  instance_id = aws_instance.web.id&lt;br /&gt;
  state       = &amp;quot;stopped&amp;quot;  # flip to &amp;quot;running&amp;quot;, push, confirm&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Flip the string, push, Spacelift applies it. No compute billing while stopped; the Elastic IP means the address survives the whole cycle.&lt;br /&gt;
&lt;br /&gt;
== Why Spacelift specifically ==&lt;br /&gt;
&lt;br /&gt;
* Plan and apply are structurally separate, with a mandatory human confirm gate before anything touches AWS.&lt;br /&gt;
* Stack dependencies are a first-class, enforced object — not a README instruction to run things in order.&lt;br /&gt;
* Full run history via &amp;lt;code&amp;gt;spacectl stack run list&amp;lt;/code&amp;gt; — every change, when, and why, queryable later.&lt;br /&gt;
* The automation API key is scoped read-only by design; it hard-fails on anything that tries to trigger a deploy. Read access for tooling and write access for a human are two separate credentials.&lt;br /&gt;
&lt;br /&gt;
That last point is the one that actually matters most: it&#039;s the reason handing real, live infrastructure work to [[MAC]] was something to trust rather than something to worry about.&lt;br /&gt;
&lt;br /&gt;
[[Category:AWS Lab]]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=5</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=5"/>
		<updated>2026-08-21T16:19:57Z</updated>

		<summary type="html">&lt;p&gt;Brett: Add portrait&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Brett-portrait.jpeg|thumb|right|220px|Brett Fullmer]]&lt;br /&gt;
&#039;&#039;&#039;Brett Fullmer&#039;&#039;&#039; is a Technical Account Manager with 20+ years in enterprise infrastructure and managed services — technical authority, human first.&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
Two decades in enterprise infrastructure and managed services, the kind of work that means being the person a customer trusts when something real is on the line. That background is the foundation everything else here is built on top of.&lt;br /&gt;
&lt;br /&gt;
== Currently ==&lt;br /&gt;
&lt;br /&gt;
Since 2024, heads-down in an independent AI lab: building LLM-powered automation and agent frameworks aimed at technical support and enterprise account management. [[MAC]] is the AI agent that does the actual day-to-day work — infrastructure, research, writing — under real guardrails rather than free rein. The [[Spacelift]] + OpenTofu practice labs (Orbit Labs, Pulsar) exist to prove that &amp;quot;AI-directed infrastructure&amp;quot; can be a trustworthy way of working, not just a slogan.&lt;br /&gt;
&lt;br /&gt;
The site&#039;s own tagline puts it plainly: &#039;&#039;&#039;building with AI, unapologetically.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== What I&#039;m looking for ==&lt;br /&gt;
&lt;br /&gt;
Remote Customer Success / Customer Engineering / Technical Account Manager roles. Not interested in big-tech-branded vendor TAM positions, even through a reseller or partner.&lt;br /&gt;
&lt;br /&gt;
== This wiki ==&lt;br /&gt;
&lt;br /&gt;
If [https://brettfullmer.com the site] tells the story and [https://brettfullmer.com/blog the blog] writes it up, this is the reference layer — build notes, gotchas, and the detail that&#039;s too dry or too &amp;quot;living document&amp;quot; for a blog post.&lt;br /&gt;
&lt;br /&gt;
== Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
* [https://brettfullmer.com Home]&lt;br /&gt;
* [https://brettfullmer.com/blog The Fullmer Frequency (blog)]&lt;br /&gt;
* [https://linkedin.com/in/brettfullmer LinkedIn]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=File:Brett-portrait.jpeg&amp;diff=4</id>
		<title>File:Brett-portrait.jpeg</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=File:Brett-portrait.jpeg&amp;diff=4"/>
		<updated>2026-08-21T16:19:17Z</updated>

		<summary type="html">&lt;p&gt;Brett: == Summary ==
Portrait for Main Page
&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Portrait for Main Page&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=3</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=3"/>
		<updated>2026-08-21T16:13:00Z</updated>

		<summary type="html">&lt;p&gt;Brett: Rewrite Main Page to be about Brett&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Brett Fullmer&#039;&#039;&#039; is a Technical Account Manager with 20+ years in enterprise infrastructure and managed services — technical authority, human first.&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
&lt;br /&gt;
Two decades in enterprise infrastructure and managed services, the kind of work that means being the person a customer trusts when something real is on the line. That background is the foundation everything else here is built on top of.&lt;br /&gt;
&lt;br /&gt;
== Currently ==&lt;br /&gt;
&lt;br /&gt;
Since 2024, heads-down in an independent AI lab: building LLM-powered automation and agent frameworks aimed at technical support and enterprise account management. [[MAC]] is the AI agent that does the actual day-to-day work — infrastructure, research, writing — under real guardrails rather than free rein. The [[Spacelift]] + OpenTofu practice labs (Orbit Labs, Pulsar) exist to prove that &amp;quot;AI-directed infrastructure&amp;quot; can be a trustworthy way of working, not just a slogan.&lt;br /&gt;
&lt;br /&gt;
The site&#039;s own tagline puts it plainly: &#039;&#039;&#039;building with AI, unapologetically.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== What I&#039;m looking for ==&lt;br /&gt;
&lt;br /&gt;
Remote Customer Success / Customer Engineering / Technical Account Manager roles. Not interested in big-tech-branded vendor TAM positions, even through a reseller or partner.&lt;br /&gt;
&lt;br /&gt;
== This wiki ==&lt;br /&gt;
&lt;br /&gt;
If [https://brettfullmer.com the site] tells the story and [https://brettfullmer.com/blog the blog] writes it up, this is the reference layer — build notes, gotchas, and the detail that&#039;s too dry or too &amp;quot;living document&amp;quot; for a blog post.&lt;br /&gt;
&lt;br /&gt;
== Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
* [https://brettfullmer.com Home]&lt;br /&gt;
* [https://brettfullmer.com/blog The Fullmer Frequency (blog)]&lt;br /&gt;
* [https://linkedin.com/in/brettfullmer LinkedIn]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
	<entry>
		<id>https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=2</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.brettfullmer.com/wiki/index.php?title=Main_Page&amp;diff=2"/>
		<updated>2026-08-21T16:06:57Z</updated>

		<summary type="html">&lt;p&gt;Brett: Write Main Page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Welcome to the Fullmer Wiki.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If [https://brettfullmer.com the site] is where I tell the story and [https://brettfullmer.com/blog the blog] is where I write it up, this is where I keep the reference material — the stuff that&#039;s too detailed, too dry, or too much of a living document to fit a blog post.&lt;br /&gt;
&lt;br /&gt;
== What&#039;s here ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AWS / IaC Lab&#039;&#039;&#039; — build notes, gotchas, and teardown/rebuild procedures for the [[Spacelift]] + OpenTofu practice labs (Orbit Labs, Pulsar).&lt;br /&gt;
* &#039;&#039;&#039;MAC&#039;&#039;&#039; — what the AI agent I work with actually has access to, how it operates, and the guardrails (Spacelift&#039;s plan/confirm gate, scoped credentials) that make handing it real infrastructure something I&#039;m comfortable with.&lt;br /&gt;
* &#039;&#039;&#039;Job Search Reference&#039;&#039;&#039; — companies, roles, and research notes from the current search.&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
&lt;br /&gt;
Brand new as of August 2026. Mostly empty right now — this grows as I actually do the work, not ahead of it.&lt;br /&gt;
&lt;br /&gt;
== Elsewhere ==&lt;br /&gt;
&lt;br /&gt;
* [https://brettfullmer.com Home]&lt;br /&gt;
* [https://brettfullmer.com/blog The Fullmer Frequency (blog)]&lt;br /&gt;
* [https://linkedin.com/in/brettfullmer LinkedIn]&lt;/div&gt;</summary>
		<author><name>Brett</name></author>
	</entry>
</feed>