clickhouse-local-dev-loop
Run ClickHouse locally with Docker, configure test fixtures, and iterate fast. Use when setting up a local ClickHouse dev environment, writing integration tests, or running ClickHouse in Docker Compose. Trigger: "clickhouse local dev", "clickhouse docker", "clickhouse dev environment", "run clickhouse locally", "clickhouse docker compose".
Best use case
clickhouse-local-dev-loop is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Run ClickHouse locally with Docker, configure test fixtures, and iterate fast. Use when setting up a local ClickHouse dev environment, writing integration tests, or running ClickHouse in Docker Compose. Trigger: "clickhouse local dev", "clickhouse docker", "clickhouse dev environment", "run clickhouse locally", "clickhouse docker compose".
Teams using clickhouse-local-dev-loop should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/clickhouse-local-dev-loop/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How clickhouse-local-dev-loop Compares
| Feature / Agent | clickhouse-local-dev-loop | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Run ClickHouse locally with Docker, configure test fixtures, and iterate fast. Use when setting up a local ClickHouse dev environment, writing integration tests, or running ClickHouse in Docker Compose. Trigger: "clickhouse local dev", "clickhouse docker", "clickhouse dev environment", "run clickhouse locally", "clickhouse docker compose".
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# ClickHouse Local Dev Loop
## Overview
Run ClickHouse in Docker for local development with fast schema iteration,
seed data, and integration testing using vitest.
## Prerequisites
- Docker or Docker Compose installed
- Node.js 18+ with `@clickhouse/client`
## Instructions
### Step 1: Docker Compose Setup
```yaml
# docker-compose.yml
services:
clickhouse:
image: clickhouse/clickhouse-server:latest
ports:
- "8123:8123" # HTTP interface
- "9000:9000" # Native TCP (clickhouse-client CLI)
volumes:
- clickhouse-data:/var/lib/clickhouse
- ./init-db:/docker-entrypoint-initdb.d # Auto-run SQL on first start
environment:
CLICKHOUSE_USER: default
CLICKHOUSE_PASSWORD: dev_password
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1 # Enable SQL-based user management
ulimits:
nofile:
soft: 262144
hard: 262144
volumes:
clickhouse-data:
```
```bash
docker compose up -d
# Verify: curl http://localhost:8123/ping → "Ok.\n"
```
### Step 2: Init Script (Auto-Run on First Start)
```sql
-- init-db/001-schema.sql
CREATE DATABASE IF NOT EXISTS app;
CREATE TABLE IF NOT EXISTS app.events (
event_id UUID DEFAULT generateUUIDv4(),
event_type LowCardinality(String),
user_id UInt64,
properties String, -- JSON string
created_at DateTime DEFAULT now()
)
ENGINE = MergeTree()
ORDER BY (event_type, created_at)
PARTITION BY toYYYYMM(created_at);
```
### Step 3: Seed Data Script
```typescript
// scripts/seed.ts
import { createClient } from '@clickhouse/client';
const client = createClient({
url: 'http://localhost:8123',
username: 'default',
password: 'dev_password',
database: 'app',
});
const events = Array.from({ length: 1000 }, (_, i) => ({
event_type: ['page_view', 'click', 'signup', 'purchase'][i % 4],
user_id: Math.floor(Math.random() * 100) + 1,
properties: JSON.stringify({ index: i }),
created_at: new Date(Date.now() - Math.random() * 86400000 * 30)
.toISOString()
.replace('T', ' ')
.slice(0, 19),
}));
await client.insert({ table: 'events', values: events, format: 'JSONEachRow' });
console.log(`Seeded ${events.length} events`);
await client.close();
```
### Step 4: Project Structure
```
my-clickhouse-app/
├── docker-compose.yml
├── init-db/
│ └── 001-schema.sql
├── scripts/
│ └── seed.ts
├── src/
│ ├── db.ts # Client singleton
│ └── queries.ts # Named query functions
├── tests/
│ ├── setup.ts # Test lifecycle (truncate tables)
│ └── events.test.ts
├── .env.local # Local creds (git-ignored)
├── .env.example
└── package.json
```
### Step 5: Client Singleton
```typescript
// src/db.ts
import { createClient, ClickHouseClient } from '@clickhouse/client';
let client: ClickHouseClient | null = null;
export function getClient(): ClickHouseClient {
if (!client) {
client = createClient({
url: process.env.CLICKHOUSE_HOST ?? 'http://localhost:8123',
username: process.env.CLICKHOUSE_USER ?? 'default',
password: process.env.CLICKHOUSE_PASSWORD ?? 'dev_password',
database: process.env.CLICKHOUSE_DATABASE ?? 'app',
});
}
return client;
}
```
### Step 6: Integration Testing with Vitest
```typescript
// tests/setup.ts
import { getClient } from '../src/db';
import { beforeEach, afterAll } from 'vitest';
beforeEach(async () => {
const client = getClient();
// TRUNCATE is lightweight — drops parts without logging
await client.command({ query: 'TRUNCATE TABLE IF EXISTS app.events' });
});
afterAll(async () => {
await getClient().close();
});
```
```typescript
// tests/events.test.ts
import { describe, it, expect } from 'vitest';
import { getClient } from '../src/db';
describe('ClickHouse events', () => {
it('inserts and queries events', async () => {
const client = getClient();
await client.insert({
table: 'events',
values: [
{ event_type: 'test', user_id: 1, properties: '{}' },
{ event_type: 'test', user_id: 2, properties: '{}' },
],
format: 'JSONEachRow',
});
const rs = await client.query({
query: 'SELECT count() AS cnt FROM events',
format: 'JSONEachRow',
});
const [row] = await rs.json<{ cnt: string }>();
expect(Number(row.cnt)).toBe(2);
});
});
```
### Step 7: Package Scripts
```json
{
"scripts": {
"dev": "tsx watch src/index.ts",
"db:up": "docker compose up -d",
"db:down": "docker compose down",
"db:reset": "docker compose down -v && docker compose up -d",
"db:seed": "tsx scripts/seed.ts",
"db:shell": "docker exec -it $(docker compose ps -q clickhouse) clickhouse-client --password dev_password",
"test": "vitest",
"test:watch": "vitest --watch"
}
}
```
## Useful CLI Commands
```bash
# Interactive SQL shell
docker exec -it <container> clickhouse-client --password dev_password
# Run a query from host via HTTP
curl 'http://localhost:8123/?query=SELECT+count()+FROM+app.events'
# Check running queries
curl 'http://localhost:8123/?query=SELECT+*+FROM+system.processes+FORMAT+PrettyCompact'
# Watch merges
curl 'http://localhost:8123/?query=SELECT+*+FROM+system.merges+FORMAT+PrettyCompact'
```
## Error Handling
| Error | Cause | Solution |
|-------|-------|----------|
| `Connection refused :8123` | Container not running | `docker compose up -d` |
| `READONLY` | User lacks write perms | Set `CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1` |
| `Too many parts` | Tiny frequent inserts | Batch inserts or increase `parts_to_throw_insert` |
| `Memory limit exceeded` | Large query on small container | Add `--memory 4g` to Docker |
## Resources
- [ClickHouse Docker Image](https://hub.docker.com/r/clickhouse/clickhouse-server)
- [clickhouse-client CLI](https://clickhouse.com/docs/interfaces/cli)
- [Vitest Documentation](https://vitest.dev/)
## Next Steps
See `clickhouse-sdk-patterns` for production-ready client patterns.Related Skills
exa-local-dev-loop
Configure Exa local development with hot reload, testing, and mock responses. Use when setting up a development environment, writing tests against Exa, or establishing a fast iteration cycle. Trigger with phrases like "exa dev setup", "exa local development", "exa test setup", "develop with exa", "mock exa".
evernote-local-dev-loop
Set up efficient local development workflow for Evernote integrations. Use when configuring dev environment, setting up sandbox testing, or optimizing development iteration speed. Trigger with phrases like "evernote dev setup", "evernote local development", "evernote sandbox", "test evernote locally".
elevenlabs-local-dev-loop
Configure local ElevenLabs development with mocking, hot reload, and audio testing. Use when setting up a dev environment for TTS/voice projects, configuring test workflows, or building a fast iteration cycle with ElevenLabs audio. Trigger: "elevenlabs dev setup", "elevenlabs local development", "elevenlabs dev environment", "develop with elevenlabs", "test elevenlabs locally".
documenso-local-dev-loop
Set up local development environment and testing workflow for Documenso. Use when configuring dev environment, setting up test workflows, or establishing rapid iteration patterns with Documenso. Trigger with phrases like "documenso local dev", "documenso development", "test documenso locally", "documenso dev environment".
deepgram-local-dev-loop
Configure Deepgram local development workflow with testing and mocks. Use when setting up development environment, configuring test fixtures, or establishing rapid iteration patterns for Deepgram integration. Trigger: "deepgram local dev", "deepgram development setup", "deepgram test environment", "deepgram dev workflow", "deepgram mock".
databricks-local-dev-loop
Configure Databricks local development with Databricks Connect, Asset Bundles, and IDE. Use when setting up a local dev environment, configuring test workflows, or establishing a fast iteration cycle with Databricks. Trigger with phrases like "databricks dev setup", "databricks local", "databricks IDE", "develop with databricks", "databricks connect".
customerio-local-dev-loop
Configure Customer.io local development workflow. Use when setting up local testing, dev/staging isolation, or mocking Customer.io for unit tests. Trigger: "customer.io local dev", "test customer.io locally", "customer.io dev environment", "customer.io sandbox", "mock customer.io".
cursor-local-dev-loop
Optimize daily development workflow with Cursor IDE using Chat, Composer, Tab, and Git integration. Triggers on "cursor workflow", "cursor development loop", "cursor productivity", "cursor daily workflow", "cursor dev flow".
coreweave-local-dev-loop
Set up local development workflow for CoreWeave GPU deployments. Use when building containers locally, testing YAML manifests, or iterating on model serving configurations before deploying. Trigger with phrases like "coreweave dev setup", "coreweave local testing", "develop for coreweave", "coreweave container build".
cohere-local-dev-loop
Configure Cohere local development with mocking, testing, and hot reload. Use when setting up a development environment, configuring test workflows, or establishing a fast iteration cycle with Cohere API v2. Trigger with phrases like "cohere dev setup", "cohere local development", "cohere dev environment", "develop with cohere", "mock cohere".
coderabbit-local-dev-loop
Configure CodeRabbit CLI for local pre-commit code reviews and fast iteration. Use when setting up local development with CodeRabbit CLI reviews, integrating AI review into your commit workflow, or testing config changes. Trigger with phrases like "coderabbit dev setup", "coderabbit local development", "coderabbit CLI workflow", "coderabbit pre-commit review".
clickup-local-dev-loop
Set up local development for ClickUp API integrations with testing, mocking, and hot reload. Trigger: "clickup dev setup", "clickup local development", "clickup dev environment", "develop with clickup", "clickup testing setup", "mock clickup API".