This is a Kotlin Multiplatform project targeting Android, iOS, and a JVM Ktor server.

* [/composeApp](./composeApp/src) is for code that will be shared across your Compose Multiplatform applications.
  It contains several subfolders:
    - [commonMain](./composeApp/src/commonMain/kotlin) is for code that is common to the mobile app targets.
    - [androidMain](./composeApp/src/androidMain/kotlin) contains Android-specific app code.
    - [iosMain](./composeApp/src/iosMain/kotlin) contains iOS-specific app code.
    - Other folders are for Kotlin code that will be compiled for only the platform indicated in the folder name.

* [/iosApp](./iosApp/iosApp) contains iOS applications. Even if you’re sharing your UI with Compose Multiplatform,
  you need this entry point for your iOS app. This is also where you should add SwiftUI code for your project.

* [/server](./server/src/main/kotlin) is for the Ktor server application.

* [/shared](./shared/src) is for the code that will be shared between all targets in the project.
  The most important subfolder is [commonMain](./shared/src/commonMain/kotlin). `shared` still declares
  a JVM target because the Ktor server depends on `projects.shared`; this does not mean the Compose
  desktop application target is enabled.

### Build and Run Android Application

To build and run the development version of the Android app, use the run configuration from the run widget
in your IDE’s toolbar or build it directly from the terminal:

- on macOS/Linux
  ```shell
  ./gradlew :composeApp:assembleDebug
  ```
- on Windows
  ```shell
  .\gradlew.bat :composeApp:assembleDebug
  ```

### Build and Run Server

To build and run the development version of the server, use the run configuration from the run widget
in your IDE’s toolbar or run it directly from the terminal:

- on macOS/Linux
  ```shell
  ./gradlew :server:run
  ```
- on Windows
  ```shell
  .\gradlew.bat :server:run
  ```

### Build and Run iOS Application

To build and run the development version of the iOS app, use the run configuration from the run widget
in your IDE’s toolbar or open the [/iosApp](./iosApp) directory in Xcode and run it from there.

### Local development

The server requires Postgres. A `docker-compose.yml` at the repo root ships a local Postgres
instance whose credentials match `application.conf` defaults (`recipe`/`recipe`/`recipe`).

Boot the database and server:

```shell
docker compose up -d postgres
./gradlew :server:run
```

Verify the server is up:

```shell
curl http://localhost:8080/health
# expected: {"status":"ok"}
```

Environment overrides (optional — set any of these to override `application.conf` defaults):

- `DATABASE_URL` — JDBC URL (default `jdbc:postgresql://localhost:5432/recipe`)
- `DATABASE_USER` — DB user (default `recipe`)
- `DATABASE_PASSWORD` — DB password (default `recipe`)
- `PORT` — Ktor port (default `8080`)

Before committing, format all Kotlin + Gradle + Markdown files:

```shell
./gradlew spotlessApply
```

The full check (Spotless + all tests across all targets):

```shell
./gradlew check
```

Reset the local database (destroys the `recipe-pgdata` volume):

```shell
docker compose down -v
```

---

Learn more about [Kotlin Multiplatform](https://www.jetbrains.com/help/kotlin-multiplatform-dev/get-started.html)
and [Compose Multiplatform](https://github.com/JetBrains/compose-multiplatform/#compose-multiplatform).
