diff --git a/app.lua b/app.lua
new file mode 100644
index 0000000..23814fa
--- /dev/null
+++ b/app.lua
+local lapis = require("lapis")
+local app = lapis.Application()
+
+app:get("/", function()
+ return "Welcome to Lapis " .. require("lapis.version")
+end)
+
+return app
diff --git a/config.lua b/config.lua
new file mode 100644
index 0000000..e63bdfd
--- /dev/null
+++ b/config.lua
+local config = require("lapis.config")
+
+config("development", {
+ server = "nginx",
+ code_cache = "off",
+ num_workers = "1"
+})
diff --git a/logs/access.log b/logs/access.log
new file mode 100644
index 0000000..a288983
--- /dev/null
+++ b/logs/access.log
+127.0.0.1 - - [25/Nov/2025:08:48:00 +0200] "\x16\x03\x01\x07a\x01\x00\x07]\x03\x03\xF0\x04\x9F*\xF0\xA3K\xA1\xF6s\xE3T\xB7f^\x8FSmf\x1ES\xF3\xFA\x9F\xA4`\x89E\x98w\xE1$ JN\xED\x17\x07\xAA\xF5\x96\x8C\xFF\xE26\xEDS\xB1@\x93\x00f\x84\xD7\xCA\xC4c\x07g\xF05\xCDD%I\x00\x22\x13\x01\x13\x03\x13\x02\xC0+\xC0/\xCC\xA9\xCC\xA8\xC0,\xC00\xC0" 400 163 "-" "-"
+127.0.0.1 - - [25/Nov/2025:08:48:00 +0200] "\x16\x03\x01\x02\x90\x01\x00\x02\x8C\x03\x03\x0C\x99\x9C5\xF1\x10~\x19\xBE\xA2*\x9E\x1B3\xAB\x97nS\xDE\xF3D\xBD\xF1?\xB5t\x8A\x8Bz6\x19\xD7 f\xFF\x9B\xD0\xC1\xD1Oh&\xC8\xF2\x90\xAB\xDE\x89 \x8E\xE1\xBF\xB2\xF6\xB3\xA4\xE3\x98\x0C\x96!\x9B\xD1\xEA\xC1\x00\x22\x13\x01\x13\x03\x13\x02\xC0+\xC0/\xCC\xA9\xCC\xA8\xC0,\xC00\xC0" 400 163 "-" "-"
+127.0.0.1 - - [25/Nov/2025:08:48:38 +0200] "GET / HTTP/1.1" 200 123 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0"
+127.0.0.1 - - [25/Nov/2025:08:48:38 +0200] "GET /favicon.ico HTTP/1.1" 404 159 "http://localhost:8080/" "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0"
+127.0.0.1 - - [25/Nov/2025:08:48:50 +0200] "GET / HTTP/1.1" 200 123 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0"
diff --git a/logs/error.log b/logs/error.log
new file mode 100644
index 0000000..c6319ae
--- /dev/null
+++ b/logs/error.log
+2025/11/25 08:47:17 [alert] 18555#0: lua_code_cache is off; this will hurt performance in /home/lhietala/repos/koivuhaka/nginx.conf.compiled:20
diff --git a/mime.types b/mime.types
new file mode 100644
index 0000000..2e62062
--- /dev/null
+++ b/mime.types
+types {
+ text/html html htm shtml;
+ text/css css;
+ text/xml xml;
+ image/gif gif;
+ image/jpeg jpeg jpg;
+ application/x-lua lua;
+ application/x-moonscript moon;
+ application/x-javascript js;
+ application/atom+xml atom;
+ application/rss+xml rss;
+
+ text/mathml mml;
+ text/plain txt;
+ text/vnd.sun.j2me.app-descriptor jad;
+ text/vnd.wap.wml wml;
+ text/x-component htc;
+
+ image/png png;
+ image/tiff tif tiff;
+ image/vnd.wap.wbmp wbmp;
+ image/x-icon ico;
+ image/x-jng jng;
+ image/x-ms-bmp bmp;
+ image/svg+xml svg svgz;
+ image/webp webp;
+
+ application/java-archive jar war ear;
+ application/mac-binhex40 hqx;
+ application/msword doc;
+ application/pdf pdf;
+ application/postscript ps eps ai;
+ application/rtf rtf;
+ application/vnd.ms-excel xls;
+ application/vnd.ms-powerpoint ppt;
+ application/vnd.wap.wmlc wmlc;
+ application/vnd.google-earth.kml+xml kml;
+ application/vnd.google-earth.kmz kmz;
+ application/x-7z-compressed 7z;
+ application/x-cocoa cco;
+ application/x-java-archive-diff jardiff;
+ application/x-java-jnlp-file jnlp;
+ application/x-makeself run;
+ application/x-perl pl pm;
+ application/x-pilot prc pdb;
+ application/x-rar-compressed rar;
+ application/x-redhat-package-manager rpm;
+ application/x-sea sea;
+ application/x-shockwave-flash swf;
+ application/x-stuffit sit;
+ application/x-tcl tcl tk;
+ application/x-x509-ca-cert der pem crt;
+ application/x-xpinstall xpi;
+ application/xhtml+xml xhtml;
+ application/zip zip;
+
+ application/octet-stream bin exe dll;
+ application/octet-stream deb;
+ application/octet-stream dmg;
+ application/octet-stream eot;
+ application/octet-stream iso img;
+ application/octet-stream msi msp msm;
+
+ audio/midi mid midi kar;
+ audio/mpeg mp3;
+ audio/ogg ogg;
+ audio/x-m4a m4a;
+ audio/x-realaudio ra;
+
+ video/3gpp 3gpp 3gp;
+ video/mp4 mp4;
+ video/mpeg mpeg mpg;
+ video/quicktime mov;
+ video/webm webm;
+ video/x-flv flv;
+ video/x-m4v m4v;
+ video/x-mng mng;
+ video/x-ms-asf asx asf;
+ video/x-ms-wmv wmv;
+ video/x-msvideo avi;
+}
diff --git a/models.lua b/models.lua
new file mode 100644
index 0000000..baa96c0
--- /dev/null
+++ b/models.lua
+local autoload = require("lapis.util").autoload
+return autoload("models")
diff --git a/nginx.conf b/nginx.conf
new file mode 100644
index 0000000..4e7b83d
--- /dev/null
+++ b/nginx.conf
+worker_processes ${{num_workers}};
+error_log stderr notice;
+daemon off;
+pid logs/nginx.pid;
+
+events {
+ worker_connections 1024;
+}
+
+http {
+ include mime.types;
+
+ init_by_lua_block {
+ require "lpeg"
+ }
+
+ server {
+ listen ${{port}};
+ lua_code_cache ${{code_cache}};
+
+ location / {
+ default_type text/html;
+ content_by_lua_block {
+ require("lapis").serve("app")
+ }
+ }
+
+ location /static/ {
+ alias static/;
+ }
+
+ location /favicon.ico {
+ alias static/favicon.ico;
+ }
+ }
+}
diff --git a/nginx.conf.compiled b/nginx.conf.compiled
new file mode 100644
index 0000000..eae3968
--- /dev/null
+++ b/nginx.conf.compiled
+env LAPIS_ENVIRONMENT=development;
+worker_processes 1;
+error_log stderr notice;
+daemon off;
+pid logs/nginx.pid;
+
+events {
+ worker_connections 1024;
+}
+
+http {
+ include mime.types;
+
+ init_by_lua_block {
+ require "lpeg"
+ }
+
+ server {
+ listen 8080;
+ lua_code_cache off;
+
+ location / {
+ default_type text/html;
+ content_by_lua_block {
+ require("lapis").serve("app")
+ }
+ }
+
+ location /static/ {
+ alias static/;
+ }
+
+ location /favicon.ico {
+ alias static/favicon.ico;
+ }
+ }
+}