Bilhälsning.se — license plate letter service
Find a file
2026-04-30 15:41:55 +02:00
.env.example feat: add Trello MCP integration and env config 2026-04-30 15:41:55 +02:00
.gitignore chore: initial project setup with docs and guidelines 2026-04-30 15:26:40 +02:00
AGENTS.md feat: add Trello MCP integration and env config 2026-04-30 15:41:55 +02:00
CODING_GUIDELINES.md docs: add branching strategy — master, develop, feature/* model 2026-04-30 15:34:00 +02:00
opencode.json feat: add Trello MCP integration and env config 2026-04-30 15:41:55 +02:00
README.md chore: initial project setup with docs and guidelines 2026-04-30 15:26:40 +02:00
REQUIREMENTS.md chore: initial project setup with docs and guidelines 2026-04-30 15:26:40 +02:00
trello-import.csv chore: initial project setup with docs and guidelines 2026-04-30 15:26:40 +02:00

BilHej / Bilhälsning.se

Send a physical letter to a Swedish car owner — just by knowing their license plate.

The user enters a registration number, composes a letter (from a template or free text), pays, and BilHej handles the rest: owner address lookup via Transportstyrelsen, printing and mailing via PostNord. The sender never sees the recipient's name or address.


Tech Stack

Layer Technology
Frontend Vue.js 3 (Composition API), Vite, Pinia
Backend Java 21, Spring Boot 3
Database PostgreSQL 16
Auth Spring Security + JWT
Payments Stripe (cards + Swish)
Deployment Docker, Docker Compose

Prerequisites

  • Docker & Docker Compose
  • Java 21 (for local IDE development)
  • Node.js 20+ (for local frontend dev)
  • A Stripe account (test mode for development)

Quick Start

git clone <repo-url> bilhej
cd bilhej
cp .env.example .env          # fill in your keys
docker compose up -d

The app will be available at:

  • Frontend: http://localhost:3000
  • Backend API: http://localhost:8080
  • PostgreSQL: localhost:5432

Environment Variables

Copy .env.example to .env and fill in:

Variable Description
POSTGRES_DB Database name (default: bilhej)
POSTGRES_USER Database user
POSTGRES_PASSWORD Database password
JWT_SECRET Secret key for JWT signing
STRIPE_SECRET_KEY Stripe secret key
STRIPE_WEBHOOK_SECRET Stripe webhook signing secret
STRIPE_PRICE_ID Stripe price ID for single letter

Project Structure

bilhej/
├── frontend/                 # Vue.js 3 SPA
│   ├── src/
│   │   ├── components/       # Reusable UI components
│   │   ├── composables/      # Shared composition functions
│   │   ├── layouts/          # Page layouts
│   │   ├── pages/            # Route-level page components
│   │   ├── router/           # Vue Router config
│   │   ├── stores/           # Pinia stores
│   │   ├── api/              # API client and endpoints
│   │   ├── assets/           # Static assets, CSS
│   │   ├── App.vue
│   │   └── main.js
│   ├── index.html
│   ├── vite.config.js
│   └── package.json
├── backend/                  # Spring Boot 3
│   ├── src/main/java/se/bilhalsning/
│   │   ├── BilHejApplication.java
│   │   ├── config/           # Security, CORS, Stripe config
│   │   ├── controller/       # REST controllers
│   │   ├── dto/              # Data transfer objects
│   │   ├── entity/           # JPA entities
│   │   ├── repository/       # Spring Data repositories
│   │   ├── service/          # Business logic
│   │   └── security/         # JWT filter, user details
│   └── src/main/resources/
│       ├── application.yml
│       └── db/migration/      # Flyway migrations
├── docker-compose.yml
├── docker/
│   ├── backend.Dockerfile
│   └── frontend.Dockerfile
├── .env.example
├── README.md
├── REQUIREMENTS.md
├── CODING_GUIDELINES.md
└── ARCHITECTURE.md

Development

Frontend (dev server with HMR)

cd frontend
npm install
npm run dev

Backend (IDE or CLI)

cd backend
./mvnw spring-boot:run

Stripe Webhooks (local testing)

stripe listen --forward-to localhost:8080/api/webhooks/stripe