| name | ait |
| description | Knowledge pack for AIt — a personal AI platform with monorepo architecture, RAG pipeline, OAuth connectors, and BullMQ scheduling. |
| metadata | {"author":"mateonunez","version":"1.0.0","source":"private","stack":"pnpm monorepo, Fastify, Drizzle ORM, Qdrant, Ollama, BullMQ, React + Vite"} |
ait
Personal AI platform built as a pnpm monorepo. Connects to external services (GitHub, Spotify, Linear, Notion, Slack, Google) via OAuth, syncs data through an ETL pipeline, stores embeddings in Qdrant, and provides RAG-powered AI responses via Ollama.
Preferences
- Package manager: pnpm (corepack, workspace protocol)
- Linter/formatter: Biome 1.9 — 2-space indent, single quotes, semicolons
- Error handling:
Result<T, E> pattern with ok() / err() — never throw in business logic
- Testing: Node.js native
node:test with describe/it, borp runner, c8 coverage
- Naming: PascalCase classes,
I prefix interfaces, camelCase methods, SCREAMING_SNAKE constants, kebab-case files
- Type files:
.types.ts, spec files: .spec.ts
- All packages: scoped
@ait/*
References
| Category | Reference | Description |
|---|
| Core | core-architecture | Layered architecture, data flow, package structure |
| Core | core-entity-types | Normalized entity types with __type strings |
| Core | core-result-type | Result<T,E>, ok(), err() usage patterns |
| Features | features-oauth | Encrypted credentials, factory pattern, token refresh |
| Features | features-rag | Qdrant, multi-query retrieval, reranking, streaming |
| Features | features-scheduler | BullMQ, priority queues, repeatable jobs |
| Features | features-connectors | GitHub, Spotify, Linear, Notion, Slack, Google connectors |
| Best Practices | best-practices-testing | Node.js native test runner, Docker services, c8 coverage |
Quick Reference
pnpm dev
pnpm start:services
pnpm test
pnpm migrate
pnpm generate:openapi
GENERATION_MODEL=gemma3:latest
EMBEDDINGS_MODEL=mxbai-embed-large:latest
const result = await someOperation();
if (result.ok) {
console.log(result.value);
} else {
console.error(result.error);
}
const service = connectorServiceFactory.getServiceByConfig(configId, userId);