Tracked issues for aligning the Octobird project setup with Open Elements conventions.
Recommended order: 1 → 2+4 (parallel) → 3+5 (parallel) → 6 → 7
Area: Root project files
The project root is missing several standard files required by Open Elements conventions.
- Add
.editorconfigwith Open Elements standard settings (UTF-8, LF, indent 4 for Java, indent 2 for TS/JSON/CSS, max line length 120 for Java, trim trailing whitespace, final newline) - Add
CODE_OF_CONDUCT.md(Contributor Covenant 2.0) - Rename
.envto.env.examplewith placeholder values, add.envto.gitignore - Review and update
.gitignoreto cover all conventions (.idea/,target/,node_modules/,.next/,*.iml,.env)
- All four files exist and match the Open Elements conventions
.envis gitignored,.env.exampleis committed with safe placeholder values- Existing developers can copy
.env.exampleto.envto get started
Area: Backend build
The backend Maven build is missing several convention-required configurations: version-pinned default plugins, SBOM generation, and a Java version pin file.
- Add
.sdkmanrctobackend/withjava=21 - Add
.dockerignoretobackend/(excludetarget/,.idea/,*.iml,.git,.mvn/wrapper/*.jar) - Pin all default Maven lifecycle plugin versions in
<pluginManagement>(compiler, surefire, jar, resources, clean, install, deploy) - Add CycloneDX Maven Plugin for SBOM generation
- Verify
maven-compiler-pluginsource/target/release is set to 21
./mvnw clean verifysucceeds- SBOM is generated in
target/during build .sdkmanrcpins Java 21.dockerignorereduces Docker build context size
Area: Backend Docker
The backend Dockerfile should follow Open Elements container conventions: run as non-root user, pin base image versions, and use optimized layering.
- Ensure base image versions are pinned (e.g.,
eclipse-temurin:21-jdk-alpine,eclipse-temurin:21-jre-alpine) - Add a non-root user in the runtime stage and switch to it (
USER 1001) - Verify only the application port (8080) is exposed
- Ensure no build artifacts (source code, Maven cache) leak into the runtime image
docker buildsucceeds for the backend- Container runs as non-root user (verifiable via
docker exec ... whoamiorid) - Image size is minimized (no JDK, no source code in runtime stage)
Area: Frontend structure
The frontend is missing several convention-required files and setup steps: Node.js version pinning, Docker ignore, favicon, and shadcn/ui component library.
- Add
.nvmrctofrontend/pinning the Node.js version (e.g.,v22) - Add
.dockerignoretofrontend/(excludenode_modules/,.next/,.idea/,.git) - Ensure
public/favicon.icoexists - Set up shadcn/ui with proper theming (Open Elements brand colors as CSS custom properties)
- Verify
tsconfig.jsonhasstrict: trueenabled
pnpm buildsucceeds.nvmrcpins the correct Node.js version- shadcn/ui is installed and themed with Open Elements brand colors
public/favicon.icois present
Area: Frontend Docker
The frontend Dockerfile needs adjustments to follow Open Elements conventions: BACKEND_URL as build argument (required
because next.config.ts is evaluated at build time), non-root user, and proper public/ directory handling.
- Add
BACKEND_URLas aARGin the build stage and pass it to the Next.js build - Add a non-root user in the runtime stage (
USER 1001) - Ensure
public/directory is properly copied (no2>/dev/null || trueworkarounds) - Pin base image version (
node:22-alpine)
docker build --build-arg BACKEND_URL=http://backend:8080 .succeeds- Container runs as non-root user
- Frontend correctly proxies API calls to the backend URL provided at build time
Area: Docker Compose
The docker-compose configuration should follow the Open Elements convention of separating base configuration from development-only overrides.
- Refactor
docker-compose.ymlto contain only production-relevant configuration - Create
docker-compose.override.ymlfor development (port mappings, debug config) — add to.gitignore - Pass
BACKEND_URLas build arg to frontend service - Ensure all credentials use
${VAR_NAME}references with no defaults for secrets - Document the override pattern in
README.md
docker-compose up --buildworks for both development (with override) and production (without)- No hardcoded credentials in committed files
- README explains how to set up local development with the override file
Area: CI/CD
The project has no CI/CD pipeline. A GitHub Actions workflow should be added to validate builds, run tests, and verify Docker images on every push and pull request.
- Create
.github/workflows/ci.ymltriggered onpushandpull_requesttomain - Pin all action versions (e.g.,
actions/checkout@v4, not@latest) - Backend job:
./mvnw clean verifywith Maven caching - Frontend job:
pnpm install --frozen-lockfile,pnpm lint,pnpm buildwith pnpm caching - Docker verification job:
docker-compose buildto verify images build successfully - Run backend and frontend jobs in parallel, Docker job after both succeed
- CI runs on every push and PR to
main - Build failures block PR merges (branch protection can be configured separately)
- Caching reduces build times after first run