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
34 changes: 34 additions & 0 deletions .github/ISSUE_TEMPLATE/category-proposal.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
name: Category proposal
description: Suggest a new category or reorganization.
title: "[Category Proposal]: "
labels:
- type:taxonomy
- area:categories
- status:triage
body:
- type: dropdown
id: proposal-type
attributes:
label: Proposal type
options:
- Add category
- Merge categories
- Rename category
- Split category
validations:
required: true

- type: textarea
id: current-state
attributes:
label: Current state
description: Explain the current structure and problem.
validations:
required: true

- type: textarea
id: proposed-change
attributes:
label: Proposed change
validations:
required: true
8 changes: 8 additions & 0 deletions .github/ISSUE_TEMPLATE/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
blank_issues_enabled: false
contact_links:
- name: Security policy
url: https://github.com/dailydotdev/awesome-developer-essentials/security/policy
about: Please report security issues privately when possible.
- name: Code of conduct
url: https://github.com/dailydotdev/awesome-developer-essentials/blob/main/code-of-conduct.md
about: Please review community expectations before posting.
37 changes: 37 additions & 0 deletions .github/ISSUE_TEMPLATE/report-dead-link.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
name: Report dead link
description: Report a broken or redirected resource URL.
title: "[Dead Link]: "
labels:
- type:bug
- area:links
- priority:high
- status:triage
body:
- type: input
id: section
attributes:
label: Section
description: Category where the broken link appears.
validations:
required: true

- type: input
id: resource-name
attributes:
label: Resource name
validations:
required: true

- type: input
id: broken-url
attributes:
label: Broken URL
placeholder: https://example.com
validations:
required: true

- type: input
id: replacement-url
attributes:
label: Suggested replacement URL
placeholder: https://example.com
41 changes: 41 additions & 0 deletions .github/ISSUE_TEMPLATE/suggest-a-resource.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
name: Suggest a resource
description: Propose a new resource for the awesome list.
title: "[Suggestion]: "
labels:
- type:suggestion
- area:content
- status:triage
body:
- type: input
id: resource-name
attributes:
label: Resource name
description: Name of the resource you want to add.
validations:
required: true

- type: input
id: resource-url
attributes:
label: Canonical URL
description: Direct homepage URL.
placeholder: https://example.com
validations:
required: true

- type: textarea
id: description
attributes:
label: Suggested list description
description: Use list format: [Name](URL) - Description.
placeholder: "[Example](https://example.com) - One-sentence factual description."
validations:
required: true

- type: textarea
id: why
attributes:
label: Why this belongs
description: Explain scope fit and uniqueness.
validations:
required: true
26 changes: 26 additions & 0 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
## Description

Describe what changed and why it should be included.

## Type of change

- [ ] Add a new resource
- [ ] Update an existing resource
- [ ] Fix formatting/typos
- [ ] Improve categorization

## Checklist

- [ ] I have read `contributing.md`.
- [ ] My change is specifically relevant to developer essentials.
- [ ] I used the format `[Name](URL) - Description.` for list entries.
- [ ] I checked for duplicate entries.
- [ ] Descriptions are concise, objective, and end with a period.
- [ ] I verified links are valid and not broken.
- [ ] I used canonical HTTPS URLs without shorteners or tracking parameters.
- [ ] I disclosed any affiliation with the added/updated resource.
- [ ] This pull request contains a single logical change.

## Additional context

Add references or screenshots if they help review.
10 changes: 10 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
day: monday
open-pull-requests-limit: 5
commit-message:
prefix: chore
42 changes: 42 additions & 0 deletions .github/labels.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
- name: type:suggestion
color: "0E8A16"
description: New resource suggestions.
- name: type:bug
color: "D73A4A"
description: Broken links, factual errors, or regressions.
- name: type:taxonomy
color: "1D76DB"
description: Category structure changes.
- name: type:maintenance
color: "6F42C1"
description: Recurring upkeep work.

- name: area:links
color: "5319E7"
description: URL and link-quality tasks.
- name: area:categories
color: "0E8A16"
description: Category naming and placement tasks.
- name: area:content
color: "FBCA04"
description: Description and editorial tasks.

- name: status:triage
color: "BFD4F2"
description: Needs maintainer review.
- name: status:needs-info
color: "D4C5F9"
description: Missing required details.
- name: status:ready
color: "0E8A16"
description: Ready for implementation.

- name: priority:high
color: "B60205"
description: Time-sensitive quality work.
- name: priority:medium
color: "FBCA04"
description: Important improvements.
- name: priority:low
color: "C2E0C6"
description: Nice-to-have tasks.
39 changes: 39 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
name: Lint

on:
push:
branches:
- main
pull_request:

jobs:
guard-internal-files:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Block internal planning files
run: |
if [ -f "PLAN.md" ] || [ -f "PROMOTION.md" ]; then
echo "Internal planning files must not be committed."
echo "Remove PLAN.md and PROMOTION.md from git."
exit 1
fi

awesome-lint:
needs: guard-internal-files
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0

- name: Setup Node.js
uses: actions/setup-node@v6
with:
node-version: 20

- name: Run awesome-lint
run: npx awesome-lint
117 changes: 117 additions & 0 deletions .github/workflows/maintenance.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
name: Maintenance

on:
workflow_dispatch:
schedule:
- cron: "0 9 * * 1"
- cron: "0 9 1 * *"

permissions:
contents: read
issues: write

jobs:
link-check:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v6

- name: Run link checker
id: lychee
continue-on-error: true
run: |
npx lychee \
--verbose \
--no-progress \
--max-concurrency 8 \
--accept 200,429 \
--format markdown \
README.md > lychee-report.md

- name: Count dead links
id: dead-links
run: |
if [ "${{ steps.lychee.outcome }}" = "success" ]; then
echo "dead_count=0" >> "$GITHUB_OUTPUT"
exit 0
fi
dead_count=$(awk '/^\s*\[✗\]/{count++} END {print count+0}' lychee-report.md)
echo "dead_count=${dead_count:-0}" >> "$GITHUB_OUTPUT"

- name: Open or update dead-link issue
if: steps.dead-links.outputs.dead_count != '0'
uses: actions/github-script@v8
with:
script: |
const fs = require("fs");
const title = "Automated dead link report";
const report = fs.readFileSync("lychee-report.md", "utf8");
const body = [
"## Dead links detected",
"",
`Detected by scheduled maintenance run on ${new Date().toISOString()}.`,
"",
`Dead links found: ${process.env.DEAD_COUNT}`,
"",
"### Report",
"",
report
].join("\n");

const { data: issues } = await github.rest.issues.listForRepo({
owner: context.repo.owner,
repo: context.repo.repo,
state: "open"
});

const existing = issues.find((issue) => issue.title === title);

if (existing) {
await github.rest.issues.update({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: existing.number,
body
});
} else {
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title,
body,
labels: ["type:maintenance", "area:links", "priority:high"]
});
}
env:
DEAD_COUNT: ${{ steps.dead-links.outputs.dead_count }}

monthly-stale-entry-review:
if: github.event_name == 'workflow_dispatch' || (github.event_name == 'schedule' && github.event.schedule == '0 9 1 * *')
runs-on: ubuntu-latest
steps:
- name: Open monthly stale-entry review issue
uses: actions/github-script@v8
with:
script: |
const now = new Date().toISOString().slice(0, 10);
const title = `Monthly stale entry review (${now.slice(0, 7)})`;
const body = [
"## Monthly stale entry review",
"",
"Review the list for stale entries and open targeted cleanup PRs.",
"",
"### Checklist",
"- [ ] Verify links for recently changed websites.",
"- [ ] Remove or replace deprecated entries.",
"- [ ] Refresh outdated descriptions.",
"- [ ] Re-check category fit for recent additions."
].join("\\n");

await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title,
body,
labels: ["type:maintenance", "priority:medium", "status:triage"]
});
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
PLAN.md
PROMOTION.md
Loading