diff --git a/frontend/package-lock.json b/frontend/package-lock.json
new file mode 100644
index 0000000..dc8b759
--- /dev/null
+++ b/frontend/package-lock.json
@@ -0,0 +1,12 @@
+{
+ "name": "beatmatchr-frontend",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "beatmatchr-frontend",
+ "version": "0.1.0"
+ }
+ }
+}
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 0000000..87096ac
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,9 @@
+{
+ "name": "beatmatchr-frontend",
+ "version": "0.1.0",
+ "private": true,
+ "description": "Simple development server for the beatmatchr frontend.",
+ "scripts": {
+ "dev": "node server.js"
+ }
+}
diff --git a/frontend/public/index.html b/frontend/public/index.html
new file mode 100644
index 0000000..96541f9
--- /dev/null
+++ b/frontend/public/index.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+ Beatmatchr
+
+
+
+
+ Beatmatchr
+ Welcome to the Beatmatchr prototype frontend.
+ This lightweight development server ensures npm run dev works.
+
+
+
diff --git a/frontend/public/styles.css b/frontend/public/styles.css
new file mode 100644
index 0000000..8b20224
--- /dev/null
+++ b/frontend/public/styles.css
@@ -0,0 +1,41 @@
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ min-height: 100vh;
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+ background: radial-gradient(circle at top, #1f2937, #111827 60%);
+ color: #f3f4f6;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.container {
+ text-align: center;
+ background: rgba(17, 24, 39, 0.7);
+ border: 1px solid rgba(147, 197, 253, 0.2);
+ border-radius: 16px;
+ padding: 48px;
+ box-shadow: 0 20px 40px rgba(15, 23, 42, 0.6);
+}
+
+h1 {
+ font-size: 3rem;
+ margin-bottom: 1rem;
+ letter-spacing: 0.08em;
+}
+
+p {
+ margin: 0.5rem 0;
+ line-height: 1.6;
+}
+
+code {
+ background: rgba(37, 99, 235, 0.2);
+ padding: 0.1rem 0.35rem;
+ border-radius: 6px;
+ font-family: 'Fira Code', 'Source Code Pro', monospace;
+}
diff --git a/frontend/server.js b/frontend/server.js
new file mode 100644
index 0000000..1591da4
--- /dev/null
+++ b/frontend/server.js
@@ -0,0 +1,34 @@
+const http = require('http');
+const path = require('path');
+const fs = require('fs');
+
+const PORT = process.env.PORT || 5173;
+const PUBLIC_DIR = path.join(__dirname, 'public');
+
+function serveFile(res, filePath, contentType = 'text/html') {
+ fs.readFile(filePath, (err, data) => {
+ if (err) {
+ res.writeHead(500, { 'Content-Type': 'text/plain' });
+ res.end('Internal Server Error');
+ return;
+ }
+
+ res.writeHead(200, { 'Content-Type': contentType });
+ res.end(data);
+ });
+}
+
+const server = http.createServer((req, res) => {
+ if (req.url === '/' || req.url === '/index.html') {
+ serveFile(res, path.join(PUBLIC_DIR, 'index.html'));
+ } else if (req.url === '/styles.css') {
+ serveFile(res, path.join(PUBLIC_DIR, 'styles.css'), 'text/css');
+ } else {
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
+ res.end('Not Found');
+ }
+});
+
+server.listen(PORT, () => {
+ console.log(`Beatmatchr frontend available at http://localhost:${PORT}`);
+});