Veeresh Hanni Project learning guide

Welcome to the Veeresh Hanni Project’s (VHP). This repository brings together Python libraries, developer tooling, and microservice examples built by Veeresh Hanni.

The hosted version of this guide is available at vhp.readthedocs.io.

The goal of this guide is to make the repository useful as a learning path: read a small project, run it, change it, and then use the same idea in a larger service.

Projects at a glance

Project

What it teaches

Start here

vhp

Python package layout, uv, console scripts

src/vhp/__init__.py

Jospy

JSON conversion, payload shaping, REST response envelopes

source README

DBDuck

One data API across SQL, NoSQL, graph, and vector stores

source README

Dompack

Domain-based Python dependency bundles and installation

source README

Microservices

Django, FastAPI, Flask, Kafka, Valkey, NATS, Docker, and WSL workflows

source README

Project-by-project outcomes

After working through the repository, you should be able to:

  • package a Python project and expose a command-line entry point;

  • build predictable JSON responses without leaking private fields;

  • choose between CRUD, document, graph, and vector data access patterns;

  • create a repeatable virtual environment and dependency workflow;

  • split a feature into services with explicit ownership;

  • decide when to use HTTP and when to publish an event;

  • implement idempotency for retried requests;

  • use Valkey for short-lived coordination rather than durable business data;

  • design a Kafka event envelope and an idempotent consumer;

  • explain why production systems need an outbox, observability, and authenticated service communication.

A complete learning project

Combine the projects by building a small catalog application:

  1. Use Dompack to prepare a web and testing environment.

  2. Use FastAPI or Flask for the HTTP API.

  3. Use Jospy to shape public responses and pagination.

  4. Use DBDuck with SQLite for the first persistence implementation.

  5. Add a catalog.item.created Kafka event.

  6. Store a short-lived response cache or request idempotency key in Valkey.

  7. Add tests for validation, duplicate requests, and insufficient stock.

  8. Document the service contract and run the system through Docker or WSL.

This exercise is intentionally incremental. Start with one process and one database, then introduce a second service only when there is a clear ownership or scaling reason. That approach teaches the trade-offs of microservices without turning every feature into deployment overhead.

How the projects fit together

Jospy       -> clean JSON and REST payloads
DBDuck      -> access application data
Dompack     -> prepare a Python development environment
VHP         -> package and organize the projects
Microservices -> combine APIs, data, messaging, and operations

For example, a future service can use Jospy for response envelopes, DBDuck for persistence, Dompack to bootstrap dependencies, and the microservice patterns for service boundaries and event delivery.

Repository and submodules

DBDuck, Dompack, Jospy, and the existing microservice system are tracked as git submodules or independent project areas. To initialize submodules in a fresh clone:

git submodule update --init --recursive

Do not commit virtual environments, .env files, build output, or generated cache directories. Use each project’s own README for project-specific tests and release commands.

Safety and production notes

The examples are designed for learning. Before using them in production:

  • pin and audit dependencies;

  • use secret management instead of example keys;

  • use durable, service-owned databases;

  • authenticate internal service calls;

  • add timeouts, retry policy, idempotency, and dead-letter handling;

  • add structured logs, metrics, traces, health checks, and readiness checks;

  • validate event schemas and plan Kafka/Valkey persistence and access control.

Next project exercise

Choose one small feature and implement it end to end:

  1. Add a customer_id to the learning order request.

  2. Validate it at the Flask boundary.

  3. Include it in the Kafka event.

  4. Add a consumer that writes an audit record.

  5. Document the event contract and test duplicate delivery.

That exercise connects payload design, service boundaries, messaging, and idempotency across the VHP projects.

Support open source

Your support helps me (Veeresh Hanni) improve the documentation, maintain the learning examples, and build new open-source libraries and coding tools for Python developers.

Thank you for helping make Python learning resources and open-source development work more accessible.