Date: April 8, 2026 Status: Initial open-source release completed, polish work remaining
| Repo | URL | Visibility | Purpose |
|---|---|---|---|
| studyield | https://github.com/studyield/studyield | Public | Open-source release, single clean commit |
| studyield-private | https://github.com/studyield/studyield-private | Private | Development repo, full git history, all branches |
| studyield-old | https://github.com/studyield/studyield-old | Private | Archived (original repo before split, can delete) |
Local directories:
/Users/nymulislam/DEVELOP/studyield→ public repo/Users/nymulislam/DEVELOP/studyield-private→ private dev repo
Workflow: Develop on studyield-private (feature branches → develop → main), then periodically sync clean code to studyield (public).
- Removed
backend/.env.productionandfrontend/.env.productionfrom git tracking (contained real AWS, Stripe, OpenRouter, Google OAuth, Firebase keys) - Sanitized
backend/.env.example- removed real Apple Team ID, Apple Key ID, Firebase project ID, internal server references - Sanitized
frontend/.env.example- changed production URL to localhost - Updated
.gitignorecomprehensively (env files, Firebase configs, IDE, internal docs, build artifacts, Flutter) - Removed hardcoded server IPs from README
- Public repo has zero secrets in git history (fresh single-commit repo)
- Replaced proprietary INFO INLET license with Apache License 2.0
- Updated
backend/package.jsonlicense:"UNLICENSED"→"Apache-2.0" - Created
NOTICEfile with third-party dependency attribution (backend, frontend, mobile)
- Removed 13 internal markdown docs from
mobile/(IMPLEMENTATION_GUIDE, ONBOARDING_*, LOCALIZATION_PROGRESS, etc.) - Removed
ONBOARDING_IMPLEMENTATION_PLAN.mdfrom root - Removed
deploy.ymlfrom public repo (stays in private only) - Removed
OPEN_SOURCE_IMPLEMENTATION.mdfrom public repo (stays in private only)
- Fixed CORS gateway fallback from wildcard
'*'to['http://localhost:3010', 'http://localhost:5189']in all 5 gateway files - Removed token substring debug logging from
ws-auth.guard.ts(was leaking token previews) - Replaced
console.errorwith NestJSLoggerinai.controller.ts - Removed internal "Peddlum" reference from
main.tscomment
- Added DOMPurify sanitization for all
dangerouslySetInnerHTMLusage (5 files - XSS prevention) - Created
ErrorBoundarycomponent (src/components/ErrorBoundary.tsx) - Removed production API URL fallback (
https://api.studyield.com→http://localhost:3010) insrc/config/api.ts - Disabled sourcemaps in production build (
vite.config.ts)
- Changed API URL fallback from
https://api.studyield.comtohttp://10.0.2.2:3010inapi_config.dart - Enabled
avoid_printlint rule inanalysis_options.yaml - Removed all token debug
print()statements fromauth_token_service.dartandtoken_storage.dart - Pinned
intldependency fromanyto^0.20.0inpubspec.yaml
-
CONTRIBUTING.md- dev setup, project structure, translations, code style, testing -
CODE_OF_CONDUCT.md- Contributor Covenant v2.1 -
SECURITY.md- responsible disclosure, 48hr SLA, self-hosting best practices -
CHANGELOG.md- Keep a Changelog format -
.github/ISSUE_TEMPLATE/bug_report.yml- with platform dropdown (Web/iOS/Android/API) -
.github/ISSUE_TEMPLATE/feature_request.yml- with study-focused categories -
.github/ISSUE_TEMPLATE/config.yml- disabled blank issues, links to docs/discussions -
.github/PULL_REQUEST_TEMPLATE.md- type of change, testing checklist, code quality -
.github/dependabot.yml- weekly npm (grouped: nestjs, react, radix), monthly GH Actions -
.github/workflows/ci.yml- lint, typecheck, build for backend + frontend
-
docker-compose.yml- full stack: PostgreSQL, Redis, Qdrant, ClickHouse, backend, frontend -
.env.docker- sensible defaults for Docker Compose -
start.sh- one-command dev startup with health checks
-
.prettierrc- consistent formatting config -
.editorconfig- cross-editor consistency
- Complete rewrite with badges, hero section, quick start (Docker + manual), feature tables, tech stack, project structure
Key files to clean up:
| File | Count | Action |
|---|---|---|
frontend/src/stores/useLiveQuizStore.ts |
16 | Remove all debug logs |
frontend/src/stores/useNotificationsStore.ts |
8 | Remove all debug logs |
frontend/src/pages/dashboard/CollaborativeExamPage.tsx |
4 | Remove debug logs |
frontend/src/pages/dashboard/ExamClonePage.tsx |
4 | Remove debug logs |
frontend/src/pages/dashboard/ExamDetailPage.tsx |
4 | Remove debug logs |
frontend/src/pages/dashboard/PracticeExamPage.tsx |
4 | Remove debug logs |
frontend/src/components/documents/DocumentsTab.tsx |
4 | Remove debug logs |
frontend/src/pages/dashboard/BookmarksPage.tsx |
2 | Remove debug logs |
frontend/src/pages/dashboard/DashboardHomePage.tsx |
2 | Remove debug logs |
frontend/src/pages/dashboard/ReviewQueuePage.tsx |
2 | Remove debug logs |
frontend/src/components/sources/SourcesTab.tsx |
2 | Remove debug logs |
| + 6 more files with 1 each |
How: Search for console.log, console.error, console.warn in all .ts/.tsx files. Remove or replace with a dev-only logger.
How: The avoid_print lint rule is now enabled. Run flutter analyze to find all violations. Replace print() with either:
- Remove completely (if just debug noise)
- Use
debugPrint()(only shows in debug mode) - Use a proper logging package like
logger
Key TODOs that need implementation:
| File | TODO | Priority |
|---|---|---|
lib/features/auth/presentation/screens/login_screen.dart:222 |
Implement Google login | HIGH |
lib/features/auth/presentation/screens/login_screen.dart:233 |
Implement Apple login | HIGH |
lib/features/auth/presentation/screens/register_screen.dart:246 |
Implement Google signup | HIGH |
lib/features/auth/presentation/screens/register_screen.dart:257 |
Implement Apple signup | HIGH |
lib/features/ai_chat/data/repositories/chat_repository_impl.dart:78 |
Implement SSE streaming | HIGH |
lib/features/problem_solver/data/repositories/problem_solver_repository_impl.dart (6 TODOs) |
Backend endpoints not implemented | MEDIUM |
lib/features/profile/presentation/screens/account_settings_screen.dart:104 |
Account deletion API | MEDIUM |
lib/features/notifications/presentation/screens/notifications_screen.dart:146 |
Delete notification in provider | LOW |
lib/features/quiz/presentation/screens/live_quiz_lobby_screen.dart:60 |
Navigate to game screen | LOW |
lib/app.dart:24 |
Add GoRouter configuration | LOW |
These files access process.env directly instead of NestJS ConfigService:
| File | Line | Variable |
|---|---|---|
backend/src/common/gateways/app.gateway.ts |
14 | CORS_ORIGINS |
backend/src/modules/chat/chat.gateway.ts |
17 | CORS_ORIGINS |
backend/src/modules/quiz/live-quiz.gateway.ts |
17 | CORS_ORIGINS |
backend/src/modules/exam-clone/exam-clone.gateway.ts |
30 | CORS_ORIGINS |
backend/src/modules/problem-solver/problem-solver.gateway.ts |
18 | CORS_ORIGINS |
backend/src/health.controller.ts |
45, 61 | npm_package_version |
How: Inject ConfigService via constructor and use this.configService.get('CORS_ORIGINS').
File: backend/src/app.module.ts
Action: Add Joi validation schema in ConfigModule.forRoot():
import * as Joi from 'joi';
ConfigModule.forRoot({
validationSchema: Joi.object({
JWT_ACCESS_SECRET: Joi.string().required().min(32),
JWT_REFRESH_SECRET: Joi.string().required().min(32),
DATABASE_HOST: Joi.string().required(),
DATABASE_PORT: Joi.number().default(5432),
REDIS_HOST: Joi.string().required(),
OPENROUTER_API_KEY: Joi.string().required(),
// ... etc
}),
});Current naming has conflicts (duplicate numbers):
001_initial.sql
001_add_exam_and_type_columns.sql ← duplicate 001
006_mind_maps.sql
006_problem_chat_messages.sql ← duplicate 006
010_blog.sql
010_create_user_fcm_tokens_table.sql ← duplicate 010
Action: Renumber to be sequential without gaps/duplicates.
File: backend/src/app.module.ts (lines ~38, 113-117)
Action: Either remove commented-out PlanGuard code or add a clear comment why it's disabled.
Neither backend/Dockerfile nor frontend/Dockerfile exist yet. They're needed for docker-compose.yml to work.
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/migrations ./migrations
EXPOSE 3010
CMD ["node", "dist/main.js"]FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]Also needs frontend/nginx.conf for SPA routing:
server {
listen 80;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
}cd studyield # public repo root
npm init -y # if no root package.json
npx husky init
npm install -D husky lint-stagedAdd to root package.json:
{
"lint-staged": {
"backend/src/**/*.ts": ["eslint --fix", "prettier --write"],
"frontend/src/**/*.{ts,tsx}": ["eslint --fix", "prettier --write"]
}
}npm install -D @commitlint/cli @commitlint/config-conventionalCreate commitlint.config.js:
module.exports = { extends: ['@commitlint/config-conventional'] };| File to Create | Content |
|---|---|
docs/getting-started/quick-start.md |
Step-by-step setup guide (Docker + manual) |
docs/getting-started/configuration.md |
All env variables explained with descriptions |
docs/architecture/overview.md |
System architecture, module diagram, data flow |
docs/guides/connector-guide.md |
How to extend/modify backend modules |
None of the 25 backend modules have README files. Each should have a brief doc explaining:
- What the module does
- Key endpoints
- Configuration needed
- Dependencies on other modules
Modules needing README (25 total):
ai, analytics, auth, blog, chat, clickhouse, code-sandbox, content, database, email, exam-clone, firebase, knowledge-base, learning-paths, notifications, problem-solver, qdrant, queue, quiz, redis, research, storage, subscription, teach-back, users
Current package name com.infoinlet.studyield references internal company name. Needs changing to com.studyield.app or similar.
Files to update:
mobile/android/app/build.gradle.kts(lines 9, 24) - namespace and applicationIdmobile/android/app/src/main/kotlin/com/infoinlet/studyield/MainActivity.kt- package declaration + rename directory- iOS bundle ID references in Xcode project
Note: This also requires updating Firebase project config, Google OAuth redirect URIs, and Apple sign-in service IDs.
The main README links to 12 translated versions that don't exist yet:
README_JA.md, README_ZH.md, README_KO.md, README_ES.md, README_FR.md, README_DE.md, README_PT-BR.md, README_AR.md, README_BN.md, README_HI.md, README_RU.md
Can be generated from the English README.
The README has a placeholder comment for screenshots:
<!-- TODO: Add product screenshot/GIF here -->Need actual screenshots/GIFs of:
- Dashboard overview
- Exam Clone feature in action
- Problem Solver multi-agent streaming
- Knowledge Graph visualization
- Chat with RAG citations
- Mobile app screens
Only 7 out of 160+ component files have aria-* attributes. Needs:
- Install
eslint-plugin-jsx-a11y - Add aria-labels to all interactive elements
- Ensure keyboard navigation works
- Add proper heading hierarchy
- Add Flutter analysis job to
ci.yml - Add code coverage reporting (Codecov)
- Add Docker build verification
| File | Purpose | Notes |
|---|---|---|
OPEN_SOURCE_IMPLEMENTATION.md |
Full tracking plan with all 75 objectives | Private repo only |
DEVELOPER_BRIEFING.md |
This file - developer instructions | Private repo only |
README.md |
Public-facing project README | In public repo |
CONTRIBUTING.md |
How to contribute | In public repo |
CHANGELOG.md |
Version history | In public repo |
SECURITY.md |
Security policy | In public repo |
docker-compose.yml |
Full stack Docker setup | In public repo |
start.sh |
Dev startup script | In public repo |
.env.docker |
Docker defaults | In public repo |
backend/.env.example |
Backend config template | In public repo |
frontend/.env.example |
Frontend config template | In public repo |
mobile/.env.example |
Mobile config template | In public repo |
.github/workflows/ci.yml |
CI pipeline | In public repo |
.github/workflows/deploy.yml |
Production deploy | Private repo only |
When open-source improvements are ready:
# 1. Work in studyield-private, commit to develop
cd /Users/nymulislam/DEVELOP/studyield-private
git checkout develop
# ... make changes, commit ...
# 2. Copy changed files to public repo
rsync -av --exclude='.git' --exclude='node_modules' --exclude='dist' \
--exclude='.env.production' --exclude='.env.local' --exclude='mobile/.env' \
--exclude='OPEN_SOURCE_IMPLEMENTATION.md' --exclude='DEVELOPER_BRIEFING.md' \
--exclude='.github/workflows/deploy.yml' --exclude='mobile/android/app/google-services.json' \
--exclude='mobile/ios/Runner/GoogleService-Info.plist' \
/Users/nymulislam/DEVELOP/studyield-private/ /Users/nymulislam/DEVELOP/studyield/
# 3. Commit and push in public repo
cd /Users/nymulislam/DEVELOP/studyield
git add -A
git commit -m "feat: description of changes"
git push origin mainBackend (NestJS): 25 modules, 120+ endpoints, 6 WebSocket namespaces
Frontend (React 19): 24+ pages, 15+ services, 12 languages
Mobile (Flutter): 22 feature modules, 12 languages
Database: PostgreSQL (27 tables, raw SQL - no ORM)
Cache: Redis 7+
Vector: Qdrant (semantic search)
Analytics: ClickHouse
Queue: BullMQ (async jobs)
Storage: Cloudflare R2
AI: OpenRouter (Claude, GPT via unified gateway)
Payments: Stripe
Real-time: Socket.io (6 namespaces: chat, exam-clone, problem-solver, teach-back, research, code-sandbox)
Auth: JWT (access + refresh) + Google OAuth + Apple OAuth