My First Application#
A complete, working admin console built with Palmyra — small enough to read in an evening, realistic enough to grow into a real product. We’ll build an Employee Management app with two entities:
- Department — a short master list (HR, Engineering, Sales, …) with a code, a name, and a description.
- Employee — the person records, each pointing at one department, plus contact info, joining date, and status.
By the end, clicking around the UI will flow through every layer Palmyra ships: a Mantine React grid asks the SpringBoot API for rows, the API asks the database, audit columns are stamped automatically, and a foreign-key picker on the Employee form calls back into the Department API.
Who this guide is for#
It’s written three ways, side by side. Pick your lane — each track stands on its own.
- Product-minded readers / non-technical folks. Start with Concepts for a plain-English tour of the moving parts, then skim Backend → Try it and Frontend → Employee screens to see the app working end-to-end.
- Backend developers familiar with Spring / JPA. Jump to Backend → Project setup; the tutorial skips Spring basics and focuses on what Palmyra adds.
- Frontend developers familiar with React / Mantine. Jump to Frontend → Project setup; we assume you know Vite and Mantine primitives and focus on the Palmyra wiring.
Tracks#
| Track | Scope |
|---|---|
| Concepts | Plain-language primer — what Palmyra’s moving parts are and how they talk to each other |
| Backend | Publish /api/department and /api/employee CRUD endpoints — Gradle, POJOs, handlers |
| Frontend | Mantine admin screens — grids, new / edit dialogs, server-lookup on department |
| Recap and next steps | End-to-end wiring summary, variations to try, and where to take the app from here |
Work the backend first and verify with curl, then drive the same API from the Mantine UI — the two sides share nothing but a JSON contract on the wire.
Target stack#
- Backend: Java 21, SpringBoot 3, Gradle, MariaDB (or any SQL database Palmyra supports).
- Frontend: React 19, TypeScript, Vite, Mantine 8, plus
@palmyralabs/palmyra-wire+@palmyralabs/rt-forms-mantine+@palmyralabs/template-tribble.
Both sides are self-contained — no shared Node / Java infrastructure is needed to follow one track while skipping the other.