尚未检测到更新。GitHub 发布版本后会显示在这里。
Create Todoist tasks for your favorite NBA team’s regular season games.
翻译准备中
正在加载完整 README。
查看完整 README ↗OAuth-enabled web app that imports an NBA team's schedule into Todoist as tasks.
Todoist NBA Schedule Import connects to a user's Todoist account, lets them choose an NBA team, and imports upcoming games into either a new project or an Inbox section. It handles OAuth, session security, schedule parsing, Todoist API writes, and season lifecycle behavior.
@doist/todoist-api-typescriptcookie-session + @hapi/iron for token handlingapp/
routes/
index.js # GET / (landing page)
setup.js # GET /setup (team picker) + POST /setup (runs the import)
result.js # GET /result (how the import went)
auth/ # OAuth login/callback
utils/
todoist.js # Todoist API operations
cookieSession.js # Encrypted token session helpers
parseSchedule.js # Schedule parsing and season-state logic
views/ # Server-rendered HTML templates
public/ # Frontend JS (entry: scripts/main.js), CSS, images
tests/ # Unit + route tests
docs/ # Architecture, testing, known issues, scrape workflow
scrape/ # Schedule scraping pipeline
data/nba_schedule.json # Canonical schedule data
/setup, which reads the team's schedule from local JSON and creates the Todoist tasks./result, which shows success (with a link to open the tasks in Todoist) or the error.Full walkthrough: docs/APP_ARCHITECTURE.md.
Use .env.local (see .env.example):
CLIENT_IDCLIENT_SECRETENCRYPTION_KEYCOOKIE_SECRETREDIRECT_URIENABLE_ERROR_DEMO (optional; true enables the ?mockTierCheck= and ?mockTodoistError= demos on /setup)Node 24 (pinned in .nvmrc):
npm ci
cp .env.example .env.local
Fill in Todoist OAuth credentials and secrets.
npm run dev
App runs at http://localhost:3000.
npm run dev # Local server, restarts on file changes (node --watch)
npm start # Local server, no restarts
npm test # Run tests
npm run test:coverage # Tests + coverage report in coverage/
scrape/.venv/bin/python scrape/main.py
For annual workflow and verification details, see docs/SCRAPE_INSTRUCTIONS.md.
state is random per login, tied to the browser's session, and single-use@hapi/iron) before session storagehttpOnly, secure, sameSite: Lax, 1-hour lifetimeDeliberately not done now, but worth revisiting if the constraints below change:
This project demonstrates practical product engineering: third-party OAuth integration, secure token/session handling, API reliability under external platform constraints, and a complete user-facing workflow from authentication to task creation.