← Portfolio
AUEB · Programming II · March 2026
ChatAUEB — AI Advisor,
Live in Production
AI department guidance system for all 8 AUEB departments — 18-question survey, LLM analysis, personalised recommendation. The desktop app runs live in the browser (via remote-desktop streaming), at 0€/month.
Java 21 Swing
Llama-3.3-70B · Groq
PostgreSQL / Neon
Docker · Fly.io
noVNC · Browser Access
SHA-256 · PreparedStatement
v1.0 · 2023
v2.0 · March 2026
Summary — for recruiters
Full-Stack Builder & DevOps · Live Production App · AUEB · 2025–26
I took a team Java application and turned it into a production system — migrated from paid OpenAI to free Groq LLM, replaced the university SQL Server with cloud PostgreSQL, containerised with Docker and deployed live on Fly.io with CI/CD.
IMPACT
Live at chataueb.fly.dev — operational cost 0€/month. Full security stack: SHA-256, PreparedStatement, .env secrets, AI topic restriction.
Java
Docker
Fly.io
PostgreSQL
LLM Integration
CI/CD
noVNC
01 — Motivation
Problem · Approach · Solution
AUEB has 8 departments with heavy thematic overlap — a hard call to make alone at 18. ChatAUEB closes that gap: questionnaire → LLM analysis → reasoned recommendation, as an objective, always-available first take — not a replacement for human guidance.
LLM = Large Language Model — an AI trained on huge amounts of text to understand questions and generate human-like answers.
ΔΕΟΣ · 01
International, European & Economic Studies
International relations, European integration, multilingualism
ΟΕ · 02
Economics
Macroeconomics, econometrics, public economics
ΔΕΤ · 03 ★
Management Science & Technology
Management, digital innovation, technology
ΟΔΕ · 04
Business Administration
Strategy, human resources, logistics
ΛΧ · 05
Accounting & Finance
Accounting, financial analysis, investments
ΜΕ · 06
Marketing & Communication
Marketing strategy, digital marketing
ΠΛ · 07
Informatics
Algorithms, artificial intelligence, cybersecurity
ΣΤ · 08
Statistics
Statistics, operations research, data analysis
★ My department
02 — User Flow
Browser → Survey → LLM → Recommendation · 6 steps
①Browser
chataueb.fly.dev — no install needed
②Auth
Register / Login / Guest
③Survey
18 questions · min 10 answers
④AI Analysis
Groq API · 5–15″ · background thread
⑤Recommendation
Primary + alternative + rationale
⑥Follow-up
AUEB Advisor — free Q&A
AUEB Advisor: free-form Q&A beyond the survey — locked to Greek, on-topic, and injection-safe by system prompt.
03 — Architecture
5-Layer Architecture · Loose Coupling · Separation of Concerns
In plain terms: the app is split into clear layers — screen, coordination, AI logic, business rules, and database — so each part can change without breaking the others.
PRESENTATION
Gui.java · ProgressBar.java
Swing frames, event handling
APPLICATION
App.java
5-step bootstrap, coordination
SERVICE
AIService.java · QueryBuilder.java
Groq API client, prompt assembly
DOMAIN
User.java · Questions.java · Labels.java
Business logic, authentication
INFRASTRUCTURE
ConnectionDB.java · AppConfig.java
JDBC, .env loader, schema bootstrap
Key Data Flows
Recommendation
Gui → QueryBuilder → AIService → Groq API → openResponseFrame()
Registration
Gui → User.signUp() → SHA-256 → ConnectionDB → Neon
Startup
AppConfig → Questions → initSchema() → download() → invokeLater()
04 — AI Integration
Groq API · llama-3.3-70b · Async Execution · Thread-Safe
In plain terms: the app talks to the AI in the background, so the interface never freezes while waiting for a reply.
AIService runs on a background thread — no UI blocking — synchronised via wait/notifyAll, with a hand-rolled JSON parser and zero external dependencies.
AIService.java
Groq HTTP client
HTTP POST to Groq, off the EDT. Manual JSON parsing — zero dependencies.
awaitResponse() via synchronized wait/notifyAll.
HTTP POSTJSON ParserThread Safetywait/notifyAll
QueryBuilder.java
Prompt assembly
Assembles the prompt from 18 Q&As + all 8 department profiles. System prompt enforces Greek, professional tone, and blocks injection/off-topic asks.
Prompt EngineeringScope LockSystem Prompt
API Config
# Groq API — OpenAI-compatible, free LPU inference
Model: llama-3.3-70b-versatile
Max tokens: 1500
Temperature: 0.5 ← balanced creativity/consistency
Endpoint: https://api.groq.com/openai/v1/chat/completions
# v1.0 → v2.0: OpenAI paid → Groq free (OpenAI-compatible → minimal code changes)
05 — Containerisation & Deployment
Docker Multi-Stage · noVNC · Fly.io · CI/CD · Zero Software Install
In plain terms: ChatAUEB is a desktop app, but it's packaged so anyone can open and use it straight from a browser — nothing to download or install.
Swing app on a virtual display (Xvfb) → x11vnc → noVNC HTML5 — accessible from any browser, zero install.
Technologies used, in plain terms:
Docker — packages the app so it runs identically anywhere, no "works on my machine" surprises.
CI/CD — every code push is automatically tested and deployed live, no manual steps.
TLS/SSL — encrypts the connection so no one can read the data in transit.
REST — the standard way the app and server exchange requests over the web.
JSON — a simple text format for exchanging data between systems.
WebSocket (WS) — a connection that stays open for real-time, two-way communication.
Infrastructure Architecture
start.sh: Xvfb :99 → fluxbox → java -jar chataueb.jar → x11vnc → noVNC → Port 6080
Stage 1: builder
eclipse-temurin:21-jdk-jammy
Maven build → fat JAR. jlink custom JRE with 11 required modules. Reduction ≈650 MB → ≈95 MB (−85%).
MavenjlinkCustom JRE95 MB
Stage 2: runtime
debian:bookworm-slim
Copy custom JRE + JAR + start.sh + noVNC. apt install: xvfb x11vnc fluxbox. Port 6080 → Fly.io TLS.
Xvfbx11vncnoVNCFly.io
fly.toml — Deployment Parameters
Cost / CI-CD
0€/month · auto-deploy on push
06 — Database
Neon PostgreSQL · Serverless · SSL/TLS · v1→v2: University SQL Server → Cloud
v1.0 ran on AUEB's SQL Server — a university-infra dependency. v2.0 moved to Neon PostgreSQL (serverless, free tier, SSL mandatory) — zero code changes required.
SQL Schema
-- Auto-created on startup (initSchema)
CREATE TABLE IF NOT EXISTS users (
username VARCHAR(100) PRIMARY KEY,
pass VARCHAR(64) NOT NULL -- SHA-256 hex, never plain text
);
CREATE TABLE IF NOT EXISTS answers (
username VARCHAR(100) REFERENCES users ON DELETE CASCADE,
question_idx INT, -- 0–17
answer_idx INT, -- 1–6
PRIMARY KEY (username, question_idx)
);
07 — Security
Multi-Layer Security Stack · Authentication · Transport · Database · AI Scope
In plain terms: passwords are never stored as readable text, all database queries are built safely against injection, secrets stay out of the codebase, and the AI is locked to stay on-topic.
| Domain |
Mechanism |
Implementation |
| Authentication | Password Hashing | SHA-256 hex (64 chars) — plain text never stored |
| Secrets | .env Management | API keys via .env only — excluded from Git and Docker image. |
| Database | SQL Injection | PreparedStatement everywhere — zero string concatenation in SQL. |
| Transport | SSL/TLS | sslmode=require in the JDBC URL, via jdk.crypto.ec in the custom JRE. |
| Resources | Resource Management | try-with-resources on every Connection and Statement. |
| AI Safety | Scope Lock | System prompt rejects off-topic queries and prompt injection attempts. |
| Input | Validation | Empty credentials, duplicate usernames, minimum 10 answers required for AI query. |
08 — Evolution
v1.0 → v2.0 · Full upgrade of architecture, infrastructure & security
v1.0 — Initial Build
OpenAI API (paid)
AUEB SQL Server (infrastructure dependency)
Local execution only
Basic Swing UI
No .env management
9-person team
v2.0 — Production Ready
Groq API — free, LPU hardware, OpenAI-compatible
Neon PostgreSQL — serverless cloud, SSL required
Browser access via noVNC · Fly.io production
Dark theme, card-based layout, chip-style choices
SHA-256 + .env + PreparedStatement security stack
GitHub Actions CI/CD — auto-deploy on git push
09 — Team
v1.0 Team · 9 members · + v2.0 Solo Upgrade
| Student ID | Name | Contribution |
| 8220035 | Σπήλιος Δημακόπουλος | v1.0: Core functionality, AI · v2.0: Full upgrade — UI/UX, PostgreSQL/Neon, Docker, noVNC, Fly.io, CI/CD, Security |
| 8220092 | Έρνολντ Μουλάι | Repository management, database |
| 8220116 | Εμμανουήλ Παπαγιάννης | Code coordination, GUI |
| 8220019 | Σταύρος Βλάχος | Questionnaire design |
| 8220225 | Νικόλαος Σινάνι | Domain model, quality assurance |
| 8220132 | Αθ.-Παν. Σακκάτος | Infrastructure classes, architecture |
| 8220231 | Άντζελα Ντάσι | AUEB department information |
| 8220015 | Ευγενία Βέκιου | AUEB department information |
| 8220141 | Παύλος Σταμάτης | Development and integration |
10 — Roadmap
Current Limitations & Future Extensions
Current Limitations
Single user — Java Swing does not support concurrent sessions
Mobile UX — degraded experience due to VNC scaling
Password Reset — no email-based recovery
AI Non-determinism — temperature=0.5, results vary
Proposed Extensions
HighSpring Boot + React — native multi-user web app
HighEmail authentication & password recovery
MediumRAG (AI searches official documents before answering) with official AUEB documents
MediumUsage analytics dashboard
LowMultilingual support
Reflection
What I took away — looking back
From group project to production. v1.0 was a 9-person coursework deliverable. Eight months later I rebuilt it solo for v2.0 — the steepest learning curve in this portfolio: backend, AI integration, infra and security, end to end.
Swing has limits — that was the point. Java Swing isn't built for this kind of UI. Making it work over a browser via noVNC, instead of switching stacks, was a deliberate constraint to deepen Java expertise — and the trade-off was worth it.
Free-tier doesn't mean compromise. Groq + Neon + Fly.io proved a fully-featured, secured, CI/CD-deployed AI app can run at 0€/month — it reshaped how I weigh infra cost before reaching for paid services.
ChatAUEB v2.0 proves a production-ready AI app — real users, cloud database, CI/CD, full security stack — can run at zero monthly cost on free-tier services alone.
The entire v2.0 upgrade — infrastructure, UI/UX, security and deployment — was rebuilt solo, end to end.
Spilios Dimakopoulos · Java 21 · Groq · Neon · Docker · Fly.io · v2.0 · March 2026