docs: add README and LICENSE with hackathon context
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 MrFrostDev
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,224 @@
|
||||
<div align="center">
|
||||
<img src="public/logo.png" alt="PatchPilot" width="120" />
|
||||
<h1>PatchPilot</h1>
|
||||
<p><strong>Repair café tool inventory & AI repair assistant.</strong></p>
|
||||
<p>
|
||||
<img alt="Next.js" src="https://img.shields.io/badge/Next.js-13.4-black?logo=next.js" />
|
||||
<img alt="React" src="https://img.shields.io/badge/React-18-149eca?logo=react" />
|
||||
<img alt="TypeScript" src="https://img.shields.io/badge/TypeScript-5-3178c6?logo=typescript" />
|
||||
<img alt="Material UI" src="https://img.shields.io/badge/MUI-5-007fff?logo=mui" />
|
||||
<img alt="License" src="https://img.shields.io/badge/license-MIT-green" />
|
||||
</p>
|
||||
</div>
|
||||
|
||||
PatchPilot is a small but complete web app for a repair café. It combines a
|
||||
**tool inventory with a reservation system** and an **AI assistant** that helps
|
||||
diagnose problems, suggest repair approaches and answer questions about the
|
||||
tool database. It's designed to feel like a real product, not a wireframe.
|
||||
|
||||
---
|
||||
|
||||
## 🏆 About this project
|
||||
|
||||
This project was built during the **Jade Hochschule AI Hackathon in May 2026**
|
||||
and reached **3rd place** as a team submission.
|
||||
|
||||
The challenge: **vibe-code an app idea around sustainability and/or health**
|
||||
in a single day. A digital companion for repair cafés fits
|
||||
squarely in the sustainability bucket — repair cafés extend the lifespan of
|
||||
broken things instead of sending them to landfill, and the bottleneck is
|
||||
almost always tool access, expertise and coordination. PatchPilot tries to
|
||||
chip away at all three at once.
|
||||
|
||||
---
|
||||
|
||||
## ✨ Features
|
||||
|
||||
### For everyone
|
||||
- **Tool inventory** — 12 tools across 8 categories with search, filter, location, training requirements and rental period.
|
||||
- **Reservation flow** — modal with date picker, live availability calendar, validation against the maximum rental period.
|
||||
- **AI assistant (RepairBuddy)** — describe a problem in plain language and get a structured, Markdown-formatted answer. Supports image uploads for visual diagnosis.
|
||||
- **Multi-language** — German / English with browser locale detection and persistent choice.
|
||||
- **Dark / light mode** — with system-preference detection.
|
||||
- **Responsive** — full mobile layout with drawers, full-screen modals and collapsing sidebars.
|
||||
|
||||
### For admins
|
||||
- **Dashboard** with live stats (tools, users, active reservations, pending requests).
|
||||
- **Pending-requests banner** with one-click approve / reject.
|
||||
- **Tool CRUD** — add / edit / delete with category, emoji, location, training requirements.
|
||||
- **Knowledge base** — upload manuals that are surfaced to the AI as context.
|
||||
- **Reservation calendar** — month / week / day view, colour-coded by status.
|
||||
|
||||
### Behind the scenes
|
||||
- **Role-aware AI** — the system prompt is built per request and injects a live snapshot of tools + reservations. Admins see borrower names; regular users only see availability & return dates. Same backend, different views.
|
||||
- **Vision via OpenAI-compatible API** — image uploads are auto-downscaled (>2.5 MB → 1600 px JPEG) and sent as multimodal content.
|
||||
- **Mock fallback** — works without an API key. The chat engine drops back to a deterministic local responder if `GEMINI_API_KEY` is missing or the upstream fails.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Getting started
|
||||
|
||||
### 1. Clone & install
|
||||
|
||||
```bash
|
||||
git clone git@github.com:MrFrostDev/patch-pilot.git
|
||||
cd patch-pilot
|
||||
npm install
|
||||
```
|
||||
|
||||
### 2. Configure the AI provider
|
||||
|
||||
PatchPilot expects an **OpenAI-compatible chat endpoint**. It has been tested
|
||||
with [Requesty](https://requesty.ai) routing to Google Gemini 3 Flash, but any
|
||||
OpenAI-compatible provider works (OpenRouter, LiteLLM, vLLM, your own gateway…).
|
||||
|
||||
Copy the example file and fill in your credentials:
|
||||
|
||||
```bash
|
||||
cp .env.example .env.local
|
||||
```
|
||||
|
||||
```env
|
||||
REQUESTY_BASE_URL=https://router.requesty.ai/v1
|
||||
GEMINI_API_KEY=your-key-here
|
||||
PATCHPILOT_MODEL=vertex/gemini-3-flash-preview # optional, this is the default
|
||||
```
|
||||
|
||||
If you leave the variables empty, PatchPilot uses its built-in **mock engine** —
|
||||
useful for demos without burning API credits.
|
||||
|
||||
### 3. Run
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
Open [http://localhost:3000](http://localhost:3000).
|
||||
|
||||
### 4. Sign in
|
||||
|
||||
Three demo accounts are bundled in the mock database:
|
||||
|
||||
| Username | Password | Role | Notes |
|
||||
| -------- | -------- | ------------- | ------------------------------------------- |
|
||||
| `admin` | `admin` | Administrator | Full access, tool CRUD, reservation actions |
|
||||
| `staff` | `staff` | Staff | Has drill + soldering training |
|
||||
| `guest` | `guest` | Guest | Read-only, no training |
|
||||
|
||||
---
|
||||
|
||||
## 🛠 Tech stack
|
||||
|
||||
| Layer | Choice |
|
||||
| ------------------ | --------------------------------------------------------------- |
|
||||
| Framework | **Next.js 13** (App Router) |
|
||||
| Language | **TypeScript** (strict-ish, `strict: false` for hack speed) |
|
||||
| UI library | **Material UI v5** with custom theme |
|
||||
| Animation | **Framer Motion 12** |
|
||||
| State | **Zustand 4** with `persist` middleware (localStorage) |
|
||||
| Calendar | **FullCalendar** (dayGrid, timeGrid, interaction) |
|
||||
| Icons | **lucide-react** |
|
||||
| Markdown | **react-markdown** + `remark-gfm` |
|
||||
| AI API | OpenAI-compatible (e.g. Requesty → Gemini 3 Flash, multimodal) |
|
||||
| Fonts | **Inter** via `next/font/google` |
|
||||
|
||||
---
|
||||
|
||||
## 📁 Project structure
|
||||
|
||||
```
|
||||
src/
|
||||
├── app/
|
||||
│ ├── api/chat/route.ts # Chat API — routes to live LLM or mock
|
||||
│ ├── globals.css # Custom properties, FullCalendar theming
|
||||
│ ├── layout.tsx # Metadata, font, providers shell
|
||||
│ ├── page.tsx # AppBar + drawer + view switch + login
|
||||
│ └── providers.tsx # Client-side providers (theme, i18n)
|
||||
├── components/
|
||||
│ ├── AIInput.tsx # Single-shell chat input with attachments
|
||||
│ ├── AdminCalendar.tsx # Admin reservation calendar
|
||||
│ ├── AdminDashboard.tsx # Stats + CRUD + approvals
|
||||
│ ├── AnimatedBackground.tsx # GPU-composited blob background
|
||||
│ ├── AvailabilityCalendar.tsx # In-modal availability view
|
||||
│ ├── ChatSidebar.tsx # Session list with rename / delete
|
||||
│ ├── ChatWindow.tsx # Messages, scroll-to-bottom, mode badge
|
||||
│ ├── HeroSection.tsx # Landing hero with AI input
|
||||
│ ├── Logo.tsx # Logo component (used everywhere)
|
||||
│ ├── MarkdownMessage.tsx # Styled Markdown renderer
|
||||
│ ├── Onboarding.tsx # Interactive 4-step walkthrough
|
||||
│ ├── ReservationModal.tsx # Booking modal with sticky footer
|
||||
│ └── ToolCard.tsx # Inventory card with hover shine
|
||||
├── config/theme.ts # MUI theme (light/dark, glassmorphism)
|
||||
├── services/
|
||||
│ ├── auth-store.ts # Mock auth + persist
|
||||
│ ├── chat-engine.ts # System prompt builder + live + mock + multimodal
|
||||
│ ├── chat-store.ts # Sessions, messages, attachments
|
||||
│ ├── color-mode.tsx # Theme provider with localStorage
|
||||
│ ├── file-utils.ts # Image → DataURL with auto-downscale
|
||||
│ ├── i18n.tsx # DE/EN dictionary + provider
|
||||
│ ├── mock-data.ts # Initial tools, users, manuals
|
||||
│ ├── reservation-store.ts # Reservations + status updates
|
||||
│ └── tools-store.ts # Tool CRUD with persist
|
||||
└── types/index.ts # Tool, User, Reservation, Category types
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧠 How the AI integration works
|
||||
|
||||
1. **The system prompt is built per request** (`buildSystemPrompt` in `chat-engine.ts`).
|
||||
2. The current **user role** (`admin` → "Verwalter", everyone else → "Nutzer") and a **Markdown table of the live tool database** (with current reservations) are injected. This is essentially poor-man's RAG without an embedding store.
|
||||
3. **Multimodal**: if the user message has image attachments, the request payload is sent as an OpenAI-style content array (`{type: 'text'}`, `{type: 'image_url'}`).
|
||||
4. **Role-aware redaction is enforced by the prompt**, not by post-processing — admins see borrower names, regular users see only availability + due date. The same backend data, two views.
|
||||
5. If the upstream fails (or no key is configured), the request transparently falls back to a deterministic local **mock responder** so the demo never breaks.
|
||||
|
||||
The system prompt itself is based on a "RepairBuddy" specification that
|
||||
prioritises safety: emergency redirection to 112 / utility hotlines, no
|
||||
step-by-step guides for gas / mains electricity / load-bearing structures,
|
||||
honest uncertainty markers.
|
||||
|
||||
---
|
||||
|
||||
## 🖼 Image upload
|
||||
|
||||
- Up to 5 files per message
|
||||
- Images > 2.5 MB are automatically downscaled to max 1600 px JPEG (q 0.85)
|
||||
- Stored as Data-URLs in the chat store and persisted across reloads
|
||||
- Rendered as clickable thumbnails inside the user bubble
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Design notes
|
||||
|
||||
- **One source of truth** — colours, shadows and radii live in `theme.ts` and `globals.css` custom properties.
|
||||
- **Glassmorphism AppBar** with `backdrop-filter: saturate(180%) blur(12px)`.
|
||||
- **GPU-composited background** — four blurred radial blobs animated via CSS keyframes (no JS per frame). Vignette + grid pattern for foreground readability.
|
||||
- **No double borders** — `AIInput` is a single shell with focus-ring; the hero just wraps it in a max-width container.
|
||||
|
||||
---
|
||||
|
||||
## 📦 Scripts
|
||||
|
||||
```bash
|
||||
npm run dev # development server on :3000
|
||||
npm run build # production build
|
||||
npm run start # serve production build
|
||||
npm run lint # next lint
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🗺 Roadmap ideas
|
||||
|
||||
- Real auth (NextAuth + provider)
|
||||
- Persistent database (Postgres + Prisma) instead of the mock store
|
||||
- Real RAG with an embeddings store for manuals
|
||||
- Email confirmations for approved reservations
|
||||
- QR code on each tool that opens the reservation flow
|
||||
- iCal export for personal reservations
|
||||
|
||||
---
|
||||
|
||||
## 📄 License
|
||||
|
||||
[MIT](./LICENSE) — do whatever you like, just don't hold me liable.
|
||||
Reference in New Issue
Block a user