Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,11 @@ updates:
interval: "weekly"
day: "friday"

- package-ecosystem: "uv"
directory: "/"
- package-ecosystem: "npm"
directory: "/web"
schedule:
interval: "weekly"
day: "friday"
groups:
dev-dependencies:
dependency-type: "development"
60 changes: 60 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: Deploy

on:
push:
branches: [master]
pull_request:
branches: [master]
workflow_dispatch:

# `pages: write` + `id-token: write` are what actions/deploy-pages needs to
# publish; `contents: read` is enough for the checkout.
permissions:
contents: read
pages: write
id-token: write

# Never let two deploys race. In-progress runs finish so a half-published
# artifact is not left behind.
concurrency:
group: pages
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- uses: actions/setup-node@v7
with:
node-version: 22
cache: npm
cache-dependency-path: package-lock.json

- name: Install dependencies
run: npm ci

- name: Typecheck
run: npm run typecheck

- name: Build
run: npm run build

- name: Upload Pages artifact
uses: actions/upload-pages-artifact@v5
with:
path: dist

deploy:
# Pull requests get the build + typecheck gate but must not publish.
if: github.event_name != 'pull_request'
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v5
52 changes: 0 additions & 52 deletions .github/workflows/docs_build.yml

This file was deleted.

7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,7 @@
node_modules
dist
.venv
site

# editors / os
.DS_Store
*.log
63 changes: 63 additions & 0 deletions 404.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
<!doctype html>
<html lang="en">
<!-- meta: {
"title": "404 · eggzec",
"description": "That page does not exist. Head back to the projects, the community, or the eggzec GitHub organization.",
"path": "/404.html"
} -->
<head>
<!--@include head-->
<meta name="robots" content="noindex" />
</head>

<body>
<a class="skip-link" href="#main">Skip to content</a>
<header data-nav></header>

<main id="main">
<section class="notfound">
<div class="hero__grid" aria-hidden="true"></div>
<div class="notfound__field" aria-hidden="true">
<canvas data-life-field data-cell="17" data-tps="9" data-density="0.15" data-intensity="0.45"></canvas>
</div>

<div class="container notfound__inner">
<div
class="display notfound__code"
data-display
data-lines="404"
data-knockout="0:1"
role="heading"
aria-level="1"
aria-label="404"
></div>

<h2 class="notfound__title" data-reveal data-reveal-delay="260">
This cell died out
</h2>

<p class="notfound__body" data-reveal data-reveal-delay="320">
The page you asked for is not here. It may have been moved, renamed, or it never
existed. The repository it belonged to might live under a different name now.
</p>

<div class="notfound__links" data-reveal data-reveal-delay="380">
<a class="button button--primary" href="/" data-magnetic>Back home</a>
<a class="button button--ghost" href="/projects/" data-magnetic>All projects</a>
<a
class="button button--ghost"
href="https://github.com/eggzec"
target="_blank"
rel="noopener"
data-magnetic
>github.com/eggzec</a
>
</div>
</div>
</section>
</main>

<footer data-footer></footer>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
96 changes: 94 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,94 @@
# Website
Community website.
# eggzec.github.io

The eggzec organization website. Science + Computing.

Live at **https://eggzec.github.io/**.

A hand built static site: Vite and TypeScript, with no UI framework.
Animation uses [Motion](https://motion.dev) plus
[Lenis](https://lenis.darkroom.engineering) for smooth scrolling, and a canvas
Game of Life for the hero texture.

## Layout

```
index.html landing page
404.html custom not found page
projects/ full project catalog, filterable by category
community/ maintainers, plus one page each
partials/head.html shared <head>, injected at build time
public/brand/ logo, project icons
src/
main.ts single entry, mounts whatever a page contains
data/site.ts projects and people. Edit content here
components/ nav, footer, cards, life field, reveals, marquee
lib/eggzec-block.ts the eggzec Block bitmap display font, as TypeScript
styles/ tokens, base, layout, components, pages
```

## Develop

```bash
npm install
npm run dev # http://localhost:5173
```

```bash
npm run build # typecheck, then emit dist/
npm run preview # serve the built output
npm run typecheck
```

## Editing content

Almost everything is data rather than markup, and it all lives in
`src/data/site.ts`.

| What | Where |
| --- | --- |
| Projects, taglines, repository and docs and PyPI links | `PROJECTS` |
| Human facing name when the repo name is not one | `display` on a project |
| Which projects lead the page | any project with an `icon` |
| Maintainers | `PEOPLE` |
| Nav links | `NAV` |
| Footer links | `COLUMNS` in `src/components/footer.ts` |

A project is featured on the landing page and in the nav menu when it has an
`icon`. That keeps the featured set in sync with the brand icon files under
`public/brand/icons/` automatically, with no second list to maintain.

Landing page statistics are counted from the catalog at runtime, so the numbers
cannot drift from what is actually listed.

## Design

Colours are the Electropop palette on white:

| Role | Colour |
| --- | --- |
| Block fills, buttons, knockouts | Kiwi `#CCFF00` |
| Accent text and links | Violet `#5200FF` |
| Sparks and newly born cells | Magenta `#F900FF` |
| Third accent | Orange `#FF6B00` |

Kiwi is brilliant as a field with black on top of it and illegible as type on
white, so `--accent-fill` and `--accent-text` are separate roles. Violet carries
everything that has to be read.

Display lettering is the eggzec Block bitmap font, rendered as inline SVG at any
size, so there is no font file and no layout shift. Because the font is
monospaced, the hero solves for letter tracking per line, which makes every line
land at the same width and the same cap height.

The hero, footer and 404 page run Conway's Game of Life on a coarse grid. That
is the same glider hidden in the logo mark. Everything animated respects
`prefers-reduced-motion`.

## Deploy

`.github/workflows/deploy.yml` builds the site and publishes to GitHub Pages on
every push to `master`. Pull requests run the typecheck and the build but do not
publish.

Pages must be set to **Settings, then Pages, then Build and deployment, Source:
GitHub Actions** in the repository settings.
66 changes: 66 additions & 0 deletions community/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<!doctype html>
<html lang="en">
<!-- meta: {
"title": "Community · eggzec",
"description": "The engineers who maintain eggzec, and how to join them.",
"path": "/community/"
} -->
<head>
<!--@include head-->
</head>

<body>
<a class="skip-link" href="#main">Skip to content</a>
<header data-nav></header>

<main id="main">
<section class="page-header" data-spotlight>
<div class="hero__grid" aria-hidden="true"></div>
<div class="container page-header__inner">
<p class="mono section__eyebrow" data-reveal>Community</p>
<h1 class="page-header__title" data-reveal data-reveal-delay="60">
Who maintains this
</h1>
<p class="page-header__lede" data-reveal data-reveal-delay="120">
eggzec is a small group of engineers working on scientific computing in the open. Every
repository takes issues and pull requests.
</p>
</div>
</section>

<section class="section">
<div class="container">
<div data-people data-reveal-group data-reveal-stagger="70"></div>
</div>
</section>

<section class="section section--ruled">
<div class="container">
<div class="cta" data-reveal>
<div class="cta__field" aria-hidden="true">
<canvas data-life-field data-cell="14" data-tps="7" data-density="0.13" data-intensity="0.38" data-interactive="false"></canvas>
</div>
<div class="cta__inner">
<h2 class="cta__title">Want to join?</h2>
<p class="cta__body">
Start by picking up an issue, then open a draft pull request against the
repository default branch and we will review it.
</p>
<div class="button-row">
<a class="button button--primary button--lg" href="https://github.com/eggzec" target="_blank" rel="noopener" data-magnetic
>Find an issue</a
>
<a class="button button--ghost button--lg" href="/projects/" data-magnetic
>Browse projects</a
>
</div>
</div>
</div>
</div>
</section>
</main>

<footer data-footer></footer>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
34 changes: 34 additions & 0 deletions community/laraib/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<!doctype html>
<html lang="en">
<!-- meta: {
"title": "M. Laraib Ali · eggzec",
"description": "Co-founder and maintainer of eggzec. Backend and systems engineer specializing in Python and Go, Linux automation, PostgreSQL, and observability.",
"path": "/community/laraib/"
} -->
<head>
<!--@include head-->
</head>

<body>
<a class="skip-link" href="#main">Skip to content</a>
<header data-nav></header>

<main id="main">
<section class="page-header" data-spotlight>
<div class="hero__grid" aria-hidden="true"></div>
<div class="container">
<div data-profile="laraib" data-reveal></div>
</div>
</section>

<section class="section">
<div class="container">
<a class="button button--ghost" href="/community/">&#8592; All maintainers</a>
</div>
</section>
</main>

<footer data-footer></footer>
<script type="module" src="/src/main.ts"></script>
</body>
</html>
Loading