<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Sustainable Security — Hacking the Workforce</title>
  <link>https://next.hackingtheworkforce.org/sustainable-security/</link>
  <atom:link href="https://next.hackingtheworkforce.org/feed.xml" rel="self" type="application/rss+xml"/>
  <description>How a small nonprofit runs on technology it owns. Articles, guides, recordings, and field notes from Hacking the Workforce.</description>
  <language>en-us</language>
  <lastBuildDate>Sun, 01 Nov 2026 20:35:39 +0000</lastBuildDate>
  <item>
    <title>Field note: the new site is live on a staging address</title>
    <link>https://next.hackingtheworkforce.org/sustainable-security/field-note-staging-site-live/</link>
    <guid isPermaLink="true">https://next.hackingtheworkforce.org/sustainable-security/field-note-staging-site-live/</guid>
    <pubDate>Sun, 01 Nov 2026 12:00:00 +0000</pubDate>
    <category>Field note</category>
    <description>Thirty-seven pages, fifty-seven redirects, three failed deploys, one line in a trust policy. What happened this week and what it taught us.</description>
    <content:encoded><![CDATA[<p><strong>What changed.</strong> The rebuilt hackingtheworkforce.org went live on a staging hostname. Thirty-seven pages generated from fifteen wireframe boards and twenty-two hand-written sources, every old URL mapped to a new one, the whole thing publishing from the repository in about three minutes.</p>
<p><strong>What broke.</strong> The infrastructure stack failed twice before it created (an identity provider that already existed, and a certificate option that must be omitted when DNS lives elsewhere). Then the publishing job was refused by the cloud three runs in a row. The sign-in audit log showed the cause in one line: the code host had changed the format of its identity token, and our trust policy matched only the old shape. One wildcard fixed it. Then the last step of the publish failed because the role could create a cache refresh but not read whether it had finished; we stopped waiting.</p>
<p><strong>What it taught us.</strong> Read the audit log before guessing. Make the build refuse to publish a page with placeholder text, because under deadline you will miss one. And keep infrastructure in a template so a fix is a line in a file, not a memory of a console click.</p>
<p><strong>What is next.</strong> Connecting the forms, then moving the real domain, then turning this week&rsquo;s work into a kit a student can run for another nonprofit.</p>]]></content:encoded>
  </item>
  <item>
    <title>The redirect map: never let a link in a grant report die</title>
    <link>https://next.hackingtheworkforce.org/sustainable-security/redirect-map-never-let-a-link-die/</link>
    <guid isPermaLink="true">https://next.hackingtheworkforce.org/sustainable-security/redirect-map-never-let-a-link-die/</guid>
    <pubDate>Sun, 25 Oct 2026 12:00:00 +0000</pubDate>
    <category>Guide</category>
    <description>Every URL you have ever put in a grant report, a flyer, or a funder email is a promise. When you move your website, a one-file redirect map keeps every one of them. Here is how to build it in an afternoon.</description>
    <content:encoded><![CDATA[<p>A nonprofit&rsquo;s old URLs are scattered across places it cannot edit: grant reports already submitted, printed flyers, a funder&rsquo;s internal notes, a partner&rsquo;s newsletter from two years ago, a QR code on a banner in somebody&rsquo;s closet. When the website moves and those links break, the organization looks careless to exactly the people it most needs to trust it. The fix is cheap and should be the first thing you build, not the last.</p>
<h2>What a redirect map is</h2>
<p>A single file that says, for every old address, where it should go now:</p>
<pre><code>{
  &quot;/our-programs&quot;:        &quot;/security/careers/&quot;,
  &quot;/donate-today&quot;:        &quot;/donate/&quot;,
  &quot;/blog/summer-camp-2025&quot;: &quot;/testimonials/seafarers-yacht-club/&quot;
}
</code></pre>
<p>Ours has fifty-seven lines. The build compiles the file into the small function that runs at the edge of the content delivery network, so every old address answers with a permanent redirect (an HTTP 301) to the new page before any file is even looked up. Search engines treat a 301 as &ldquo;this page moved,&rdquo; and they carry the old page&rsquo;s reputation to the new one. Visitors see nothing except the right page.</p>
<h2>How to gather the old URLs</h2>
<ol>
<li><strong>The old platform&rsquo;s page list.</strong> Export it or copy it by hand. Include pages you plan to delete; those need redirects most.</li>
<li><strong>Your own documents.</strong> Search your grant reports, decks, and newsletters for your domain name. Every hit is a URL someone else may still have.</li>
<li><strong>Search engine results.</strong> Search <code>site:yourdomain.org</code> and page through the results. These are the addresses the public actually reaches.</li>
<li><strong>The server log or analytics, if you have either.</strong> Anything with traffic in the last year goes on the list.</li>
<li><strong>Old flyers and QR codes.</strong> Ask the person who makes them.</li>
</ol>
<p>Write each one down exactly as it appears, including capitalization and trailing slashes. The map should tolerate both forms; ours strips a trailing slash before looking up the address.</p>
<h2>How to choose the destination</h2>
<p>For each old address pick the one new page that best answers the reason someone clicked the old link. A blog post about a past event goes to the case study or the events page, not the home page. A deleted program page goes to the nearest living program, with a sentence on that page acknowledging the change if the program really ended. The home page is the destination of last resort; a redirect there tells the visitor &ldquo;we lost it.&rdquo;</p>
<h2>Rules we follow</h2>
<ul>
<li>Every destination must end with a slash and must be a page that exists. The build checks both and refuses to publish otherwise.</li>
<li>Never chain redirects. If A once went to B and B now goes to C, point A straight at C.</li>
<li>Keep the map in the repository next to the content, under version control, so a change is a one-line edit anyone can review.</li>
<li>After cutover, watch for 404s for a month and add a line for each one that was a real link rather than a bot guessing.</li>
</ul>
<h2>Why it matters more for nonprofits than for companies</h2>
<p>A company can buy its way out of a broken link with advertising. A nonprofit&rsquo;s reach is made of relationships and references, most of them written down somewhere by someone else. The redirect map is how you keep faith with every one of those references at once, for the cost of an afternoon and one file.</p>]]></content:encoded>
  </item>
  <item>
    <title>Field note: what we pay for every month, and the one question we asked about each line</title>
    <link>https://next.hackingtheworkforce.org/sustainable-security/field-note-what-we-pay-for-every-month/</link>
    <guid isPermaLink="true">https://next.hackingtheworkforce.org/sustainable-security/field-note-what-we-pay-for-every-month/</guid>
    <pubDate>Sun, 18 Oct 2026 12:00:00 +0000</pubDate>
    <category>Field note</category>
    <description>Before moving anything, we listed every recurring technology charge and asked one question of each. The list was longer than we thought, and the question answered itself more often than we expected.</description>
    <content:encoded><![CDATA[<p><strong>What changed.</strong> We sat down with the bank statement and listed every recurring technology charge: the website platform, the domain, email and shared inboxes, the forms and email-sequence platform, the donation processor, two learning platforms, a video tool, a design tool, and three subscriptions nobody could remember signing up for. Fourteen lines. We had guessed eight.</p>
<p><strong>The one question.</strong> For each line: <em>if this disappeared tomorrow, what would we lose, and could we get it back from our own files?</em> Three answers came back. For email and donations, the answer was &ldquo;a lot, and no,&rdquo; so those stay. For the website, the answer was &ldquo;the site, and only if we export it first,&rdquo; which told us the content was not really ours. For the three forgotten subscriptions, the answer was &ldquo;nothing,&rdquo; and they were gone by the end of the meeting.</p>
<p><strong>What it taught us.</strong> Renting is fine when the vendor does something we should not do ourselves, like running mail servers or handling card numbers. Renting is a problem when the vendor holds the only copy of something we made. The cost audit is not really about money; it is about finding the places where we have quietly given up ownership. The money follows.</p>
<p><strong>What is next.</strong> The website is the biggest line where we own nothing. That is the first thing to move.</p>]]></content:encoded>
  </item>
  <item>
    <title>Student project: move a nonprofit off rented technology</title>
    <link>https://next.hackingtheworkforce.org/sustainable-security/student-project-nonprofit-site-kit/</link>
    <guid isPermaLink="true">https://next.hackingtheworkforce.org/sustainable-security/student-project-nonprofit-site-kit/</guid>
    <pubDate>Sun, 11 Oct 2026 12:00:00 +0000</pubDate>
    <category>Guide</category>
    <description>A semester-sized service-learning project. A student rebuilds a small nonprofit&#x27;s website on technology the nonprofit owns, cuts its recurring costs, and leaves behind documentation the organization can maintain. Brief, milestones, deliverables, and grading rubric.</description>
    <content:encoded><![CDATA[<p>We did this for ourselves in a day with an experienced engineer and an AI assistant. Done carefully by a student over a semester, with a real nonprofit as the client, it is one of the best portfolio projects we know: it touches cloud, DNS, identity, automation, accessibility, and writing, and it ends with a real organization spending less money. This brief is written for a student, a faculty sponsor, or a nonprofit that wants to host one.</p>
<h2>The problem the student solves</h2>
<p>A small nonprofit pays monthly for a website builder (and often for separate forms, storage, and email tools), cannot easily edit or export its own content, and would struggle to leave. The student replaces the website with plain files the nonprofit owns, hosted on a major cloud for cents per month, published automatically from a code repository, and documented so a non-technical staff member can make changes afterwards.</p>
<h2>Who it is for</h2>
<p>A student who has written some HTML and run commands in a terminal. No prior cloud experience is required; the project teaches it. It fits a capstone, an internship, an apprenticeship rotation, or a self-directed portfolio project. One student can do it; two is comfortable.</p>
<h2>What the nonprofit provides</h2>
<ul>
<li>Ownership of its domain name and a login to wherever its DNS is managed.</li>
<li>A list of every current page and which ones matter.</li>
<li>About two hours of a staff member&rsquo;s time per month for decisions and review, plus one hour for the handover.</li>
<li>A credit card for the cloud account (expect under five dollars a month; the first year is often free-tier).</li>
</ul>
<h2>Milestones</h2>
<p><strong>Weeks 1–2: Discover.</strong> Inventory every page and URL of the current site. Interview the staff about what they edit and how often. Record the current recurring costs. Deliver a one-page findings memo and a proposed page list.</p>
<p><strong>Weeks 3–4: Build locally.</strong> Set up the repository from the kit. Write the pages as sources. Run the build and the checker until the site passes with zero problems. Deliver a preview the client can click through on a laptop and on a phone.</p>
<p><strong>Weeks 5–6: Stand up the infrastructure.</strong> Create the cloud stack from the template on a staging hostname. Connect the repository&rsquo;s publishing job. Prove that a one-line edit on the code host&rsquo;s website is live in minutes. Deliver the staging URL and a short screen recording of a change going live.</p>
<p><strong>Weeks 7–8: Redirects, accessibility, and content review.</strong> Build the old-URL redirect map. Run an accessibility check on every page and fix what it finds. The client reviews the copy. Deliver the redirect map and a checklist of accessibility fixes made.</p>
<p><strong>Weeks 9–10: Cut over.</strong> Move the apex and <code>www</code> hostnames to the new site without touching mail records. Monitor old URLs for a week. Deliver a cutover log: what was changed, when, and how to reverse it.</p>
<p><strong>Weeks 11–12: Hand over.</strong> Write the maintenance guide in the client&rsquo;s words. Record two short screen recordings: editing a page, and adding a photo. Cancel the old platform with the client. Present the before-and-after cost and a lessons-learned write-up.</p>
<h2>Deliverables</h2>
<ol>
<li>The repository, with a README and a maintenance guide a non-technical person can follow.</li>
<li>The live site on the nonprofit&rsquo;s domain, passing the automated checks.</li>
<li>The redirect map covering every old URL.</li>
<li>Two screen recordings (editing a page; adding a photo), each under five minutes.</li>
<li>A written case study, de-identified if the client prefers, that another nonprofit could learn from. We will publish it here with the client&rsquo;s consent.</li>
</ol>
<h2>Grading rubric (100 points)</h2>
<ul>
<li><strong>Working system (30).</strong> The site is live on the client&rsquo;s domain, publishes from the repository automatically, and passes the checker with zero problems.</li>
<li><strong>Client ownership (20).</strong> The client can make a text change and add a photo without the student, demonstrated live at handover.</li>
<li><strong>Continuity (15).</strong> Every old URL redirects; mail kept working through cutover; the cutover log is complete enough to reverse.</li>
<li><strong>Accessibility and performance (15).</strong> Every image has alt text; the site is usable with a keyboard and a screen reader; pages load fast on a phone.</li>
<li><strong>Security hygiene (10).</strong> No long-lived cloud keys anywhere; the bucket is private; the publishing identity is scoped to one repository and one branch; the student can explain why each of those matters.</li>
<li><strong>Communication (10).</strong> The findings memo, the maintenance guide, and the case study are clear to a non-technical reader.</li>
</ul>
<h2>What the student learns, in the language of a résumé</h2>
<p>Static-site architecture and build automation; object storage and content delivery networks; TLS certificates and DNS (including the difference between a website move and a mail move); short-lived federated identity instead of stored keys; infrastructure as code; continuous deployment with automated quality gates; web accessibility; technical writing for non-technical readers; and client management with a real organization and a real budget.</p>
<h2>Rules we ask every student to follow</h2>
<ul>
<li>The client makes every decision that touches money, identity, or DNS. The student prepares the change and explains it; the client clicks.</li>
<li>Never store a cloud access key in the repository or on a laptop. The kit&rsquo;s publishing job does not need one.</li>
<li>Do not cancel the old platform until the new site has served the real domain for a week.</li>
<li>Write the maintenance guide before the handover meeting, then test it by having the client follow it while you watch and say nothing.</li>
</ul>
<h2>How to start</h2>
<p>Fork the kit from our repository, read the implementation plan in this section, and find a nonprofit. If you are a student who wants a client, or a nonprofit who wants a student, write to us at <a href="mailto:hello@hackingtheworkforce.org">hello@hackingtheworkforce.org</a> with the subject &ldquo;Site kit&rdquo; and we will try to match you.</p>]]></content:encoded>
  </item>
  <item>
    <title>Implementation plan: moving a nonprofit website to files you own</title>
    <link>https://next.hackingtheworkforce.org/sustainable-security/static-site-implementation-plan/</link>
    <guid isPermaLink="true">https://next.hackingtheworkforce.org/sustainable-security/static-site-implementation-plan/</guid>
    <pubDate>Sun, 04 Oct 2026 12:00:00 +0000</pubDate>
    <category>Guide</category>
    <description>The technical plan we followed to replace a hosted website builder with a static site on AWS, published by GitHub Actions. De-identified, with the four mistakes that cost us the most time so you can skip them.</description>
    <content:encoded><![CDATA[<p>This is the plan we actually executed, with our account identifiers removed. It assumes a nonprofit with a domain name it controls, a free GitHub account, and an AWS account with a credit card on file (the bill at small-nonprofit traffic is cents per month). The same shape works on other clouds; the pieces are generic.</p>
<h2>The target architecture</h2>
<p>Five pieces, each doing one job.</p>
<ul>
<li><strong>A Git repository</strong> holds the source: a <code>build/</code> folder with the page sources, a <code>redirects.json</code> map of old URLs to new ones, an infrastructure template, and two automation workflows. The generated site is not committed; it is rebuilt on every change.</li>
<li><strong>A build script</strong> (a few hundred lines of Python) turns the sources into finished HTML. It writes the shared header, footer, navigation, and calls-to-action once, inlines the stylesheet, resizes photos, writes the sitemap, and refuses to publish any page that still contains placeholder text.</li>
<li><strong>Object storage</strong> (an S3 bucket) holds the finished files. The bucket is private; only the content delivery network can read it.</li>
<li><strong>A content delivery network</strong> (a CloudFront distribution) serves the files over HTTPS with a free certificate, rewrites clean URLs like <code>/donate/</code> to the right file, and answers the old URLs with permanent redirects so nothing you ever shared goes dead.</li>
<li><strong>A publishing job</strong> (GitHub Actions) runs on every push to the main branch: build, check, upload, refresh the cache, and smoke-test three pages. It signs in to AWS with a short-lived identity token, so there are no long-lived access keys anywhere.</li>
</ul>
<h2>Phase 1: the content (half a day)</h2>
<ol>
<li><strong>Inventory the old site.</strong> List every page URL. You will need this twice: once to decide what to keep, once to build the redirect map. Export any text you cannot easily recreate.</li>
<li><strong>Decide the page list and the navigation.</strong> We went from a sprawl of pages to thirty-seven with a six-item navigation. Each page got a title, a one-sentence description, and a reason to exist.</li>
<li><strong>Write the pages as sources, not as finished HTML.</strong> Some of ours are wireframe exports; most are short Python calls that produce a hero, a card grid, and a call to action from text. The point is that a volunteer edits sentences, never layout.</li>
<li><strong>Mark every unknown with a visible placeholder</strong> in a fixed format, and have the build log them to a file. Ours is a bracketed tag that starts with the word SWAP and says what belongs there. The build replaces each with honest interim copy (&ldquo;Pricing announced soon&rdquo;) and writes the original intent to <code>NEEDS-INPUT.md</code>. The checker refuses to publish any page where a raw placeholder survived.</li>
<li><strong>Build the redirect map.</strong> For every old URL, pick the new page it should land on. Ours has fifty-seven entries. This is the single most valuable file for anyone who has ever put a link in a grant report.</li>
</ol>
<h2>Phase 2: the infrastructure (two hours, once)</h2>
<ol>
<li><strong>Write the infrastructure as a template</strong>, not as clicks in a console. Ours is one CloudFormation file that creates the bucket, the distribution, the certificate, the URL-rewrite function, and the deploy role. Keep it in the repository. A small script regenerates the template from <code>redirects.json</code>, so adding a redirect never means editing infrastructure by hand.</li>
<li><strong>Create the stack in <code>us-east-1</code></strong> (certificates used by the CDN must live there) with the staging hostname, for example <code>next.yourdomain.org</code>. While it creates, the certificate service shows a validation record to add at your DNS provider. Add it; the stack waits until it resolves.</li>
<li><strong>Point the staging hostname at the distribution</strong> with a CNAME record.</li>
<li><strong>Connect GitHub to AWS</strong> by storing four values as repository variables: the deploy role&rsquo;s identifier, the bucket name, the distribution identifier, and the site URL. The workflow reads them. Nothing secret is stored.</li>
<li><strong>Push.</strong> The first run publishes the site to the staging hostname.</li>
</ol>
<h2>Phase 3: cutover (one hour, when ready)</h2>
<ol>
<li>Update the stack so the primary hostname is your apex domain and the additional hostname is <code>www</code>. A new certificate is issued; add its two validation records.</li>
<li>Change the site URL constant in the build (it drives canonical links and social previews) and the <code>SITE_URL</code> variable, and push.</li>
<li>At the DNS provider, point the apex at the distribution (an ALIAS or ANAME record, or your provider&rsquo;s equivalent) and <code>www</code> as a CNAME. The distribution redirects <code>www</code> to the apex.</li>
<li>Leave every mail record alone: MX, SPF, DKIM, DMARC. Your mailboxes do not know or care where the website lives.</li>
<li>Do not renew the old platform. Keep the domain registration; it is separate from the website plan and usually cheap.</li>
</ol>
<h2>The four mistakes that cost us the most time</h2>
<p><strong>The identity provider already existed.</strong> If your AWS account has ever connected to GitHub before, the OpenID Connect provider is already there and a template that tries to create it again fails and rolls back. Make it a parameter and default it to &ldquo;no&rdquo;.</p>
<p><strong>Certificate validation options without a hosted zone.</strong> If your DNS is not in Route 53, the certificate resource must omit its validation-options block entirely. Including it with an empty zone fails with an unhelpful message about a null domain.</p>
<p><strong>GitHub changed the shape of its identity token.</strong> The subject claim used to read <code>repo:Owner/Repo:ref:refs/heads/main</code>. It now stamps numeric identifiers into it: <code>repo:Owner@12345/Repo@67890:ref:refs/heads/main</code>. A trust policy that matches only the old pattern is refused with &ldquo;not authorized to perform sts:AssumeRoleWithWebIdentity&rdquo;. Match both patterns with a wildcard condition. Check the sign-in audit log for the exact subject your run presented; it tells you in one line.</p>
<p><strong>Waiting on a cache refresh you are not allowed to read.</strong> Our deploy role could create a cache invalidation but not read its status, so the &ldquo;wait until done&rdquo; step failed after the site was already live. Either grant the read permission or do not wait; the refresh completes in about a minute regardless.</p>
<h2>Operating it afterwards</h2>
<ul>
<li>A text change is an edit on the code host&rsquo;s website and a three-minute wait. No tools.</li>
<li>A new photo is a file dropped into a folder plus one line naming it.</li>
<li>A new redirect is one line in <code>redirects.json</code>.</li>
<li>Undo is one command, because every publish is a commit.</li>
<li>Review the old-URL traffic for a month after cutover and add any redirect you missed.</li>
</ul>
<h2>What this is not</h2>
<p>It is not a content management system with roles, drafts, and a visual editor. If your organization has many non-technical editors publishing daily, you may still want one. For a small nonprofit with a few pages that change a few times a month, this is less work, far cheaper, and entirely yours.</p>
<p>The full source is in our repository, and the student project brief in this section turns the plan into a semester-long service-learning project.</p>]]></content:encoded>
  </item>
  <item>
    <title>Why we left our website platform, and what the site costs now</title>
    <link>https://next.hackingtheworkforce.org/sustainable-security/why-we-left-our-website-platform/</link>
    <guid isPermaLink="true">https://next.hackingtheworkforce.org/sustainable-security/why-we-left-our-website-platform/</guid>
    <pubDate>Sun, 27 Sep 2026 12:00:00 +0000</pubDate>
    <category>Article</category>
    <description>We moved hackingtheworkforce.org off a monthly website platform onto plain files we own, hosted for pennies. Here is the reasoning, the numbers, and what we kept paying for on purpose.</description>
    <content:encoded><![CDATA[<p>Small nonprofits rent most of their technology. The website is on a builder platform, the forms are on a second platform, email on a third, donations on a fourth, and each one bills monthly, raises the price when the plan renews, and makes leaving just hard enough that nobody does. We ran that way for years. This fall we decided to stop renting the website.</p>
<h2>What was wrong</h2>
<p>The website platform cost us a few hundred dollars a year. That is not a lot of money until you count what it bought. The site was slow to edit in any way the editor did not anticipate. Two of our volunteers could not safely change a page without breaking the layout. The 4C model pages, which we want every school to be able to copy, were locked inside a page builder that had no clean export. Old URLs we had shared in grant reports pointed at pages we could not reliably redirect. And the renewal notice arrived the same month we were deciding how to fund a participant&rsquo;s training. One cohort seat is a real line item for us; the website fee was quietly competing with it.</p>
<p>The deeper problem was ownership. Our content lived in someone else&rsquo;s database, in someone else&rsquo;s format. If the price doubled, we would pay it, because the alternative was rebuilding from scratch under deadline.</p>
<h2>What we moved to</h2>
<p>The site is now a folder of plain HTML files in a Git repository we own. A short build script generates every page from a handful of source files, so the header, footer, navigation, donation band, and quick-exit bar are written once and appear everywhere. When someone changes a file, an automated job rebuilds the site, checks it for broken links, missing image descriptions, and leftover placeholder text, and publishes it to object storage behind a content delivery network. The change is live in about three minutes. There is no server to patch, no plugin to update, no login page for attackers to find.</p>
<p>Editing is simpler than it was. A volunteer can open a file in the browser, fix a sentence, and commit. If the change breaks a rule, the publish stops and the log says which line. Every version is kept, so undoing a mistake is one command.</p>
<h2>What it costs now</h2>
<p>Hosting the files and serving them worldwide costs us less than a dollar a month at our traffic, and the first year of the content delivery network is inside the provider&rsquo;s free tier. The domain name still costs about twenty dollars a year, as it always did. The code hosting is free for a repository this size. The remaining recurring cost is the time of whoever edits the site, and that was true before.</p>
<p>We kept paying for three things deliberately. Email and shared inboxes, because running our own mail server is a security risk we do not want. A forms and email-sequence platform, because it routes people to the right program and we would rather spend volunteer time on people than on form plumbing. And a no-fee donation processor, because it passes one hundred percent of each gift to us. Owning the website did not mean owning everything; it meant owning the parts where renting was costing more than it returned.</p>
<h2>What it took</h2>
<p>About one working day, with an AI assistant doing most of the typing and a human making every decision that touched money, identity, or DNS. The build script, the infrastructure template, the redirect map for fifty-seven old URLs, and the publishing job are all in the repository. The step-by-step version is in the companion guide, and the student project brief turns the same work into a semester project a learner can do for another nonprofit.</p>
<h2>Why we are writing this down</h2>
<p>We train people for cybersecurity careers and we help the organizations that serve our communities stay safe online. Both of those are easier when an organization owns its technology and understands it. A nonprofit that can read its own website files can also read its own DNS records, its own access logs, and its own vendor contracts. That is the beginning of security, not an IT detail. So this section of the site will keep documenting, in public, what we run, what it costs, what breaks, and what we learn.</p>]]></content:encoded>
  </item>
</channel>
</rss>
