Full-stack pfinance development guidance. Use when working on the personal finance app, creating features, debugging issues, or understanding the codebase architecture...
This skill provides comprehensive guidance for developing the pfinance personal finance application.
PFinance is a full-stack personal finance application with:
http://localhost:8111 (NOT 8080)http://localhost:1234http://localhost:8111/healthpfinance/
āāā web/ # Next.js frontend (App Router)
ā āāā src/
ā āāā app/ # Pages and feature components
ā ā āāā components/ # Feature-specific React components
ā ā āāā context/ # React Context providers
ā ā āāā utils/ # Utility functions
ā āāā components/ui/ # shadcn/ui components
ā āāā gen/ # Generated protobuf TS types
ā āāā lib/ # Core services (firebase, financeService)
āāā backend/ # Go backend
ā āāā cmd/server/ # Server entrypoint
ā āāā internal/
ā āāā auth/ # Firebase auth middleware
ā āāā service/ # Business logic (FinanceService)
ā āāā store/ # Data access (Firestore + Memory)
āāā proto/ # Protobuf definitions
āāā pfinance/v1/ # API contract definitions
# Start full development environment
make dev
# Individual services
make dev-backend # Go server on :8111 (in-memory store)
make dev-frontend # Next.js on :1234
# Check service health
make status
# Run tests
make test # All tests
make test-backend # Backend only
make test-frontend # Frontend only
# Code generation (after proto changes)
make proto # Generate protobuf code
make generate # Generate all (proto + mocks)
# Build
make build # Build both frontend and backend
// Context hierarchy
<AuthProvider>
<FinanceProvider>
<MultiUserFinanceProvider>
<App />
</MultiUserFinanceProvider>
</FinanceProvider>
</AuthProvider>
// Service implements the Connect-RPC interface
type FinanceService struct {
store store.Store
auth auth.Authenticator
}
func (s *FinanceService) CreateExpense(ctx context.Context, req *connect.Request[v1.CreateExpenseRequest]) (*connect.Response[v1.CreateExpenseResponse], error) {
// Implementation
}
import { createClient } from "@bufbuild/connect";
import { FinanceService } from "@/gen/pfinance/v1/finance_service_connect";
const client = createClient(FinanceService, transport);
const response = await client.createExpense({ ... });
make proto after changing .proto files@/components/ui/ for consistencymake status before debugging connectivity issues