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
21 changes: 21 additions & 0 deletions .github/.linkspector.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Linkspector config for awesome-coder.
# Mirrors the structure of coder/coder/.github/.linkspector.yml so the
# behavior stays consistent across the two repositories.
dirs:
- .
excludedDirs:
# Build output and dependencies have no value to lint.
- node_modules
- .git
ignorePatterns:
- pattern: "localhost"
- pattern: "127.0.0.1"
- pattern: "0.0.0.0"
- pattern: "example.com"
- pattern: "mailto:"
# Hosts known to block GitHub runner IPs even from a headless browser.
# Add new patterns here when a real URL is verified working in a normal
# browser but the runner consistently fails to reach it.
- pattern: "linkedin.com"
aliveStatusCodes:
- 200
61 changes: 61 additions & 0 deletions .github/ISSUE_TEMPLATE/1-suggest-resource.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: "Suggest a resource"
description: "Suggest a resource to add to the list."
title: "suggestion: "
labels: ["suggestion"]
body:
- type: checkboxes
id: existing_issues
attributes:
label: "Is there an existing issue for this?"
description: "Please search to see if the resource has already been suggested or listed."
options:
- label: "I have searched the existing issues and the README"
required: true

- type: input
id: name
attributes:
label: "Name"
description: "Name of the resource."
validations:
required: true

- type: input
id: url
attributes:
label: "URL"
validations:
required: true

- type: dropdown
id: section
attributes:
label: "Suggested section"
options:
- Official Resources
- Tutorials and Blog Posts
- IDEs
- Automation
- Templates
- Talks and Videos
- Other (explain below)
validations:
required: true

- type: textarea
id: description
attributes:
label: "One-line description"
description: "Format as it would appear in the README, e.g. `[Name](url) - One-line description.`"
validations:
required: true

- type: checkboxes
id: checks
attributes:
label: "Checks"
options:
- label: "I have read the [contribution guidelines](https://github.com/coder/awesome-coder/blob/main/CONTRIBUTING.md)."
required: true
- label: "The resource is actively maintained."
required: false
13 changes: 13 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
contact_links:
- name: Coder Documentation
url: https://coder.com/docs
about: Official Coder documentation.
- name: Coder Registry
url: https://registry.coder.com
about: Official and community templates and modules.
- name: Coder Discord
url: https://cdr.co/discord-Y6fMxGdNRg
about: Get in touch with the Coder developers and community for support.
- name: Questions or discussion
url: https://github.com/coder/coder/discussions/new/choose
about: For general questions or discussion, use the coder/coder discussions board.
30 changes: 30 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
## Description

<!-- Briefly describe what this PR does and why. -->

## Type of change

- [ ] New resource added to the list
- [ ] Resource removed (no longer maintained, broken, etc.)
- [ ] Resource updated (URL change, description change, etc.)
- [ ] Documentation or content refresh
- [ ] CI, tooling, or repository maintenance
- [ ] Other

## Resource information

<!-- Delete this section if your PR does not add or update a list entry. -->

**Section:**
**Entry:** `[Name](url) - One-line description.`

## Checklist

- [ ] I have read the [contribution guidelines](https://github.com/coder/awesome-coder/blob/main/CONTRIBUTING.md).
- [ ] My entry follows the `[Name](url) - One-line description.` format.
- [ ] The resource is actively maintained or otherwise worth listing.
- [ ] `bun fmt:ci` passes locally (or I'm relying on CI to confirm).

## Related issues

<!-- Link related issues or write "None". -->
19 changes: 19 additions & 0 deletions .github/dependabot.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
groups:
github-actions:
patterns:
- "*"

- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
groups:
npm:
patterns:
- "*"
22 changes: 22 additions & 0 deletions .github/typos.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
[default.extend-words]
# Coder community handles / usernames that look like typos.
denbeigh = "denbeigh"
matifali = "matifali"
sharkymark = "sharkymark"
ntimo = "ntimo"
bpmct = "bpmct"
tmsmr = "tmsmr"
sulo = "sulo"
elliotgraebert = "elliotgraebert"

# Domain-specific terms.
Kubevirt = "KubeVirt"
NixOS = "NixOS"
HashiCorp = "HashiCorp"

[files]
extend-exclude = [
"LICENSE",
"bun.lock",
"node_modules",
]
70 changes: 70 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: CI

on:
push:
branches: [main]
pull_request:
schedule:
# Mondays at 14:00 UTC, so broken links surface even between contributions.
- cron: "0 14 * * 1"
workflow_dispatch:

# Cancel in-progress runs for pull requests when developers push new changes.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

permissions:
contents: read

jobs:
format:
name: Check formatting
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false

- name: Install Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: latest

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Validate formatting
run: bun fmt:ci

lint-awesome:
name: Lint awesome list
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false

- name: Install Bun
uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
with:
bun-version: latest

- name: Run awesome-lint
run: bun x awesome-lint

lint-typos:
name: Check for typos
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false

- name: Run typos
uses: crate-ci/typos@37bb98842b0d8c4ffebdb75301a13db0267cef89 # v1.47.2
with:
config: .github/typos.toml
109 changes: 109 additions & 0 deletions .github/workflows/link-check.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
name: Link check

on:
push:
branches: [main]
pull_request:
paths:
- "**/*.md"
- ".github/.linkspector.yml"
- ".github/workflows/link-check.yaml"
schedule:
# Mondays at 14:00 UTC.
- cron: "0 14 * * 1"
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

jobs:
check-links:
# Later versions of Ubuntu have disabled unprivileged user namespaces,
# which the linkspector action requires.
runs-on: ubuntu-22.04
permissions:
contents: read
pull-requests: write
env:
CHROME_BUILD_ID: "145.0.7632.77"
steps:
- name: Harden Runner
uses: step-security/harden-runner@f808768d1510423e83855289c910610ca9b43176 # v2.17.0
with:
egress-policy: audit

- name: Checkout
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false

- name: Set up Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
with:
node-version: "22"

- name: Cache Puppeteer Chrome
id: chrome-cache
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: ~/.cache/puppeteer
key: puppeteer-${{ runner.os }}-${{ runner.arch }}-chrome-${{ env.CHROME_BUILD_ID }}

- name: Install Linkspector Chrome
id: install-chrome
run: |
set -euo pipefail
# @puppeteer/browsers is idempotent: when the cache hit restored the
# binary it just prints the existing path; on a cache miss it
# downloads Chrome into ~/.cache/puppeteer for actions/cache to save
# at the end of the job.
chrome_path="$(npx -y @puppeteer/browsers install "chrome@${CHROME_BUILD_ID}" --path "${HOME}/.cache/puppeteer" --format '{{path}}')"
echo "path=${chrome_path}" >> "$GITHUB_OUTPUT"

# action-linkspector has a pnpm install step that fails without an
# existing pnpm store. See:
# https://github.com/UmbrellaDocs/action-linkspector/issues/54
- name: Enable corepack and create pnpm store
run: |
corepack enable pnpm
mkdir -p "$(pnpm store path --silent)"

# action-linkspector pipes linkspector through reviewdog, which only
# surfaces failures and stays silent on success. List discovered URLs
# and run linkspector standalone first so the workflow log shows every
# URL that was checked, then let action-linkspector run for the PR
# review comment integration.
- name: List URLs found in Markdown files
run: |
set -euo pipefail
echo "URLs discovered in Markdown files (subject to linkspector ignorePatterns):"
echo
grep -rhoE 'https?://[^[:space:])"`<>]+' \
--include='*.md' \
--exclude-dir=node_modules \
--exclude-dir=.git \
. | sort -u

- name: Run linkspector
env:
PUPPETEER_EXECUTABLE_PATH: ${{ steps.install-chrome.outputs.path }}
run: npx -y @umbrelladocs/linkspector check --showstat --check-archived -c .github/.linkspector.yml

- name: Check Markdown links
if: always()
uses: umbrelladocs/action-linkspector@036f295d12b67b0c4b445bc83db0538afb78db69 # v1.5.2
env:
# Use the Chrome build prepared from the pinned Puppeteer instead
# of letting linkspector download a mutable browser at runtime.
# See: https://github.com/UmbrellaDocs/action-linkspector/issues/62
PUPPETEER_EXECUTABLE_PATH: ${{ steps.install-chrome.outputs.path }}
with:
reporter: ${{ github.event_name == 'pull_request' && 'github-pr-review' || 'github-check' }}
config_file: .github/.linkspector.yml
fail_on_error: "true"
filter_mode: "file"
show_stats: "true"
35 changes: 35 additions & 0 deletions .github/workflows/zizmor.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
name: GitHub Actions Security Analysis (zizmor)

on:
pull_request:
branches: ["**"]
paths:
- ".github/workflows/**"
push:
branches: ["main"]
paths:
- ".github/workflows/**"
workflow_dispatch:

permissions: {}

jobs:
zizmor:
runs-on: ubuntu-latest
permissions:
contents: read
actions: read
steps:
- name: Checkout repository
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false

- name: Run zizmor (blocking, HIGH only)
uses: zizmorcore/zizmor-action@5f14fd08f7cf1cb1609c1e344975f152c7ee938d # v0.5.6
with:
advanced-security: false
annotations: true
min-severity: high
inputs: |
.github/workflows
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules/
Loading
Loading