Official website of THREAD, Filigran's annual conference for the threat intelligence and cyber defense community.
Live at thread.filigran.io — October 15, 2026, Les Jardins de Saint-Dominique, Paris.
All the text of the website lives in three files under src/content/.
Edit the text between quotes ("..."), commit to main, and the site redeploys
automatically in about a minute.
| File | What it contains |
|---|---|
src/content/site.ts |
Event name, date, venue, countdown, key figures, footer links, contact email |
src/content/sections.ts |
"Why THREAD" story, audiences, the five zones, speakers, Community Zone experiences |
src/content/agenda.ts |
The full agenda, track by track (instructions at the top of the file) |
src/content/sponsors.ts |
Sponsorship tier packages and the sponsor logo showcase |
Each file starts with a comment block explaining exactly how to edit it. You can do this entirely from the GitHub web interface: open the file, click the pencil icon, edit, and commit.
Speakers are managed in src/content/sections.ts and shown in
two places: the teaser grid on the homepage (the speakers object) and the full
line-up on the dedicated /speakers page (the speakersPage.eventSpeakers object).
Step 1 — Add the headshot
Drop a square headshot (min ~400x400px) into public/pictures/speakers/, named after
the speaker, e.g. jane-doe.jpg.
Step 2 — Add the speaker to the /speakers page
Open src/content/sections.ts and add an entry to the
speakersPage.eventSpeakers.speakers array:
{
name: "Jane Doe",
role: "CISO, Acme Corp",
photo: "/pictures/speakers/jane-doe.jpg",
linkedin: "https://www.linkedin.com/in/janedoe/",
bio: "A short bio, a few sentences long.",
}photo, linkedin and bio are all optional — omit any of them and the card
adapts automatically (a generated avatar is used when photo is missing). As soon
as this array has at least one entry, the "Speaker line-up coming soon" pill is
replaced by the speaker cards automatically.
Step 3 — (Optional) Feature the speaker on the homepage teaser
To also feature a speaker in the homepage teaser grid, add or replace an entry in
the speakers.cards array (same file), using the same shape plus href: "/speakers"
so the card links to the full speakers page.
Step 4 — Commit to main
The site redeploys automatically. No other code changes are needed.
The sponsors section lives entirely in src/content/sponsors.ts.
It has two parts:
The sponsorship object holds the three tier cards ("Supporter", "Partner", "Premier").
Rename the name field, update tagline and perks, and reorder entries freely —
the page reflects your changes after the next deploy.
The logo grid is hidden by default and only appears once you switch it on.
Step 1 — Add the logo file
Drop the logo into the public/sponsors/ folder (create it if it doesn't exist yet).
SVG is preferred because it scales perfectly. Name it clearly, e.g. acme-corp.svg.
Step 2 — Register the sponsor
Open src/content/sponsors.ts and add an entry to the sponsors.items array:
{ name: "Acme Corp", logoPath: "/sponsors/acme-corp.svg", url: "https://acme.com", tier: "Premier" }tier is optional but controls the display order (Premier → Partner → Supporter).
Step 3 — Switch the section on
In the same file, set sponsors.show to true.
While it is false the entire logo section is invisible — no empty grid, no layout shift.
Step 4 — Commit to main
The site redeploys automatically. No other code changes are needed.
Same stack and design system as filigran.io:
- Vite + React 18 + TypeScript
- Tailwind CSS with the Filigran design tokens (Sora font, dark navy, cyan accent)
- lucide-react icons
npm install
npm run dev # local dev server on http://localhost:8080
npm run build # typecheck + production build to dist/
npm run preview # preview the production buildEvery push to main triggers the Deploy to GitHub Pages
workflow: build with Node 20, upload the dist/ artifact, deploy to GitHub Pages.
The custom domain (thread.filigran.io) is configured in the repository Pages settings.