diff --git a/README.md b/README.md index 1d20e03..6319fa6 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,11 @@ 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 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 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 +40,35 @@ 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 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`. +## 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`. + +## Spam protection (Turnstile) + +The contact form uses Turnstile when configured. **Set both halves or neither:** +`params.turnstileSiteKey` in `hugo.toml`, and `TURNSTILE_SECRET` as a Worker secret. +If the secret is set but the site key has not deployed, the form renders no widget, sends no +token, and every submission is rejected. Deploy the site key first. + ## 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.) - Update `data/events.yaml` whenever a class is scheduled. ## License diff --git a/assets/css/site.css b/assets/css/site.css index e084225..37b8536 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} @@ -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} @@ -215,5 +222,14 @@ 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}} +/* 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} +.two-col.feature{align-items:center} +.two-col.feature h2{margin-top: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..2b51ef6 100644 --- a/content/about.md +++ b/content/about.md @@ -31,7 +31,7 @@ Columbia Gadget Works is a **membership organization**. Every member in good sta 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. -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..610512a 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,13 +24,11 @@ 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 @@ -46,7 +44,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/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..6c1109f --- /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 corner of the building, which is part of why we like them: + +- The chassis and armor get cut, welded, and machined in the [metal shop](/tools/metal-shop/), on the Bridgeport and the Clausing 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 the [woodshop](/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/privacy.md b/content/privacy.md index 7046b76..de2143a 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. diff --git a/content/tools/3d-printers.md b/content/tools/3d-printers.md index 520ef65..eee9dd9 100644 --- a/content/tools/3d-printers.md +++ b/content/tools/3d-printers.md @@ -1,10 +1,10 @@ --- 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. weight: 30 image: 3d-printers.webp -imageAlt: "A hand holding a plaster mold that was made from a 3D-printed pattern" +imageAlt: "An open-frame Bambu Lab A1 and an enclosed X1 Carbon side by side on a bench, with an AMS filament changer on top and spools between them" training: false openHackNight: true wiki: https://wiki.comogadget.casa/index.php/3D_printers diff --git a/content/tools/_index.md b/content/tools/_index.md index 10a456d..0feec26 100644 --- a/content/tools/_index.md +++ b/content/tools/_index.md @@ -7,4 +7,4 @@ description: "Equipment at Columbia Gadget Works makerspace in Columbia, MO: 80W 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/). -**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/electronics-bench.md b/content/tools/electronics-bench.md index 5ad9c32..09b791c 100644 --- a/content/tools/electronics-bench.md +++ b/content/tools/electronics-bench.md @@ -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 42da8f7..d512102 100644 --- a/content/tools/laser-cutter.md +++ b/content/tools/laser-cutter.md @@ -1,10 +1,10 @@ --- 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. weight: 10 image: laser-cutter.webp -imageAlt: "A laser-cut orange \"Gadget Works\" sign on a workbench with paint cans and cut-out parts" +imageAlt: "The laser cutter with its lid raised, engraved wooden panels resting on the honeycomb bed" training: true openHackNight: true wiki: https://wiki.comogadget.casa/index.php/Laser_Cutter diff --git a/content/tools/metal-casting.md b/content/tools/metal-casting.md index dde3684..87946a1 100644 --- a/content/tools/metal-casting.md +++ b/content/tools/metal-casting.md @@ -1,7 +1,7 @@ --- 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. +description: Metal casting at Columbia Gadget Works, Columbia MO. Plaster investment casting from 3D-printed patterns in aluminum. Free classes offered. weight: 50 image: metal-casting-parts.jpg imageAlt: Small cast brass pieces including a Star Trek insignia lying on a white surface @@ -9,7 +9,7 @@ training: true openHackNight: false specs: - { label: Method, value: Plaster investment casting from 3D-printed patterns } - - { label: Metals, value: Aluminum, zinc alloys, pewter, brass (with care) } + - { label: Metals, value: Aluminum, brass (with care) } - { label: Equipment, value: Propane furnace, crucibles, burnout kiln, flasks, safety gear } - { label: Zone, value: Casting } --- diff --git a/content/tools/metal-shop.md b/content/tools/metal-shop.md index 70a3b91..53f848c 100644 --- a/content/tools/metal-shop.md +++ b/content/tools/metal-shop.md @@ -31,6 +31,8 @@ Every machine in the metal shop requires training before solo use. The mill and Our metalworking 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. 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/woodshop.md b/content/tools/woodshop.md index d53ac7c..cadd5ba 100644 --- a/content/tools/woodshop.md +++ b/content/tools/woodshop.md @@ -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. + +Setup notes, blade inventories, and finishing schedules live on the [member wiki](https://wiki.comogadget.casa/). - 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. 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/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/layouts/_partials/footer.html b/layouts/_partials/footer.html index ede4779..f596101 100644 --- a/layouts/_partials/footer.html +++ b/layouts/_partials/footer.html @@ -13,7 +13,7 @@ {{ $p.email }}
{{ $p.phone }} -

Contact form →

+

Contact form

@@ -54,11 +54,24 @@

The shop

+
+
+
+

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" . }} +
+
+
+

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..67b2e52 100644 --- a/layouts/tools/list.html +++ b/layouts/tools/list.html @@ -17,7 +17,7 @@

    {{ .Title }}

    {{ if .Params.training }}Training required{{ else }}Open to members{{ end }} {{ if .Params.openHackNight }}Try it on a Thursday{{ end }}

    - Details → + Details
    {{ end }} diff --git a/punchlist.md b/punchlist.md index 88b54c5..c6fcb42 100644 --- a/punchlist.md +++ b/punchlist.md @@ -6,10 +6,10 @@ Quick fixes Small changes with outsized effect on how the site reads to a reviewer. All of these are doable in an afternoon. Add a heading block to the homepage -Real body text above the post loop — not a theme header image, not an image caption. An H1, the mission sentence, the Thursday Open Hack line, and two buttons: Plan Your Visit and Donate. Right now a reviewer landing on the homepage sees six post thumbnails and no statement of what CGW is. +Real body text above the post loop, not a theme header image, not an image caption. An H1, the mission sentence, the Thursday Open Hack line, and two buttons: Plan Your Visit and Donate. Right now a reviewer landing on the homepage sees six post thumbnails and no statement of what CGW is. Rebuild the menu from the page list -Select pages from the page picker rather than pasting URLs, then assign the menu to every location the theme offers — including the front page template. The homepage and interior pages currently show two different menus, which is the exact "confusing navigation" failure Google names. +Select pages from the page picker rather than pasting URLs, then assign the menu to every location the theme offers, including the front page template. The homepage and interior pages currently show two different menus, which is the exact "confusing navigation" failure Google names. Appearance → Menus Move Discord and the Wiki to the footer @@ -41,10 +41,10 @@ Create /tools Laser cutter, CNC router, mill and lathe, 3D printers, casting setup, electronics bench, woodshop. A paragraph and a photo for each, plus a note on what requires training first. Target 600+ words. -This is the highest-value page you don't have. It fixes the most content volume at once, and it's what people actually search for — "laser cutter near me" brings strangers to your door. +This is the highest-value page you don't have. It fixes the most content volume at once, and it's what people actually search for, "laser cutter near me" brings strangers to your door. Create /classes -Open Hack Night, plus the classes you've already run — metal casting, soldering, metalworking, milling. How to propose one, and how to hear about upcoming ones. Link out to the existing blog posts so they stop being orphaned. +Open Hack Night, plus the classes you've already run, metal casting, soldering, metalworking, milling. How to propose one, and how to hear about upcoming ones. Link out to the existing blog posts so they stop being orphaned. Create /contact Address, embedded Google Map, hours, phone, and a working contact form. @@ -56,7 +56,7 @@ Expand /visit past 80 words What a first-timer should expect: where to park on Grand, that they need to bring nothing, that no experience is required, who greets them, and what they'll walk in on. Lead with the Thursday visit and move Discord to the end. Expand /about toward 400 words -Add the founding story from 2017 to now, leadership or board, a link to the Form 990, and community impact. The mission copy that's there already is good — this is about giving it company. +Add the founding story from 2017 to now, leadership or board, a link to the Form 990, and community impact. The mission copy that's there already is good, this is about giving it company. Add a calendar with recurring events A real events calendar does double duty: it adds indexable content that refreshes itself, and it answers the question most first-time visitors actually have. @@ -73,7 +73,7 @@ Technical checks Speed and mobile performance are scored on real measurements, so these have to be run rather than reasoned about. Resize and compress the source images -The post thumbnails are full-resolution phone photos — pxl_20260213_005721747.jpg, pxl_20260116_014121971.jpg, pxl_20260227_010125431_1.jpg. Cap the long edge near 1600px and re-upload. +The post thumbnails are full-resolution phone photos, pxl_20260213_005721747.jpg, pxl_20260116_014121971.jpg, pxl_20260227_010125431_1.jpg. Cap the long edge near 1600px and re-upload. Run PageSpeed Insights on mobile Test the homepage and /donate at minimum, on the mobile tab. Fix whatever it flags. @@ -94,7 +94,7 @@ Empty the WordPress trash So no deleted page keeps squatting on the donate slug and forces WordPress to hand you donate-2. Standardize on mail@columbiagadgetworks.org -The footer currently shows a Gmail address while the About page shows the domain address. Use the domain address everywhere — it reads as a real organization, which is what Google is assessing. +The footer currently shows a Gmail address while the About page shows the domain address. Use the domain address everywhere, it reads as a real organization, which is what Google is assessing. Submit an XML sitemap to Search Console Once the new pages exist, so they're indexed before the application is reviewed. diff --git a/src/contact.js b/src/contact.js index 9ec78d7..2fca15c 100644 --- a/src/contact.js +++ b/src/contact.js @@ -1,8 +1,8 @@ // Contact form handler, mounted at POST /api/contact by src/index.js (Cloudflare Worker). // Forwards the contact form to a Discord channel via webhook. No third-party form service needed. // Environment variables (Workers & Pages → cgw-website → Settings → Variables and Secrets): -// DISCORD_WEBHOOK_URL (secret, required) — a webhook for the #website-contact channel -// TURNSTILE_SECRET (secret, optional) — enables Cloudflare Turnstile verification when the +// DISCORD_WEBHOOK_URL (secret, required) is a webhook for the #website-contact channel +// TURNSTILE_SECRET (secret, optional) enables Cloudflare Turnstile verification when the // site key is also set in hugo.toml (params.turnstileSiteKey) // // Rollout order matters: deploy the site key in hugo.toml FIRST, then add TURNSTILE_SECRET. diff --git a/static/_headers b/static/_headers index c5e3a83..ecf3105 100644 --- a/static/_headers +++ b/static/_headers @@ -8,3 +8,5 @@ Cache-Control: public, max-age=31536000, immutable /css/* Cache-Control: public, max-age=31536000, immutable +/video/* + Cache-Control: public, max-age=2592000 diff --git a/static/video/battlebots-arena.mp4 b/static/video/battlebots-arena.mp4 new file mode 100644 index 0000000..04c826b Binary files /dev/null and b/static/video/battlebots-arena.mp4 differ