How to Debug Issues in the Kaneo Project: A Complete Troubleshooting Guide
Debugging Kaneo requires verifying the shared .env configuration, tracing HTTPException errors through the API source, and checking WebSocket adapter initialization logs.
Kaneo is a self-hosted project management platform built as a pnpm monorepo with a Hono API backend and React frontend. When you debug issues in the Kaneo project, you are typically working across two runtimes that share a single environment configuration. Understanding the specific error handling patterns in apps/web/src/lib/error-handler.ts and the permission validation logic in apps/api/src/utils/validate-workspace-access.ts will help you isolate failures quickly.
Common Failure Points and Diagnostic Locations
Most production issues in Kaneo fall into five specific categories. Each has distinct symptoms and corresponding source files where errors originate.
CORS and Network Errors
If you see "Failed to fetch" or "CORS" errors in the browser console, the frontend has already categorized the error via parseApiError in apps/web/src/lib/error-handler.ts. This helper analyzes network-related failures and returns structured error types.
The getCorsTroubleshootingSteps() function provides exact checks you should perform when error.message contains network failure strings. Check that KANEO_API_URL and KANEO_CLIENT_URL in your .env file use correct protocols and ports.
Database Connection Failures
When the API fails to start with "Database connection failed" messages, examine apps/api/src/database/* and the startup logs in apps/api/src/index.ts. The application automatically runs migrations on startup from apps/api/src/migrations/, and any failure here aborts the server launch.
Verify your DATABASE_URL format and the derived POSTGRES_* variables. The connection string must be valid before the Hono server begins accepting requests.
Authentication and Permission Errors
401 Unauthorized or 403 Forbidden responses originate from apps/api/src/utils/validate-workspace-access.ts. This utility validates user roles and workspace membership, throwing HTTPException with specific messages when checks fail.
// apps/api/src/utils/validate-workspace-access.ts
if (membership.length === 0) {
throw new HTTPException(403, { message: "You don't have access to this workspace" });
}
These exceptions surface as JSON responses that you can inspect in your browser's Network tab.
WebSocket Broadcasting Issues
Missing real-time updates indicate problems with the broadcast adapter initialized in apps/api/src/ws/index.ts. The system implements both in-memory and Redis adapters selected by isRedisConfigured().
When the API starts, it logs the active adapter:
console.log(`📡 WebSockets Initialized using: "${adapter.constructor.name}"`);
If using Redis, confirm REDIS_URL, REDIS_SENTINELS, or REDIS_CLUSTER_NODES are set correctly in your environment.
MCP and External Integration Failures
MCP commands and webhook integrations fail when endpoints in apps/api/src/mcp/* or apps/api/src/*-integration/* throw HTTPException errors. Verify that /api/mcp/health returns a successful response and that webhook secrets match the configured values in your .env file.
Step-by-Step Debugging Workflow
Follow this systematic approach to isolate and resolve issues when debugging Kaneo.
-
Verify Environment Configuration
Ensure
.envcontains all required variables includingKANEO_CLIENT_URL,KANEO_API_URL,AUTH_SECRET, andDATABASE_URL. Refer to theENVIRONMENT_SETUP.mdguide for the complete variable list. -
Start Services and Monitor Logs
Run
pnpm devand watch console output. The API prints its configuration on startup, while the web app logs the Vite dev server address. Look for migration status messages in the API terminal. -
Check Browser Developer Tools
Open DevTools and examine the Console and Network tabs. If you see "Failed to fetch" errors, the frontend has already processed them through
parseApiErrorwith specific type categorization. -
Trace API Error Paths
Search for
HTTPExceptionthrows in the API codebase. These exceptions carry specific status codes and messages that appear in network response bodies. Breakpoints aroundvalidateWorkspaceAccesscalls reveal permission logic failures. -
Inspect WebSocket Initialization
Confirm the broadcast adapter logged during startup matches your infrastructure. If you expect Redis but see "InMemoryAdapter", check your
REDIS_*environment variables. -
Validate Database State
Connect to your PostgreSQL instance and verify migration tables exist. Failed migrations leave the database in partial states that prevent API startup.
-
Test Endpoints in Isolation
Spin up only the API using
pnpm --filter @kaneo/api devand test endpoints withcurlor Postman. This eliminates frontend variables when debugging backend logic. -
Check Integration Connectivity
For MCP or webhook issues, verify external services can reach your API. Use tools like ngrok for local webhook testing and confirm signature validation logic in the integration handlers.
-
Add Strategic Logging
Insert
console.logstatements in TypeScript hooks likeuseTaskFiltersoruseProjectWebsocketon the frontend, or usenode --inspectfor backend debugging around suspect code paths.
Essential Debugging Code Patterns
Use these patterns when implementing error handling or investigating issues in your Kaneo instance.
Parsing Frontend API Errors
import { parseApiError, getCorsTroubleshootingSteps } from "@/lib/error-handler";
try {
const res = await fetch("/api/task");
if (!res.ok) throw new Error(`HTTP ${res.status}`);
// Process response
} catch (e) {
const err = parseApiError(e);
console.warn(err.message);
if (err.type === "cors") {
console.table(getCorsTroubleshootingSteps());
}
}
Validating Workspace Access
import { validateWorkspaceAccess } from "@/utils/validate-workspace-access";
export async function someProtectedHandler(c) {
const userId = c.get("userId");
const workspaceId = c.req.param("workspaceId");
await validateWorkspaceAccess(userId, workspaceId); // Throws 403 if not allowed
// Authorized logic continues
}
Broadcasting Project Events
import { broadcastToProject } from "@/ws";
broadcastToProject(projectId, {
type: "TASK_UPDATED",
taskId,
changes: { status: "done" },
});
Summary
- Kaneo uses a shared
.envfile for both API and web runtimes; incorrect variables cause most deployment issues. - Frontend network errors are categorized in
apps/web/src/lib/error-handler.tswith specific troubleshooting steps for CORS failures. - API permission errors originate from
apps/api/src/utils/validate-workspace-access.tsand throw descriptiveHTTPExceptioninstances. - Real-time features depend on the WebSocket adapter selected at runtime in
apps/api/src/ws/index.ts, configurable via Redis environment variables. - Database migrations run automatically on API startup; check
apps/api/src/index.tslogs for connection failures.
Frequently Asked Questions
Why am I seeing CORS errors when connecting to the Kaneo API?
CORS errors appear when KANEO_CLIENT_URL and KANEO_API_URL in your .env file use mismatched protocols or ports. The parseApiError function in apps/web/src/lib/error-handler.ts specifically detects these failures and provides troubleshooting steps. Ensure your API server allows requests from your frontend origin and that both services use the correct URL values defined in the environment setup guide.
How do I fix database connection failures in Kaneo?
Database failures occur when the API cannot connect to PostgreSQL using the DATABASE_URL variable. Check the startup logs in apps/api/src/index.ts for connection string errors and verify your PostgreSQL server is running. The API automatically runs migrations from apps/api/src/migrations/ on startup, so ensure the database user has schema modification permissions.
Why are real-time updates not working in my Kaneo instance?
Real-time updates depend on the WebSocket broadcast adapter initialized in apps/api/src/ws/index.ts. Check the API startup logs for the line indicating which adapter is active. If you configured Redis but see "InMemoryAdapter", verify that REDIS_URL or cluster/sentinel variables are set correctly. The broadcastToProject function requires the correct adapter to propagate events to connected clients.
How do I debug authentication loops or 403 errors?
Authentication issues originate from apps/api/src/utils/validate-workspace-access.ts, which validates user membership against workspace IDs. When debugging, inspect the Network tab for HTTPException responses containing specific messages like "You don't have access to this workspace". Ensure your AUTH_SECRET is consistent across restarts and that the user record exists in the database with valid workspace associations.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →