Initial project setup: Clojure Kit web app for BTC price tracking

Kit framework with Undertow, Reitit routing, Hiccup + HTMX templating,
Tailwind CSS v4, PostgreSQL (empty database), and mobile-first index page.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-17 14:50:42 +01:00
co-authored by Claude Opus 4.6
commit f7b571f670
38 changed files with 1756 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
(ns pmagnus.btcprice.dev-middleware)
(defn wrap-dev [handler _opts]
handler)
+11
View File
@@ -0,0 +1,11 @@
(ns pmagnus.btcprice.env
(:require
[clojure.tools.logging :as log]
[pmagnus.btcprice.dev-middleware :refer [wrap-dev]]))
(def defaults
{:init (fn [] (log/info "\n-=[btcprice starting...dev/test profile]=-"))
:start (fn [] (log/info "\n-=[btcprice started...dev/test profile]=-"))
:stop (fn [] (log/info "\n-=[btcprice has shut down]=-"))
:middleware wrap-dev
:opts {:profile :dev}})
+48
View File
@@ -0,0 +1,48 @@
(ns user
(:require
[clojure.tools.logging :as log]
[integrant.core :as ig]
[integrant.repl :refer [go halt reset reset-all set-prep!]]
[pmagnus.btcprice.config :as config]))
(defn dev-prep! []
(set-prep!
(fn []
(-> (config/system-config {:profile :dev})
(ig/prep)))))
(defn test-prep! []
(set-prep!
(fn []
(-> (config/system-config {:profile :test})
(ig/prep)))))
(defn reset-db []
(let [sys (or @pmagnus.btcprice.core/system
integrant.repl.state/system)]
(when-let [mig (:db.sql/migrations sys)]
(migratus.core/reset mig)
(log/info "Database reset complete"))))
(defn rollback []
(let [sys (or @pmagnus.btcprice.core/system
integrant.repl.state/system)]
(when-let [mig (:db.sql/migrations sys)]
(migratus.core/rollback mig))))
(defn migrate []
(let [sys (or @pmagnus.btcprice.core/system
integrant.repl.state/system)]
(when-let [mig (:db.sql/migrations sys)]
(migratus.core/migrate mig))))
(defn query-fn []
(let [sys (or @pmagnus.btcprice.core/system
integrant.repl.state/system)]
(:db.sql/query-fn sys)))
(comment
(dev-prep!)
(go)
(reset)
(halt))
+15
View File
@@ -0,0 +1,15 @@
<configuration>
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
<logger name="pmagnus.btcprice" level="DEBUG" />
<logger name="org.eclipse.jetty" level="WARN" />
<logger name="io.undertow" level="WARN" />
<logger name="org.xnio" level="WARN" />
</configuration>
+10
View File
@@ -0,0 +1,10 @@
(ns pmagnus.btcprice.env
(:require
[clojure.tools.logging :as log]))
(def defaults
{:init (fn [] (log/info "\n-=[btcprice starting]=-"))
:start (fn [] (log/info "\n-=[btcprice started successfully]=-"))
:stop (fn [] (log/info "\n-=[btcprice has shut down successfully]=-"))
:middleware (fn [handler _] handler)
:opts {:profile :prod}})
+14
View File
@@ -0,0 +1,14 @@
<configuration>
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
<logger name="org.eclipse.jetty" level="WARN" />
<logger name="io.undertow" level="WARN" />
<logger name="org.xnio" level="WARN" />
</configuration>
+11
View File
@@ -0,0 +1,11 @@
<configuration>
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="ERROR">
<appender-ref ref="STDOUT" />
</root>
</configuration>