Authoring


So You Want to Help Write the Wiki?

This wiki is a community effort. Every page someone writes makes it more useful for the next person who joins. You do not need to be a developer to contribute โ€” if you can write Markdown and use GitHub, you can add pages.

This guide covers two paths:

  • Just writing content โ€” the fast path. No local setup needed.
  • Full local setup โ€” for previewing changes before submitting, or making deeper edits to the site config and theme.

Path 1 โ€” Just Writing a Page

If you only want to add or edit content, you do not need Hugo installed. The wiki is just Markdown files. You can write one, open a pull request, and someone will review and merge it.

1. Fork and clone the repo

git clone https://github.com/dxcently/FAU-CSC-WIKI.git
cd FAU-CSC-WIKI

2. Create your file

All content lives under content/. The structure looks like this:

content/
โ”œโ”€โ”€ _index.md                     # Home page
โ”œโ”€โ”€ start/
โ”‚   โ””โ”€โ”€ _index.md                 # Section landing page
โ”œโ”€โ”€ toolbox/
โ”‚   โ””โ”€โ”€ _index.md
โ””โ”€โ”€ your-section/
    โ””โ”€โ”€ your-page.md              โ† your file goes here

Create a .md file in the right section. Every page needs a front matter block at the top:

+++
title = "Your Page Title"
weight = 2
+++
  • title โ€” shows up in the sidebar and as the page heading
  • weight โ€” controls order in the sidebar (lower number = higher up)
  • Add type = "chapter" for section landing pages to get the big header style

Write your content in plain Markdown below the front matter. That is it.

3. Submit a pull request

git checkout -b my-new-page
git add content/
git commit -m "add page: your topic here"
git push origin my-new-page

Open a pull request on GitHub. Someone will review it and merge it in.


Path 2 โ€” Full Local Setup

Do this if you want to preview the site before submitting, or if you are making changes beyond content โ€” config, menus, theme, etc.

Install Hugo

sudo snap install hugo
brew install hugo
winget install Hugo.Hugo.Extended

Verify:

hugo version

Run the dev server

hugo server

Open http://localhost:1313. The page live-reloads on every save. Use this to check that your page looks right before submitting.

Build the site

hugo

Outputs the static site to public/. You normally do not need this unless you are deploying.


Editing the Meeting Schedule

The schedule on the home page is the thing you will edit most. It lives in the front matter of content/_index.md โ€” not in a database, not in the theme. You edit Markdown, the site rebuilds, the page updates.

Add a meeting

Open content/_index.md and add one block per meeting:

[[params.sessions]]
  date  = "2026-10-02"
  title = "Active Directory workshop"
  track = "learn"
  lead  = "Officers"
  link  = "/learn/windows/active-directory/"
Field Required What it does
date yes "YYYY-MM-DD", in quotes. Drives everything below.
title yes What the meeting is about. Keep it one line.
room no Where it is. Leave it out and the row inherits the weekly room from [params.meeting]. Set it only when a session moves โ€” another room, another building, or "Online". An overridden room is highlighted so nobody skims past it.
track no Free text label shown on the right (general, learn, compete).
lead no Who is running it.
link no Where to send people who want to prepare. Internal paths start with /.
status no Manual override. See below.

The site works out the rest

You do not mark meetings as finished. The page compares each date to today:

  • date in the past โ†’ dimmed and struck through
  • date is today โ†’ TODAY, red bar
  • first date still ahead โ†’ NEXT, red bar
  • anything after that โ†’ plain upcoming row

Only one row ever gets a red bar. If a meeting is today, nothing is marked NEXT.

Overriding a row

Set status by hand only when reality disagrees with the calendar:

  status = "cancelled"   # meeting called off โ€” row is struck through
  status = "moved"       # date changed; say what happened in the title
  status = "done"        # force a row to read as finished

Order does not matter

Rows are sorted by date when the site builds. Add new meetings anywhere in the list.

Changing the recurring details

Day, time, and room live in one place near the top of the same file:

[params.meeting]
  day   = "Thursday"
  time  = "5:00 โ€“ 7:00 PM"
  room  = "CM 22"

Change the semester label and the note under the table in [params.schedule].


Adding a Page

Where a file lives decides where it appears. There is no separate menu to update.

Add a page to an existing section

Create content/<section>/<name>.md. Example โ€” a new page under Linux:

content/learn/linux/systemd.md
+++
title = "systemd"
weight = 4
description = "What systemd does, and how to read a unit file."
+++

weight orders it against its siblings โ€” lower numbers come first. description is the sentence shown on the section’s card grid, so do not skip it.

Add a whole new section

Create a directory with an _index.md in it:

content/learn/cloud/_index.md
+++
title = "Cloud Security"
weight = 10
description = "One sentence about what this section covers."
icon = "fa-solid fa-pen-ruler"
+++

Then add {{< section-grid >}} at the bottom of that _index.md and the section lists its own child pages automatically.

Editing a page that already exists

Find the file, change the words, save. Two things to keep in mind:

  • The URL comes from the file path. Renaming a file breaks every link to it. If you must rename, either add slug = "old-name" to keep the old URL, or grep the repo for the old path and fix every link:
    grep -rn "old-page-name" content/
  • description is what other pages show. If you change what a page is about, change its description too โ€” it appears on the parent section’s card grid, not just in the file.

Moving or deleting a page

git mv content/learn/linux/old.md content/learn/linux/new.md
grep -rn "linux/old" content/          # then fix what turns up

Deleting is the same minus the move. Always grep first โ€” a dead internal link is invisible until someone clicks it.

Reordering pages

weight sorts siblings, lowest first. Leave gaps (10, 20, 30) so you can slot something in later without renumbering everything.

Checking your work before you push

hugo server        # http://localhost:1313, reloads as you save
hugo --quiet       # must print nothing at all

hugo --quiet printing nothing is the pass condition. Any output is a problem, including warnings.

Then look at the page in the browser. A page that builds is not a page that reads well:

  • Does it appear in the sidebar where you expected?
  • Does its card show a sensible description on the parent section?
  • Do your links go where you meant?
  • Does it look right narrow? Drag the window thin, or open it on your phone.

Common mistakes

Symptom Cause
Page does not appear at all Missing front matter, or the +++ delimiters are ---
Page appears but the section does not The directory has no _index.md
Blank card on the section grid No description in front matter
Wrong order in the sidebar weight missing or duplicated between siblings
Link 404s Missing leading /, or missing trailing /
Build warning about relref Use a plain /path/ link instead of the relref shortcode
Your CSS change did nothing You edited themes/ โ€” that is a submodule; use assets/css/custom.css

Writing style

Read AGENTS.md in the repo root โ€” it carries the voice, the policy rules, and the plain-English guidelines every page follows. The short version: short sentences, active voice, define jargon the first time you use it, no filler, and never publish anything that points a reader at a system they are not allowed to touch.

Rules that keep the site consistent

  • Every page needs title, weight, and description.
  • Section landing pages are _index.md. Everything else is <name>.md.
  • Internal links start with / and end with / โ€” /learn/linux/permissions/.
  • Do not edit anything in themes/ โ€” it is a submodule and your changes will be lost. Site-wide styling goes in assets/css/custom.css.
  • Do not hand-edit public/ โ€” it is generated output.

Shortcodes (Fancy Formatting)

Shortcodes are Hugo’s way of doing things plain Markdown cannot. Use them sparingly โ€” plain text is usually enough and easier to maintain.

Shortcode What It Does
Notice Callout boxes (tip, warning, info, caution, etc)
Tabs Tabbed content for OS or environment differences
Expand Collapsible sections for optional content
Mermaid Diagrams and flowcharts rendered from text

Notice (Callout Boxes)

Use when something needs to stand out โ€” a warning, a tip, a gotcha. Two syntax options; both work the same way.

Short form (simpler to write):

> [!tip] Pro Tip
> Your tip text goes here.

Shortcode form (more control over the title text):

{{% notice style="warning" title="Heads Up" %}}
Something the reader should not skip.
{{% /notice %}}

Swap style= for: tip, warning, info, note, caution, important


Tabs

Use tabs when the same instructions differ by OS or environment and stacking them vertically would be cluttered.

Wrap everything in tabs, then put each option in its own tab block. The title= value is what appears on the clickable tab.

{{< tabs >}}
{{% tab title="Linux" %}}
Your Linux instructions here.
{{% /tab %}}
{{% tab title="Windows" %}}
Your Windows instructions here.
{{% /tab %}}
{{< /tabs >}}

Any normal Markdown works inside a tab block โ€” code, lists, paragraphs.


Expand (Collapsible Sections)

Use for content that is optional or would interrupt the flow โ€” full command output, a deeper explanation, a reference table. The section is collapsed by default; the reader opens it if they want it.

The title= is the label shown while collapsed.

{{% expand title="Show the full output..." %}}
Your hidden content here. Works with any Markdown inside.
{{% /expand %}}

Mermaid (Diagrams)

Renders diagrams from text. No image files, no external tools. Write the diagram definition between the tags.

{{< mermaid >}}
flowchart TD
    A[Start] --> B[Do a thing]
    B --> C[Done]
{{< /mermaid >}}

Mermaid supports flowcharts, sequence diagrams, state machines, Gantt charts, and more. The syntax differs per diagram type โ€” check the Mermaid docs for what you need.


The Club Mark โ€” Files You Can Drop In

If you are making a slide, a flyer, a Discord banner, or a page that needs the owl, take it from here rather than screenshotting it off the site. All six are SVG, so they scale to any size cleanly.

Every form comes in two grounds. Pick the one that matches what you are putting it on โ€” the dark files wash out on paper, the light files disappear on black.

Shield

The full lockup. The only form that brings its own base, so it survives anywhere. Use it when the mark stands alone: an avatar, a sticker, a slide corner.

Club owl mark inside a shield Club owl mark inside a shield Club owl mark inside a shield

dark ground ยท light ground

Owl head

No frame. Use it when it sits on a panel or beside text, where a second border is just clutter.

Club owl head without the shield Club owl head without the shield Club owl head without the shield

dark ground ยท light ground

Full owl

Head, folded wings, breast and talons โ€” the one on the home page. Use it where there is vertical room and the mark is the subject.

The full club owl with wings and talons The full club owl with wings and talons The full club owl with wings and talons

dark ground ยท light ground

The previews above swap with the theme โ€” flip it in the topbar and watch.

Before you use it anywhere official, read the rules on Logo & Brand: the palette, the clear space, the minimum sizes, and the FAU trademark warning. This owl is the club’s mark, not the university’s.


Front Matter Reference

Parameter Type Default What It Does
title string โ€” Page title
weight int โ€” Sidebar order (lower = higher up)
type string โ€” "home" or "chapter" for special layouts
hidden boolean false Hides the page from the sidebar
disableToc boolean false Hides the table of contents
disableNextPrev boolean false Hides the Next / Previous nav buttons

Deeper Edits โ€” Hugo Config and Theme

This section is for changes beyond content: menus, sidebar links, colors, config.

Key files

File What it controls
hugo.toml Site title, theme variant, sidebar menus, nav links
i18n/en.toml UI string overrides (e.g. sidebar section title)
assets/css/theme-hacker.css Color scheme โ€” Base16 Greenscreen palette

Shortcut links (Discord, GitHub, etc.) live in hugo.toml under [[menus.shortcuts]]. Add a new entry:

[[menus.shortcuts]]
  name = "<i class='fab fa-github'></i> GitHub"
  url = "https://github.com/your-repo"
  weight = 10

The sidebar section title (“Quick Links”) is set in i18n/en.toml.

Color scheme

The wiki uses a custom Hacker Terminal palette โ€” green on black. All colors are defined as CSS variables in assets/css/theme-hacker.css.

Base palette

Hex Role
#001100 Background (main + sidebar)
#002200 Slightly lighter bg (code, boxes)
#005500 Dark accent, borders, separators
#007700 Muted text, visited links
#009900 Secondary elements, H5/H6 headings
#00BB00 Main text, H3/H4 headings
#00FF00 H1/H2 titles, highlights, hover
#00FF88 Hyperlinks (cyan-green)
#00FFC8 Hyperlink hover state

Key CSS variables

Variable Value What it controls
--PRIMARY-color #00BB00 Primary brand color
--PRIMARY-HOVER-color #00FF00 Hover state
--MAIN-BG-color #001100 Page background
--MAIN-TEXT-color #00BB00 Body text
--MAIN-TITLES-TEXT-color #00FF00 H1 / H2 headings
--MAIN-LINK-color #00FF88 Hyperlinks
--CODE-BLOCK-BG-color #002200 Code block background
--CODE-BLOCK-BORDER-color #005500 Code block border
--CODE-INLINE-color #00FF00 Inline code text
--MENU-SECTIONS-BG-color #001100 Sidebar background
--MENU-VISITED-color #007700 Visited sidebar links

Edit assets/css/theme-hacker.css to change any of these. The theme variant is wired up in hugo.toml via themeVariant = 'hacker'.


Using AI to Write Pages

You do not have to write everything from scratch. An AI assistant can draft a Markdown page well, as long as you give it enough context and review what comes out.

What to tell it

  • The front matter format (TOML with +++ delimiters)
  • Which section the page belongs to
  • What it should cover
  • The tone: direct, practical, no filler

Example prompt:

Write a wiki page for a cybersecurity club. Front matter uses TOML with +++ delimiters.

+++
title = "Your Title"
weight = 2
+++

The page is about [topic]. Keep it direct and practical.
Cover: [list what you want].

If your tool reads the repo

Coding agents that run in a terminal read the repo before they write. Point one at the repo root and it picks up the rules on its own:

  • AGENTS.md โ€” one file, everything: build commands, site structure, the writing voice, FAU policy rules, and the Simplified Technical English rules. CLAUDE.md is a symlink to it, so either name loads the same thing.

Read both yourself before you write a page by hand. They apply to people too.

What to watch for

AI will confidently write things that are wrong. Read it before committing. If the page covers a specific tool or command, test that it actually works.

Cut any paragraph that says nothing. Phrases like “it’s important to note” or “feel free to explore” are filler โ€” delete them.


Questions?

Reach out on the Discord. No judgment โ€” we were all new to this once.

Next Logo & BrandThe club owl mark in both forms, with downloads, colours, and rules for using it.