Skip to main content

Tafy Studio Development Setup

Overview

This guide helps developers set up their environment for contributing to Tafy Studio. We use a monorepo structure with multiple languages and target multiple architectures.

Prerequisites

Required Tools

  • Node.js 20+ and pnpm 9+
  • Go 1.23+
  • Python 3.11+ with uv
  • Docker with buildx plugin
  • Git 2.30+
  • k3d (5.5+) - Local Kubernetes for testing
  • kubectl (1.28+) - Kubernetes CLI
  • helm (3.10+) - Kubernetes package manager
  • VS Code - With recommended extensions
  • Playwright - Cross-browser testing for WebSerial

Installing Package Managers

# Install all required tools
make install-tools

# Or manually:
# Install pnpm
npm install -g pnpm

# Install uv (Python)
curl -LsSf https://astral.sh/uv/install.sh | sh

Installing Kubernetes Tools

These tools are required for local development with Node-RED and NATS:

All Platforms (using official scripts)

# Install k3d
curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash

# Install kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/$(uname -s | tr '[:upper:]' '[:lower:]')/$(uname -m)/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

# Install helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Platform-Specific

macOS

# Install Homebrew if needed
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# Install tools
brew install node go python@3.11 helm k3d kubectl
brew install --cask docker visual-studio-code

Linux (Ubuntu/Debian)

# Add Node.js repository
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -

# Install basic tools
sudo apt update
sudo apt install -y nodejs golang python3 python3-pip docker.io

# Install Kubernetes tools via snap
sudo snap install helm --classic
sudo snap install kubectl --classic

# Install k3d
curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash

# Install pnpm
npm install -g pnpm

# Install uv for Python
curl -LsSf https://astral.sh/uv/install.sh | sh

Windows (WSL2)

# Use the Linux instructions above in WSL2
# Ensure Docker Desktop is installed and WSL2 integration is enabled

Verify Installation

After installing the tools, verify they're working:

# Check versions
node --version # Should be 20+
pnpm --version # Should be 9+
go version # Should be 1.23+
python3 --version # Should be 3.11+
docker --version # Should be 20+
k3d version # Should be 5.5+
kubectl version --client # Should be 1.28+
helm version # Should be 3.10+

Repository Setup

1. Clone the Repository

git clone https://github.com/tafystudio/tafystudio.git
cd tafystudio

2. Initialize Monorepo

# Install all dependencies
make install

# Or manually:
pnpm install

3. Environment Configuration

# Create environment files (if needed)
echo "NATS_URL=nats://localhost:4222" > apps/hub-api/.env
echo "NEXT_PUBLIC_API_URL=http://localhost:8000" > apps/hub-ui/.env.local

Development Workflow

Local Kubernetes Cluster

Start a local k3s cluster for development:

# Create cluster (if make command doesn't exist yet)
k3d cluster create tafy-dev --servers 1 --agents 2

# Or use make command if available
make cluster-create

# Check cluster status
kubectl get nodes
kubectl cluster-info

# Delete cluster when done
k3d cluster delete tafy-dev
# or
make cluster-delete

Deploy Core Services

# Add Helm repos
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm repo add traefik https://helm.traefik.io/traefik
helm repo update

# Deploy NATS
helm install nats nats/nats -f charts/nats/values.yaml \
--create-namespace --namespace tafy-system

# Deploy Node-RED
helm install node-red ./charts/node-red --namespace tafy-system

# Check deployments
kubectl get all -n tafy-system

Node-RED Development

For visual robot programming with Node-RED:

# Port forward to access Node-RED UI
kubectl port-forward service/node-red-tafy-node-red 1880:1880 -n tafy-system

# Access Node-RED at http://localhost:1880
# Access Dashboard at http://localhost:1880/ui

# To develop custom nodes
cd packages/node-red-contrib-tafy
pnpm install
pnpm run build

Running Services Locally

For rapid development, run services outside Kubernetes:

# Start infrastructure services with Docker Compose
docker-compose -f docker-compose.dev.yml up -d

# Run all services in development mode
make dev

# Or run individual services:
make dev-ui # Run Hub UI
make dev-api # Run Hub API
make dev-agent # Run tafyd agent

# Forward ports from Kubernetes cluster
make port-forward

# Access services:
# Hub UI: http://localhost:3000
# Hub API: http://localhost:8000
# API Docs: http://localhost:8000/docs
# NATS Monitor: http://localhost:8222
# Node-RED: http://localhost:1880

Building Components

# Build everything
make build

# Build specific components
make build-ui # Build hub-ui
make build-api # Build hub-api
make build-agent # Build tafyd agent

# Build Docker images
make docker-build # Local architecture only
make docker-build-all # Multi-arch (amd64, arm64)

# Push images to registry
make docker-push

Testing

Test Automation

We use automated testing across all components with Jest (React), pytest (Python), and standard Go testing.

# Run all tests
make test

# Run unit tests only
make test-unit

# Run integration tests
make test-integration

# Run tests with coverage
make test-coverage

# Run tests in watch mode
make test-watch

# Run tests in Docker
make docker-test

Component-Specific Testing

# Hub UI (Jest + Playwright)
cd apps/hub-ui
pnpm test # Run tests
pnpm test:watch # Watch mode
pnpm test:coverage # With coverage

# WebSerial browser testing
pnpm exec playwright install # Install browsers (first time)
make test-webserial-mock # Test without hardware
make test-webserial # Test with ESP32 connected

# Hub API (pytest)
cd apps/hub-api
source .venv/bin/activate
pytest # Run tests
pytest -v # Verbose
pytest --cov # With coverage

# tafyd (Go test)
cd apps/tafyd
go test ./... # Run all tests
go test -v ./... # Verbose
go test -race ./... # Race detection
go test -cover ./... # With coverage

CI/CD Test Pipeline

Tests automatically run on GitHub Actions for:

  • Multiple Node.js versions (20, 22)
  • Multiple Python versions (3.11, 3.12)
  • Go 1.23
  • Integration tests with Docker Compose
  • Coverage reporting to Codecov
  • Cross-browser testing with Playwright (Chrome, Edge, Firefox, Safari)

Code Style

Linting and Code Quality

# Run all linters
make lint

# Format all code
make format

# Run TypeScript type checking
make typecheck

# Run security vulnerability scans
make security-scan

Formatting

We use:

  • Prettier for TypeScript/JavaScript
  • Black for Python
  • gofmt for Go

Frontend Notes

  • Tailwind CSS v4: We use Tailwind CSS v4 which requires the @tailwindcss/postcss plugin. This is already configured in the hub-ui project.
# Install git pre-commit hooks
make install-hooks

Working with Different Components

Hub UI (Next.js)

cd apps/hub-ui
npm run dev # Start dev server
npm run build # Production build
npm run storybook # Component development

Hub API (FastAPI)

cd apps/hub-api
python -m venv venv
source venv/bin/activate # or `venv\Scripts\activate` on Windows
pip install -r requirements-dev.txt
uvicorn main:app --reload

Node Agent (Go)

cd apps/tafyd
go mod download
go run . --debug # Run with debug logging
go build # Build binary

Firmware (PlatformIO)

cd firmware/esp32
pio run # Build all environments
pio run -e esp32dev # Build specific board
pio run -t upload # Flash to connected board
pio device monitor # Serial monitor

Node-RED Nodes

cd packages/node-red-contrib-tafy
npm link # Link for local development
cd ~/.node-red # Or your Node-RED user directory
npm link @tafy/node-red-contrib-tafy

Debugging

VS Code Launch Configurations

The repository includes launch configurations for:

  • Hub UI (Next.js debugging)
  • Hub API (Python debugging)
  • Node Agent (Go debugging with Delve)
  • Jest tests

Remote Debugging

For debugging on actual hardware:

# Forward ports from remote device
ssh -L 9229:localhost:9229 pi@raspberrypi.local

# Or use kubectl for k8s pods
kubectl port-forward pod/hub-api-xxx 5678:5678

Common Issues

WebSerial Testing

# Browser not found
pnpm exec playwright install chromium

# Permission denied on Linux
sudo usermod -a -G dialout $USER # Then logout/login

# ESP32 not detected
ls /dev/tty.usbserial-* || ls /dev/ttyUSB* # Check device

Port Conflicts

# Find what's using a port
lsof -i :4222 # macOS/Linux
netstat -ano | findstr :4222 # Windows

# Kill process using port
kill -9 <PID>

Docker Build Issues

# Clean Docker cache
docker system prune -a

# Build with no cache
docker build --no-cache .

# Check buildx
docker buildx ls

NATS Connection Issues

# Test NATS connection
nats-cli ping

# Monitor NATS traffic
nats-cli sub ">"

Making Changes

Feature Development

  1. Create feature branch: git checkout -b feature/your-feature
  2. Make changes following code style
  3. Write/update tests
  4. Update documentation
  5. Run turbo test lint typecheck
  6. Commit with conventional commits
  7. Push and create PR

Commit Convention

We use conventional commits:

  • feat: New feature
  • fix: Bug fix
  • docs: Documentation only
  • test: Test only
  • refactor: Code change that neither fixes nor adds
  • chore: Build process or auxiliary tool changes

Pull Request Process

  1. PR title follows conventional commit format
  2. Description explains what and why
  3. All CI checks pass
  4. At least one review approval
  5. Squash and merge

Performance Profiling

Go Services

# CPU profiling
go test -cpuprofile=cpu.prof -bench=.
go tool pprof cpu.prof

# Memory profiling
go test -memprofile=mem.prof -bench=.
go tool pprof mem.prof

Node.js Services

# Start with profiling
node --inspect apps/hub-api/dist/index.js

# Connect Chrome DevTools
# Navigate to chrome://inspect

Release Process

Version Bumps

# Bump version (follows semver)
npm run version:patch # 1.0.0 -> 1.0.1
npm run version:minor # 1.0.0 -> 1.1.0
npm run version:major # 1.0.0 -> 2.0.0

Building Release Artifacts

# Build all release artifacts
make release

# Sign images
make sign-images

# Generate SBOM
make sbom

Useful Commands

Development

# Check if all tools are installed
make check-tools

# Update all dependencies to latest
make update-deps

# View logs from Kubernetes services
make logs

Cleaning

# Clean build artifacts
make clean

# Deep clean (includes node_modules)
make clean-deep

CI/CD Helpers

# Commands used by GitHub Actions
make ci-lint # Run linters
make ci-test # Run unit tests
make ci-build # Build all packages

Kubernetes Operations

# Deploy to local cluster
make deploy-dev

# Check cluster status
make cluster-status

# Forward ports for local access
make port-forward

Complete Makefile Reference

Run make help to see all available commands with descriptions.

Troubleshooting

k3d Issues

k3d command not found

# Reinstall k3d
curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash
# Add to PATH if needed
export PATH=$PATH:/usr/local/bin

Cannot connect to Docker

# Ensure Docker is running
docker info

# On macOS, start Docker Desktop
# On Linux, start Docker service
sudo systemctl start docker

kubectl Issues

kubectl: command not found

# Reinstall kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/$(uname -s | tr '[:upper:]' '[:lower:]')/$(uname -m)/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

The connection to the server localhost:xxxx was refused

# Check if cluster is running
k3d cluster list

# Create cluster if needed
k3d cluster create tafy-dev --servers 1 --agents 2

# Update kubeconfig
k3d kubeconfig merge tafy-dev --kubeconfig-switch-context

Helm Issues

Error: Kubernetes cluster unreachable

# Check cluster connection
kubectl cluster-info

# Set correct context
kubectl config current-context
kubectl config use-context k3d-tafy-dev

Repository not found

# Re-add helm repositories
helm repo add nats https://nats-io.github.io/k8s/helm/charts/
helm repo update

Node-RED Access Issues

Cannot access http://localhost:1880

# Check if pod is running
kubectl get pods -n tafy-system

# Check logs
kubectl logs -n tafy-system deployment/node-red-tafy-node-red

# Restart port forwarding
kubectl port-forward service/node-red-tafy-node-red 1880:1880 -n tafy-system

NATS Connection Issues

NATS not reachable from Node-RED

# Check NATS pods
kubectl get pods -n tafy-system | grep nats

# Test NATS connection
kubectl exec -it nats-box-xxx -n tafy-system -- nats sub ">"

# Check service DNS
kubectl exec -it node-red-pod-xxx -n tafy-system -- nslookup nats.tafy-system.svc.cluster.local

Getting Help

  • Check existing issues on GitHub
  • Join our Discord community
  • Read the architecture docs
  • Ask in the #development channel

Remember: when in doubt, ask! We're here to help you contribute successfully.