diff --git a/.env.example b/.env.example
index 48ceb78..5ec5eba 100644
--- a/.env.example
+++ b/.env.example
@@ -1,15 +1,3 @@
-# Database
-DATABASE_URL="" # PostgreSQL connection string
-# For Docker Compose: postgresql://hacktoberfest:hacktoberfest123@localhost:5432/hacktoberfest
-# For cloud providers: copy the connection string from your provider
-
-# Authentication
-AUTH_SECRET="" # A random string
-AUTH_URL="" # Should be http://localhost:3000 for local development
-AUTH_GITHUB_ID=""
-AUTH_GITHUB_SECRET=""
-AUTH_DRIZZLE_URL="$DATABASE_URL" # Should be the same as DATABASE_URL
-
-# Optional
-NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME="" # Optional
-NEXT_PUBLIC_ANALYTICS_WEBSITE_ID="" # Optional
+# No environment variables are needed: the site is now a static
+# discontinuation notice. The old variables (database, GitHub OAuth,
+# analytics) are documented in archive/src/env.mjs.
diff --git a/.prettierignore b/.prettierignore
index 3e82242..bb8943b 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -4,4 +4,5 @@
.github
node_modules
.all-contributorsrc
-.xatarc
\ No newline at end of file
+.xatarc
+archive
diff --git a/README.md b/README.md
index a89e2ff..24e1748 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,10 @@
# Hacktoberfest Projects 🎉
-A Web app that lets you find eligible repositories for Hacktoberfest!
+> [!IMPORTANT]
+> **This project has been discontinued.** Hacktoberfest no longer counts pull requests, so there is no need to search for eligible repositories anymore. https://finder.usmans.me now shows a static notice that points visitors to [hacktoberfest.com](https://hacktoberfest.com). All search, sign-in, reporting, database and analytics features are switched off, and the old source code is kept in [`archive/`](archive) for reference. New contributions are no longer being accepted.
-Use it here - https://finder.usmans.me
+A Web app that lets you find eligible repositories for Hacktoberfest!
[](#contributors-)
diff --git a/docker-compose.yml b/archive/docker-compose.yml
similarity index 100%
rename from docker-compose.yml
rename to archive/docker-compose.yml
diff --git a/drizzle.config.ts b/archive/drizzle.config.ts
similarity index 100%
rename from drizzle.config.ts
rename to archive/drizzle.config.ts
diff --git a/public/hacktoberfest.png b/archive/public/hacktoberfest.png
similarity index 100%
rename from public/hacktoberfest.png
rename to archive/public/hacktoberfest.png
diff --git a/public/horizontal_beige.png b/archive/public/horizontal_beige.png
similarity index 100%
rename from public/horizontal_beige.png
rename to archive/public/horizontal_beige.png
diff --git a/src/app/(private)/reports/_components/report-card.tsx b/archive/src/app/(private)/reports/_components/report-card.tsx
similarity index 100%
rename from src/app/(private)/reports/_components/report-card.tsx
rename to archive/src/app/(private)/reports/_components/report-card.tsx
diff --git a/src/app/(private)/reports/page.tsx b/archive/src/app/(private)/reports/page.tsx
similarity index 100%
rename from src/app/(private)/reports/page.tsx
rename to archive/src/app/(private)/reports/page.tsx
diff --git a/src/app/(public)/_components/button.tsx b/archive/src/app/(public)/_components/button.tsx
similarity index 100%
rename from src/app/(public)/_components/button.tsx
rename to archive/src/app/(public)/_components/button.tsx
diff --git a/src/app/(public)/_components/header.tsx b/archive/src/app/(public)/_components/header.tsx
similarity index 100%
rename from src/app/(public)/_components/header.tsx
rename to archive/src/app/(public)/_components/header.tsx
diff --git a/src/app/(public)/_components/hero.tsx b/archive/src/app/(public)/_components/hero.tsx
similarity index 100%
rename from src/app/(public)/_components/hero.tsx
rename to archive/src/app/(public)/_components/hero.tsx
diff --git a/src/app/(public)/_components/icons.tsx b/archive/src/app/(public)/_components/icons.tsx
similarity index 100%
rename from src/app/(public)/_components/icons.tsx
rename to archive/src/app/(public)/_components/icons.tsx
diff --git a/src/app/(public)/_components/language-button.tsx b/archive/src/app/(public)/_components/language-button.tsx
similarity index 100%
rename from src/app/(public)/_components/language-button.tsx
rename to archive/src/app/(public)/_components/language-button.tsx
diff --git a/src/app/(public)/_components/marque-text-animation.tsx b/archive/src/app/(public)/_components/marque-text-animation.tsx
similarity index 100%
rename from src/app/(public)/_components/marque-text-animation.tsx
rename to archive/src/app/(public)/_components/marque-text-animation.tsx
diff --git a/src/app/(public)/_components/mobile-menu.tsx b/archive/src/app/(public)/_components/mobile-menu.tsx
similarity index 100%
rename from src/app/(public)/_components/mobile-menu.tsx
rename to archive/src/app/(public)/_components/mobile-menu.tsx
diff --git a/src/app/(public)/_components/search-form.tsx b/archive/src/app/(public)/_components/search-form.tsx
similarity index 100%
rename from src/app/(public)/_components/search-form.tsx
rename to archive/src/app/(public)/_components/search-form.tsx
diff --git a/src/app/(public)/contributors/_components/contributor-card.tsx b/archive/src/app/(public)/contributors/_components/contributor-card.tsx
similarity index 100%
rename from src/app/(public)/contributors/_components/contributor-card.tsx
rename to archive/src/app/(public)/contributors/_components/contributor-card.tsx
diff --git a/src/app/(public)/contributors/page.tsx b/archive/src/app/(public)/contributors/page.tsx
similarity index 100%
rename from src/app/(public)/contributors/page.tsx
rename to archive/src/app/(public)/contributors/page.tsx
diff --git a/src/app/(public)/page.tsx b/archive/src/app/(public)/page.tsx
similarity index 100%
rename from src/app/(public)/page.tsx
rename to archive/src/app/(public)/page.tsx
diff --git a/src/app/(public)/repos/[language]/loading.tsx b/archive/src/app/(public)/repos/[language]/loading.tsx
similarity index 100%
rename from src/app/(public)/repos/[language]/loading.tsx
rename to archive/src/app/(public)/repos/[language]/loading.tsx
diff --git a/src/app/(public)/repos/[language]/page.tsx b/archive/src/app/(public)/repos/[language]/page.tsx
similarity index 100%
rename from src/app/(public)/repos/[language]/page.tsx
rename to archive/src/app/(public)/repos/[language]/page.tsx
diff --git a/src/app/(public)/repos/_components/pagination.tsx b/archive/src/app/(public)/repos/_components/pagination.tsx
similarity index 100%
rename from src/app/(public)/repos/_components/pagination.tsx
rename to archive/src/app/(public)/repos/_components/pagination.tsx
diff --git a/src/app/(public)/repos/_components/repo-card.tsx b/archive/src/app/(public)/repos/_components/repo-card.tsx
similarity index 100%
rename from src/app/(public)/repos/_components/repo-card.tsx
rename to archive/src/app/(public)/repos/_components/repo-card.tsx
diff --git a/src/app/(public)/repos/_components/report-button.tsx b/archive/src/app/(public)/repos/_components/report-button.tsx
similarity index 100%
rename from src/app/(public)/repos/_components/report-button.tsx
rename to archive/src/app/(public)/repos/_components/report-button.tsx
diff --git a/src/app/(public)/repos/_components/scroll-to-top.tsx b/archive/src/app/(public)/repos/_components/scroll-to-top.tsx
similarity index 100%
rename from src/app/(public)/repos/_components/scroll-to-top.tsx
rename to archive/src/app/(public)/repos/_components/scroll-to-top.tsx
diff --git a/src/app/(public)/repos/_components/sorter.tsx b/archive/src/app/(public)/repos/_components/sorter.tsx
similarity index 100%
rename from src/app/(public)/repos/_components/sorter.tsx
rename to archive/src/app/(public)/repos/_components/sorter.tsx
diff --git a/src/app/(public)/repos/_components/stars-filter.tsx b/archive/src/app/(public)/repos/_components/stars-filter.tsx
similarity index 100%
rename from src/app/(public)/repos/_components/stars-filter.tsx
rename to archive/src/app/(public)/repos/_components/stars-filter.tsx
diff --git a/src/app/(public)/repos/loading.tsx b/archive/src/app/(public)/repos/loading.tsx
similarity index 100%
rename from src/app/(public)/repos/loading.tsx
rename to archive/src/app/(public)/repos/loading.tsx
diff --git a/src/app/(public)/repos/page.tsx b/archive/src/app/(public)/repos/page.tsx
similarity index 100%
rename from src/app/(public)/repos/page.tsx
rename to archive/src/app/(public)/repos/page.tsx
diff --git a/src/app/actions.ts b/archive/src/app/actions.ts
similarity index 100%
rename from src/app/actions.ts
rename to archive/src/app/actions.ts
diff --git a/src/app/android-chrome-192x192.png b/archive/src/app/android-chrome-192x192.png
similarity index 100%
rename from src/app/android-chrome-192x192.png
rename to archive/src/app/android-chrome-192x192.png
diff --git a/src/app/android-chrome-512x512.png b/archive/src/app/android-chrome-512x512.png
similarity index 100%
rename from src/app/android-chrome-512x512.png
rename to archive/src/app/android-chrome-512x512.png
diff --git a/src/app/api/auth/[...nextauth]/route.ts b/archive/src/app/api/auth/[...nextauth]/route.ts
similarity index 100%
rename from src/app/api/auth/[...nextauth]/route.ts
rename to archive/src/app/api/auth/[...nextauth]/route.ts
diff --git a/src/app/api/check-repo/route.ts b/archive/src/app/api/check-repo/route.ts
similarity index 100%
rename from src/app/api/check-repo/route.ts
rename to archive/src/app/api/check-repo/route.ts
diff --git a/src/app/favicon.svg b/archive/src/app/favicon.svg
similarity index 100%
rename from src/app/favicon.svg
rename to archive/src/app/favicon.svg
diff --git a/src/app/fonts/AtkinsonHyperlegibleMono-Italic-VariableFont_wght.ttf b/archive/src/app/fonts/AtkinsonHyperlegibleMono-Italic-VariableFont_wght.ttf
similarity index 100%
rename from src/app/fonts/AtkinsonHyperlegibleMono-Italic-VariableFont_wght.ttf
rename to archive/src/app/fonts/AtkinsonHyperlegibleMono-Italic-VariableFont_wght.ttf
diff --git a/src/app/fonts/AtkinsonHyperlegibleMono-VariableFont_wght.ttf b/archive/src/app/fonts/AtkinsonHyperlegibleMono-VariableFont_wght.ttf
similarity index 100%
rename from src/app/fonts/AtkinsonHyperlegibleMono-VariableFont_wght.ttf
rename to archive/src/app/fonts/AtkinsonHyperlegibleMono-VariableFont_wght.ttf
diff --git a/src/app/icon-16x16.png b/archive/src/app/icon-16x16.png
similarity index 100%
rename from src/app/icon-16x16.png
rename to archive/src/app/icon-16x16.png
diff --git a/src/app/icon-32x32.png b/archive/src/app/icon-32x32.png
similarity index 100%
rename from src/app/icon-32x32.png
rename to archive/src/app/icon-32x32.png
diff --git a/archive/src/app/not-found.tsx b/archive/src/app/not-found.tsx
new file mode 100644
index 0000000..24be490
--- /dev/null
+++ b/archive/src/app/not-found.tsx
@@ -0,0 +1,53 @@
+import Link from 'next/link';
+import { Header } from './(public)/_components/header';
+import { Button } from './(public)/_components/button';
+
+export default function NotFoundPage() {
+ return (
+ <>
+
+
+
+ {/* 404 Number with Animation */}
+
+
+ 404
+
+
+
+
+ {/* Error Message */}
+
+
+ Oops! Page Not Found
+
+
+ The page you're looking for seems to have wandered off into the
+ digital void. Don't worry, it happens to the best of us!
+
+
+
+ {/* Action Buttons */}
+
+
+
+
+
+
+ {/* Decorative Elements */}
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/src/app/validation.ts b/archive/src/app/validation.ts
similarity index 100%
rename from src/app/validation.ts
rename to archive/src/app/validation.ts
diff --git a/src/assets/languages.json b/archive/src/assets/languages.json
similarity index 100%
rename from src/assets/languages.json
rename to archive/src/assets/languages.json
diff --git a/src/auth.ts b/archive/src/auth.ts
similarity index 100%
rename from src/auth.ts
rename to archive/src/auth.ts
diff --git a/src/components/Icons.tsx b/archive/src/components/Icons.tsx
similarity index 100%
rename from src/components/Icons.tsx
rename to archive/src/components/Icons.tsx
diff --git a/src/components/footer.tsx b/archive/src/components/footer.tsx
similarity index 100%
rename from src/components/footer.tsx
rename to archive/src/components/footer.tsx
diff --git a/src/components/report-modal.tsx b/archive/src/components/report-modal.tsx
similarity index 100%
rename from src/components/report-modal.tsx
rename to archive/src/components/report-modal.tsx
diff --git a/src/env.mjs b/archive/src/env.mjs
similarity index 100%
rename from src/env.mjs
rename to archive/src/env.mjs
diff --git a/src/hooks/use-get-repo.ts b/archive/src/hooks/use-get-repo.ts
similarity index 100%
rename from src/hooks/use-get-repo.ts
rename to archive/src/hooks/use-get-repo.ts
diff --git a/src/lib/db/connection.ts b/archive/src/lib/db/connection.ts
similarity index 100%
rename from src/lib/db/connection.ts
rename to archive/src/lib/db/connection.ts
diff --git a/src/lib/db/migrations/0000_watery_bill_hollister.sql b/archive/src/lib/db/migrations/0000_watery_bill_hollister.sql
similarity index 100%
rename from src/lib/db/migrations/0000_watery_bill_hollister.sql
rename to archive/src/lib/db/migrations/0000_watery_bill_hollister.sql
diff --git a/src/lib/db/migrations/0001_magical_doctor_doom.sql b/archive/src/lib/db/migrations/0001_magical_doctor_doom.sql
similarity index 100%
rename from src/lib/db/migrations/0001_magical_doctor_doom.sql
rename to archive/src/lib/db/migrations/0001_magical_doctor_doom.sql
diff --git a/src/lib/db/migrations/0002_concerned_violations.sql b/archive/src/lib/db/migrations/0002_concerned_violations.sql
similarity index 100%
rename from src/lib/db/migrations/0002_concerned_violations.sql
rename to archive/src/lib/db/migrations/0002_concerned_violations.sql
diff --git a/src/lib/db/migrations/0003_rich_gargoyle.sql b/archive/src/lib/db/migrations/0003_rich_gargoyle.sql
similarity index 100%
rename from src/lib/db/migrations/0003_rich_gargoyle.sql
rename to archive/src/lib/db/migrations/0003_rich_gargoyle.sql
diff --git a/src/lib/db/migrations/0004_organic_slapstick.sql b/archive/src/lib/db/migrations/0004_organic_slapstick.sql
similarity index 100%
rename from src/lib/db/migrations/0004_organic_slapstick.sql
rename to archive/src/lib/db/migrations/0004_organic_slapstick.sql
diff --git a/src/lib/db/migrations/0005_kind_saracen.sql b/archive/src/lib/db/migrations/0005_kind_saracen.sql
similarity index 100%
rename from src/lib/db/migrations/0005_kind_saracen.sql
rename to archive/src/lib/db/migrations/0005_kind_saracen.sql
diff --git a/src/lib/db/migrations/meta/0000_snapshot.json b/archive/src/lib/db/migrations/meta/0000_snapshot.json
similarity index 100%
rename from src/lib/db/migrations/meta/0000_snapshot.json
rename to archive/src/lib/db/migrations/meta/0000_snapshot.json
diff --git a/src/lib/db/migrations/meta/0001_snapshot.json b/archive/src/lib/db/migrations/meta/0001_snapshot.json
similarity index 100%
rename from src/lib/db/migrations/meta/0001_snapshot.json
rename to archive/src/lib/db/migrations/meta/0001_snapshot.json
diff --git a/src/lib/db/migrations/meta/0002_snapshot.json b/archive/src/lib/db/migrations/meta/0002_snapshot.json
similarity index 100%
rename from src/lib/db/migrations/meta/0002_snapshot.json
rename to archive/src/lib/db/migrations/meta/0002_snapshot.json
diff --git a/src/lib/db/migrations/meta/0003_snapshot.json b/archive/src/lib/db/migrations/meta/0003_snapshot.json
similarity index 100%
rename from src/lib/db/migrations/meta/0003_snapshot.json
rename to archive/src/lib/db/migrations/meta/0003_snapshot.json
diff --git a/src/lib/db/migrations/meta/0004_snapshot.json b/archive/src/lib/db/migrations/meta/0004_snapshot.json
similarity index 100%
rename from src/lib/db/migrations/meta/0004_snapshot.json
rename to archive/src/lib/db/migrations/meta/0004_snapshot.json
diff --git a/src/lib/db/migrations/meta/0005_snapshot.json b/archive/src/lib/db/migrations/meta/0005_snapshot.json
similarity index 100%
rename from src/lib/db/migrations/meta/0005_snapshot.json
rename to archive/src/lib/db/migrations/meta/0005_snapshot.json
diff --git a/src/lib/db/migrations/meta/_journal.json b/archive/src/lib/db/migrations/meta/_journal.json
similarity index 100%
rename from src/lib/db/migrations/meta/_journal.json
rename to archive/src/lib/db/migrations/meta/_journal.json
diff --git a/src/lib/db/migrations/schema.ts b/archive/src/lib/db/migrations/schema.ts
similarity index 100%
rename from src/lib/db/migrations/schema.ts
rename to archive/src/lib/db/migrations/schema.ts
diff --git a/src/state/repoAtom.ts b/archive/src/state/repoAtom.ts
similarity index 100%
rename from src/state/repoAtom.ts
rename to archive/src/state/repoAtom.ts
diff --git a/src/types.ts b/archive/src/types.ts
similarity index 100%
rename from src/types.ts
rename to archive/src/types.ts
diff --git a/next.config.mjs b/next.config.mjs
index d43ab70..2fea024 100644
--- a/next.config.mjs
+++ b/next.config.mjs
@@ -1,16 +1,26 @@
import path from 'path';
import { fileURLToPath } from 'url';
-import './src/env.mjs';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
+/**
+ * The project finder has been discontinued (Hacktoberfest no longer counts
+ * pull requests). The site is now a single static notice page, and this
+ * config keeps hosting usage close to zero:
+ * - every old route (/repos, /contributors, /reports, /api/*, ...) is
+ * redirected to the notice page by the routing layer, so no server
+ * function, database or GitHub API call is ever invoked;
+ * - image optimization is turned off so no image transformations are billed.
+ *
+ * The retired feature code lives in /archive for reference.
+ */
+
/**@type {import('next').NextConfig}*/
const config = {
reactStrictMode: true,
- typedRoutes: true,
- experimental: {
- viewTransition: true
+ images: {
+ unoptimized: true
},
webpack(config) {
config.resolve.alias['@'] = path.resolve(__dirname, 'src');
@@ -23,6 +33,13 @@ const config = {
destination:
'https://github.com/max-programming/hacktoberfest-projects',
permanent: true
+ },
+ {
+ // Any path without a file extension (i.e. any old page or API route)
+ // goes to the notice page. Static assets and /_next are left alone.
+ source: '/:path((?!_next/)[^.]+)',
+ destination: '/',
+ permanent: false
}
];
}
diff --git a/package.json b/package.json
index 5c1ec40..05f2226 100644
--- a/package.json
+++ b/package.json
@@ -15,6 +15,9 @@
"@databuddy/sdk": "^2.1.77",
"@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^9.32.0",
+ "@fontsource-variable/inter": "^5.3.0",
+ "@fontsource/barlow-semi-condensed": "^5.3.0",
+ "@fontsource/space-mono": "^5.3.0",
"@t3-oss/env-nextjs": "^0.13.8",
"@twuni/emojify": "^1.0.2",
"@types/node": "^24.1.0",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ed64746..27ae788 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -23,6 +23,15 @@ importers:
'@eslint/js':
specifier: ^9.32.0
version: 9.32.0
+ '@fontsource-variable/inter':
+ specifier: ^5.3.0
+ version: 5.3.0
+ '@fontsource/barlow-semi-condensed':
+ specifier: ^5.3.0
+ version: 5.3.0
+ '@fontsource/space-mono':
+ specifier: ^5.3.0
+ version: 5.3.0
'@t3-oss/env-nextjs':
specifier: ^0.13.8
version: 0.13.8(typescript@5.9.2)(zod@4.0.14)
@@ -537,6 +546,15 @@ packages:
resolution: {integrity: sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@fontsource-variable/inter@5.3.0':
+ resolution: {integrity: sha512-OupL48va4JNofb97w6NYeF9S7W/kHNKM0Er8Dem5nqi4jeOLrVJDoE8tZEpnMJmtkvNbB1EIPPwHcdkF6b1oUA==}
+
+ '@fontsource/barlow-semi-condensed@5.3.0':
+ resolution: {integrity: sha512-EdpQ1GlLMofGqDsQhEw+g6DonNKmzt21p8y/oNbTl4BFzEkqYkFyE2fj25YGxmZBL/LZZGAxe74FlvEWcgc31w==}
+
+ '@fontsource/space-mono@5.3.0':
+ resolution: {integrity: sha512-FrpBMOVWn3PRdRHlrZWC55X3kZG/2BTH7SM5ZyS/bky3iKya2BturI5lk+t0RoDQL2JyHzURsVq/EisCsxpI5A==}
+
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
@@ -583,92 +601,78 @@ packages:
resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==}
cpu: [arm64]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linux-arm@1.2.0':
resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==}
cpu: [arm]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linux-ppc64@1.2.0':
resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==}
cpu: [ppc64]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linux-s390x@1.2.0':
resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==}
cpu: [s390x]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linux-x64@1.2.0':
resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==}
cpu: [x64]
os: [linux]
- libc: [glibc]
'@img/sharp-libvips-linuxmusl-arm64@1.2.0':
resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==}
cpu: [arm64]
os: [linux]
- libc: [musl]
'@img/sharp-libvips-linuxmusl-x64@1.2.0':
resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==}
cpu: [x64]
os: [linux]
- libc: [musl]
'@img/sharp-linux-arm64@0.34.3':
resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
- libc: [glibc]
'@img/sharp-linux-arm@0.34.3':
resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm]
os: [linux]
- libc: [glibc]
'@img/sharp-linux-ppc64@0.34.3':
resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [ppc64]
os: [linux]
- libc: [glibc]
'@img/sharp-linux-s390x@0.34.3':
resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [s390x]
os: [linux]
- libc: [glibc]
'@img/sharp-linux-x64@0.34.3':
resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
- libc: [glibc]
'@img/sharp-linuxmusl-arm64@0.34.3':
resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [arm64]
os: [linux]
- libc: [musl]
'@img/sharp-linuxmusl-x64@0.34.3':
resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==}
engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
cpu: [x64]
os: [linux]
- libc: [musl]
'@img/sharp-wasm32@0.34.3':
resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==}
@@ -800,28 +804,24 @@ packages:
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- libc: [glibc]
'@next/swc-linux-arm64-musl@15.5.7':
resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- libc: [musl]
'@next/swc-linux-x64-gnu@15.5.7':
resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- libc: [glibc]
'@next/swc-linux-x64-musl@15.5.7':
resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- libc: [musl]
'@next/swc-win32-arm64-msvc@15.5.7':
resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==}
@@ -1029,49 +1029,41 @@ packages:
resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==}
cpu: [arm64]
os: [linux]
- libc: [glibc]
'@unrs/resolver-binding-linux-arm64-musl@1.11.1':
resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==}
cpu: [arm64]
os: [linux]
- libc: [musl]
'@unrs/resolver-binding-linux-ppc64-gnu@1.11.1':
resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==}
cpu: [ppc64]
os: [linux]
- libc: [glibc]
'@unrs/resolver-binding-linux-riscv64-gnu@1.11.1':
resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==}
cpu: [riscv64]
os: [linux]
- libc: [glibc]
'@unrs/resolver-binding-linux-riscv64-musl@1.11.1':
resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==}
cpu: [riscv64]
os: [linux]
- libc: [musl]
'@unrs/resolver-binding-linux-s390x-gnu@1.11.1':
resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==}
cpu: [s390x]
os: [linux]
- libc: [glibc]
'@unrs/resolver-binding-linux-x64-gnu@1.11.1':
resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==}
cpu: [x64]
os: [linux]
- libc: [glibc]
'@unrs/resolver-binding-linux-x64-musl@1.11.1':
resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==}
cpu: [x64]
os: [linux]
- libc: [musl]
'@unrs/resolver-binding-wasm32-wasi@1.11.1':
resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==}
@@ -3149,6 +3141,12 @@ snapshots:
'@eslint/core': 0.15.1
levn: 0.4.1
+ '@fontsource-variable/inter@5.3.0': {}
+
+ '@fontsource/barlow-semi-condensed@5.3.0': {}
+
+ '@fontsource/space-mono@5.3.0': {}
+
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.6':
diff --git a/public/favicon.svg b/public/favicon.svg
index b37f4c0..cede9f1 100644
--- a/public/favicon.svg
+++ b/public/favicon.svg
@@ -1 +1 @@
-
\ No newline at end of file
+
diff --git a/public/hacktoberfest-2026.svg b/public/hacktoberfest-2026.svg
new file mode 100644
index 0000000..1348a91
--- /dev/null
+++ b/public/hacktoberfest-2026.svg
@@ -0,0 +1 @@
+
diff --git a/src/app/apple-icon.png b/src/app/apple-icon.png
index 1616a36..d7d75cb 100644
Binary files a/src/app/apple-icon.png and b/src/app/apple-icon.png differ
diff --git a/src/app/layout.tsx b/src/app/layout.tsx
index 8f7ee23..4ac35b5 100644
--- a/src/app/layout.tsx
+++ b/src/app/layout.tsx
@@ -1,102 +1,75 @@
+// Fonts are self-hosted (bundled from npm) so visitors make no requests to
+// third-party font services.
+import '@fontsource/barlow-semi-condensed/latin-700.css';
+import '@fontsource/barlow-semi-condensed/latin-800.css';
+import '@fontsource/space-mono/latin-400.css';
+import '@fontsource/space-mono/latin-700.css';
+import '@fontsource-variable/inter/wght.css';
import '@/styles/globals.css';
-import Script from 'next/script';
import type { Metadata, Viewport } from 'next';
-import { unstable_ViewTransition as ViewTransition } from 'react';
-import { Toaster } from 'react-hot-toast';
-import { SessionProvider } from 'next-auth/react';
-import { Footer } from '@/components/footer';
-import { ReportModal } from '@/components/report-modal';
-import { env } from '@/env.mjs';
-import localFont from 'next/font/local';
-import { Databuddy } from '@databuddy/sdk/react';
-const atkinsonHyperlegibleMono = localFont({
- variable: '--font-atkinson-hyperlegible-mono',
- src: [
- {
- path: './fonts/AtkinsonHyperlegibleMono-Italic-VariableFont_wght.ttf',
- weight: '400',
- style: 'italic'
- },
- {
- path: './fonts/AtkinsonHyperlegibleMono-VariableFont_wght.ttf',
- weight: '400',
- style: 'normal'
- }
- ]
-});
+// Analytics are disabled now that the project finder is discontinued.
+// Uncomment these (and the matching blocks below) to bring them back.
+// The env schema lives in archive/src/env.mjs.
+// import Script from 'next/script';
+// import { Databuddy } from '@databuddy/sdk/react';
+// import { env } from '@/env.mjs';
export default function RootLayout({ children }: React.PropsWithChildren) {
return (
-
+
-
-
- {children}
-
-
-
-
-
- {env.NEXT_PUBLIC_ANALYTICS_WEBSITE_ID && (
-
- )}
- {env.NEXT_PUBLIC_DATABUDDY_CLIENT_ID && (
-
- )}
-
+
+ {children}
+ {/* Umami analytics (disabled)
+ {env.NEXT_PUBLIC_ANALYTICS_WEBSITE_ID && (
+
+ )}
+ */}
+ {/* Databuddy analytics (disabled)
+ {env.NEXT_PUBLIC_DATABUDDY_CLIENT_ID && (
+
+ )}
+ */}
);
}
export const viewport: Viewport = {
- themeColor: '#1A202C',
+ themeColor: '#3d5e58',
colorScheme: 'dark'
};
-export function generateMetadata(): Metadata {
- const today = new Date();
- const currentMonth = today.getMonth();
- const currentYear = today.getFullYear();
- return {
- title: {
- template: '%s | Hacktoberfest Project Finder',
- default: 'Home | Hacktoberfest Project Finder'
- },
- description: `Quickly and easily find projects to contribute to ${currentMonth > 9 ? `upcoming Hacktoberfest ${currentYear + 1}` : `this Hacktoberfest ${currentYear}`}!`,
- keywords: [
- 'hacktoberfest',
- 'open-source',
- 'contribution',
- 'oss',
- 'open source'
- ],
- openGraph: {
- type: 'website',
- locale: 'en_US',
- url: 'https://finder.usmans.me'
- },
- twitter: {
- creator: '@MaxProgramming1',
- card: 'summary_large_image',
- site: 'https://finder.usmans.me'
- }
- };
-}
+export const metadata: Metadata = {
+ title: 'Hacktoberfest Project Finder has been discontinued',
+ description:
+ 'Hacktoberfest no longer counts pull requests, so the Hacktoberfest Project Finder has been retired. Visit hacktoberfest.com to learn how to take part.',
+ robots: { index: true, follow: true },
+ openGraph: {
+ type: 'website',
+ locale: 'en_US',
+ url: 'https://finder.usmans.me'
+ },
+ twitter: {
+ creator: '@MaxProgramming1',
+ card: 'summary_large_image',
+ site: 'https://finder.usmans.me'
+ }
+};
diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx
index 24be490..64a5ff9 100644
--- a/src/app/not-found.tsx
+++ b/src/app/not-found.tsx
@@ -1,53 +1,3 @@
-import Link from 'next/link';
-import { Header } from './(public)/_components/header';
-import { Button } from './(public)/_components/button';
-
-export default function NotFoundPage() {
- return (
- <>
-
-
-
- {/* 404 Number with Animation */}
-
-
- 404
-
-
-
-
- {/* Error Message */}
-
-
- Oops! Page Not Found
-
-
- The page you're looking for seems to have wandered off into the
- digital void. Don't worry, it happens to the best of us!
-
-
-
- {/* Action Buttons */}
-
-
-
-
-
-
- {/* Decorative Elements */}
-
-
-
-
-
-
-
- >
- );
-}
+// Anything that slips past the redirects in next.config.mjs (e.g. a missing
+// file) shows the same static discontinuation notice.
+export { default } from './page';
diff --git a/src/app/page.tsx b/src/app/page.tsx
new file mode 100644
index 0000000..28440b5
--- /dev/null
+++ b/src/app/page.tsx
@@ -0,0 +1,276 @@
+import type { PropsWithChildren, ReactNode } from 'react';
+import { ArrowRight, KeyRound, MapPin, Sticker } from 'lucide-react';
+
+const HACKTOBERFEST_URL = 'https://hacktoberfest.com';
+const GITHUB_URL = 'https://github.com/max-programming/hacktoberfest-projects';
+
+export const dynamic = 'force-static';
+
+function CoralButton({ href, children }: PropsWithChildren<{ href: string }>) {
+ return (
+
+ {children}
+
+ );
+}
+
+function Eyebrow({
+ className,
+ children
+}: PropsWithChildren<{ className: string }>) {
+ return (
+
+ {children}
+
+ );
+}
+
+/** Hexagon "sticker" badge, like the ones on hacktoberfest.com. */
+function HexIcon({ color, children }: { color: string; children: ReactNode }) {
+ return (
+
+ );
+}
+
+const steps = [
+ {
+ icon: ,
+ color: '#8bb2de',
+ title: 'Sign in with MyMLH',
+ body: 'Create your free account on hacktoberfest.com to start your sticker book.'
+ },
+ {
+ icon: ,
+ color: '#e97a77',
+ title: 'Go to a Fest, or join online',
+ body: 'Find an in-person Fest near you, or join the livestreams and challenges from anywhere.'
+ },
+ {
+ icon: ,
+ color: '#f3b924',
+ title: 'Collect stickers and swag',
+ body: 'Earn virtual stickers as you take part, and get real swag mailed to your door.'
+ }
+];
+
+export default function DiscontinuedPage() {
+ return (
+ <>
+
+
+
+
+
+ {/* Hero */}
+
+
+ Project Finder · Discontinued · October 2026
+
+
+ No more PR hunting.{' '}
+ This finder has retired.
+
+
+ Hacktoberfest no longer counts pull requests, so there's no need to
+ search for repositories tagged{' '}
+
+ hacktoberfest
+ {' '}
+ anymore. The Hacktoberfest Project Finder has been switched off.
+
+
+ This site helped you find projects for Hacktoberfest.
+ {' '}
+ Pick a language and it listed GitHub repositories ready for the
+ pull requests the event used to require.
+
+
+
+ Hacktoberfest has changed.
+ {' '}
+ Pull requests no longer count toward rewards. Instead, you take
+ part at in-person Fests or online, and collect stickers along
+ the way.
+
+
+
+ With nothing left to search for,
+ {' '}
+ the finder, GitHub sign-in and reporting features have been
+ switched off for good.
+