The official website for ASSERT Research, a non-profit association (ideell förening) based in Stockholm, Sweden, advancing scientific research and development in software technology.
A static site, bilingual (English + Swedish), deployed to GitHub Pages on the custom domain assert-research.org.
.
├── index.html # English page (default) — single structural source
├── se/index.html # Swedish page — GENERATED from index.html
├── bylaws-en.html # English bylaws — GENERATED from bylaws-en.md
├── bylaws-sv.html # Swedish bylaws — GENERATED from bylaws-sv.md
├── assets/
│ ├── css/
│ │ ├── main.css # entry point — @imports the modules below
│ │ ├── theme.css # design tokens: colours, type, spacing (edit here)
│ │ ├── base.css # reset + base element styles
│ │ ├── layout.css # header, footer, containers, grids
│ │ └── components.css # buttons, hero, cards, members, language switch
│ ├── js/
│ │ ├── i18n.js # ALL copy + board/founder data + render engine
│ │ └── main.js # language resolution, switching, small UI
│ ├── img/ # optimised logos, favicon, board avatars
│ └── css/bylaws.css # styling for the legal document pages
├── scripts/
│ ├── build-se.js # regenerates se/index.html from index.html
│ └── render-bylaws.js # renders bylaws-*.md → bylaws-*.html
├── bylaws-en.md / bylaws-sv.md # authoritative bylaws source (Markdown)
├── CNAME # custom domain for GitHub Pages
└── .github/workflows/deploy.yml
- All visible text lives in
assets/js/i18n.jsunder theSTRINGS.enandSTRINGS.svdictionaries. The HTML only carriesdata-i18n="key"markers — never prose. Edit a string once and both the English and Swedish pages update. - Board members and founding members are the
BOARDandFOUNDERSarrays at the top ofi18n.js. Role labels (Chairperson, etc.) are translated via theboard.*keys. - Colours / fonts / spacing are design tokens in
assets/css/theme.css. The palette is built around the Swedish flag's blue and yellow.
- English is the default and is served at
/. - Swedish is served at
/se/. - A header toggle switches language in place (no reload), updates the URL, and
remembers the choice. Language is resolved from, in order: the URL path
(
/se), the page's declared language, a stored preference, then English.
After editing index.html, regenerate the generated pages:
npm run build # renders bylaws-*.html and se/index.html
se/index.html,bylaws-en.html, andbylaws-sv.htmlare generated — do not edit them by hand.
The bylaws are authored in Markdown (bylaws-en.md, bylaws-sv.md) and
rendered into styled, standalone pages (bylaws-en.html, bylaws-sv.html) by
scripts/render-bylaws.js. Each page reuses the site's header and footer,
which are extracted from index.html between the @partial:header /
@partial:footer comment markers — so the shared chrome has a single source.
- Edit the text in the
.mdfiles, then runnpm run build. - Edit the document styling in
assets/css/bylaws.css. - The pages are language-static: the header EN/SV toggle navigates between
bylaws-en.htmlandbylaws-sv.htmlrather than swapping text in place.
Because pages use absolute paths (/assets/...), serve from the project root:
npm run serve # builds the SV page + serves at http://localhost:5173
# or any static server, e.g.: python3 -m http.server 5173Pushing to main triggers .github/workflows/deploy.yml, which runs the build
(regenerating se/index.html) and publishes the site to GitHub Pages.
One-time setup:
- Repo → Settings → Pages → Build and deployment → Source: GitHub Actions.
- The
CNAMEfile pins the custom domainassert-research.org. - In Cloudflare DNS, point the domain at GitHub Pages:
CNAME(or apexA/AAAA) records to GitHub Pages.- For the apex
assert-research.org, add A records to GitHub's IPs (185.199.108.153,.109.153,.110.153,.111.153) or a CNAME flatten to<user>.github.io. - Set the Cloudflare proxy to DNS only (grey cloud) initially so GitHub can issue its TLS certificate, then enable Enforce HTTPS in GitHub Pages settings.
Source artwork: public/assert-research-logo-6600px.png. Optimised variants in
assets/img/ (logo.png, logo@2x.png, white logo-white.png for the dark
footer) were generated with ImageMagick. To regenerate:
magick public/assert-research-logo-6600px.png -resize 1400x assets/img/logo.png
magick public/assert-research-logo-6600px.png -resize 2200x assets/img/logo@2x.png
magick public/assert-research-logo-6600px.png -resize 1100x \
-channel RGB -evaluate set 100% +channel assets/img/logo-white.png