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.

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.