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
26 changes: 13 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# DEETNUTS

DEETNUTS is a data-heavy Next.js application for publishing MHT-CET college and admissions data in a searchable, student-facing format. The repository contains the web application, data-access layer, upload utilities, and migration tooling used to manage MHT-CET datasets.
DEETNUTS is a Next.js application for publishing MHT-CET college and admissions data in a searchable format. The repository contains the web application, data-access layer, upload utilities, and migration tools for MHT-CET datasets.

Live properties:

Expand All @@ -10,12 +10,12 @@ Live properties:

The current codebase covers the following data domains:

| Domain | Coverage in Repository | Notes |
| --------------------------- | ---------------------------------------------- | ----------------------------------------------------------- |
| MHT-CET state cutoffs | 2024 rounds 1-3, 2025 rounds 1-4, 2026 round 1 | Profile-aware cutoffs derived from official CAP data |
| MHT-CET all-India cutoffs | 2024 rounds 1-3 | API handlers exist for all three rounds |
| MHT-CET seat matrix | 2024 | Batch-ingested from CSV |
| MHT-CET college master data | 2024 | Used for directory and detail pages |
| Domain | Coverage in Repository | Notes |
| --------------------------- | ---------------------------------------------- | ---------------------------------------------------- |
| MHT-CET state cutoffs | 2024 rounds 1-3, 2025 rounds 1-4, 2026 round 1 | Profile-aware cutoffs derived from official CAP data |
| MHT-CET all-India cutoffs | 2024 rounds 1-3 | API handlers exist for all three rounds |
| MHT-CET seat matrix | 2024 | Batch-ingested from CSV |
| MHT-CET college master data | 2024 | Used for directory and detail pages |

## Architecture Summary

Expand All @@ -42,7 +42,7 @@ CSV / JSON source files
-> PocketBase collections
```

For a fuller system description, see [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md).
For a full system description, see [docs/ARCHITECTURE.md](./docs/ARCHITECTURE.md).

## Repository Layout

Expand All @@ -65,7 +65,7 @@ deetnuts/

Prerequisites:

- Node.js 22 or newer is the safest match for the checked-in Docker build
- Node.js 22 or newer is the recommended version for the checked-in Docker build
- npm

Install and start the app:
Expand Down Expand Up @@ -95,8 +95,8 @@ AUTH_STATE_SECRET=at-least-32-random-characters
Notes:

- The browser never receives PocketBase administrator or service credentials.
- Supabase variables are accepted only by the explicit one-time source migration; they must not appear in the application runtime environment.
- Most `scripts/` entrypoints load `.env`; the web app uses the usual Next.js `.env.local` flow. If you run the CLI utilities directly, keep the required values available in your shell or a local `.env` file.
- Supabase variables are accepted only by the explicit one-time source migration. They must not appear in the application runtime environment.
- Most `scripts/` entrypoints load `.env`. The web app uses the standard Next.js `.env.local` flow. If you run a CLI utility directly, keep the required values in your shell or a local `.env` file.

## Development Commands

Expand All @@ -112,7 +112,7 @@ npm run test:platform
npm run format
```

Operational scripts are documented in [docs/scripts-readme.md](./docs/scripts-readme.md).
Deployment operations are documented in [deploy/README.md](./deploy/README.md).

### eJAM predictor runtime

Expand Down Expand Up @@ -143,7 +143,7 @@ The repository contains the complete Supabase-to-PocketBase migration path:
- `scripts/migrate-supabase-to-pocketbase.ts` takes a read-only repeatable snapshot, imports auth/data/storage, verifies exact counts and digests, configures Google OAuth, and creates a pre-cutover backup.
- The source Supabase project is rollback-only after cutover and is not a runtime dependency.

Run the migration only through `deploy/bin/deetnuts-pocketbase-migrate`; it gates the temporary import hook and disables batch migration features when verification finishes.
Run the migration only through `deploy/bin/deetnuts-pocketbase-migrate`. The command controls the temporary import hook. It disables batch migration features when verification finishes.

## Documentation

Expand Down
40 changes: 20 additions & 20 deletions URLS_DOCUMENTATION.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# DeetNuts URL Structure Documentation
# DEETNUTS URL structure

This document provides an overview of the active URLs on the DeetNuts website.
This document lists the active public URLs on the DEETNUTS website.

## Base URL

Expand All @@ -10,30 +10,30 @@ https://www.deetnuts.com

## Static Pages

| Page Name | URL | Description |
|-----------|-----|-------------|
| Home | `/` | Main landing page |
| Creators | `/creators` | Information about the creators |
| Data Source | `/datasource` | Data source documentation |
| Terms & Conditions | `/compliance/terms-and-conditions` | Legal terms and conditions |
| Page | URL | Description |
| -------------------- | ---------------------------------- | -------------------------------- |
| Home | `/` | Main page |
| Creators | `/creators` | Project and operator information |
| Data sources | `/datasource` | Data source documentation |
| Terms and conditions | `/compliance/terms-and-conditions` | Service terms |

## MHT-CET Section

| Page Name | URL | Description |
|-----------|-----|-------------|
| MHT-CET Cutoffs | `/mht-cet` | Main MHT-CET cutoffs page |
| All India Cutoffs | `/mht-cet/all-india-cutoffs` | All India category cutoffs |
| State Cutoffs | `/mht-cet/state-cutoffs` | State-wise cutoffs |
| Colleges | `/mht-cet/colleges` | List of MHT-CET colleges |
| College Detail | `/mht-cet/colleges/[slug]` | College-specific cutoffs and seat data |
| Page | URL | Description |
| ----------------- | ---------------------------- | ----------------------------- |
| MHT-CET cutoffs | `/mht-cet` | MHT-CET cutoff tools |
| All India cutoffs | `/mht-cet/all-india-cutoffs` | All India cutoff data |
| State cutoffs | `/mht-cet/state-cutoffs` | State cutoff data |
| Colleges | `/mht-cet/colleges` | MHT-CET college list |
| College detail | `/mht-cet/colleges/[slug]` | College cutoffs and seat data |

## Other Application Pages

| Page Name | URL | Description |
|-----------|-----|-------------|
| Account | `/account` | User account dashboard |
| Login | `/login` | User login |
| Signup | `/signup` | User registration |
| Page | URL | Description |
| ------- | ---------- | --------------------- |
| Account | `/account` | Account page |
| Login | `/login` | Sign-in page |
| Signup | `/signup` | Account creation page |

## Sitemap Locations

Expand Down
14 changes: 7 additions & 7 deletions app/mht-cet-login-required/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,18 +30,18 @@ export default async function MHTCETLoginRequired({
MHT-CET Resources
</h1>
<p className="text-lg text-gray-600">
Access exclusive MHT-CET cutoffs
Sign in to view MHT-CET cutoff data
</p>
</div>

<div className="bg-gradient-to-r from-green-50 to-emerald-50 border border-green-200 rounded-xl p-5 shadow-sm relative overflow-visible">
<div className="text-center relative z-10">
<h3 className="text-lg font-semibold text-green-800 mb-1">
Your Data is Safe
Privacy information
</h3>
<p className="text-sm text-green-700 leading-relaxed">
We only collect your email to rate limit usage and keep this
service free for everyone. We will never sell your data.
We collect your email address to enforce usage limits. We do not
sell your data.
</p>
</div>

Expand All @@ -59,10 +59,10 @@ export default async function MHTCETLoginRequired({

<div className="bg-blue-50 border border-blue-200 rounded-lg p-6">
<h2 className="text-xl font-semibold text-blue-900 mb-3">
Login Required
Sign-in required
</h2>
<p className="text-blue-700 mb-4">
Please sign in to access MHT-CET resources including state cutoffs
Sign in to view MHT-CET resources, including state cutoffs.
</p>

<div className="space-y-3">
Expand Down Expand Up @@ -91,7 +91,7 @@ export default async function MHTCETLoginRequired({

<div className="text-sm text-gray-500">
<Link href="/" className="hover:underline">
Back to Homepage
Back to home page
</Link>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion app/mht-cet/all-india-cutoffs/TEST_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ This distinction matters because the current checked-in page exposes only round
http://localhost:3000/mht-cet/all-india-cutoffs
```

3. Hit the API endpoints directly.
3. Request the API endpoints directly.

```text
http://localhost:3000/api/mht-cet/all-india-cutoffs/2024-round-one
Expand Down
8 changes: 4 additions & 4 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export default function Home() {
<SparklesText text="DEETNUTS" />
</div>
<h2 className="text-center font-heading text-3xl m1000:text-2xl m500:text-xl m400:text-xl">
mildly important college data simplified
clear college and admission data
</h2>
</div>
<div className="relative w-full h-[50vh] flex justify-center items-center overflow-hidden">
Expand All @@ -54,7 +54,7 @@ export default function Home() {
/>
<img
src="https://res.cloudinary.com/dfyrk32ua/image/upload/v1722072594/deetnuts/3_t0cm25.png"
alt="DEETNUTS - College data simplified for MHT-CET aspirants"
alt="DEETNUTS college and admission data for MHT-CET students"
className="w-full h-full object-contain object-center"
/>
</picture>
Expand All @@ -72,14 +72,14 @@ export default function Home() {
.map((_, id) => (
<div className="flex items-center" key={id}>
<span className="mx-10 text-xl font-bold sm:text-2xl lg:text-4xl">
mildly important college data simplified
clear college and admission data
</span>
<a className="text-2xl md:text-6xl" key={`emoji-${id}`}>
{" "}
🎀{" "}
</a>
<span className="mx-10 text-xl font-bold sm:text-2xl lg:text-4xl">
self scrapped da data
source-backed MHT-CET data
</span>
<a className="text-2xl md:text-6xl" key={`emoji-${id}-2`}>
{" "}
Expand Down
25 changes: 12 additions & 13 deletions components/CollegeGrid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ const CollegeCard = memo(function CollegeCard({
scroll={false}
className="w-full inline-flex items-center justify-center px-6 py-3 bg-main text-black font-heading rounded-base hover:bg-main-dark transition-all duration-200 border-2 border-black shadow-base"
>
<span>View Details</span>
<span>View college</span>
<svg
className="w-4 h-4 ml-2 group-hover:translate-x-1 transition-transform"
fill="currentColor"
Expand Down Expand Up @@ -146,10 +146,10 @@ export default function CollegeGrid({ colleges }: CollegeGridProps) {
<div className="bg-white border-4 border-black rounded-base shadow-base p-4 sm:p-8 mb-8">
<div className="mb-6">
<h2 className="text-3xl font-heading text-black mb-2">
Find Your Perfect College
Search colleges
</h2>
<p className="text-lg font-base text-black">
Use the filters below to narrow down your search
Search by college name, ID, or home university.
</p>
</div>

Expand All @@ -159,12 +159,12 @@ export default function CollegeGrid({ colleges }: CollegeGridProps) {
htmlFor="search"
className="block text-sm font-semibold text-gray-700 mb-3"
>
🔍 Search Colleges
Search colleges
</label>
<input
type="text"
id="search"
placeholder="Search by name, ID, or university..."
placeholder="Search by name, ID, or university"
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
className="w-full px-4 py-3 border-2 border-black rounded-base shadow-base focus:outline-none focus:ring-2 focus:ring-main focus:border-main transition-all duration-200 text-black placeholder-gray-500"
Expand All @@ -175,15 +175,15 @@ export default function CollegeGrid({ colleges }: CollegeGridProps) {
htmlFor="status"
className="block text-sm font-semibold text-gray-700 mb-3"
>
📊 Filter by Status
Filter by status
</label>
<select
id="status"
value={statusFilter}
onChange={(e) => setStatusFilter(e.target.value)}
className="w-full px-4 py-3 border-2 border-black rounded-base shadow-base focus:outline-none focus:ring-2 focus:ring-main focus:border-main transition-all duration-200 text-black bg-white"
>
<option value="all">All Statuses</option>
<option value="all">All statuses</option>
{uniqueStatuses.map((status) => (
<option key={status} value={status}>
{status}
Expand All @@ -196,7 +196,7 @@ export default function CollegeGrid({ colleges }: CollegeGridProps) {
<div className="mt-6 flex items-center justify-between text-sm">
<div className="flex items-center space-x-4">
<span className="px-4 py-2 bg-main text-black rounded-base font-heading border-2 border-black shadow-base">
📈 Showing {filteredColleges.length} of {colleges.length} colleges
Showing {filteredColleges.length} of {colleges.length} colleges
</span>
{(searchTerm || statusFilter !== "all") && (
<button
Expand All @@ -206,7 +206,7 @@ export default function CollegeGrid({ colleges }: CollegeGridProps) {
}}
className="px-4 py-2 bg-red-300 text-black rounded-base hover:bg-red-400 transition-colors border-2 border-black shadow-base font-heading"
>
✖️ Clear filters
Clear filters
</button>
)}
</div>
Expand All @@ -219,11 +219,10 @@ export default function CollegeGrid({ colleges }: CollegeGridProps) {
<div className="max-w-md mx-auto">
<div className="text-6xl mb-4">🔍</div>
<h3 className="text-2xl font-bold text-black mb-2">
No colleges found
No colleges match these filters
</h3>
<p className="text-black mb-6">
Try adjusting your search criteria or filters to find more
results.
Change the search terms or filters and try again.
</p>
<button
onClick={() => {
Expand All @@ -232,7 +231,7 @@ export default function CollegeGrid({ colleges }: CollegeGridProps) {
}}
className="px-6 py-3 bg-main text-black rounded-base hover:bg-main-dark transition-colors font-heading border-2 border-black shadow-base"
>
Reset Search
Clear filters
</button>
</div>
</div>
Expand Down
4 changes: 2 additions & 2 deletions components/SiteJsonLd.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export default function SiteJsonLd() {
},
sameAs: ["https://x.com/kewonit", "https://discord.gg/xbtqGcQ6SF"],
description:
"Mildly important Maharashtra college data simplified. Comprehensive MHT-CET cutoffs, seat matrices, and admission data.",
"Maharashtra college and admission data, including MHT-CET cutoffs and seat matrices.",
contactPoint: {
"@type": "ContactPoint",
contactType: "customer service",
Expand All @@ -36,7 +36,7 @@ export default function SiteJsonLd() {
"@id": `${baseUrl}/#website`,
url: baseUrl,
name: "DEETNUTS",
description: "Mildly important data related to colleges simplified",
description: "College and admission data for students in Maharashtra",
inLanguage: "en-IN",
publisher: {
"@id": `${baseUrl}/#organization`,
Expand Down
Loading