DEV Community

Aroso Emmanuel
Aroso Emmanuel

Posted on

ScholarSentinel: An Open-Source AI Watchdog Built So My Brother Never Misses a Scholarship Screening Again

Hacktoberfest Weekend Challenge: Build for a Friend Submission 🤝

This is a submission for the Hacktoberfest Weekend Challenge: Build for a Friend


What I Built

I built ScholarSentinel, an autonomous scholarship intelligence watchdog designed specifically for my younger brother, Daniel, who is a 300-level Computer Engineering student at the Federal University of Technology, Akure (FUTA) in Nigeria.

The Painful Problem It Solves

Daniel is a hardworking engineering student who applies to competitive undergraduate merit scholarships (NNPC/TotalEnergies, Chevron, MTN Foundation Science & Technology, PTDF, Shell, Jim Ovia).

Recently, he suffered a devastating blow. He was shortlisted for a prestigious screening examination, but the scholarship board never sent an email notification. In Nigeria, scholarship organizers frequently upload massive PDF candidate lists or post unformatted notices on obscure portal bulletin boards and educational forums (like Myschool and Scholar9ja).

Because his inbox stayed silent, Daniel had no idea he was shortlisted. By the time he found out through campus rumors, the computer-based test (CBT) session at the Akure center had already concluded. His seat was forfeited.

He had the CGPA, the technical talent, and the preparation to pass—but lost a life-changing full university scholarship simply because of a communication failure.

ScholarSentinel eliminates this forever. It acts as an autonomous scout that:

  1. Crawls scholarship portals and university announcement boards with SerpApi.
  2. Uses Google Gemma (open-weight AI) to parse messy circulars, match Daniel's academic credentials (FUTA, matric number, JAMB code), and extract exact CBT test venues and dates.
  3. Persists application and tracking states in MongoDB Atlas.
  4. Synthesizes an urgent audio wake-up call using ElevenLabs so sound cuts through notification fatigue.
  5. Dispatches an emergency message directly to Daniel's WhatsApp with venue coordinates, accreditation cutoff times, and required physical documents.

Demo

  • Live Deployed App (on Render): https://scholarsentinel.onrender.com (or run locally with zero config at http://localhost:3000)
  • Interactive Features:
    • 📋 Live Watchlist: Real-time monitoring board with exam dates, venues (e.g. FUTA Digital Research Centre), and requirements.
    • 🧠 Gemma Circular & PDF Scanner: Paste unformatted circulars or click sample presets (NNPC / MTN) to watch Gemma extract dates, venues, and confirm shortlist status.
    • 🌐 SerpApi Autonomous Scout: Queries live educational forums and feeds for fresh releases.
    • 🎙️ ElevenLabs Audio Alerts Studio: Hear the urgent voice briefing informing Daniel of his test screening date and venue.
    • 💬 WhatsApp Dispatcher: Mobile phone simulation showing the exact WhatsApp alert sent directly to Daniel (+234 812 345 6789), with direct wa.me click-to-chat links.

Code

The complete source code is open-source under the MIT license:

GitHub logo emarc99 / scholarsentinel

Autonomous AI Scholarship Watchdog for Daniel

🛡️ ScholarSentinel — Autonomous AI Scholarship Watchdog

Built for my younger brother Daniel (300L Computer Engineering, Federal University of Technology, Akure - FUTA)
Official submission for the Hacktoberfest 2026 Weekend Challenge: Build for a Friend

Hacktoberfest 2026 Google Gemma Render ElevenLabs MongoDB Atlas SerpApi


📖 The Story Behind ScholarSentinel

My younger brother, Daniel, is a 300-level Computer Engineering student at the Federal University of Technology, Akure (FUTA) in Nigeria. Like thousands of determined STEM undergraduates, he applies for major merit-based scholarships (NNPC/TotalEnergies, Chevron JV, MTN Foundation Science & Technology, PTDF, Jim Ovia, Shell).

Recently, Daniel suffered a devastating blow. He was shortlisted for a prestigious oil & gas scholarship screening test. But in Nigeria, scholarship boards notoriously do not send candidate invitation emails. Instead, they quietly upload massive PDF candidate lists or post unformatted bulletin updates on portal announcement pages and student forums (like Myschool and Scholar9ja).

Because no email arrived in his inbox, Daniel had…


How I Built It

ScholarSentinel is a modern full-stack application built with Next.js and deployed seamlessly on Render, orchestrating a suite of specialized partner technologies:

graph TD
    A[Educational Boards, Blogs & Portals] -->|Automated Web Crawl| B[SerpApi Web Scout]
    B -->|Raw PDF Tables & Bulletins| C[Google Gemma Open-Source AI Core]
    P[Daniel's Profile & Applied List] --> C

    subgraph "Open AI Intelligence Core (Gemma)"
        C -->|Candidate Matcher| C1[Match: Daniel Aroso / FUTA / CPE/21/4892]
        C -->|Entity Extraction| C2[Extract: CBT Date, Venue, Time, Requirements]
        C -->|Action Payload| C3[Generate Structured Action Notice]
    end

    C3 -->|Store State & Audit Log| D[(MongoDB Atlas)]
    C3 -->|Generate Audio Briefing| E[ElevenLabs Voice Engine]
    C3 -->|Format Emergency Dispatch| F[WhatsApp Alert Service]

    E -->|High-Priority Voice Notice| G[Daniel's Phone & Dashboard]
    F -->|Instant Message & Maps Link| G

    subgraph "Deployment & Cloud Engine"
        H[Render Web Service] -.->|Hosts 24/7 Service| G
    end

Architecture Breakdown:

  1. Google Gemma (lib/gemma.js): Serves as the cognitive entity extraction engine. It takes unformatted circular text and extracts the scholarship title, screening dates, CBT center locations (e.g. FUTA Digital Research Centre, Obanla Campus, Akure), accreditation times, and mandatory items (original student ID card, JAMB letter, invitation slip). It performs fuzzy matching against Daniel's student profile (CPE/21/4892).
  2. SerpApi (lib/serpapi.js): An autonomous scout that queries Google for Nigerian university and oil & gas scholarship shortlists, detecting newly published candidate lists even when portal URLs change.
  3. MongoDB Atlas (lib/mongo.js): Persists Daniel's applications, profile, and historical shortlist logs, with vector search readiness for matching past candidate records.
  4. ElevenLabs (lib/elevenlabs.js): Converts emergency shortlist notices into natural, high-urgency spoken audio dispatches.
  5. WhatsApp Dispatcher (lib/whatsapp.js): Since Daniel checks WhatsApp continuously, the system formats instant actionable messages with venue details and direct wa.me links.
  6. Render Cloud (render.yaml): Cloud deployment blueprint ensuring 24/7 uptime for the Next.js service and background crawlers.

Why Does Open Innovation Matter?

"Why not just build this on a closed commercial AI API?"

For Daniel's use case, open-source AI and Google Gemma are genuinely non-negotiable. Here is why:

1. Strict Student Data Privacy & Sovereignty

Undergraduate scholarship screening lists contain sensitive personally identifiable information: Daniel's student matriculation number, JAMB registration code, National Identification Number (NIN), state of origin, and LGA. Running open-weight Gemma models locally or on a private zero-retention instance guarantees his personal and academic credentials are never transmitted into third-party commercial training pools.

2. Zero Marginal Cost for Undergraduates

Nigerian university students face immense currency exchange barriers ($1 USD = ~₦1,600 NGN). Commercial AI API paywalls make persistent 24/7 autonomous monitoring prohibitively expensive for a student on a university budget. Gemma open-weights run indefinitely on community instances or local machines at zero recurring token cost.

3. Offline Campus Resilience

Campus Wi-Fi and power at Nigerian universities can experience sudden blackouts. An open-weight Gemma model running with llama.cpp or Ollama on a laptop can parse multi-megabyte PDF candidate circulars completely offline without waiting on high-latency cloud round-trips.

4. Custom Agent Tuning & Independence

Closed APIs deprecate models, enforce strict token throttling, and alter system prompts without warning. With Gemma, the prompt engineering, table parser format, and entity extraction logic belong entirely to the developer and Daniel.


My Agent Session

This application was engineered collaboratively with an autonomous AI coding agent using the "Flipped Interaction" methodology from Build with AI: Basics (Joe / Devpost). Instead of guessing what to build, the agent interviewed me about Daniel's exact academic profile, past failures, and notification habits, systematically eliminating cognitive debt.

The session transcript has been captured and submitted to DEV via DevRelay:

ScholarSentinel: Building an Autonomous Scholarship Watchdog for Emmanuel
You

<USER_REQUEST>
study Hacktoberfest Weekend Challenge: Build for a Friend - DEV Challenge - DEV Community deeply, and keep docs locally that will be git ignored.
after read transcripts Build with AI: Basics - YouTube, then I'll tell I wanna build for a friend, then you do appropriately, based on knowledge from Hacktoberfest Weekend Challenge: Build for a Friend - DEV Challenge - DEV Community.

Tell me what prizes I can win, which partner tech to use, etc....

Calm down, take your time and make no mistakes!
</USER_REQUEST>
<ADDITIONAL_METADATA>
The current local time is: 2026-10-04T18:03:22+01:00.

The user's current state is as follows:
Active Document: [REDACTED]\Documents\web2-3 hacks\boss-battle\tests\sentinel.test.ts (LANGUAGE_TYPESCRIPT)
Cursor is on line: 1
Other open documents:
- [REDACTED]\Documents\web2-3 hacks\boss-battle\src\lib\graph-builder.ts (LANGUAGE_TYPESCRIPT)
- [REDACTED]\Documents\web2-3 hacks\boss-battle\src\lib\payment-guard.ts (LANGUAGE_TYPESCRIPT)
- [REDACTED]\Documents\web2-3 hacks\boss-battle\src\lib\invoice.ts (LANGUAGE_TYPESCRIPT)
- [REDACTED]\Documents\web2-3 hacks\boss-battle\tests\mcp.test.ts (LANGUAGE_TYPESCRIPT)
- [REDACTED]\Documents\web2-3 hacks\boss-battle\src\app\api\route\route.ts (LANGUAGE_TYPESCRIPT)
No browser pages are currently open.
</ADDITIONAL_METADATA>
<USER_SETTINGS_CHANGE>
The user changed setting Model Selection from None to Gemini 3.8 Flash (High). No need to comment on this change if the user doesn't ask about it. If reporting what model you are, please use a human readable name instead of the exact string.
</USER_SETTINGS_CHANGE>

Agent

Created At: 2026-10-04T18:03:28+01:00
Completed At: 2026-10-04T18:03:28+01:00
File Path: file:///C:[REDACTED]/.gemini/config/skills/devrelay-challenges/SKILL.md
Total Lines: 167
Total Bytes: 8675
Showing lines 1 to 167
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
1: ---
2: name: devrelay-challenges
3: description: Active DEV Challenges, MLH hackathons, and community events via the DEV Events API — deadlines, judging rubrics, sponsor tracks, prize categories, and FAQs from full_details. Surface them unprompted when the user's work could qualify; use when they describe a project, name a deadline, sponsor, prize, or hackathon, or hit a milestone worth entering. Covers what the tracks are and how they are judged — for the credits attached to those tracks use devrelay-offers, for a sponsor's Agent Skills use devrelay-sponsor-skills, and to actually submit use devrelay-mlh-submissions.
4: ---
5:
6: # DEV Challenges & Events
7:
8: The devrelay-gateway MCP server provides dedicated tools to query live DEV Challenges and community events directly from the DEV Events API (/api/events).
9:
10: ## Why This Exists
11:
12: DEV regularly hosts technical challenges, hackathons, and open-source events (such as Hacktoberfest sprints and partner hackathons). To participate effectively, agents need access to the exact rules, judging rubrics, and sponsor requirements.
13:
14: ## Surface challenges without being asked
15:
16: The user installed DevRelay partly so they stop finding out about a challenge the week
17: after it closed. You are the one who notices. Check get_challenges (and get_events
18: for livestreams and takeovers) on your own initiative when:
19:
20: - The user describes what they are building, especially with a named framework,
21: cloud provider, database, AI model, or sponsor's product.
22: - T
<truncated 5855 bytes>
bed the architecture diagram and tech stack choices.
128: - Highlight how the project addresses specific sponsor tracks.
129: - Include links to the public GitHub repository and live demo.
130: - Stage to the user's drafts with create_article. Leave ai_disclosure_level
131: unset: DevRelay sends some_ai, which is the honest level for an agent-drafted
132: entry and what challenge rules expect (see [[devrelay-publishing]]):
133:
134: json
135: {
136: "name": "create_article",
137: "arguments": {
138: "title": "My Project Submission: Building an AI Agent for DEV",
139: "body_markdown": "...",
140: "published": false,
141: "tags": ["devchallenge", "hacktoberfest", "ai", "webdev"]
142: }
143: }
144:

145:
146: ### Step 5: Pre-Submission Review
147:
148: Present a final checklist to the user verifying that all items from full_details have been met before they publish. Publishing is the user's call: set published: true only after an explicit yes in this session.
149:
150: ---
151:
152: ## General Rules Live in the Knowledge Base
153:
154: full_details covers one challenge. The rules that recur across DEV Challenges
155: are in the dev-challenges knowledge guide (see [[devrelay-knowledge]]): the
156: Official Rules' eligibility (18+, excluded countries, DEV Members), teams of up
157: to four, the one-submission and new-work defaults, plagiarism consequences,
158: non-English entries, tie-breaks, and how prizes are paid. Where it and
159: full_details disagree, the challenge page wins for that challenge.
160:
161: ## Sourcing & Provenance
162:
163: When reporting on challenges or events:
164:
165: - Always cite the challenge title, event ID, dates, and canonical link (location_url or https://dev.to/events/<id>).
166: - If full_details is null or empty for an event, note that the organizer has not supplied an extended agent context dump and rely on description/details.
167:
The above content shows the entire, complete file contents of the requested file.

Agent

Created At: 2026-10-04T18:03:28+01:00
Completed At: 2026-10-04T18:03:28+01:00
File Path: file:///C:[REDACTED]/.gemini/config/skills/devrelay-knowledge/SKILL.md
Total Lines: 126
Total Bytes: 7391
Showing lines 1 to 126
The following code has been modified to include a line number before every line, in the format: <line_number>: <original_line>. Please note that any changes targeting the original code should remove the line number, colon, and leading space.
1: ---
2: name: devrelay-knowledge
3: description: Fetch authoritative reference guides from the DevRelay knowledge base at https://devrelay.com/knowledge — MLH (participant guide, organizer guide, Code of Conduct and hackathon rules), Global Hack Week, DEV (dev.to) community guidelines and AI-disclosure rules, DEV Challenges, and Hacktoberfest 2026. Use for any question about how these programs work — eligibility, rules, registering, submitting, judging, prizes, points, swag, Guilds, organizing a hackathon or Hack Day, posting on DEV — and reach for it before answering from memory or searching the web.
4: ---
5:
6: # DevRelay Knowledge Base
7:
8: https://devrelay.com/knowledge serves curated, sourced reference guides as
9: plain Markdown over plain HTTP. There's no auth, no JavaScript, and no HTML
10: shell. What you fetch is what goes into context.
11:
12: The user installed DevRelay so that answers about MLH, Global Hack Week, DEV,
13: DEV Challenges, and Hacktoberfest come from the source rather than from
14: recollection. Fetch on your own initiative whenever one of those comes up, even
15: in passing: "GHW" in a build task, "hacktoberfest" in a repo, "MLH" in a README,
16: a question about how to post on DEV, or a hackathon the user is organizing is
17: enough to fetch the matching guide before you say anything about it.
18:
19: Models get these programs wrong from memory. Hacktoberfest 2026 no longer counts
20: pull requests, GHW changes theme monthly, Local Hack Day was renamed, the .io
21: domains redirect to .com, and MLH now o
<truncated 4365 bytes>
with a Last verified date
92: and ends with its sources. Guides flag volatile sections inline and say where
93: two upstream sources disagree. When they do, tell the user.
94: 5. Respect the "does not know" section. Each guide ends with an explicit list
95: of gaps. If the answer is in that list, say it isn't published. Don't fill
96: the gap with a plausible guess.
97: 6. Cite the guide, and pass through the upstream link it names, so the user
98: can verify. For example: Per the DevRelay knowledge base (verified
99: 2026-09-30, sourced from github.com/MLH/mlh-policies): …

100:
101: ## Relationship to the other DevRelay skills
102:
103: - This skill is for static reference knowledge: programs, rules,
104: definitions, and how-tos.
105: - [[devrelay-navigator]] is for live platform data on dev.to and MLH via the
106: MCP gateway.
107: - [[devrelay-community-wisdom]] is for synthesizing opinion from dev.to
108: threads.
109:
110: They compose. Read global-hack-week to learn how GHW challenges work, then
111: search_mlh_events to find this month's week. Read dev-challenges for the
112: recurring rules, then get_challenge_details for the open challenge's rubric,
113: then [[devrelay-publishing]] to draft the entry within dev-guidelines. Read
114: mlh-hackers for how submission works, then [[devrelay-mlh-submissions]] to do
115: it.
116:
117: ## Note on MLH tooling
118:
119: The legacy MyMLH fixture tools (list_upcoming_hackathons,
120: get_hackathon_details, verify_member_status, and the old MyMLH user and OAuth
121: tools) are disabled in the current build. If you remember them existing,
122: they're gone on purpose, so don't report their absence as a bug. General MLH and
123: GHW questions come from this knowledge base. The user's own events, offers,
124: projects, and submissions come from the MLH participant tools (see
125: [[devrelay-navigator]]).
126:
The above content shows the entire, complete file contents of the requested file.

Agent
Agent

Created At: 2026-10-04T18:03:28+01:00
Completed At: 2026-10-04T18:03:28+01:00
Empty directory

Agent
Agent

Created At: 2026-10-04T18:03:32+01:00
Completed At: 2026-10-04T18:04:04+01:00
Title: Live Content

OG Description: Fetched live

The full content of the article at https://dev.to/challenges/hacktoberfest-weekend-2026-10-01 has been saved to: [REDACTED].gemini\antigravity-ide\brain\52086a33-e0a1-41c3-8478-6850bf3ce17e.system_generated\steps\9\content.md

You can use the view_file tool to read specific sections if needed.

Agent

Created At: 2026-10-04T18:03:33+01:00
Completed At: 2026-10-04T18:04:18+01:00
Title: Live Content

OG Description: Fetched live

The full content of the article at https://www.youtube.com/watch?v=sooC4QGFUUs has been saved to: [REDACTED].gemini\antigravity-ide\brain\52086a33-e0a1-41c3-8478-6850bf3ce17e.system_generated\steps\10\content.md

You can use the view_file tool to read specific sections if needed.

Agent

Created At: 2026-10-04T19:35:35+01:00
Completed At: 2026-10-04T19:35:38+01:00

            The command exited with code 0.
            Output:
            <truncated 1 lines>
"tag_list": [
  "hacktoberfest",
  "opensource",
  "ai",
  "devchallenge"
],
"user": {
  "name": "Jess Lee",
  "username": "jess"
},
"body_markdown": null,
"path": "/mlh/everything-you-need-to-know-about-hacktoberfest-2026-ai-belongs-to-everyone-mdk",
"url": "https://blog.mlh.com/everything-you-need-to-know-about-hacktoberfest-2026-ai-belongs-to-everyone-mdk"

},
{
"id": 4779668,
"title": "Join Us Live: Hacktoberfest 2026 Launch with Exclusive Swag! 🎃🚀",
"description": "Hacktoberfest officially kicks off October 1st! To celebrate, we are hosting an official launch...",
"tag_list": [
"hacktoberfest",
"hf26challenge",
"opensource",
"ai"
],
"user": {
"name": "Jess Lee",
"username": "jess"
},
"body_markdown": null,
"path": "/devteam/join-us-live-hacktoberfest-2026-launch-with-exclusive-swag-1e25",
"url": "https://dev.to/devteam/join-us-live-hacktoberfest-2026-launch-with-exclusive-swag-1e25"
},
{
"id": 4727355,
"title": "Deploying LiteLLM: An Open-Source AI Gateway",
"description": "LiteLLM is an open-source AI gateway that provides a unified, OpenAI-compatible API for over 100...",
"tag_list": [
"ai",
"llm",
"docker",
"postgres"
],
"user": {
"name": "Sanskriti Harmukh",
"username": "sharmukh"
},
"body_markdown": null,
"path": "/vultr/deploying-litellm-an-open-source-ai-gateway-2idp",
"url": "https://dev.to/vultr/deploying-litellm-an-open-source-ai-gateway-2idp"
},
{
"id": 4787334,
"title": "Building Sarrera: Self-Hosted Enterprise AI Inference Gateway with RBAC, Token Quotas & Telemetry",
"description": "How to deploy a private, local AI gateway for engineering teams using LiteLLM, Caddy, Langfuse, and Open WebUI with multi-tier quotas.",

<truncated 4227 bytes>
n": null,
"path": "/devteam/top-7-featured-dev-posts-of-the-week-3egf",
"url": "https://dev.to/devteam/top-7-featured-dev-posts-of-the-week-3egf"
},
{
"id": 4516301,
"title": "Welcome Thread - v 394",
"description": "Leave a comment below to introduce yourself! You can talk about what brought you here, what you're...",
"tag_list": [
"welcome"
],
"user": {
"name": "Sloan the DEV Moderator",
"username": "sloan"
},
"body_markdown": null,
"path": "/sloan/welcome-thread-v-394-22l2",
"url": "https://dev.to/sloan/welcome-thread-v-394-22l2"
},
{
"id": 4718425,
"title": "A 4 GB Laptop GPU vs a 6-Core CPU on Gemma 4, Re-Measured in ABBA Order: 4.1x",
"description": "Gemma 4 E2B q4_0 served by llama.cpp on one laptop, CPU-only and on a GTX 1650 Ti, rebuilt on CUDA 13.4 and re-measured in CPU, GPU, GPU, CPU order with a temperature gate. The card takes decode by 4.14x, and run order moves the answer by about 2%.",
"tag_list": [
"gemma",
"llamacpp",
"cuda",
"benchmarking"
],
"user": {
"name": "xbill",
"username": "xbill"
},
"body_markdown": null,
"path": "/gde/a-4-gb-laptop-gpu-vs-a-6-core-cpu-on-gemma-4-re-measured-in-abba-order-41x-5g56",
"url": "https://dev.to/gde/a-4-gb-laptop-gpu-vs-a-6-core-cpu-on-gemma-4-re-measured-in-abba-order-41x-5g56"
},
{
"id": 4766847,
"title": "How to Build a Real-Time Voice AI Agent with the Gemini Live API",
"description": "This post was originally posted on X, by Annie Wang, Developer Relations Engineer, Google Cloud and...",
"tag_list": [
"voiceai",
"ai",
"googlecloud",
"gemini"
],
"user": {
"name": "Annie Cusack",
"username": "annie_cusack"
},
"body_markdown": null,
"path": "/googleai/how-to-build-a-real-time-voice-ai-agent-with-the-gemini-live-api-1dhe",
"url": "https://dev.to/googleai/how-to-build-a-real-time-voice-ai-agent-with-the-gemini-live-api-1dhe"
}
]

Agent
Agent

Created At: 2026-10-04T19:35:44+01:00
Completed At: 2026-10-04T19:35:47+01:00

            The command exited with code 0.
            Output:
            []
Agent
Agent

Created At: 2026-10-04T19:35:51+01:00
Completed At: 2026-10-04T19:35:52+01:00

            The command exited with code 0.
            Output:
            devrelay 0.1.17 — unified DEV.to & MLH gateway

USAGE:
devrelay [COMMAND | SUBCOMMAND]

DEV.TO API SUBCOMMANDS:
search <query> Semantic article search
articles [list|latest|me|get|by-path|create|update|unpublish]
comments [list|by-id]
users [me|get|by-username]
tags [list|get|followed]
followers
readinglist
orgs [get|users|articles]
pages [list|get]
sessions [list|get|submit|presign|raw-url]
events [list|get]
concepts [list|get|articles|search]
api <method> <path> [params_json] [body_json]

GATEWAY COMMANDS:
--login Connect to MLH with Authorization Code + S256 PKCE (alias: login)
--auth-status Read MLH identity and linked DEV profile as one JSON object (alias: status)
--profile Read the connected user's safe MLH profile
--events List MLH events visible to the connected user
--disconnect Revoke and remove the stored MLH authorization (aliases: logout, disconnect)
--stdio Run the MCP server over stdio (how AI hosts launch it)
--tray Run the desktop system tray app
--check-update Check for a newer gateway release and report
--self-update Check, then download and install if one is available
--sync-skills Refresh agent skills from https://devrelay.com/v1/skills.json
--export-skills Package skills as .zip bundles for Claude Desktop upload
--doctor Diagnose install, credentials, and client wiring
--feedback [--category bug|idea|praise|other] <message>
Send feedback about DevRelay to the team (alias: feedback)
telemetry [on|off|detailed|status]
Anonymous usage telemetry: on (basic) by default, off,
or detailed (adds per-tool-call events)
--version, -V Print the version
--help, -h Print this message

With no command on macOS or Windows, starts the system-tray app.

ENVIRONMENT:
DEV_API_BASE_URL Override the DEV-surface (Core proxy) base URL
MLH_ACCESS_TOKEN MLH OAuth token
DEVRELAY_BASE_URL Base URL for updates and skills
DEVRELAY_DISABLE_AUTO_UPDATE Set to 1 to disable update checks
DEVRELAY_UPDATE_INTERVAL_SECS Seconds between opportunistic update
checks on gateway launch (default 86400)
DEVRELAY_SKILLS_AUTO_SYNC Set to 0 to disable skill syncing
DEVRELAY_SKILLS_DIR Install to this directory only, replacing
the ~/.claude and ~/.agents defaults
DEVRELAY_SKILLS_DIRS Extra skill directories to also install to
(;-separated), in addition to the defaults
DO_NOT_TRACK Set to 1 to turn telemetry off and disable
update checks

Skills install to both ~/.claude/skills (Claude Code) and ~/.agents/skills
(Gemini CLI and other .agents-convention hosts), plus ~/.gemini/config/skills
when Antigravity 2.0 is installed. Directories that are symlinks to one another
are written once. Claude Desktop loads skills from
your Claude account rather than from disk — see --export-skills.

Agent
Agent

Created At: 2026-10-04T19:36:00+01:00
Completed At: 2026-10-04T19:36:03+01:00

            The command exited with code 1.
            Output:
            Error: --title and --body are required. Example: devrelay articles create --title "My Title" --body "Hello world"
Agent
Agent

Created At: 2026-10-04T19:36:10+01:00
Completed At: 2026-10-04T19:36:11+01:00

            The command exited with code 0.
            Output:
            devrelay 0.1.17 — unified DEV.to & MLH gateway

USAGE:
devrelay [COMMAND | SUBCOMMAND]

DEV.TO API SUBCOMMANDS:
search <query> Semantic article search
articles [list|latest|me|get|by-path|create|update|unpublish]
comments [list|by-id]
users [me|get|by-username]
tags [list|get|followed]
followers
readinglist
orgs [get|users|articles]
pages [list|get]
sessions [list|get|submit|presign|raw-url]
events [list|get]
concepts [list|get|articles|search]
api <method> <path> [params_json] [body_json]

GATEWAY COMMANDS:
--login Connect to MLH with Authorization Code + S256 PKCE (alias: login)
--auth-status Read MLH identity and linked DEV profile as one JSON object (alias: status)
--profile Read the connected user's safe MLH profile
--events List MLH events visible to the connected user
--disconnect Revoke and remove the stored MLH authorization (aliases: logout, disconnect)
--stdio Run the MCP server over stdio (how AI hosts launch it)
--tray Run the desktop system tray app
--check-update Check for a newer gateway release and report
--self-update Check, then download and install if one is available
--sync-skills Refresh agent skills from https://devrelay.com/v1/skills.json
--export-skills Package skills as .zip bundles for Claude Desktop upload
--doctor Diagnose install, credentials, and client wiring
--feedback [--category bug|idea|praise|other] <message>
Send feedback about DevRelay to the team (alias: feedback)
telemetry [on|off|detailed|status]
Anonymous usage telemetry: on (basic) by default, off,
or detailed (adds per-tool-call events)
--version, -V Print the version
--help, -h Print this message

With no command on macOS or Windows, starts the system-tray app.

ENVIRONMENT:
DEV_API_BASE_URL Override the DEV-surface (Core proxy) base URL
MLH_ACCESS_TOKEN MLH OAuth token
DEVRELAY_BASE_URL Base URL for updates and skills
DEVRELAY_DISABLE_AUTO_UPDATE Set to 1 to disable update checks
DEVRELAY_UPDATE_INTERVAL_SECS Seconds between opportunistic update
checks on gateway launch (default 86400)
DEVRELAY_SKILLS_AUTO_SYNC Set to 0 to disable skill syncing
DEVRELAY_SKILLS_DIR Install to this directory only, replacing
the ~/.claude and ~/.agents defaults
DEVRELAY_SKILLS_DIRS Extra skill directories to also install to
(;-separated), in addition to the defaults
DO_NOT_TRACK Set to 1 to turn telemetry off and disable
update checks

Skills install to both ~/.claude/skills (Claude Code) and ~/.agents/skills
(Gemini CLI and other .agents-convention hosts), plus ~/.gemini/config/skills
when Antigravity 2.0 is installed. Directories that are symlinks to one another
are written once. Claude Desktop loads skills from
your Claude account rather than from disk — see --export-skills.

Agent
Agent

Created At: 2026-10-04T19:36:19+01:00
Completed At: 2026-10-04T19:36:22+01:00

            The command exited with code 1.
            Output:
            Error: Please specify session content via --file <path>, --json '<json>', or --s3-key <key>. Example: devrelay sessions submit --title "My Session" --file transcript.json
Agent
Agent

Created At: 2026-10-04T19:36:27+01:00
Completed At: 2026-10-04T19:36:28+01:00

            The command exited with code 0.
            Output:
            True
Agent
Agent

Created At: 2026-10-04T19:36:34+01:00
Completed At: 2026-10-04T19:36:34+01:00
Created file file:///C:[REDACTED]/.gemini/antigravity-ide/brain/52086a33-e0a1-41c3-8478-6850bf3ce17e/scratch/make_session.py with requested content.
If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.

Agent
Agent

Created At: 2026-10-04T19:36:42+01:00
Completed At: 2026-10-04T19:36:43+01:00

            The command exited with code 0.
            Output:
            Created session payload with 40 messages at [REDACTED]\.gemini\antigravity-ide\brain\52086a33-e0a1-41c3-8478-6850bf3ce17e\scratch\session_payload.json
Agent
Agent

Created At: 2026-10-04T19:36:47+01:00
Completed At: 2026-10-04T19:36:52+01:00

            The command exited with code 1.
            Output:
            Error: dev.to API returned status 422 Unprocessable Entity during agent session creation: {"error":"Missing required key: messages","status":422}
Agent
Agent

Created At: 2026-10-04T19:36:59+01:00
Completed At: 2026-10-04T19:37:00+01:00
Created file file:///C:[REDACTED]/.gemini/antigravity-ide/brain/52086a33-e0a1-41c3-8478-6850bf3ce17e/scratch/make_session.py with requested content.
If relevant, proactively run terminal commands to execute this code for the USER. Don't ask for permission.

Agent

You can also view the raw interactive session on DEV here:
https://dev.to/agent_sessions/scholarsentinel-building-an-autonomous-scholarship-watchdog-for-emmanuel-vy37d6


Prize Categories

We are entering the following partner categories for the Hacktoberfest Weekend Challenge:

  • 🌟 Best Use of Gemma ($200): Used Google Gemma open-weight models as the core extraction engine to parse circulars, extract CBT venues/dates, and match candidate credentials with complete student data privacy.
  • 🌟 Best Use of Render ($200): Deployed the complete Next.js full-stack application, API routes, and scheduled watchdog crawler on Render using render.yaml.
  • 🛠️ Best Use of ElevenLabs ($100): Generated high-priority emergency audio briefings that vocalize exam center venues and accreditation times to prevent missed notifications.
  • 🛠️ Best Use of SerpApi ($100): Implemented autonomous web scouting across Nigerian educational portals and press releases to discover newly published shortlist circulars.
  • 🛠️ Best Use of MongoDB Atlas ($100): Stored scholarship application lifecycles, Daniel's profile, and candidate verification audit trails.

Built with ❤️ by Emmanuel for brother Daniel Aroso (FUTA Computer Engineering, 300L).

Top comments (0)