diff --git a/README.md b/README.md index 1d20e03..5f896b9 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Columbia Gadget Works website -Source for . Built with [Hugo](https://gohugo.io) (no external theme; layouts live in `layouts/`), hosted on Cloudflare Pages. +Source for . Built with [Hugo](https://gohugo.io) (no external theme; layouts live in `layouts/`), deployed as a Cloudflare Worker with static assets. ## Editing content @@ -9,10 +9,12 @@ Everything a volunteer normally touches is a Markdown or YAML file: | What | Where | |---|---| | Pages (Visit, About, Donate, …) | `content/.md` | -| News posts | `content/news/.md` — copy an existing one; set `date`, `title`, optional `image` | -| Tool pages | `content/tools/.md` — front matter holds specs, training flag, wiki link | -| Events calendar | `data/events.yaml` — `recurring` always shows; `upcoming` items disappear after their date | -| Photos | `assets/img/` — drop in a JPG/PNG (long edge ≤ 1600 px is plenty); reference by filename | +| News posts | `content/news/.md` (copy an existing one; set `date`, `title`, optional `image`) | +| Tool pages | `content/tools/.md` (front matter holds `zone`, specs, training flag, wiki link) | +| Shop zones | `data/zones.yaml` (name, summary, and the accent colour each zone is themed with) | +| Events calendar | `data/events.yaml` (`recurring` always shows; `upcoming` items disappear after their date) | +| Photos | `assets/img/` (drop in a JPG/PNG, long edge 1600 px or less; reference by filename) | +| Video | `static/video/` (MP4 muxed with `-movflags +faststart`; embed with the `video` shortcode) | | Contact info, links, EIN, Givebutter IDs | `hugo.toml` under `[params]` | | Menu | `hugo.toml` under `[menus]` | @@ -39,17 +41,83 @@ The site deploys as a Cloudflare Worker: Hugo's `public/` folder is served as st - Deploy command: `npx wrangler deploy` - Hugo comes from the `hugo-extended` npm package pinned in `package.json`, so no `HUGO_VERSION` variable is needed 3. Secrets (Settings → Variables and Secrets, type *Secret*): - - `DISCORD_WEBHOOK_URL` — webhook for the contact form channel (see `src/contact.js`) - - `TURNSTILE_SECRET` (optional) — add only **after** `turnstileSiteKey` in `hugo.toml` has deployed + - `DISCORD_WEBHOOK_URL`, webhook for the contact form channel (see `src/contact.js`) + - `TURNSTILE_SECRET` (optional), add only **after** `turnstileSiteKey` in `hugo.toml` has deployed + - `SUBSCRIBERS_EXPORT_TOKEN`, required to export the mailing list (see below) + - `DISCORD_SIGNUP_WEBHOOK_URL` (optional), pings a channel on each list signup 4. Custom domain: Settings → Domains & Routes → add `columbiagadgetworks.org` and `www` (the zone must be in the same account). 5. `static/_redirects` maps the old WordPress URLs; `static/_headers` sets caching and security headers. Both are honored by Workers static assets. Manual deploy from a machine with Wrangler logged in: `npm run deploy`. +## Shop zones + +`/tools/` groups every tool page under the zone it belongs to. Zones are defined once in `data/zones.yaml`: + +```yaml +- id: woodworking # must match the `zone:` value in a tool's front matter + name: Woodworking + accent: "#AB501B" # text and rules; keep it dark enough to read on white + summary: One sentence describing the zone. +``` + +Each tool page sets `zone: woodworking`. The accent is emitted into the stylesheet as a +CSS custom property (`.zone-woodworking { --zone-accent: ... }`), so adding a zone needs +no CSS edit. Zone order follows `zones.yaml`; tools within a zone follow their `weight`. + +## Video + +Drop an MP4 in `static/video/` and a poster still in `assets/img/`, then: + +``` +{{}} +``` + +Nothing loads until the visitor presses play (`preload="none"`), and the poster reserves +the layout box. Re-mux phone footage with `ffmpeg -i in.mp4 -c copy -movflags +faststart out.mp4` +so playback can start before the file finishes downloading. + +## Class and event email list + +`{{}}` renders the signup form. It is on `/classes/` and `/events/`, and +linked from the footer. Addresses are stored in Cloudflare KV, not a third-party mailing +service, so the list stays ours. + +1. Create the namespace: `npx wrangler kv namespace create SUBSCRIBERS` +2. Paste the id it prints into the commented `kv_namespaces` block in `wrangler.jsonc`. +3. Add `SUBSCRIBERS_EXPORT_TOKEN` as a secret (`openssl rand -hex 32`). + +Export the list: + +```sh +curl "https://columbiagadgetworks.org/api/subscribers?token=$SUBSCRIBERS_EXPORT_TOKEN" -o subscribers.csv +``` + +Without that secret the export returns 404, so the list is never exposed by accident. +Records are keyed by lowercased email, so signing up twice updates one row. To remove +someone, delete the `sub:` key from the namespace. + +`GET /api/health` reports which bindings the Worker can see (names only, never values). + +## Spam protection (Turnstile) + +The contact form and the signup form both use Turnstile when it is configured. +**Set both halves or neither:** + +- `params.turnstileSiteKey` in `hugo.toml` (public, safe in git) +- `TURNSTILE_SECRET` as a Worker secret + +The handlers verify only when the secret is present. If the secret is set but the site key +has not deployed, the forms render no widget, send no token, and every submission is +rejected. Deploy the site key first, then add the secret. + +When creating the widget, list `columbiagadgetworks.org` (subdomains are covered +automatically) and the `workers.dev` hostname if you test there. + ## After launch checklist - Google Search Console: verify the domain, submit `/sitemap.xml`. -- Givebutter: fix the org profile URL to `https://`, create a **widget** for the donation campaign and paste its ID into `givebutterWidgetId`. +- Givebutter: fix the org profile URL to `https://`. (The donation widget is configured; `givebutterAccount` and `givebutterWidgetId` are set in `hugo.toml`.) - Update `data/events.yaml` whenever a class is scheduled. ## License diff --git a/assets/css/site.css b/assets/css/site.css index e084225..10fa267 100644 --- a/assets/css/site.css +++ b/assets/css/site.css @@ -1,4 +1,4 @@ -/* Columbia Gadget Works — site styles. Brand color comes from hugo.toml. */ +/* Columbia Gadget Works site styles. Brand color comes from hugo.toml. */ :root{ --rust:{{ site.Params.brandColor }}; --rust-dark:#983C1E; @@ -12,8 +12,10 @@ --line:#E5DED4; --ok:#2F7A4B; --warn:#9C6A00; - --font:ui-sans-serif,system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif; - --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace; + /* Ordinary, ubiquitous faces. Nothing is downloaded, so text paints on the + first frame and there is no layout shift when a webfont arrives. */ + --font:Arial,"Helvetica Neue",Helvetica,sans-serif; + --mono:Consolas,"DejaVu Sans Mono","Courier New",monospace; --wrap:1120px; --r:10px; } @@ -23,8 +25,8 @@ body{margin:0;font-family:var(--font);font-size:17px;line-height:1.6;color:var(- img{max-width:100%;height:auto;display:block} a{color:var(--rust-dark);text-decoration-thickness:1px;text-underline-offset:2px} a:hover{color:var(--rust)} -h1,h2,h3,h4{line-height:1.15;letter-spacing:-.01em;margin:0 0 .5em;font-weight:800} -h1{font-size:clamp(2rem,4.5vw,3.2rem)} +h1,h2,h3,h4{line-height:1.18;letter-spacing:-.005em;margin:0 0 .5em;font-weight:700} +h1{font-size:clamp(1.9rem,4.2vw,3rem)} h2{font-size:clamp(1.5rem,2.6vw,2rem)} h3{font-size:1.2rem} p{margin:0 0 1em} @@ -40,14 +42,15 @@ ul.plain{list-style:none;padding:0;margin:0} ul.plain li{margin:0 0 .35em} /* Buttons */ -.btn{display:inline-block;padding:.6em 1.15em;border-radius:8px;font-weight:700;text-decoration:none;border:2px solid transparent;line-height:1.2;cursor:pointer;font-family:inherit;font-size:1rem} +.btn{display:inline-block;padding:.62em 1.2em;border-radius:3px;font-weight:700;text-decoration:none;border:2px solid transparent;line-height:1.2;cursor:pointer;font-family:inherit;font-size:1rem;transition:background .12s ease,border-color .12s ease,transform .06s ease} +.btn:active{transform:translateY(1px)} .btn-primary{background:var(--rust);color:#fff;border-color:var(--rust)} .btn-primary:hover{background:var(--rust-dark);border-color:var(--rust-dark);color:#fff} -.btn-light{background:#fff;color:var(--ink);border-color:#fff} -.btn-light:hover{background:var(--paper);color:var(--rust-dark)} +.btn-light{background:#fff;color:var(--ink);border-color:var(--ink)} +.btn-light:hover{background:var(--ink);color:#fff} .btn-outline{background:transparent;color:var(--rust-dark);border-color:var(--rust)} .btn-outline:hover{background:var(--rust-tint)} -.btn-lg{padding:.8em 1.4em;font-size:1.08rem} +.btn-lg{padding:.78em 1.5em;font-size:1.06rem} /* Header */ .site-header{background:#fff;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:50} @@ -84,7 +87,7 @@ ul.plain li{margin:0 0 .35em} .lead{font-size:1.2rem;max-width:62ch;color:inherit} .hero .lead{color:#E7E3DC} .hero-cta{display:flex;flex-wrap:wrap;gap:12px;margin:24px 0 20px} -.hack-chip{display:inline-block;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.2);padding:.5em .9em;border-radius:999px;font-size:.95rem;margin:0} +.hack-chip{display:inline-block;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.18);border-left:3px solid var(--rust);padding:.5em .9em;border-radius:2px;font-size:.95rem;margin:0} /* Cards / grids */ .three-up{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:20px} @@ -97,7 +100,7 @@ ul.plain li{margin:0 0 .35em} .band-dark .btn-light{color:var(--ink)} .tool-ph{display:flex;align-items:center;justify-content:center;aspect-ratio:4/3;background:linear-gradient(135deg,#3a444f,#2B333C)} .tool-grid .tool-ph img,.tool-card .tool-ph img{width:64px;height:64px;aspect-ratio:auto;opacity:.5} -.tool-card .tool-ph{aspect-ratio:16/10;background:var(--rust-tint)} +.tool-card .tool-ph{aspect-ratio:16/10;background:#F1ECE4} .band-rust{background:var(--rust);color:#fff} .band-rust a.btn-light{color:var(--rust-dark)} .section-head{max-width:60ch;margin-bottom:28px} @@ -136,6 +139,10 @@ ul.plain li{margin:0 0 .35em} .page-hero{margin:0 0 32px} .page-hero img{border-radius:var(--r);width:100%} .prose{max-width:72ch} +/* Pages that lay out in columns opt out of the reading measure, so a two-column + block fills the 1120px wrap instead of being squeezed into 72ch. */ +.prose-wide{max-width:none} +.prose-wide>.two-col>div>:first-child{margin-top:0} .prose h2{margin-top:1.6em;padding-top:.2em} .prose h3{margin-top:1.3em} .prose ul,.prose ol{padding-left:1.3em} @@ -154,17 +161,22 @@ ul.plain li{margin:0 0 .35em} .callout.ok{border-left-color:var(--ok)} .callout.warn{border-left-color:var(--warn)} .callout p:last-child{margin-bottom:0} -.badges{display:flex;flex-wrap:wrap;gap:8px;margin:.4em 0} -.badge{font-size:.78rem;font-weight:700;padding:.25em .6em;border-radius:999px;background:#fff;border:1px solid var(--line);color:var(--muted)} -.badge-warn{border-color:#E6C98A;color:var(--warn);background:#FFF6E0} -.badge-ok{border-color:#B7DCC4;color:var(--ok);background:#E9F5EC} +/* Shop tags. Squared, stencilled, and labelled like the machines they describe: + pill-shaped pastel chips read as generic web UI, which is not what this place is. */ +.badges{display:flex;flex-wrap:wrap;gap:8px;margin:.5em 0;align-items:stretch} +.badge{display:inline-block;font-family:var(--mono);font-size:.7rem;font-weight:700;text-transform:uppercase;letter-spacing:.07em;padding:.36em .65em;border-radius:2px;background:#fff;border:1px solid var(--line);color:var(--muted)} +.badge-ok{color:var(--ok)} +.badge-warn{color:#6B4A00} +.band-dark .badge,.hero .badge{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.22);color:#EDE8E1} /* Tools */ .tool-cards{list-style:none;padding:0;margin:24px 0 0;display:grid;gap:20px;grid-template-columns:repeat(auto-fill,minmax(320px,1fr))} .tool-card{background:#fff;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;display:flex;flex-direction:column} .tool-card-img img{aspect-ratio:16/10;object-fit:cover;width:100%} .tool-card-body{padding:18px 20px 20px} -.tool-card-body h2{font-size:1.25rem;margin-bottom:.1em} +.tool-card-body h3{font-size:1.2rem;margin-bottom:.1em} +.tool-card-body h3 a{text-decoration:none;color:var(--ink)} +.tool-card-body h3 a:hover{color:var(--rust-dark)} .tool-card-body p{margin-bottom:.5em} .tool-layout{display:grid;grid-template-columns:minmax(0,1fr) 340px;gap:40px;align-items:start} @media (max-width:860px){.tool-layout{grid-template-columns:1fr}} @@ -183,7 +195,7 @@ ul.plain li{margin:0 0 .35em} .news-grid{list-style:none;padding:0;margin:24px 0;display:grid;gap:20px;grid-template-columns:repeat(auto-fill,minmax(300px,1fr))} .news-card{background:#fff;border:1px solid var(--line);border-radius:var(--r);overflow:hidden} .news-thumb img{aspect-ratio:16/10;object-fit:cover;width:100%} -.thumb-blank{display:flex;align-items:center;justify-content:center;aspect-ratio:16/10;background:var(--rust-tint)} +.thumb-blank{display:flex;align-items:center;justify-content:center;aspect-ratio:16/10;background:#F1ECE4} .news-body{padding:16px 18px 18px} .news-body time{font-size:.85rem;color:var(--muted)} .news-body h2{font-size:1.15rem;margin:.2em 0 .3em} @@ -215,5 +227,52 @@ ul.plain li{margin:0 0 .35em} .site-footer address{font-style:normal;line-height:1.7} .hack-night{background:rgba(255,255,255,.06);border-radius:8px;padding:10px 12px;display:inline-block} .footer-bottom{display:flex;flex-wrap:wrap;justify-content:space-between;gap:8px;border-top:1px solid rgba(255,255,255,.12);margin-top:36px;padding-top:16px;font-size:.85rem;color:#A9A39B} -@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}} +/* Zones. Colors come from data/zones.yaml so the palette lives in one place. */ +{{ range hugo.Data.zones }} +.zone-{{ .id }}{--zone-accent:{{ .accent }}} +{{- end }} +.zone-nav{display:flex;flex-wrap:wrap;gap:8px;margin:28px 0 8px;padding:0;list-style:none} +.zone-chip{display:inline-block;font-size:.82rem;font-weight:700;text-decoration:none;color:var(--zone-accent);background:#fff;border:1px solid var(--line);border-radius:2px;padding:.42em .78em} +.zone-chip:hover,.zone-chip:focus-visible{border-color:var(--zone-accent)} +.zone{margin-top:44px;scroll-margin-top:84px} +.zone-head{border-left:4px solid var(--zone-accent);border-bottom:1px solid var(--line);padding:2px 0 12px 16px} +.zone-head h2{margin:0 0 .12em;font-size:1.35rem;color:var(--zone-accent)} +.zone-head p{margin:0;max-width:74ch;color:var(--muted)} +.zone .tool-cards{margin-top:18px} +.zone .tool-card{border-top:3px solid var(--zone-accent)} +.zone-more{margin:10px 0 0;font-size:.95rem} +.two-col.feature{align-items:center} +.two-col.feature h2{margin-top:0} +.eyebrow-sep{margin:0 .15em;opacity:.55} +.zone-link{color:var(--zone-accent,var(--rust-dark))} +.page.zone-woodworking,.page.zone-machining,.page.zone-digital-fabrication,.page.zone-electronics,.page.zone-crafting,.page.zone-metalworking{border-top:3px solid var(--zone-accent);margin-top:-1px} +/* Homepage tile accents */ +.tool-grid li{--zone-accent:var(--rust)} +.tool-grid a{border-top:3px solid var(--zone-accent)} + +/* Email signup */ +.signup{border:1px solid var(--line);background:#fff;border-radius:var(--r);padding:24px;margin:2em 0} +.signup h2{font-size:1.3rem;margin:0 0 .2em} +.signup-lead{color:var(--muted);max-width:62ch} +.signup-form{margin:0} +.signup-fields{display:grid;grid-template-columns:1fr 1fr;gap:14px} +@media (max-width:600px){.signup-fields{grid-template-columns:1fr}} +.field.consent{margin:14px 0 16px} +.field.consent label{display:flex;gap:.6em;align-items:flex-start;font-weight:400;font-size:.95rem;margin:0} +.field.consent input[type=checkbox]{width:auto;flex:none;margin:.3em 0 0;accent-color:var(--rust)} +.signup-promise{margin-top:24px;border-top:1px solid var(--line);padding-top:16px} +.signup-promise h3{font-family:var(--mono);font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:0 0 .6em;font-weight:700} +.signup-promise ul{padding-left:1.2em;margin:0 0 .7em} +.signup-promise li{margin:.32em 0;font-size:.95rem} +.signup-msg{margin-top:16px} +.signup-msg p:last-child{margin-bottom:0} + +/* Video. Self-hosted, no third-party player, dimensions reserved to avoid layout shift. */ +.video-figure{margin:1.6em 0} +.video-figure video{display:block;width:100%;height:auto;aspect-ratio:16/9;background:#14181c;border-radius:var(--r)} +.video-figure figcaption{margin-top:.55em;font-size:.9rem;color:var(--muted)} +.prose .video-figure{margin-left:0;margin-right:0} + +@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto} + .btn{transition:none}} @media print{.site-header,.site-footer,.hero-media{display:none}} diff --git a/assets/img/battlebots-arena.jpg b/assets/img/battlebots-arena.jpg new file mode 100644 index 0000000..622fd2e Binary files /dev/null and b/assets/img/battlebots-arena.jpg differ diff --git a/content/about.md b/content/about.md index 08dc934..26e2dbc 100644 --- a/content/about.md +++ b/content/about.md @@ -29,9 +29,9 @@ In 2026 we began a deliberate transition from an informal "club" to a properly g Columbia Gadget Works is a **membership organization**. Every member in good standing has one vote. Members elect four officers each April at the annual meeting, and the officers serve as the board of directors. -The shop itself is divided into **zones**: woodworking, metalworking, digital fabrication (laser, CNC, 3D printing), electronics, and casting. Each zone is run by a volunteer "zone lead" who sets it up, keeps it safe, and decides what training its tools require. Other volunteers take on functions like membership, classes, facilities, and communications. +The shop itself is divided into six **zones**: [woodworking, machining, digital fabrication, electronics, crafting, and metalworking](/tools/). Each zone is run by a volunteer "zone lead" who sets it up, keeps it safe, and decides what training its tools require. Other volunteers take on functions like membership, classes, facilities, and communications. -Decisions are written down on our member wiki. If it isn't on the wiki, it isn't policy. +Decisions are written down on our [member wiki](https://wiki.comogadget.casa/). If it isn't on the wiki, it isn't policy. ### Board of directors diff --git a/content/classes.md b/content/classes.md index 03b8c4c..6dbfa84 100644 --- a/content/classes.md +++ b/content/classes.md @@ -7,16 +7,16 @@ description: "Free and low-cost maker classes in Columbia, MO: soldering, metal ## Open Hack Night is the first class -Every Thursday from 6 to 8 pm the shop is open to everyone. It isn't a formal class, but it's where most learning at CGW actually happens: a member shows you how the laser works, someone walks you through your first 3D print, a machinist explains what you did wrong on the lathe. If you want to learn something specific, say so when you arrive. [Plan a visit →](/visit/) +Every Thursday from 6 to 8 pm the shop is open to everyone. It isn't a formal class, but it's where most learning at CGW actually happens: a member shows you how the laser works, someone walks you through your first 3D print, a machinist explains what you did wrong on the lathe. If you want to learn something specific, say so when you arrive. [Plan a visit](/visit/) ## Scheduled classes Members run classes roughly monthly, usually on a Thursday at 6 pm in place of the normal open night. Recent ones: -- **Metal casting** – make a plaster mold from a 3D-printed part and pour it in aluminum, zinc, or pewter with the shop's casting setup. [Recap →](/news/metal-casting-class-recap/) -- **Soldering** – hand soldering and reflow/surface-mount techniques, with kits to take home. [Announcement →](/news/soldering-class-and-art-in-the-park/) -- **Machining** – the manual milling machine and metal lathe, from reading the dials to taking a real cut. [Recap →](/news/metalworking-class/) -- **Field trips** – like our tour of KOPN community radio's studios and transmitter equipment. [Details →](/news/kopn-tour-april-23/) +- **Metal casting:** make a plaster mold from a 3D-printed part and pour it in aluminum with the shop's casting setup. [Recap](/news/metal-casting-class-recap/) +- **Soldering:** hand soldering and reflow/surface-mount techniques, with kits to take home. [Announcement](/news/soldering-class-and-art-in-the-park/) +- **Machining:** the Bridgeport mill and the Clausing lathe, from reading the dials to taking a real cut. [Recap](/news/metalworking-class/) +- **Field trips:** like our tour of KOPN community radio's studios and transmitter equipment. [Details](/news/kopn-tour-april-23/) Classes on the calendar for the year ahead: laser cutting basics, CNC router basics, 3D printing basics, intro to electronics and Arduino, welding, and woodshop safety. Dates are announced about a month ahead on the [events page](/events/), the [news page](/news/), and Discord. @@ -24,18 +24,18 @@ Classes on the calendar for the year ahead: laser cutting basics, CNC router bas ### City of Columbia grant classes, Nov 2026 – Oct 2027 -Thanks to a grant from the City of Columbia, we're running a **free public class on the first Thursday of every month** for a year, starting November 5, 2026. Topics rotate through every zone in the shop. No membership needed; some classes have limited seats, so watch the [calendar](/events/) for sign-up links. - - +Thanks to a grant from the City of Columbia Office of Cultural Affairs, we're running a **free public class on the first Thursday of every month** for a year, starting November 5, 2026. Topics rotate through every zone in the shop. No membership needed; some classes have limited seats, so watch the [calendar](/events/) for sign-up links. ## Cost -Most classes are **free**. Where materials are significant (casting metal, electronics kits) we charge cost, typically $5–$20, and members get a discount. No one is turned away for inability to pay; just tell the instructor. +All classes are **free unless otherwise stated**. Financial assistance for this program has been provided by the City of Columbia Office of Cultural Affairs. ## Upcoming {{< events limit="6" >}} +{{< subscribe source="classes" redirect="/classes/?subscribe=ok" >}} + ## Teach a class {#teach} Everything we offer is taught by volunteers, and the best classes come from members who are enthusiastic about something. You don't need to be an expert; you need to be a step or two ahead of the students and willing to prepare. @@ -46,7 +46,7 @@ To propose a class: 2. Post in the `#classes` channel on Discord or [send us a note](/contact/) with the topic, what students will make or leave able to do, materials needed, and how many people you can handle. 3. The classes lead will help you find a date, put it on the calendar, and promote it. -Instructors may charge a fee for paid classes, split with the zone that provides the tools. Details are in the membership policy on the wiki. +Instructors may charge a fee for paid classes, split with the zone that provides the tools. Details are in the membership policy on the [member wiki](https://wiki.comogadget.casa/). ## Groups, schools, and scouts diff --git a/content/contact.md b/content/contact.md index 7111a3f..5beb93f 100644 --- a/content/contact.md +++ b/content/contact.md @@ -2,6 +2,7 @@ title: Contact subtitle: Say hello, ask a question, or set up a visit. description: Contact Columbia Gadget Works. 1404 Grand Ave, Columbia, MO 65203. Open to the public every Thursday 6–8 pm. Email mail@columbiagadgetworks.org or call 573-326-9868. +wide: true ---
@@ -13,18 +14,24 @@ description: Contact Columbia Gadget Works. 1404 Grand Ave, Columbia, MO 65203. **Open to the public:** every Thursday, 6–8 pm (Open Hack Night)
**Members:** 24/7 -Park in the gravel lot and ring the bell by the side entrance. +Park in the gravel lot and ring the bell by the side entrance. First time? [What to expect on a visit](/visit/). ## Reach us - Email: [mail@columbiagadgetworks.org](mailto:mail@columbiagadgetworks.org) - Phone: [573-326-9868](tel:+15733269868) (voicemail; a volunteer will call back) - Discord: [join the server](https://discord.gg/F7kM7ardMs) for the fastest answers +- Member wiki: [wiki.comogadget.casa](https://wiki.comogadget.casa/) for policies, tool guides, and meeting minutes - Social: [Facebook](https://www.facebook.com/columbiagadgetworks/) · [Bluesky](https://bsky.app/profile/comogadgetworks.bsky.social) We're volunteers, so email replies can take a few days. If it's urgent and it's a Thursday evening, just come by. -{{< map >}} +### Common questions + +- **Want a tour?** No appointment needed on a Thursday. Just walk in. +- **Bringing a group, class, or troop?** Use the form and tell us roughly how many people and what you'd like to see, so we can line up enough members. +- **Donating a tool or machine?** [Ask first](/donate/) so we can confirm we have space and a use for it. +- **Interested in joining?** See [membership](/membership/), then come by on a Thursday.
@@ -35,3 +42,7 @@ We're volunteers, so email replies can take a few days. If it's urgent and it's
+ +## Find us + +{{< map >}} diff --git a/content/events.md b/content/events.md index 382ebe7..0b74751 100644 --- a/content/events.md +++ b/content/events.md @@ -15,6 +15,8 @@ description: "Columbia Gadget Works calendar: free Open Hack Night every Thursda {{< calendar >}} +{{< subscribe source="events" redirect="/events/?subscribe=ok" heading="Get class and event announcements by email" >}} + Class announcements also go out on [Discord](https://discord.gg/F7kM7ardMs), [Facebook](https://www.facebook.com/columbiagadgetworks/), and [Bluesky](https://bsky.app/profile/comogadgetworks.bsky.social), and are posted in the [news](/news/). Subscribe to the [news RSS feed](/news/index.xml) if you'd rather not check. Something missing? Members can edit `data/events.yaml` in the [website repository](https://github.com/ColumbiaGadgetWorks/website) or ask the communications lead. diff --git a/content/membership.md b/content/membership.md index 70833a9..e5f40a8 100644 --- a/content/membership.md +++ b/content/membership.md @@ -15,8 +15,6 @@ description: Join Columbia Gadget Works. Membership includes 24/7 shop access, a ## Dues - - | Level | Monthly | Who it's for | |---|---|---| | **Standard** | $50 | Full access for one adult. | @@ -38,7 +36,7 @@ Cost should never be the reason someone doesn't join. If the standard rate is ou ## Training -Some tools require training before you use them alone: the laser cutter, CNC router, milling machine, lathe, welders, and table saw. Training is free for members and is run by the zone lead on request or on a scheduled class night. Once you're signed off, it's recorded on the wiki and you're good to go. +Some tools require training before you use them alone: the laser cutter, CNC router, Bridgeport mill, Clausing lathe, welders, and table saw. Training is discounted for members and is run by the zone lead on request or on a scheduled class night. Once you're signed off, it's recorded on the wiki and you're good to go. ## Rules, briefly diff --git a/content/news/battlebots-chamber-of-robotic-aggression.md b/content/news/battlebots-chamber-of-robotic-aggression.md new file mode 100644 index 0000000..5dd891e --- /dev/null +++ b/content/news/battlebots-chamber-of-robotic-aggression.md @@ -0,0 +1,30 @@ +--- +title: "Robot combat in the Chamber of Robotic Aggression" +date: 2026-09-20T10:00:00-05:00 +description: Members built a polycarbonate battle box and filled it with small combat robots. Video from a recent match night at Columbia Gadget Works. +image: battlebots-arena.jpg +imageAlt: Two small combat robots pushing against each other inside a clear-walled arena labelled Chamber of Robotic Aggression +--- + +Somebody at this shop decided we needed an arena, so we built one. The **Chamber of Robotic Aggression** is a member-built battle box: a welded steel frame, a plywood floor, polycarbonate walls, expanded metal over the top, and hazard striping along the bottom rail so nobody forgets what it is for. + +Here is fourteen seconds of what happens once two bots are in there together. + +{{< video src="/video/battlebots-arena.mp4" poster="battlebots-arena.jpg" caption="Two small combat robots in the Chamber of Robotic Aggression at a recent Open Hack Night." >}} + + + +## It uses most of the shop + +A combat robot is a good excuse to touch nearly every zone in the building, which is part of why we like them: + +- The chassis and armor get cut and welded in [metalworking](/tools/welding/), or machined on the [Bridgeport and the Clausing](/tools/machine-shop/) when a part has to be right. +- Wedges, wheel hubs, and mounts come off the [3D printers](/tools/3d-printers/). +- Drive electronics, radio gear, and battery wiring happen at the [electronics bench](/tools/electronics-bench/). +- The arena itself came out of [woodworking](/tools/woodshop/) and the welding bay. + +## Want to build one? + +Start small. An antweight class bot is cheap, fits on a bench, and teaches you the same lessons a heavier one would, just without the shrapnel. Come to [Open Hack Night](/visit/) on a Thursday and say you want to build a battlebot; there are several members who will immediately have opinions about drive trains. + +Build notes and arena details go on the [member wiki](https://wiki.comogadget.casa/), and match nights get announced on [Discord](https://discord.gg/F7kM7ardMs) and the [events calendar](/events/). diff --git a/content/news/kopn-tour-april-23.md b/content/news/kopn-tour-april-23.md index 3a0cae4..cb9af3a 100644 --- a/content/news/kopn-tour-april-23.md +++ b/content/news/kopn-tour-april-23.md @@ -1,5 +1,5 @@ --- -title: KOPN Tour – April 23 +title: "KOPN tour: April 23" date: 2026-04-08T07:05:47-05:00 description: Columbia Gadget Works field trip to KOPN community radio on Thursday, April 23, 2026. image: kopn.jpg diff --git a/content/news/metal-casting-class-feb-26th.md b/content/news/metal-casting-class-feb-26th.md index c8d2401..4227c2f 100644 --- a/content/news/metal-casting-class-feb-26th.md +++ b/content/news/metal-casting-class-feb-26th.md @@ -1,5 +1,5 @@ --- -title: Metal Casting Class – Feb 26th! +title: "Metal casting class: February 26" date: 2026-02-20T09:52:15-06:00 description: Free metal casting class Thursday, February 26, 2026 at 6 pm at Columbia Gadget Works. image: metal-casting-mold.jpg diff --git a/content/news/metal-casting-class-recap.md b/content/news/metal-casting-class-recap.md index bb6cabb..53e3362 100644 --- a/content/news/metal-casting-class-recap.md +++ b/content/news/metal-casting-class-recap.md @@ -1,5 +1,5 @@ --- -title: Metal Casting Class – Recap +title: "Metal casting class: recap" date: 2026-02-27T09:44:09-06:00 description: Recap of the free metal casting class at Columbia Gadget Works, February 2026. image: metal-casting-parts.jpg diff --git a/content/news/metalworking-class.md b/content/news/metalworking-class.md index f8c33ef..ce56335 100644 --- a/content/news/metalworking-class.md +++ b/content/news/metalworking-class.md @@ -8,4 +8,4 @@ imageAlt: Jeff demonstrating the vertical milling machine to a group of members CGW has been running monthly classes. Last month, Jeff shared knowledge about using the manual milling machine in the CGW workshop, and other metalworking information. -Want to learn the mill or lathe yourself? See the [metal shop](/tools/metal-shop/) page and watch the [events calendar](/events/) for the next session. +Want to learn the mill or lathe yourself? See the [machine shop](/tools/machine-shop/) page and watch the [events calendar](/events/) for the next session. diff --git a/content/privacy.md b/content/privacy.md index 7046b76..9cf9581 100644 --- a/content/privacy.md +++ b/content/privacy.md @@ -4,7 +4,7 @@ subtitle: Short, because we collect very little. description: Privacy policy for columbiagadgetworks.org. --- -*Last updated: September 18, 2026* +*Last updated: September 20, 2026* Columbia Gadget Works ("CGW", "we") operates columbiagadgetworks.org. This page explains what information the site collects and what we do with it. @@ -16,6 +16,8 @@ Columbia Gadget Works ("CGW", "we") operates columbiagadgetworks.org. This page **Contact form.** When you send a message through our [contact form](/contact/), we receive your name, email address, and message. It is delivered to a private channel on our volunteer Discord server so that the people who handle inquiries can respond. We use it only to reply to you, and we don't add you to any mailing list. +**Class and event mailing list.** If you sign up for [class and event announcements](/classes/#email-signup), we store the email address you give us, an optional first name, the date you signed up, and which page you signed up from. We use it for one thing: telling you about upcoming classes and events at the shop. We do not sell, rent, trade, or share the list with anyone, and we do not use it for fundraising appeals. The list is held in Cloudflare KV storage and is readable only by the volunteers who send the announcements. Ask us to remove you, by replying to any announcement or through the [contact form](/contact/), and you come off the list that day. You must be 13 or older to sign up. + **Email and phone.** If you email or call us, we keep the correspondence as long as needed to respond and for our records. ## Third-party services embedded on this site diff --git a/content/tools/3d-printers.md b/content/tools/3d-printers.md index a76a1e9..1d24776 100644 --- a/content/tools/3d-printers.md +++ b/content/tools/3d-printers.md @@ -1,7 +1,8 @@ --- title: 3D printers subtitle: Fast, reliable Bambu Lab printers with multi-color capability. -description: 3D printing at Columbia Gadget Works, Columbia MO. Bambu Lab X1 Carbon and A1 printers with AMS for PLA, PETG, TPU, ABS, and ASA. Orientation required; free for members. +description: 3D printing at Columbia Gadget Works, Columbia MO. Bambu Lab X1 Carbon and A1 printers with AMS for PLA, PETG, TPU, ABS, and ASA. Orientation required; open to members. +zone: digital-fabrication weight: 30 image: metal-casting-mold.jpg imageAlt: "A hand holding a plaster mold that was made from a 3D-printed pattern" @@ -13,7 +14,6 @@ specs: - { label: Build volume, value: 256 × 256 × 256 mm each } - { label: Materials, value: PLA, PETG, TPU, ABS, ASA } - { label: Software, value: Bambu Studio on the shop PC } - - { label: Zone, value: Digital fabrication } --- 3D printing is the easiest way to go from an idea to a physical object, and our two Bambu Lab printers make it nearly foolproof. Both have an AMS (automatic material system) that holds four spools, so you can print in multiple colors or switch materials without babysitting the machine. Typical prints take an hour or two; large ones run overnight. diff --git a/content/tools/_index.md b/content/tools/_index.md index 10a456d..d1d5461 100644 --- a/content/tools/_index.md +++ b/content/tools/_index.md @@ -1,10 +1,10 @@ --- title: Tools and equipment linkTitle: Tools -subtitle: What's in the shop, what it does, and what you need before you use it. -description: "Equipment at Columbia Gadget Works makerspace in Columbia, MO: 80W CO2 laser cutter, Shapeoko CNC router, Bambu Lab 3D printers, Bridgeport mill and Clausing lathe, welders, metal casting, electronics bench, and woodshop." +subtitle: Six zones, each with its own lead, its own tools, and its own rules for getting started. +description: "Equipment at Columbia Gadget Works makerspace in Columbia, MO, organized by zone: woodworking, machining, digital fabrication, electronics, crafting, and metalworking. Laser cutter, CNC router, 3D printers, Bridgeport mill, Clausing lathe, welders, and casting." --- -The shop is organized into zones, each looked after by a volunteer lead. Members can use any tool they've been trained on, 24/7. Visitors can try the basic tools on Thursday nights and get a demo of anything else. Detailed operating guides, settings, and maintenance logs live on the [member wiki](https://wiki.comogadget.casa/). +The shop is organized into **zones**, each looked after by a volunteer lead who keeps it running, keeps it safe, and decides what training its tools require. Members can use any tool they have been trained on, 24/7. Visitors can try the basic tools on Thursday nights and get a demo of anything else. Detailed operating guides, settings, and maintenance logs live on the [member wiki](https://wiki.comogadget.casa/). -**Training:** tools marked *training required* need a sign-off from a zone lead before you use them alone. Training is free for members and usually takes an hour or less. +**Training:** tools marked *training required* need a sign-off from a zone lead before you use them alone. Training is discounted for members and usually takes an hour or less. diff --git a/content/tools/cnc-router.md b/content/tools/cnc-router.md index a62b891..41430f2 100644 --- a/content/tools/cnc-router.md +++ b/content/tools/cnc-router.md @@ -2,6 +2,7 @@ title: CNC router subtitle: Computer-controlled router for carving wood, plastic, and soft metals. description: Shapeoko 4 XL CNC router at Columbia Gadget Works makerspace, Columbia MO. Carve signs, parts, and furniture components in wood, plastic, and aluminum. Training required. +zone: woodworking weight: 20 image: cnc-router.jpg imageAlt: "The Shapeoko 4 CNC router cutting a rectangle in plywood held down with green clamps, dust boot attached to the trim router" @@ -14,7 +15,6 @@ specs: - { label: Spindle, value: Makita RT0701C trim router with dust boot } - { label: Control, value: Carbide Motion } - { label: CAM, value: Carbide Create, FreeCAD, Fusion 360 } - - { label: Zone, value: Digital fabrication } --- The CNC router turns a drawing on a computer into a carved part. A spinning cutter moves over the workpiece under computer control, cutting profiles, pockets, holes, and 3D reliefs with a precision and repeatability that's hard to match by hand. It's the tool for anything flat-ish that needs to be exact: enclosures, brackets, signage, inlay, jigs, furniture joinery, and parts for other machines. diff --git a/content/tools/crafting.md b/content/tools/crafting.md new file mode 100644 index 0000000..7100721 --- /dev/null +++ b/content/tools/crafting.md @@ -0,0 +1,35 @@ +--- +title: Crafting +subtitle: Sewing, vinyl, paint, and bench space for projects that are not made of metal. +description: Crafting at Columbia Gadget Works makerspace, Columbia MO. Sewing machine, vinyl cutter, paint and finishing supplies, hand tools, and open bench space. Open to visitors. +weight: 65 +zone: crafting +training: false +openHackNight: true +wiki: https://wiki.comogadget.casa/ +specs: + - { label: Textiles, value: Sewing machine, fabric shears, cutting mat } + - { label: Vinyl and paper, value: Craft cutter, weeding tools, transfer tape } + - { label: Finishing, value: Paint, brushes, sandpaper, glues and epoxies } + - { label: Also, value: Open bench space, hand tools, cutting and measuring tools } +--- + +Not everything worth making is made of steel. The crafting zone is the shop's general-purpose making space: a sewing machine, a vinyl cutter, paint and finishing supplies, glues, hand tools, and clear bench space to spread out on. It is the least intimidating corner of the building and a good place to start if the machine noise elsewhere is not your thing yet. + +**What people do here:** sew bags, costumes, and repairs, cut vinyl for stickers and shirts, paint and finish parts that came off the [3D printers](/tools/3d-printers/) or the [laser cutter](/tools/laser-cutter/), assemble kits, and work on anything that needs a clean flat surface and good light. + + + +## It pairs with everything else + +The crafting zone is where a lot of projects actually get finished. A laser-cut box gets sanded and stained here. A printed cosplay piece gets filled, primed, and painted here. A cut-and-sew project starts on the [CNC router](/tools/cnc-router/) or the laser as a pattern and ends up on the sewing machine. If you are making something that crosses zones, this is usually the last stop. + +## Using the zone + +No training required. A member will show you where things live and how the sewing machine and vinyl cutter are set up. Please: + +- Bring your own fabric, vinyl, and consumables for anything substantial. Shop stock is for small jobs and trying things out. +- Clean the cutting mat and bench when you are done, and put blades and needles in the sharps bin, not the trash. +- Label and shelve work in progress so the bench stays usable for the next person. + +Project notes and machine settings go on the [member wiki](https://wiki.comogadget.casa/). diff --git a/content/tools/electronics-bench.md b/content/tools/electronics-bench.md index 5ad9c32..7482625 100644 --- a/content/tools/electronics-bench.md +++ b/content/tools/electronics-bench.md @@ -2,6 +2,7 @@ title: Electronics bench subtitle: Soldering, testing, and repair, with people who've done a lot of it. description: Electronics workbench at Columbia Gadget Works, Columbia MO. Soldering stations, hot air rework, oscilloscope, power supplies, multimeters, and components. Open to visitors on Thursdays. +zone: electronics weight: 60 image: electronics-bench.jpg imageAlt: "The electronics bench: pegboard with magnifier visors and solder, a Hakko soldering station, hot-air rework station, helping-hands holder, and precision screwdrivers" @@ -11,7 +12,6 @@ specs: - { label: Soldering, value: Hakko FX-888D stations, hot-air rework, reflow } - { label: Test gear, value: Oscilloscope, bench power supplies, multimeters, function generator } - { label: Also, value: PanaVise holders, magnifiers, component stock, breadboards, Arduino and Raspberry Pi } - - { label: Zone, value: Electronics } --- The electronics bench is the most beginner-friendly corner of the shop and the one visitors can use right away on a Thursday night. Temperature-controlled soldering stations, a hot-air rework tool, a scope, power supplies, and bins of common components cover everything from a first blinking LED to repairing a vintage amplifier or building a custom circuit board. @@ -30,3 +30,5 @@ No formal training required; a member will show you the stations and where thing - Don't take the last of anything without noting it on the consumables list. - Use the fume extractor when soldering. - Ask before probing anything mains-powered. + +Component inventories and bench notes are on the [member wiki](https://wiki.comogadget.casa/). diff --git a/content/tools/laser-cutter.md b/content/tools/laser-cutter.md index c15a350..eaf8a4a 100644 --- a/content/tools/laser-cutter.md +++ b/content/tools/laser-cutter.md @@ -1,7 +1,8 @@ --- title: Laser cutter subtitle: 80-watt CO₂ laser for cutting and engraving wood, acrylic, leather, and more. -description: OMTech 80W CO2 laser cutter at Columbia Gadget Works, Columbia MO. Cut and engrave plywood, acrylic, leather, paper, and fabric. Training required; free for members. +description: OMTech 80W CO2 laser cutter at Columbia Gadget Works, Columbia MO. Cut and engrave plywood, acrylic, leather, paper, and fabric. Training required; discounted for members. +zone: digital-fabrication weight: 10 image: gadget-works-sign.jpg imageAlt: "A laser-cut orange \"Gadget Works\" sign on a workbench with paint cans and cut-out parts" @@ -13,7 +14,6 @@ specs: - { label: Power, value: 80 W CO₂ tube } - { label: Bed, value: "20 × 28 in (approx.)" } - { label: Software, value: LightBurn (via LightBurn Bridge) } - - { label: Zone, value: Digital fabrication } --- The laser cutter is the most popular machine in the shop, and the one that brings the most first-time visitors through the door. It cuts and engraves by focusing an invisible infrared beam onto the material: through plywood and acrylic up to roughly a quarter inch in one pass, and engraving photos, text, and patterns into wood, leather, glass, stone, and anodized aluminum. diff --git a/content/tools/machine-shop.md b/content/tools/machine-shop.md new file mode 100644 index 0000000..ae8bbd6 --- /dev/null +++ b/content/tools/machine-shop.md @@ -0,0 +1,42 @@ +--- +title: Machine shop +subtitle: A full-size Bridgeport mill and a Clausing lathe for precise metal parts. +description: Machining at Columbia Gadget Works, Columbia MO. Full-size Bridgeport vertical milling machine and Clausing metal lathe for steel, aluminum, and brass. Training required. +weight: 40 +zone: machining +image: metalworking-class.jpg +imageAlt: An instructor demonstrating the vertical milling machine to members during a class +training: true +openHackNight: true +wiki: https://wiki.comogadget.casa/ +specs: + - { label: Mill, value: Full-size Bridgeport vertical knee mill } + - { label: Lathe, value: Clausing engine lathe } + - { label: Materials, value: Steel, aluminum, brass, cast iron, plastics } + - { label: Also, value: Drill press, bandsaw, bench grinders, measuring tools } +--- + +The machine shop is where the heavy iron lives. A **full-size Bridgeport vertical mill** and a **Clausing engine lathe** let members work to a thousandth of an inch in steel, aluminum, and brass: shafts, bushings, brackets, fixtures, and replacement parts for machines that stopped being sold decades ago. These are the two machines that turn "I need a part that does not exist" into a part. + +**What people make:** custom motorcycle and car parts, tooling for the other machines in the shop, repairs for farm and shop equipment, precision fixtures, and the occasional battlebot chassis. + +## The Bridgeport + +The Bridgeport is the archetypal knee mill and the reason so many small shops can make anything at all. The head tilts and swivels, the table moves in three axes, and with the right workholding it will drill, bore, face, slot, and cut keyways. It is a forgiving machine to learn on and an unforgiving one to rush. + +## The Clausing + +The lathe turns round things: facing, turning to diameter, drilling on center, boring, parting, and single-point threading. Most people's first lathe project is a simple shaft or a knurled handle, and most people are surprised how quickly it becomes the machine they reach for. + +## Training + +Both machines require training before solo use. They can seriously hurt an untrained operator, and they are also the machines most easily damaged by a bad cut. Training is one-on-one with the zone lead or a qualified member, and covers: + +- **Mill:** tramming, workholding in the vise, edge-finding, reading the DRO, speeds and feeds, climb vs. conventional cuts. +- **Lathe:** chucking, tool setup and height, facing, turning, drilling, parting, and threading. + +Our machining instructor runs periodic classes on the mill and lathe (see [classes](/classes/)), and a Thursday-night demo is always available. Setup notes and tooling inventories live on the [member wiki](https://wiki.comogadget.casa/). + +## Safety + +Safety glasses always. **No gloves at the mill or lathe**, ever: a glove that catches takes your hand with it. No loose clothing, jewelry, or long hair. Never leave a chuck key in a chuck. If you are not sure, stop and ask. diff --git a/content/tools/metal-casting.md b/content/tools/metal-casting.md index dde3684..9bd1aee 100644 --- a/content/tools/metal-casting.md +++ b/content/tools/metal-casting.md @@ -1,17 +1,19 @@ --- -title: Metal casting -subtitle: Turn a 3D print into a solid metal part. -description: Metal casting at Columbia Gadget Works, Columbia MO. Plaster investment casting from 3D-printed patterns in aluminum, zinc, and pewter. Free classes offered. +title: Metal casting and heat treating +linkTitle: Casting and heat treating +subtitle: Turn a 3D print into a solid metal part, and harden the parts you machine. +description: Metal casting and heat treating at Columbia Gadget Works, Columbia MO. Plaster investment casting from 3D-printed patterns in aluminum, plus a kiln for heat treating tool steel. Free classes offered. +zone: metalworking weight: 50 image: metal-casting-parts.jpg imageAlt: Small cast brass pieces including a Star Trek insignia lying on a white surface training: true openHackNight: false +wiki: https://wiki.comogadget.casa/ specs: - { label: Method, value: Plaster investment casting from 3D-printed patterns } - - { label: Metals, value: Aluminum, zinc alloys, pewter, brass (with care) } - - { label: Equipment, value: Propane furnace, crucibles, burnout kiln, flasks, safety gear } - - { label: Zone, value: Casting } + - { label: Metals, value: Aluminum, brass (with care) } + - { label: Equipment, value: Propane furnace, crucibles, kiln, flasks, safety gear } --- Casting is the shop's newest capability and one of its most satisfying. Print a pattern on the [3D printers](/tools/3d-printers/), invest it in plaster, burn out the plastic in the kiln, and pour molten metal into the cavity that's left. An hour later you're holding a solid metal version of whatever you printed. Members have cast pendants, badges, replacement hardware, knobs, and small sculptures. @@ -28,6 +30,10 @@ The process, roughly: Because it involves molten metal, casting is only done with a trained member present. The good news: we teach it regularly as a free class. Our first metal casting class in February 2026 filled up fast, and we'll run it again. See [classes](/classes/) and the [recap](/news/metal-casting-class-recap/). +## Heat treating + +The same kiln that burns out casting molds does **heat treating**: harden a tool-steel part you cut on the [lathe or mill](/tools/machine-shop/), temper it back to a usable toughness, or anneal a piece that work-hardened on you. Controlled, repeatable temperature is the whole game, and it is the one thing a torch cannot give you. Bring a plan for your alloy, because the quench and tempering temperatures are specific to it; the [member wiki](https://wiki.comogadget.casa/) has the schedules we have used before. + ## Safety Face shield, leather gloves and apron, long pants, and closed-toe leather shoes are required for anyone near the furnace. Moisture and molten metal are an explosive combination, so molds are dried thoroughly and tools are preheated before they touch the melt. diff --git a/content/tools/metal-shop.md b/content/tools/metal-shop.md deleted file mode 100644 index 70a3b91..0000000 --- a/content/tools/metal-shop.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -title: Metal shop -subtitle: Manual milling machine, metal lathe, welders, and the tools to go with them. -description: Metalworking at Columbia Gadget Works, Columbia MO. Vertical milling machine, metal lathe, MIG and TIG welding, chop saw, grinders, and drill press. Training required. -weight: 40 -image: metalworking-class.jpg -imageAlt: An instructor demonstrating the vertical milling machine to members during a class -training: true -openHackNight: true -specs: - - { label: Mill, value: Bridgeport vertical knee mill } - - { label: Lathe, value: Clausing engine lathe } - - { label: Welding, value: MIG, TIG, and stick } - - { label: Also, value: Drill press, bandsaw, chop saw, bench grinders, belt sander, hand tools } - - { label: Zone, value: Metalworking } ---- - -The metal shop is where the heavy iron lives. A Bridgeport vertical milling machine and a Clausing engine lathe let members make precise parts in steel, aluminum, and brass: shafts, bushings, brackets, fixtures, and repairs for machines that stopped being sold decades ago. Welders, a bandsaw, a chop saw, grinders, and a drill press round out the zone for fabrication work: frames, carts, brackets, and art. - -**What people make:** custom motorcycle and car parts, tooling for the other machines in the shop, repairs for farm and shop equipment, steel furniture, and the occasional battlebot. - - - -## Training - -Every machine in the metal shop requires training before solo use. The mill and lathe can seriously hurt an untrained operator, and they're also the machines most easily damaged by a bad cut. Training is one-on-one with the zone lead or a qualified member and typically covers: - -- **Mill:** tramming, workholding in the vise, edge-finding, reading the DRO, speeds and feeds, climb vs. conventional cuts. -- **Lathe:** chucking, tool setup and height, facing, turning, drilling, parting, and threading. -- **Welding:** machine setup, safety gear, ventilation, fire watch, and a supervised session on scrap. - -Our metalworking instructor runs periodic classes on the mill and lathe (see [classes](/classes/)), and a Thursday-night demo is always available. - -## Safety - -Safety glasses always. No gloves at the mill or lathe. No loose clothing, jewelry, or long hair. Never leave a chuck key in a chuck. If you're not sure, stop and ask. diff --git a/content/tools/welding.md b/content/tools/welding.md new file mode 100644 index 0000000..ca5d6ae --- /dev/null +++ b/content/tools/welding.md @@ -0,0 +1,40 @@ +--- +title: Welding and fabrication +subtitle: MIG, TIG, and stick, plus the saws and grinders to prep and finish the work. +description: Welding at Columbia Gadget Works, Columbia MO. MIG, TIG, and stick welding, chop saw, grinders, and fabrication tools. Training and a supervised session required. +weight: 55 +zone: metalworking +training: true +openHackNight: true +wiki: https://wiki.comogadget.casa/ +specs: + - { label: Processes, value: MIG, TIG, and stick } + - { label: Prep and finish, value: Chop saw, bandsaw, angle grinders, belt sander } + - { label: Materials, value: Mild steel, stainless, aluminum (TIG) } + - { label: Gear, value: Auto-darkening helmets, leathers, gloves, fire blanket } +--- + +Welding is how flat stock becomes a frame, a cart, a bracket, a gate, or a sculpture. The shop runs three processes, and which one you want depends on the job: + +- **MIG** is the fastest to learn and the right choice for most mild-steel fabrication. If you have never welded before, you will start here. +- **TIG** is slower, far more controllable, and what you need for thin material, aluminum, stainless, and anything where the bead is going to be visible. +- **Stick** handles dirty, rusty, or outdoor work that the other two would fight you on. + +Around the welders sit the tools that make up most of the actual work: a chop saw and bandsaw for cutting stock to length, angle grinders for prep and cleanup, a belt sander, clamps, and a steel welding table. + +**What people make:** shop carts and fixtures, trailer and vehicle repairs, furniture frames, garden and yard hardware, art, and battlebot armor. + + + +## Training + +Welding requires training and a supervised session on scrap before you strike an arc alone. Training covers machine setup and settings, shielding gas, the safety gear, ventilation, and fire watch. Expect an hour for the basics and a fair amount of practice after that, because welding is a skill you build rather than a procedure you follow. Settings cheat sheets for common material thicknesses are on the [member wiki](https://wiki.comogadget.casa/). + +## Safety + +Welding makes ultraviolet light, sparks, fumes, and very hot metal, in that order of sneakiness. + +- Helmet down, and warn anyone nearby before you strike. Arc flash is a sunburn on your eyes and you will not feel it until hours later. +- Leathers, gloves, closed-toe leather boots, and no synthetic clothing. Polyester melts. +- Ventilation on. Never weld galvanized, plated, or painted stock without stripping it first. +- Fire watch after you finish. Nothing flammable within the work area, and check the area again before you leave. diff --git a/content/tools/woodshop.md b/content/tools/woodshop.md index d53ac7c..9fdd1e8 100644 --- a/content/tools/woodshop.md +++ b/content/tools/woodshop.md @@ -2,6 +2,7 @@ title: Woodshop subtitle: Table saw, sanders, and the hand tools for everything from shelves to fine furniture. description: Woodworking shop at Columbia Gadget Works makerspace, Columbia MO. Table saw, miter saw, band saw, planer, sanders, router table, and hand tools. Training required for power saws. +zone: woodworking weight: 70 image: woodshop.jpg imageAlt: "Woodshop workbench with a vise and clamps; a miter saw, drill press, and bench grinder along the wall behind it" @@ -11,7 +12,6 @@ specs: - { label: Saws, value: Table saw, miter saw, band saw, jigsaws } - { label: Surfacing, value: Planer, belt and orbital sanders } - { label: Also, value: Router table, drill press, clamps, hand tools, dust collection } - - { label: Zone, value: Woodworking } --- The woodshop covers the basics well: a table saw for ripping and crosscutting sheet goods and boards, a miter saw for quick accurate cuts, a band saw for curves, a planer, a router table, sanders, a drill press, and a wall of clamps. Combined with the [CNC router](/tools/cnc-router/) and [laser cutter](/tools/laser-cutter/) next door, members build furniture, shop fixtures, speaker cabinets, enclosures, signs, and the occasional canoe paddle. @@ -27,4 +27,6 @@ The **table saw** requires training before solo use; it's the tool that causes t - Dust collection on for every machine that has a port. - Eye protection always; hearing protection is on the wall and you'll want it. - Check boards for nails and screws before they touch a blade. -- Clean the machines and floor when you're done. Sawdust is the woodshop's main product and it needs to go in the bin, not the metal shop. +- Clean the machines and floor when you're done. Sawdust is the woodshop's main product and it needs to go in the bin, not the machine shop. + +Setup notes, blade inventories, and finishing schedules live on the [member wiki](https://wiki.comogadget.casa/). diff --git a/content/visit.md b/content/visit.md index 8e090fc..1513542 100644 --- a/content/visit.md +++ b/content/visit.md @@ -44,4 +44,4 @@ Most day-to-day chatter (who's coming Thursday, class announcements, "does anyon

Ask a question Join the Discord

-Ready for more than Thursdays? [Membership](/membership/) gets you 24/7 access. +Ready for more than Thursdays? [Membership](/membership/) gets you 24/7 access, and our [member wiki](https://wiki.comogadget.casa/) has the tool guides and policies once you join. diff --git a/data/zones.yaml b/data/zones.yaml new file mode 100644 index 0000000..f0353cb --- /dev/null +++ b/data/zones.yaml @@ -0,0 +1,26 @@ +# Shop zones. Each tool page sets `zone:` to one of these ids. +# `accent` is used for text and rules; keep it dark enough for AA contrast on white. +- id: woodworking + name: Woodworking + accent: "#AB501B" + summary: Saws, sanders, and the router table, plus the CNC router that cuts parts too fussy to do by hand. +- id: machining + name: Machining + accent: "#A8271F" + summary: A full-size Bridgeport mill and a Clausing lathe for precise metal parts, one thousandth at a time. +- id: digital-fabrication + name: Digital fabrication + accent: "#1B5C9E" + summary: Two 3D printers and an 80-watt laser cutter, for going from a file to a finished part. +- id: electronics + name: Electronics + accent: "#A32167" + summary: Soldering stations and test equipment, and the most beginner-friendly bench in the building. +- id: crafting + name: Crafting + accent: "#2E7A4A" + summary: Sewing, vinyl, paint, and the general-purpose bench space for projects that are not made of metal. +- id: metalworking + name: Metalworking + accent: "#886800" + summary: The kiln for casting and heat treating, plus MIG, TIG, and stick welding. diff --git a/dns/columbiagadgetworks.org.zone b/dns/columbiagadgetworks.org.zone index e0ebf6a..7855c42 100644 --- a/dns/columbiagadgetworks.org.zone +++ b/dns/columbiagadgetworks.org.zone @@ -5,22 +5,22 @@ $ORIGIN columbiagadgetworks.org. $TTL 300 -;; Website (WordPress.com) — replaced by the Worker custom domain at cutover +;; Website (WordPress.com), replaced by the Worker custom domain at cutover @ IN A 192.0.78.145 @ IN A 192.0.78.198 www IN CNAME columbiagadgetworks.org. -;; Google Workspace mail — must be preserved exactly +;; Google Workspace mail, must be preserved exactly @ IN MX 1 smtp.google.com. @ IN TXT "v=spf1 include:_spf.google.com include:_spf.wpcloud.com ~all" _dmarc IN TXT "v=DMARC1;p=none;" google._domainkey IN TXT "v=DKIM1;k=rsa;p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh9V6IVDbSSe5p8xPugt5DtKLHo3zeVm9X9bkc7svWRbiK9mdq9Rl3A9/87i42RMUBoNtoFWKNR7A8DNOmG001qPqtw7FhtvIZQtXZGVP0gsLAQJC+CE+FQKYKsi0Qaxd3N3oU4wl/Fthe1JPp3QG0Pm/5vOIX9kEjNAfPjKj6YWw6D0BktaqHt5NdHqwUlF/S1h/pGuauFs+VXUDfelMDUuLue4yBh+Ik6AIwmgCoNNvj71RaGSsCAEhBK1ivGkOR+/51d8x4231v2QtI9Nlqv2ukfEb1pK1NMKpp91JZ2Iz2/kGnC0e+1qzcmZUSU7p+TFfa8BIOCYzfYPxT7LNUwIDAQAB" -;; WordPress.com outbound-mail DKIM — keep until the WordPress.com plan is cancelled +;; WordPress.com outbound-mail DKIM, keep until the WordPress.com plan is cancelled wpcloud1._domainkey IN CNAME wpcloud1._domainkey.wpcloud.com. wpcloud2._domainkey IN CNAME wpcloud2._domainkey.wpcloud.com. -;; Google domain verification (Workspace / Google-hosted) — keep +;; Google domain verification (Workspace / Google-hosted), keep vgqemn6x7kjj IN CNAME gv-vze2kqff7cvjlo.dv.googlehosted.com. ;; Not carried over: TXT _domainconnect (WordPress.com's DNS-management hook; meaningless once DNS leaves WordPress.com) diff --git a/docs/launch-checklist.md b/docs/launch-checklist.md index a2fdbe8..00c5ac2 100644 --- a/docs/launch-checklist.md +++ b/docs/launch-checklist.md @@ -4,19 +4,19 @@ Status as of 2026-09-20: the Hugo site is live at https://columbiagadgetworks.or repo's `main` branch to a Cloudflare Worker in the CGW Cloudflare account. DNS is on Cloudflare; the registrar is Namecheap. What remains, in order. -## 1. Force HTTPS (Cloudflare, 2 minutes) — DONE 2026-09-20 +## 1. Force HTTPS (Cloudflare, 2 minutes): DONE 2026-09-20 1. Cloudflare dashboard → **columbiagadgetworks.org** → **SSL/TLS** → **Edge Certificates**. 2. Turn on **Always Use HTTPS**. 3. Check: `curl -sI http://columbiagadgetworks.org/ | head -3` should show `301` with a `location: https://…` line. -## 2. Redirect www to the root domain (Cloudflare, 2 minutes) — DONE 2026-09-20 +## 2. Redirect www to the root domain (Cloudflare, 2 minutes): DONE 2026-09-20 1. Domain → **Rules** → **Overview** → **Create rule** → **Redirect Rule**. 2. Pick the template **Redirect from WWW to Root**, deploy it. 3. Check: `curl -sI https://www.columbiagadgetworks.org/ | head -3` should show `301` to the apex. -## 3. Turn on the contact form (Discord + Cloudflare, 10 minutes) — DONE 2026-09-20 +## 3. Turn on the contact form (Discord + Cloudflare, 10 minutes): DONE 2026-09-20 1. In Discord, create a private text channel, e.g. `#website-contact`, visible to officers and whoever answers inquiries. 2. Server Settings → **Integrations** → **Webhooks** → **New Webhook**. Name it "Website contact form", set its channel, **Copy Webhook URL**. diff --git a/hugo.toml b/hugo.toml index b575d5f..f54b411 100644 --- a/hugo.toml +++ b/hugo.toml @@ -49,6 +49,7 @@ disableKinds = ["taxonomy", "term"] mapsQuery = "Columbia Gadget Works, 1404 Grand Ave, Columbia, MO 65203" calendarEmbedUrl = "" # optional: public Google Calendar embed URL; shown on /events/ when set contactEndpoint = "/api/contact" # handled by the Worker in src/index.js + subscribeEndpoint = "/api/subscribe" # handled by the Worker in src/subscribe.js turnstileSiteKey = "" # optional: Cloudflare Turnstile site key for the contact form [menus] diff --git a/layouts/_partials/footer.html b/layouts/_partials/footer.html index ede4779..0c71f41 100644 --- a/layouts/_partials/footer.html +++ b/layouts/_partials/footer.html @@ -13,7 +13,7 @@ {{ $p.email }}
{{ $p.phone }} -

Contact form →

+

Contact form

diff --git a/layouts/_partials/jsonld.html b/layouts/_partials/jsonld.html index 3b847d3..2665ca4 100644 --- a/layouts/_partials/jsonld.html +++ b/layouts/_partials/jsonld.html @@ -5,21 +5,21 @@ "@type": ["NGO", "LocalBusiness"], "name": "Columbia Gadget Works", "alternateName": "CGW", - "url": {{ site.BaseURL | jsonify }}, - "logo": {{ "/img/cgw-gear.png" | absURL | jsonify }}, - "image": {{ "/img/og-default.jpg" | absURL | jsonify }}, - "description": {{ $p.description | jsonify }}, - "foundingDate": {{ $p.founded | jsonify }}, + "url": {{ site.BaseURL }}, + "logo": {{ "/img/cgw-gear.png" | absURL }}, + "image": {{ "/img/og-default.jpg" | absURL }}, + "description": {{ $p.description }}, + "foundingDate": {{ $p.founded }}, "nonprofitStatus": "Nonprofit501c3", - "taxID": {{ $p.ein | jsonify }}, - "email": {{ $p.email | jsonify }}, - "telephone": {{ $p.phoneHref | jsonify }}, + "taxID": {{ $p.ein }}, + "email": {{ $p.email }}, + "telephone": {{ $p.phoneHref }}, "address": { "@type": "PostalAddress", - "streetAddress": {{ $p.addressStreet | jsonify }}, - "addressLocality": {{ $p.addressCity | jsonify }}, - "addressRegion": {{ $p.addressState | jsonify }}, - "postalCode": {{ $p.addressZip | jsonify }}, + "streetAddress": {{ $p.addressStreet }}, + "addressLocality": {{ $p.addressCity }}, + "addressRegion": {{ $p.addressState }}, + "postalCode": {{ $p.addressZip }}, "addressCountry": "US" }, "openingHoursSpecification": [{ @@ -30,10 +30,10 @@ "description": "Free Open Hack Night, open to the public" }], "sameAs": [ - {{ $p.facebook | jsonify }}, - {{ $p.bluesky | jsonify }}, - {{ $p.github | jsonify }}, - {{ $p.wiki | jsonify }} + {{ $p.facebook }}, + {{ $p.bluesky }}, + {{ $p.github }}, + {{ $p.wiki }} ] } diff --git a/layouts/_partials/video-home.html b/layouts/_partials/video-home.html new file mode 100644 index 0000000..57c46f5 --- /dev/null +++ b/layouts/_partials/video-home.html @@ -0,0 +1,8 @@ +{{- $poster := resources.Get "img/battlebots-arena.jpg" -}} +
+ +
Two combat robots in the member-built Chamber of Robotic Aggression.
+
diff --git a/layouts/_shortcodes/subscribe.html b/layouts/_shortcodes/subscribe.html new file mode 100644 index 0000000..7755b1e --- /dev/null +++ b/layouts/_shortcodes/subscribe.html @@ -0,0 +1,77 @@ +{{- /* Class and event announcement signup. + {{< subscribe >}} or {{< subscribe source="events" redirect="/events/?subscribe=ok" >}} */ -}} +{{- $p := site.Params -}} +{{- $source := .Get "source" | default .Page.File.ContentBaseName -}} +{{- $redirect := .Get "redirect" | default (printf "%s?subscribe=ok" .Page.RelPermalink) -}} + + diff --git a/layouts/_shortcodes/video.html b/layouts/_shortcodes/video.html new file mode 100644 index 0000000..8aa2738 --- /dev/null +++ b/layouts/_shortcodes/video.html @@ -0,0 +1,36 @@ +{{- /* Self-hosted video. No third-party player, no tracking, nothing loaded until + the visitor presses play. Usage: + {{< video src="/video/foo.mp4" poster="foo.jpg" caption="..." >}} */ -}} +{{- $src := .Get "src" -}} +{{- if not $src }}{{ errorf "video shortcode: src is required (%s)" .Position }}{{ end -}} +{{- $w := .Get "width" | default "854" -}} +{{- $h := .Get "height" | default "480" -}} +{{- $posterURL := "" -}} +{{- with .Get "poster" -}} + {{- $p := resources.Get (printf "img/%s" .) -}} + {{- if not $p }}{{ errorf "video shortcode: assets/img/%s not found (%s)" . $.Position }}{{ end -}} + {{- $posterURL = ($p.Resize "854x q72").RelPermalink -}} +{{- end -}} +
+ + {{- with .Get "caption" }} +
{{ . | markdownify }}
+ {{- end }} +
+{{- /* VideoObject so the clip can surface in search rather than being invisible. */ -}} +{{- $name := .Get "name" | default $.Page.Title -}} +{{- $desc := .Get "caption" | default $.Page.Description -}} + diff --git a/layouts/home.html b/layouts/home.html index 37efa42..f49083d 100644 --- a/layouts/home.html +++ b/layouts/home.html @@ -19,17 +19,17 @@

A community workshop where anyone can learn, build, and fix things.

Visit on a Thursday

Open Hack Night is free and open to everyone. Take a tour, meet members, use the basic tools, and bring a broken thing to fix. Walk in the door on Grand Avenue between 6 and 8 pm.

- What to expect → + What to expect

Take a class

Members teach free and low-cost classes on soldering, metal casting, machining, and more. Most are announced a couple of weeks ahead on Discord and here.

- Classes and workshops → + Classes and workshops

Become a member

Members get 24/7 access to the shop, a project locker, discounts on classes, and a vote in how the space is run. Dues pay the rent and keep Thursday nights free.

- Membership details → + Membership details
@@ -38,19 +38,32 @@

Become a member

The shop

-

Equipment most people could never fit in a garage, shared like a library.

+

Equipment most people could never fit in a garage, shared like a library, and organized into six zones with a volunteer lead looking after each one.

{{ $tools := where site.RegularPages "Section" "tools" }} -

See all tools and training requirements

+

Browse the shop by zone

+
+ + +
+
+
+

What a Thursday can turn into

+

Members built a battle box out of steel, plywood, and polycarbonate, called it the Chamber of Robotic Aggression, and started putting robots in it. A combat robot touches nearly every zone in the building: welded frame, machined parts, printed wedges, and drive electronics from the bench.

+

Read about the arena

+
+
+ {{ partial "video-home.html" . }} +
@@ -58,7 +71,7 @@

The shop

Coming up

{{ partial "events.html" (dict "limit" 4) }} -

Full calendar →

+

Full calendar

News from the shop

@@ -67,7 +80,7 @@

News from the shop

  • {{ .Title }}
  • {{ end }} -

    All news →

    +

    All news

    diff --git a/layouts/list.html b/layouts/list.html index e7de064..120d620 100644 --- a/layouts/list.html +++ b/layouts/list.html @@ -7,7 +7,7 @@

    {{ .Title }}

    {{ .Content }}
      {{ range .Pages }} -
    • {{ .Title }}{{ with .Params.subtitle }} — {{ . }}{{ end }}
    • +
    • {{ .Title }}{{ with .Params.subtitle }} {{ . }}{{ end }}
    • {{ end }}
    diff --git a/layouts/single.html b/layouts/single.html index 21177e1..d98018d 100644 --- a/layouts/single.html +++ b/layouts/single.html @@ -5,7 +5,9 @@

    {{ .Title }}

    {{ with .Params.subtitle }}

    {{ . }}

    {{ end }} {{ with .Params.image }}
    {{ partial "img.html" (dict "src" . "alt" ($.Params.imageAlt | default "") "sizes" "(min-width: 900px) 860px, 100vw" "loading" "eager") }}
    {{ end }} -
    + {{/* `wide: true` in front matter drops the 72ch reading measure so pages that + lay themselves out in columns can use the full wrap. */}} +
    {{ .Content }}
    diff --git a/layouts/tools/list.html b/layouts/tools/list.html index d67becc..a7578a0 100644 --- a/layouts/tools/list.html +++ b/layouts/tools/list.html @@ -5,22 +5,55 @@

    {{ .Title }}

    {{ with .Params.subtitle }}

    {{ . }}

    {{ end }}
    {{ .Content }}
    - + + {{- $tools := .Pages -}} + + + {{- range hugo.Data.zones }} + {{- $zid := .id }}{{ $zname := .name }}{{ $zsummary := .summary }} + {{- with sort (where $tools "Params.zone" $zid) "Weight" }} +
    +
    +

    {{ $zname }}

    +

    {{ $zsummary }}

    +
    + +
    + {{- end -}} + {{- end }} + +
    +

    Not sure where to start?

    +

    Come to Open Hack Night on a Thursday and ask for a tour. You will get a walk through every zone in about ten minutes, and you can try the beginner-friendly tools the same evening. Operating guides, material settings, and maintenance logs for everything here live on the member wiki.

    +
    {{ end }} diff --git a/layouts/tools/single.html b/layouts/tools/single.html index 5164e62..1765e63 100644 --- a/layouts/tools/single.html +++ b/layouts/tools/single.html @@ -1,7 +1,13 @@ {{ define "main" }} -
    +{{- $zid := .Params.zone -}} +{{- $zone := "" -}} +{{- with where hugo.Data.zones "id" $zid }}{{ $zone = index . 0 }}{{ end -}} +
    -

    Tools

    +

    + Tools + {{- with $zone }} {{ .name }}{{ end -}} +

    {{ .Title }}

    {{ with .Params.subtitle }}

    {{ . }}

    {{ end }}

    @@ -14,6 +20,7 @@

    {{ .Title }}