diff --git a/crier/crier.fnl b/crier/crier.fnl
new file mode 100644
index 0000000..be5c023
--- /dev/null
+++ b/crier/crier.fnl
@@ -0,0 +1,94 @@
+(local lgi (require :lgi))
+(local dbus (require :dbus_proxy))
+(local Gio lgi.Gio)
+(local GLib lgi.GLib)
+(local GV lgi.GLib.Variant)
+(local variant dbus.variant)
+(local inspect (require :inspect))
+(local Gtk lgi.Gtk)
+
+
+(local dbus-service-attrs
+ {
+ :bus dbus.Bus.SESSION
+ :name "org.freedesktop.Notifications"
+ :interface "org.freedesktop.Notifications"
+ :path "/org/freedesktop/Notifications"
+ })
+
+(local bus (dbus.Proxy:new
+ {
+ :bus dbus.Bus.SESSION
+ :name "org.freedesktop.DBus"
+ :interface "org.freedesktop.DBus"
+ :path "/org/freedesktop/DBus"
+ }))
+
+
+(local DBUS_NAME_FLAG_DO_NOT_QUEUE 4)
+(local DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER 1)
+(local DBUS_REQUEST_NAME_REPLY_IN_QUEUE 2)
+(local DBUS_REQUEST_NAME_REPLY_EXISTS 3)
+(local DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER 4)
+
+
+(let [ret (bus:RequestName dbus-service-attrs.name
+ DBUS_NAME_FLAG_DO_NOT_QUEUE)]
+ (match ret
+ DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER
+ true
+
+ DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER
+ true
+
+ DBUS_REQUEST_NAME_REPLY_IN_QUEUE
+ (error "unexpected DBUS_REQUEST_NAME_REPLY_IN_QUEUE")
+
+ DBUS_REQUEST_NAME_REPLY_EXISTS
+ (error "already running")))
+
+(var notification-id 10)
+(fn next-id []
+ (set notification-id (+ notification-id 1))
+ notification-id)
+
+
+(fn handle-dbus-method-call [conn sender path interface method params invocation]
+ (when (and (= path dbus-service-attrs.path)
+ (= interface dbus-service-attrs.interface))
+ (match method
+ "GetCapabilities"
+ (invocation:return_value (GV "as" ["actions"]))
+
+ "GetServerInformation"
+ (invocation:return_value
+ (GV "(ssss)" ["crier"
+ "telent"
+ "0.1"
+ "1.2"]))
+
+ "Notify"
+ (let [p params]
+ (print (inspect (dbus.variant.strip p)))
+ (invocation:return_value (GV "(u)" [(next-id)]))))))
+
+(fn handle-dbus-get [conn sender path interface name]
+ (when (and (= path dbus-service-attrs.path)
+ (= interface dbus-service-attrs.interface)
+ (= name "Visible"))
+ (lgi.GLib.Variant "b" true)))
+
+(local interface-info
+ (let [xml (: (io.open "interface.xml" "r") :read "*a")
+ node-info (Gio.DBusNodeInfo.new_for_xml xml)]
+ (. node-info.interfaces 1)))
+
+(Gio.DBusConnection.register_object
+ bus.connection
+ dbus-service-attrs.path
+ interface-info
+ (lgi.GObject.Closure handle-dbus-method-call)
+ (lgi.GObject.Closure handle-dbus-get)
+ (lgi.GObject.Closure (fn [a] (print "set"))))
+
+(Gtk:main)
diff --git a/crier/dbus-proxy.nix b/crier/dbus-proxy.nix
new file mode 100644
index 0000000..5e2fd62
--- /dev/null
+++ b/crier/dbus-proxy.nix
@@ -0,0 +1,29 @@
+{ lua, lgi, buildLuaPackage, fetchFromGitHub }:
+let
+
+ simpleName = "dbus_proxy";
+
+in
+# TODO: add busted and checkPhase?
+buildLuaPackage rec {
+ version = "0.10.2";
+ pname = simpleName; # nixpkgs unstable needs this
+ name = "${pname}-${version}"; # nixpkgs 21.11 needs this
+
+ src = fetchFromGitHub {
+ owner = "stefano-m";
+ repo = "lua-${simpleName}";
+ rev = "v${version}";
+ sha256 = "0kl8ff1g1kpmslzzf53cbzfl1bmb5cb91w431hbz0z0vdrramh6l";
+ };
+
+ propagatedBuildInputs = [ lgi ];
+
+ buildPhase = ":";
+
+ installPhase = ''
+ mkdir -p "$out/share/lua/${lua.luaversion}"
+ cp -r src/${pname} "$out/share/lua/${lua.luaversion}/"
+ '';
+
+}
diff --git a/crier/default.nix b/crier/default.nix
new file mode 100644
index 0000000..4802fe0
--- /dev/null
+++ b/crier/default.nix
@@ -0,0 +1,43 @@
+{ stdenv
+, callPackage
+, fetchFromGitHub
+, fetchurl
+, gobject-introspection
+, gtk3
+, lib
+, librsvg
+, lua53Packages
+, lua5_3
+, makeWrapper
+, writeText
+}:
+let fennel = fetchurl {
+ name = "fennel.lua";
+ url = "https://fennel-lang.org/downloads/fennel-1.0.0";
+ hash = "sha256:1nha32yilzagfwrs44hc763jgwxd700kaik1is7x7lsjjvkgapw7";
+ };
+ dbusProxy = callPackage ./dbus-proxy.nix {
+ inherit (lua53Packages) lgi buildLuaPackage;
+ lua = lua5_3;
+ };
+
+ lua = lua5_3.withPackages (ps: with ps; [
+ dbusProxy
+ inspect
+ lgi
+ luafilesystem
+ luaposix
+ readline
+ ]);
+in stdenv.mkDerivation {
+ pname = "crier";
+ version = "0.1";
+ src =./.;
+ inherit fennel;
+
+ buildInputs = [ lua gtk3 gobject-introspection.dev ];
+ nativeBuildInputs = [ lua makeWrapper ];
+
+ makeFlags = [ "PREFIX=${placeholder "out"}" ];
+
+}
diff --git a/crier/interface.xml b/crier/interface.xml
new file mode 100644
index 0000000..ffe860f
--- /dev/null
+++ b/crier/interface.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/crier/shell.nix b/crier/shell.nix
new file mode 100644
index 0000000..a760f25
--- /dev/null
+++ b/crier/shell.nix
@@ -0,0 +1 @@
+with import {} ; callPackage ./. {}