Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
13dd30e
thank you for your service, Travis and `s3_website` gem
tiffehr Feb 3, 2026
438fd55
control versions and setup rake-based tasks
tiffehr Feb 3, 2026
aa35a96
revise a URL that changed on us
tiffehr Feb 3, 2026
1a92290
bring over Actions and rake-driven tests/validations
tiffehr Feb 3, 2026
257ab59
add deployment vars (non-secret) to deploy `_config.yml`
tiffehr Feb 3, 2026
f218bdb
overhaul README with latest instrux and tips about rake tasks
tiffehr Feb 3, 2026
7b37c80
Bring over a lot of developer-experience and modern app approaches fr…
tiffehr Feb 23, 2026
7340c41
set correct CloudFront distribution ID and update page title to refer…
tiffehr Feb 25, 2026
b389305
lotta `https`, trailing whitespace and `:format`-driven cleanup
tiffehr Feb 25, 2026
9465d7f
remove outdated templates and redirect configurations from the archive
tiffehr Feb 25, 2026
6f35b99
cleanup after `:a11y` test results for dead links and missing alt text
tiffehr Feb 25, 2026
a626784
refactor: consolidate head metadata into a separate include file
tiffehr Feb 25, 2026
2121078
refactor: streamline code of conduct for clarity and accessibility
tiffehr Feb 25, 2026
2323d07
tailor YAML validation and improve error handling in Rakefile tasks a…
tiffehr Feb 25, 2026
5bb4acd
update GitHub workflows for improved deployment and testing processes
tiffehr Feb 25, 2026
671f2be
`:format` cleanup on some previously unreached files within ...`test:…
tiffehr Feb 25, 2026
8c63da4
lotta `:format` and `test:templates` cleanup
tiffehr Feb 25, 2026
1f93716
2016-2017 archived pages format and linter upgrades
tiffehr Feb 25, 2026
5a802dc
2014 archived pages format and linter upgrades
tiffehr Feb 25, 2026
6ea3c3d
2016 archived pages format and linter upgrades
tiffehr Feb 25, 2026
18cc642
linter/format fixes for test rake tasks
tiffehr Feb 25, 2026
80faf1f
add copilot instructions for SRCCON project setup and workflow
tiffehr Feb 25, 2026
f5e94db
update author link for Emma Carew Grovum in multiple toolkit documents
tiffehr Feb 25, 2026
d1e2a0b
Initial plan
Copilot Feb 25, 2026
016cece
fix: restore 'Source con' tagline rendering on main_footer pages
Copilot Feb 25, 2026
69ca181
Update .github/workflows/deploy.yml
tiffehr Feb 25, 2026
8d04068
Merge pull request #419 from OpenNews/copilot/sub-pr-418
tiffehr Feb 25, 2026
d7add41
fix: ensure Typekit loads asynchronously in headmeta
tiffehr Feb 25, 2026
bc056bf
Merge pull request #418 from OpenNews/2026-travis-purge-tf
tiffehr Feb 25, 2026
1b18e10
Bump nokogiri from 1.19.0 to 1.19.1
dependabot[bot] Feb 25, 2026
017e903
Merge pull request #420 from OpenNews/dependabot/bundler/nokogiri-1.19.1
tiffehr Feb 25, 2026
e8251ce
Initial plan
Copilot Feb 25, 2026
365f12c
Add optional external URL checking capability (non-blocking)
Copilot Feb 25, 2026
fabc2c5
Add staging vs production site comparison tool
Copilot Feb 25, 2026
04d4298
update _config.yml and points where we link to the latest SRCCON event
tiffehr Feb 25, 2026
2ce82b4
update core _layouts/* structure and update HTML
tiffehr Feb 25, 2026
3ac3cbc
update 2014oldz/* layout files and names to not confuse with core SRC…
tiffehr Feb 25, 2026
766abb1
update schedule links /2019_templates/* to hard-coded 2019 url
tiffehr Feb 25, 2026
210dc52
hide tmp from git, now that `HTMLProofer.check_directory()` can write…
tiffehr Feb 25, 2026
4750ff7
revise now-dead links to point to more stable or Archive.org versions
tiffehr Feb 25, 2026
1c2ffd3
update schedule links in prior years to point to their year's site
tiffehr Feb 25, 2026
6ebbaf2
add post-deployment `:review` tasks to Rake documentation
tiffehr Feb 25, 2026
22de467
Update _archive/pages/2014oldz/old_layouts/layout_redirect.html
tiffehr Feb 25, 2026
b454b6a
minor fixes to prior work; undo one bad copilot suggestion
tiffehr Feb 25, 2026
78a1a17
update TROUBLESHOOTING with revised Rake tasks
tiffehr Feb 25, 2026
894e988
Address review feedback: scope helpers, add timeouts, fix URLs and te…
Copilot Feb 25, 2026
878503b
Use cleaner single-quote syntax for regex replacement
Copilot Feb 25, 2026
f5d4eb4
Merge pull request #422 from OpenNews/copilot/check-public-url-access
tiffehr Feb 26, 2026
3090c8f
enhance `:review` tasks to support additional URL paths for comparison
tiffehr Feb 26, 2026
ff319bb
Add paths.txt for additional URL paths and enhance `:review` task for…
tiffehr Feb 26, 2026
c93e6ad
Refactor exclude list in _config.yml to suppress dev-only files from …
tiffehr Feb 26, 2026
01e5f7e
`:format` cleanup in tasks
tiffehr Feb 26, 2026
e9a2d78
add .editorconfig to enforce consistent coding styles across editors
tiffehr Feb 26, 2026
bd7e0ba
drop LICENSE from exported files to S3
tiffehr Feb 26, 2026
34301d0
bring over humans.txt from srccon main site
tiffehr Feb 26, 2026
b87bb7c
fix `*.json` exclude patterns and enhance string escaping in `headmet…
tiffehr Feb 26, 2026
5699442
whatever
tiffehr Feb 26, 2026
35da4da
added 2026 link
johnhrnndz Feb 26, 2026
8960e3e
Merge branch 'staging' of https://github.com/OpenNews/srccon into sta…
johnhrnndz Feb 26, 2026
6699632
text edit to homepage
johnhrnndz Feb 26, 2026
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
33 changes: 33 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# EditorConfig helps maintain consistent coding styles across different editors
# https://editorconfig.org

root = true

# Universal settings
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
indent_size = 2

# Markdown files - preserve trailing spaces (for line breaks)
[*.md]
trim_trailing_whitespace = false

# YAML files
[*.{yml,yaml}]
indent_size = 2

# Ruby files
[*.{rb,rake}]
indent_size = 2

# HTML/CSS/JS files
[*.{html,css,js,json}]
indent_size = 2

# Makefiles require tabs
[Makefile]
indent_style = tab
55 changes: 55 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# Copilot instructions for SRCCON

## Big picture architecture

- This repo is a Jekyll site, not an app server: source content + templates compile into `_site/` (`Rakefile` `build`, `.github/workflows/test.yml`).
- Page content is mostly root-level Markdown (for example `homepage.md`) with frontmatter driving layout/navigation behavior.
- Liquid composition pattern:
- Layouts in `_layouts/` (for example `_layouts/layout_hub.html`) wrap `{{ content }}`.
- Shared fragments live in `_includes/`.
- Structured content lives in `_data/*.yml`.
- Collections are configured in `_config.yml` (`transcripts`, `share`) and output to permalinked paths.
- Legacy material exists in `_archive/`; prefer editing current root pages, `_layouts/`, `_includes/`, `_data/`, and collection content unless asked to update archive files.

## Workflow commands agents should use

- Setup/runtime baseline: Ruby `.ruby-version` and Bundler.
- Primary local loop: `bundle exec rake default` (`build` + `check` + `serve`).
- If you need a fresh output directory first: run `bundle exec rake clean` before `build`/`default`.
- Build-only when debugging rendering: `bundle exec rake build`.
- Config/data guardrail before deeper edits: `bundle exec rake check` (depends on `validate_yaml`).
- Full local validation suite: `bundle exec rake test` (aggregate task in `tasks/test.rake`).
- `bundle exec rake test:sessions` exists but is currently a placeholder and is not included in aggregate `rake test`.
- Formatting:
- `bundle exec rake lint` for checks (StandardRB + Prettier).
- `bundle exec rake format` for autofix (StandardRB + Prettier).

## Project-specific conventions (enforced by tasks)

- Root markdown pages should include frontmatter `section` and `permalink` (`test:page_config`).
- In Liquid templates, prefer `page.root_url`; `site.root_url` is treated as an error except legacy `_includes/prior_events.html` (`test:templates`).
- Liquid href style matters: `href="{{variable}}"` is warned on; `{{ page.url }}`-style spacing/object references are expected (`test:templates`).
- (Template checks intentionally skip some file paths)

## Validation nuances and CI differences

- `test:html_proofer` checks built output in `_site/` and aborts if `_site/` does not exist.
- Local `test:html_proofer` enforces HTTPS links (`enforce_https: true` in `tasks/test.rake`).
- CI `test.yml` intentionally runs htmlproofer with `--no-enforce-https`; do not assume parity with local failures.
- YAML validation is stricter than syntax-only: `validate_yaml` also detects duplicate keys using Psych AST traversal in `Rakefile`.
- `rake check` reports configuration errors (template bucket/distribution defaults) but currently does not `abort`; use it as a guardrail signal, not a hard gate.

## Deployment boundaries and integrations

- Deployment settings come from `_config.yml` → `deployment.bucket`, `deployment.staging_bucket`, `deployment.cloudfront_distribution_id`.
- Branch-driven behavior in `.github/workflows/deploy.yml`:
- `staging` push syncs `_site/` to staging S3.
- `main` push syncs production S3 and invalidates CloudFront.
- Local deploy tasks in `Rakefile` default to dry runs (`deploy:staging`, `deploy:production`) and require explicit confirmation for real deploys.
- AWS auth uses GitHub OIDC with `AWS_ROLE_ARN`; avoid adding static credentials.

## Editing guidance for agents

- Keep edits minimal and aligned with existing Liquid/Jekyll patterns; do not introduce new frameworks/toolchains.
- For template/frontmatter/data changes, run targeted checks first (`check`, `test:templates`, `test:page_config`) before `rake test`.
- If modifying deploy logic, update both Rake deploy tasks and matching GitHub workflow behavior to keep local/CI intent consistent.
25 changes: 25 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
version: 2

updates:
# GitHub Actions
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
labels:
- "dependencies"
- "github-actions"
open-pull-requests-limit: 5

# Ruby gems (Bundler)
- package-ecosystem: "bundler"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
labels:
- "dependencies"
- "ruby"
open-pull-requests-limit: 5
versioning-strategy: increase
78 changes: 78 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Deploy to S3

on:
push:
branches:
- main
- staging

permissions:
contents: read
id-token: write # Required for OIDC authentication

jobs:
deploy:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ".ruby-version"
bundler-cache: true

- name: Validate YAML files
run: bundle exec rake validate_yaml

- name: Build Jekyll site
run: bundle exec jekyll build

- name: Extract deployment config from _config.yml
id: config
run: |
mapfile -t DEPLOYMENT_VALUES < <(ruby -ryaml -e "config = YAML.safe_load_file('_config.yml', permitted_classes: [], aliases: true); deployment = config['deployment'] || {}; puts deployment['bucket'].to_s; puts deployment['staging_bucket'].to_s; puts deployment['cloudfront_distribution_id'].to_s")
BUCKET="${DEPLOYMENT_VALUES[0]}"
if [ -z "$BUCKET" ]; then
echo "Error: S3 bucket name not configured. Please set deployment.bucket in _config.yml." >&2
exit 1
fi
STAGING_BUCKET="${DEPLOYMENT_VALUES[1]}"
if [ -z "$STAGING_BUCKET" ]; then
echo "Error: Staging bucket name not configured. Please set deployment.staging_bucket in _config.yml." >&2
exit 1
fi
CLOUDFRONT="${DEPLOYMENT_VALUES[2]}"
echo "bucket=$BUCKET" >> $GITHUB_OUTPUT
echo "staging_bucket=$STAGING_BUCKET" >> $GITHUB_OUTPUT
echo "cloudfront=$CLOUDFRONT" >> $GITHUB_OUTPUT

- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v6
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: us-east-1
role-session-name: Deploy-${{ github.event.repository.name }}-${{ github.run_id }}

- name: Deploy to S3 (Staging)
if: github.ref == 'refs/heads/staging'
run: |
aws s3 sync _site/ s3://${{ steps.config.outputs.staging_bucket }} \
--delete \
--cache-control "public, max-age=3600"

- name: Deploy to S3 (Production)
if: github.ref == 'refs/heads/main'
run: |
aws s3 sync _site/ s3://${{ steps.config.outputs.bucket }} \
--delete \
--cache-control "public, max-age=3600"

- name: Invalidate CloudFront (Production)
if: github.ref == 'refs/heads/main' && steps.config.outputs.cloudfront != ''
run: |
aws cloudfront create-invalidation \
--distribution-id ${{ steps.config.outputs.cloudfront }} \
--paths "/*"
79 changes: 79 additions & 0 deletions .github/workflows/health-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
name: Weekly Health Check

on:
schedule:
- cron: "0 12 * * 1" # Every Monday at noon UTC
workflow_dispatch: # Allow manual trigger

permissions:
contents: read
issues: write

jobs:
health-check:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ".ruby-version"
bundler-cache: true

- name: Check for outdated dependencies
run: |
echo "=== Checking for outdated gems ==="
bundle outdated || true

- name: Validate YAML files
run: bundle exec rake validate_yaml

- name: Build Jekyll site
run: bundle exec jekyll build --verbose

- name: Validate build output
run: |
if [ ! -d "_site" ]; then
echo "ERROR: _site directory not created"
exit 1
fi

if [ ! -f "_site/index.html" ]; then
echo "ERROR: index.html not found in _site"
exit 1
fi

echo "✅ Build validation passed"

- name: Create issue on failure
if: failure()
uses: actions/github-script@v8
with:
script: |
const title = '🚨 Weekly health check failed';
const body = `The scheduled template validation failed on ${new Date().toISOString()}.

**Workflow Run:** ${context.payload.repository.html_url}/actions/runs/${context.runId}

Please investigate the failure and update dependencies as needed.`;

// Check if issue already exists
const issues = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
state: 'open',
labels: 'automated,health-check'
});

if (issues.data.length === 0) {
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: title,
body: body,
labels: ['automated', 'health-check', 'bug']
});
}
81 changes: 81 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
name: Test Build

on:
push:
branches-ignore:
- main
- staging
pull_request:
branches:
- main
- staging

permissions:
contents: read
id-token: write # Required for OIDC authentication

jobs:
test:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: ".ruby-version"
bundler-cache: true

- name: Validate YAML files
run: bundle exec rake validate_yaml

- name: Build Jekyll site
run: bundle exec jekyll build --verbose

- name: Validate HTML and check links
run: |
bundle exec htmlproofer ./_site \
--disable-external \
--no-enforce-https \
--ignore-urls "/^http:\/\/(127\.0\.0\.1|0\.0\.0\.0|localhost)/" \
--allow-hash-href

- name: Extract deployment config from _config.yml
if: github.event_name == 'pull_request' && env.AWS_ROLE_ARN != '' && github.repository != 'OpenNews/srccon-site-starterkit'
id: config
env:
AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }}
run: |
STAGING_BUCKET=$(ruby -ryaml -e "config = YAML.safe_load_file('_config.yml', permitted_classes: [], aliases: true); puts config['deployment']['staging_bucket']")
echo "staging_bucket=$STAGING_BUCKET" >> $GITHUB_OUTPUT

- name: Configure AWS credentials
if: github.event_name == 'pull_request' && env.AWS_ROLE_ARN != '' && github.repository != 'OpenNews/srccon-site-starterkit'
uses: aws-actions/configure-aws-credentials@v6
env:
AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }}
with:
role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
aws-region: us-east-1
role-session-name: Test-${{ github.event.repository.name }}-${{ github.run_id }}

- name: Test deployment (dry-run)
if: github.event_name == 'pull_request' && env.AWS_ROLE_ARN != '' && github.repository != 'OpenNews/srccon-site-starterkit'
env:
AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }}
run: |
echo "Testing S3 sync command (dry-run)..."
aws s3 sync _site/ s3://${{ steps.config.outputs.staging_bucket }} \
--dryrun \
--delete \
--cache-control "public, max-age=3600"

- name: Skip deployment test (no credentials or GitHub Pages repo)
if: github.event_name == 'pull_request' && (env.AWS_ROLE_ARN == '' || github.repository == 'OpenNews/srccon-site-starterkit')
env:
AWS_ROLE_ARN: ${{ secrets.AWS_ROLE_ARN }}
run: |
echo "⏭️ Skipping S3 deployment test in this build context"
echo "This is normal for Dependabot PRs and external contributions."
27 changes: 25 additions & 2 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,26 @@
# Jekyll build outputs
_site/
.jekyll-cache/
.sass-cache/
tmp/

# Ruby/Bundler
.bundle/
vendor/

# Node.js
node_modules/

# OS files
.DS_Store
_site
.jekyll-cache
Thumbs.db

# Editor files (but allow .vscode/ and .editorconfig for team shared settings)
.idea/
*.swp
*.swo
*~

# Local environment
.env
.env.local
Loading