Native macOS widgets for developers who are leveling up. Your LeetCode and GitHub streaks, a daily LeetCode problem, AI-written interview questions with hints (system design, OS, networks, DBMS, infra), questions spun from your own resume, and a project to build.
- Zero effort, every day. Open Notification Center and your practice for the day is already there.
- Practice like a real interview. Questions are specific production scenarios with four progressive hints, not trivia.
- Grilled on your own work. Hand over your resume once; every day one question probes a project you actually built.
- Answers in Apple Notes. One click creates a note titled with the question, so your prep stays searchable.
- Featherweight. Native WidgetKit: no background app, no Electron, no web view. It wakes up once an hour and sleeps the rest of the time.
- No Xcode. Builds in under a minute with Apple's free Command Line Tools.
| Widget | Sizes | What it shows |
|---|---|---|
| Activity | Large | LeetCode + GitHub heatmaps for the last 3 months, streaks 🔥, problems solved, contributions, refresh button |
| Today | Medium, Large | LeetCode daily problem + an AI-written system design question |
| CS Fundamentals | Medium, Large | One OS, Networks, DBMS and Infra question per day |
| Build Idea | Medium, Large | A "build X from scratch" project in C, C++, Java or Python + fresh GitHub repos in a rotating domain (payments, security, banking, OS, databases…) |
Click any question title to open the hints page: reveal hints one at a time, then Write answer in Notes.
Only titles (marked ↗) are clickable, so you never open something by accident.
Requirements: macOS 14 Sonoma or later and Apple's free Command Line Tools (xcode-select --install).
git clone https://github.com/Sumit063/devboard.git
cd devboard
./setup.shsetup.sh asks for:
- Your LeetCode and GitHub usernames (either can be left blank).
- A free Gemini API key (optional, recommended). Get one in a minute at aistudio.google.com/apikey; no card needed. Without it, everything except the AI questions still works.
- Your resume (optional): a PDF, DOCX, TXT, Markdown or LaTeX file. See Resume handoff.
It then builds the app and installs it to ~/Applications/DevBoard.app.
Add the widgets: click the date and time in the menu bar → Edit Widgets (or right-click the desktop) → search DevBoard. A stack of Activity (Large) + Today, CS Fundamentals and Build Idea (Medium) fills a laptop-height Notification Center.
The first time you click Write answer in Notes, macOS asks to let DevBoard control Notes. Click Allow.
Resume-based questions make practice personal: "In your dispatch service, why did you shard Redis by geography, and what happens when a shard fails?"
How it works, with privacy first:
setup.shextracts the text on your Mac (PDFKit /textutil, nothing installed).- Emails, phone numbers and links are scrubbed locally before anything leaves your machine.
- Gemini rewrites the rest into a ~300-word tech profile with no name, employers, schools or locations. Companies become "a large fintech company" and so on.
- You review the profile and save, edit or discard it. It is stored only at
~/.config/devboard/profile.txt. - Each day, one question slot (rotating OS → Networks → DBMS → Infra → System design) is written from that profile. It's tagged From your resume, and its note title starts with
[RESUME].
Prefer not to send your resume anywhere? Copy profile.example.txt to ~/.config/devboard/profile.txt, write your own summary, and run ./build.sh.
Gemini's free tier may use prompts to improve Google's products. That's why only the anonymized profile is ever used for questions.
Everything personal lives in ~/.config/devboard/ (permissions 600), never in this repo:
| File | Purpose |
|---|---|
config.json |
Usernames and options (see config.example.json) |
gemini_key |
Your Gemini API key |
profile.txt |
Your anonymized resume profile |
{
"leetcode_username": "your-leetcode-username",
"github_username": "your-github-username",
"notes_folder": "Daily Problems",
"resume_questions": true
}After editing any of these, run ./build.sh. The widget is sandboxed, so settings are copied into the app bundle at build time. Or just run ./setup.sh again.
Notification Center ─▶ DevBoardWidget.appex (sandboxed, hourly timeline)
├─ LeetCode GraphQL ........ heatmap, solved count, daily problem
├─ GitHub contributions .... heatmap (public page, no token)
├─ build-your-own-x ........ daily project idea (cached 24h)
├─ GitHub search ........... fresh repos for the day's domain
└─ Gemini (1 call/day) ..... 5 questions + hints, cached for the day
clicks ─▶ DevBoard.app (tiny helper, quits when done)
├─ opens links in your browser
├─ hints page (SwiftUI)
└─ Apple Notes via AppleScript
- Refresh: hourly and just after midnight; the Refresh button forces it. All widgets share one fetch.
- Questions: each subject rotates through ~35 subtopics so days don't repeat. Gemini writes the question, scenario and hints.
gemini-2.5-flashis used first (about 5 seconds), and overloaded models fall back automatically. - Resilient: any source that fails keeps its last good data; failed question generation retries every 10 minutes.
Project layout:
App/ helper app: link routing, hints page, Notes
Widget/ the four widgets (SwiftUI + WidgetKit)
Shared/ models, fetchers, Gemini question generator
scripts/ resume → profile (text extraction + anonymization)
Support/ Info.plists, entitlements
Tools/ screenshot renderer for this README
- Subtopics: edit the lists in
Shared/CSGenerator.swift(topics). - Interviewer style: edit
instructionsin the same file. - Resume frequency: change
resumeSlot(_:)(one per day by default), or set"resume_questions": false. - Build-idea domains: edit
FreshRepos.topicsinShared/Fetchers.swift. - Screenshots:
Tools/screenshots/render.shregenerates the images above from demo data.
| Problem | Fix |
|---|---|
| DevBoard isn't in Edit Widgets | Run ./build.sh again, then close and reopen Edit Widgets. If it's still missing, run killall chronod and try once more. |
| "Set username in config.json" | Run ./setup.sh and enter your usernames. |
| Questions say "Add a free Gemini API key" | Run ./setup.sh and paste a key from AI Studio. |
| Questions stuck on "Generating…" | Gemini's free tier is sometimes overloaded; it retries every 10 minutes. Logs: log show --last 30m --info --predicate 'subsystem == "dev.devboard"' |
| Notes doesn't open | System Settings → Privacy & Security → Automation → enable Notes for DevBoard. Rebuilding may ask again. |
| Clicking does nothing | Only titles marked ↗ are links; the rest is intentionally inert. |
./uninstall.sh # removes the app and widgets, keeps ~/.config/devboard
./uninstall.sh --all # also deletes your config, key and profileYour notes in Apple Notes are never touched.
Ideas, widgets and fixes are welcome: open an issue or a PR. Good first contributions: more subtopics, Codeforces/HackerRank heatmaps, more build-idea sources, localization.
- Project ideas from codecrafters-io/build-your-own-x
- Brand icons from Simple Icons (CC0)
- Questions written by Google Gemini on its free tier
- LeetCode data comes from LeetCode's public, unofficial GraphQL endpoint. DevBoard isn't affiliated with LeetCode, GitHub or Google.
If DevBoard helps your prep, a ⭐ helps others find it.

