+
+ {{ panel.description }} +
+diff --git a/.air.toml b/.air.toml
new file mode 100644
index 0000000..435a885
--- /dev/null
+++ b/.air.toml
@@ -0,0 +1,17 @@
+# Working directory
+root = "."
+
+# The main Go file
+main = "main.go"
+
+bin = "tmp/main.exe"
+
+# Watching all Go files, excluding certain directories
+[build]
+ cmd = "go build -o ./tmp/main.exe main.go"
+ include_ext = ["go"]
+ exclude_dir = ["fe", "panels", "builds"]
+
+# Restart on file changes
+[log]
+ time = true
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..345ff6f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+.env
+config.js
+
+devices/*
+tmp/
+log.txt
+
+Macrame.exe
+
+public
+macros/*
+builds
+node_modules
+ToDo.md
\ No newline at end of file
diff --git a/add-gpl-header.sh b/add-gpl-header.sh
new file mode 100644
index 0000000..fe20142
--- /dev/null
+++ b/add-gpl-header.sh
@@ -0,0 +1,47 @@
+#!/bin/bash
+
+# Directory to start searching from (default to current directory)
+DIR="${1:-.}"
+
+# Define the GPLv3 header content
+GPL_HEADER="Macrame is a program that enables the user to create keyboard macros and button panels.
+The macros are saved as simple JSON files and can be linked to the button panels. The panels can
+be created with HTML and CSS.
+
+Copyright (C) 2025 Jesse Malotaux
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see
Click here to start authorization and open the "Devices" page on your PC.
+No panels found.
+Learn how to create a panel here.
+ + +Start using a panel!
++ Linked with: {{ server.ip }} +
++ Not linked +
+No devices found.
+Unlink a device or add new devices.
+No macros found.
+Edit and view your macros.
+No panels found.
+Learn how to create a panel here.
+ + +Link macros to panels or view a panel.
++ Connected to: {{ server.host }} +
+ + +
+ Or manually type the IP address:
+ {{ server.ip }}/devices
+
Are you sure you want to delete this key?
+[Press a key]
+ ++ The following keys have been pressed down, but + not released. +
++ The following keys have been released, but + not pressed down. +
++ {{ panel.description }} +
++ Macrame is an open-source application designed to turn any device into a customizable + button panel. Whether you're optimizing your workflow or enhancing your gaming experience, + Macrame makes it simple to create and link macros to your button panels. +
++ For more information, including details on licensing, visit + https://macrame.github.io +
+L?ve(f,b,y,!0,!1,P):Se(u,p,_,b,y,S,w,E,P)},Ge=(f,u,p,_,b,y,S,w,E)=>{let x=0;const L=u.length;let P=f.length-1,F=L-1;for(;x<=P&&x<=F;){const $=f[x],U=u[x]=E?Ye(u[x]):Fe(u[x]);if(Ct($,U))A($,U,p,null,b,y,S,w,E);else break;x++}for(;x<=P&&x<=F;){const $=f[P],U=u[F]=E?Ye(u[F]):Fe(u[F]);if(Ct($,U))A($,U,p,null,b,y,S,w,E);else break;P--,F--}if(x>P){if(x<=F){const $=F+1,U=$ L?ve(f,b,y,!0,!1,P):Se(u,p,_,b,y,S,w,E,P)},Ge=(f,u,p,_,b,y,S,w,E)=>{let x=0;const L=u.length;let P=f.length-1,F=L-1;for(;x<=P&&x<=F;){const $=f[x],U=u[x]=E?Ye(u[x]):Fe(u[x]);if(Ct($,U))A($,U,p,null,b,y,S,w,E);else break;x++}for(;x<=P&&x<=F;){const $=f[P],U=u[F]=E?Ye(u[F]):Fe(u[F]);if(Ct($,U))A($,U,p,null,b,y,S,w,E);else break;P--,F--}if(x>P){if(x<=F){const $=F+1,U=$ N?ve(f,b,y,!0,!1,P):Se(u,p,_,b,y,S,w,E,P)},Ge=(f,u,p,_,b,y,S,w,E)=>{let x=0;const N=u.length;let P=f.length-1,F=N-1;for(;x<=P&&x<=F;){const $=f[x],U=u[x]=E?Ye(u[x]):Fe(u[x]);if(Ct($,U))A($,U,p,null,b,y,S,w,E);else break;x++}for(;x<=P&&x<=F;){const $=f[P],U=u[F]=E?Ye(u[F]):Fe(u[F]);if(Ct($,U))A($,U,p,null,b,y,S,w,E);else break;P--,F--}if(x>P){if(x<=F){const $=F+1,U=$Home
\n Home
\n \n
Home
\n