Compare commits

...
74 Commits
Author SHA1 Message Date
me 8d01548627 backups, no longer include the SFTP directory. 2026-11-07 20:12:51 -07:00
me f587ca1e5e tunnel, keep the loop in the foreground so that the output makes it to the log. 2026-11-06 14:53:16 -07:00
me bbffe8c69a tunnel, add green light output for loop. 2026-11-04 19:50:58 -07:00
me 768cabfe45 tunnel, add task which makes sure the main directory is 755 so that users may view the files. 2026-11-04 19:20:13 -07:00
me b1bdc953c2 tunnel, restart the service if the remote host no longer forwards to the local process. 2026-11-04 19:11:51 -07:00
me 1764ca510f test, remove java and docker as they've become stable. 2026-11-04 08:50:34 -07:00
me 7f986e51d3 AGENTS.md, add coding conventions and layout logistics including code snippets and example programs. 2026-11-04 08:48:26 -07:00
me d0970f5971 i3, increase startup volume to 75 from 25. 2026-11-03 13:56:11 -07:00
me d94397349b ai, begin refactoring sections into their own plays, starting with Sandbox and its AGENTS.md file. 2026-11-03 13:36:23 -07:00
me bb1514c33d llm, AGENTS.md, cover downgrades not being preferred. 2026-11-03 13:20:48 -07:00
me 0581ea62df docker, fix network sync run file permissions. 2026-11-03 08:45:50 -07:00
me 0332289742 llm, move enabling docker to docker playbook. 2026-11-02 20:51:42 -07:00
me a3a647318d docker, ensure container networks accurately reflect host network when using network_mode:host on runit systems. 2026-11-02 20:51:16 -07:00
me 4da671c40e llm, do not try to pull local image. 2026-11-02 16:19:16 -07:00
me 4db955b32d llm, add more context to the Build process headers. 2026-11-02 15:32:54 -07:00
me c0a9d79776 llm, add note on how to compile KMP projects. 2026-11-02 15:28:20 -07:00
me 4145a12637 i3, fix sunset-alarm not reporting errors. 2026-11-02 07:27:37 -07:00
me c23bb1c06b i3, fix location on redshift to have a colon. 2026-11-02 06:52:42 -07:00
me a9b78dbba2 i3, change bedtime from 21 to 20 and generalize redshift location. 2026-11-01 20:09:07 -07:00
me a714a26058 llm, mention that the release build needs filtered on v8a. 2026-11-01 15:26:45 -07:00
me d15b22ec26 llm, continue editing AGENTS based on findings when fixing more Android projects. 2026-11-01 09:56:30 -07:00
me 482d3072f5 llm, move the open-terminal container name up. 2026-11-01 08:10:42 -07:00
me 609edd6c3b llm, refactor the AGENTS version section. 2026-11-01 08:04:22 -07:00
me 1ded62a3d4 llm, update a few versions for Android and Flutter projects, as well as add the paths to where they are set and an example of what they look like. 2026-11-01 06:58:31 -07:00
me 0303a1c091 llm, change namespace on open-terminal build in case it does ever get uploaded. 2026-11-01 06:39:05 -07:00
me 10b21ac49b i3, add logging for sunset-alarm, add an annoyance for bedtime. 2026-11-01 05:59:36 -07:00
me 7efa7f1b91 llm, refactor which models are still relevent to install. 2026-11-01 05:47:15 -07:00
me d3a5946232 llm, add a function which deletes models that get put into the removal array. 2026-10-31 20:24:09 -07:00
me 46890d0d16 llm, stop mounting resolv.conf on containers, they sometimes get stale versions and files do not stay up tp date, let network_mode host handle it. 2026-10-31 09:29:45 -07:00
me 9073dfc597 docker, stop making the DNS file, the nameservers seem to fail even on network_mode host, unsure what else would be needed to get them to resolve. 2026-10-31 09:28:57 -07:00
me f3d9f088c7 llm, add mistral-small and see it if't truly the v4 MoE. 2026-10-31 08:21:18 -07:00
me 3c10415347 update, improve output of skipping NPM. 2026-10-31 08:07:19 -07:00
me 26dc61ebbf ai, add the command for the most recent test. 2026-10-31 07:54:46 -07:00
me 33755480bb ai, add some more benchmark results and make the tables per-model for easier reading. 2026-10-31 07:53:38 -07:00
me 35783422a3 i3, change sunset timer to actually be based on AZ sunset. 2026-10-30 21:19:56 -07:00
me d681c3f447 i3, fix sunset-timer not being able to show alert. 2026-10-30 21:17:20 -07:00
me a31cad1f42 open-webui, fix the network for this as well by mounting the host's resolv.conf directly. 2026-10-30 21:04:22 -07:00
me 788a723690 llm, go back to using host mode, seems to work as long as daemon.json exists with DNS servers, could not find a combination of the named network which worked well. 2026-10-30 20:55:11 -07:00
me 6ed4f284c0 i3, officially add Sunset Alarm, just from Code for now. 2026-10-30 20:34:02 -07:00
me 59b4343ec2 open-terminal, more attemots to get the container access to the Internet (DNS). 2026-10-30 20:26:12 -07:00
me af64e47519 ai, further scope Coder personality. 2026-10-30 19:57:45 -07:00
me e2c18a5cfc llm, do a few more things to try to get open-terminal DNS-ready more consistently. 2026-10-30 19:55:30 -07:00
me 556f483aaa roleplays, add an even smaller lang (16k ctx, 10k compact) and re-enable the 128k and 256k versions of code since some projects are actually getting big and keep compacting before even responding.. 2026-10-30 17:54:53 -07:00
me b09e74c4b7 roleplays, upload latest version. 2026-10-29 19:54:44 -07:00
me 107afbece4 llm, let compose know that the open-webui network for open-terminal is created elsewhere and not to tear it down. 2026-10-29 18:55:19 -07:00
me 076f954abd llm, get Open WebUI & Terminal working 100% without using host network, solves some DNS issues that the containers were seeing for some reason, but adds complexity since they are not in the same compose file. 2026-10-29 17:37:17 -07:00
me 648962e710 llm, still need to add gateway to host so that open-webui can see ollama, port to host is successfully being forwarded though! 2026-10-29 17:03:55 -07:00
me 15370d639f vpn, fix lint issues. 2026-10-29 10:49:58 -07:00
me eb3b16264e vpn, explicitly have Mullvad enable Local Sharing. 2026-10-29 10:48:45 -07:00
me 25346a95de llm, go back to using ports for Docker! 2026-10-29 10:47:35 -07:00
me d25f47bd72 vpn, fix Mullvad breaking Docker. 2026-10-29 10:45:43 -07:00
me 9aa25f85cd llm, go back to using network host for docker containers, ports still not working. 2026-10-29 10:44:14 -07:00
me b732402719 llm, return the sleeps to 10 minutes after the Docker programs starts, messes up the log too much, can run the commands manually if wanting them quickly. 2026-10-29 10:34:21 -07:00
me b3b2cb075f llm, ensure all the open-terminal compose commands use the correct compose file. 2026-10-29 09:57:49 -07:00
me 95542ec233 llm, go ahead and do the Docker image updates at the beginning rather than waiting since it's now a loop. 2026-10-29 09:56:39 -07:00
me 8abe634c42 packages, fix xkb package name. 2026-10-29 08:24:41 -07:00
me 5e0b5fb4d2 llm, have the Docker-based services fork their background update checker and make it a loop. 2026-10-29 08:04:28 -07:00
me 855cffc64d llm, stop doing the DNS portion for open-terminal now that the network is working properly. 2026-10-29 07:43:08 -07:00
me 032239e430 i3, lock the session properly and have it call i3lock plus turn off the screen. 2026-10-28 20:50:06 -07:00
me 57b56d82c4 packages, add xkb, xset, and xlock. 2026-10-28 19:51:42 -07:00
me bede2b84f3 llm, fixed intranet issue, stop using host network for open webui & terminal. 2026-10-28 19:42:05 -07:00
me 4fbf7b41e4 update, prevent error due to empty if statement. 2026-10-28 18:57:01 -07:00
me ce1afc6624 llm, add note to AGENTS about the host system and Docker container preferences. 2026-10-28 17:29:53 -07:00
me b4fc988f97 llm, improve AGENTS since model thinks it can ignore putting the Kotlin version in the build file, ensure a few critical components are installed on open-terminal image, give the built container a name. 2026-10-28 17:07:01 -07:00
me 9ab9f0095b update, stop doing NPM manually. 2026-10-28 08:38:47 -07:00
me 9949014558 llm, begin refactoring the script into an ai folder, also increase parallel. 2026-10-27 19:07:07 -07:00
me 373b03d46c docker, remove the daemon.json file. 2026-10-27 19:06:25 -07:00
me 6117a65009 Add docker.yml to local and test playbooks. 2026-10-27 08:32:23 -07:00
me af82cd3319 llm, extracted docker tasks, no longer needed here. 2026-10-27 08:31:59 -07:00
me bb1529e5b1 docker, pull from llm. 2026-10-27 08:31:09 -07:00
me 252d24b2a7 llm, fixes and improvements to the personality blurbs. 2026-10-27 06:49:52 -07:00
me a997fd8efc llm, update the AGENTS.md text to be a bit more over about when to stop due to blockers and how much effort to put in. 2026-10-27 06:49:31 -07:00
me 88ec75a544 llm, comment the DNS servers which don't actually exist yet. 2026-10-26 09:36:20 -07:00
me 3d64b90d58 llm, ensure open-terminal has access to DNS. 2026-10-25 20:44:48 -07:00
16 changed files with 1161 additions and 304 deletions

No files matched your search

+7 -1
View File
@@ -23,6 +23,7 @@
stress: stress
jq: jq
btop: btop
xkb: x11-xkb-utils
- name: General | Facts | Package | Parrot OS Fixes
ansible.builtin.set_fact:
@@ -51,6 +52,7 @@
encfs: encfs
dig: bind
base_devel: base-devel
xkb: xorg-setxkbmap
when: ansible_pkg_mgr == "pacman"
- name: General | Facts | Package | FreeBSD
@@ -266,10 +268,14 @@
;;
esac
update_npm: |
if [[ `which npm` ]]; then
## Let's let the distro package managers handle this, otherwise may end up
## breaking dependencies or causing other system weirdness. No thanks! :)
if [[ `which npm` && 1 == 0 ]]; then
echo "*** NPM ***" &&
sudo npm update -g
echo -e "\n"
else
echo -e "*** Skipping NPM ***\n\n"
fi
# Flatpaks
+3 -1
View File
@@ -60,7 +60,8 @@
strawberry: strawberry
dict_en: hunspell-en_us
dict_es: hunspell-es_any
xset: xorg-xset
xlock: xss-lock
- name: Workstation | Facts | Package | apt (All Distros)
ansible.builtin.set_fact:
@@ -80,6 +81,7 @@
ncurses: libncurses-dev
android_udev: android-udev-rules
vlc_plugins: libavcodec-extra
xset: x11-server-utils
when: ansible_pkg_mgr == "apt"
- name: Workstation | Facts | Package | Pop_OS!
+1 -1
View File
@@ -69,7 +69,7 @@ sleep 5
echo "*** Creating backup at '$BACKUP2' ***"
sudo zip -rv "$BACKUP2" \
/root /home /srv/sftp \
/root /home \
-x "*/.gradle/" -x "*/app/build/*"
status="$?"
+43 -27
View File
@@ -27,28 +27,6 @@ font pango:monospace 8
# text rendering and scalability on retina/hidpi displays (thanks to pango).
#font pango:DejaVu Sans Mono 8
# Start XDG autostart .desktop files using dex. See also
# https://wiki.archlinux.org/index.php/XDG_Autostart
exec --no-startup-id dex --autostart --environment i3
# The combination of xss-lock, nm-applet and pactl is a popular choice, so
# they are included here as an example. Modify as you see fit.
# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
# screen before suspend. Use loginctl lock-session to lock your screen.
exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork
# NetworkManager is the most popular way to manage wireless networks on Linux,
# and nm-applet is a desktop environment-independent system tray GUI for it.
exec --no-startup-id nm-applet
# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
#bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
#bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
#bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
#bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
# Use Mouse+$mod to drag floating windows to their wanted position
floating_modifier $mod
@@ -331,9 +309,11 @@ bindsym $mod+Shift+e exec "i3-nagbar -t warning -m 'You pressed the exit shortcu
bindsym $mod+Shift+q exec "i3-msg exit"
# lock
bindsym $ctrl+$alt+l exec "i3lock -c 000000 -e -f && sleep 1 && xset dpms force off"
bindsym $ctrl+$mod+l exec "i3lock -c 000000 -e -f && sleep 1 && xset dpms force off"
bindsym $shift+$mod+l exec "i3lock -c 000000 -e -f && sleep 1 && xset dpms force off"
#set $LOCK_CMD "i3lock -c 333333 -e -f && sleep 1 && xset dpms force off"
set $LOCK_CMD "loginctl lock-session"
bindsym $ctrl+$alt+l exec $LOCK_CMD
bindsym $ctrl+$mod+l exec $LOCK_CMD
bindsym $shift+$mod+l exec $LOCK_CMD
# shutdown entire system.
#bindsym $ctrl+$shift+q exec dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Stop
@@ -418,7 +398,7 @@ exec_always --no-startup-id "sleep 00; killall pipewire wireplumber pipewire-pul
exec_always --no-startup-id "sleep 01; pipewire >~/Reports/pipewire.log 2>&1 &"
exec_always --no-startup-id "sleep 02; wireplumber >~/Reports/wireplumber.log 2>&1 &"
exec_always --no-startup-id "sleep 03; pipewire-pulse >~/Reports/pipewire-pulse.log 2>&1 &"
exec --no-startup-id "sleep 04; bash -c 'source /usr/local/bin/volume.function && volume 25'"
exec --no-startup-id "sleep 04; bash -c 'source /usr/local/bin/volume.function && volume 75'"
# Wallpaper
exec_always --no-startup-id feh --recursive --randomize --bg-fill ~/Pictures/Wallpapers
@@ -432,4 +412,40 @@ exec_always --no-startup-id bash -c 'pkill -ef "bash `which battery_nag.sh`" >~/
# Redshift
#exec_always --no-startup-id "killall redshift-gtk; redshift-gtk"
#exec_always --no-startup-id "killall redshift; redshift -l 35.19540:-111.65720 -t 6500K:1100K"
exec_always --no-startup-id "killall redshift; killall redshift-gtk; sleep 1; redshift -x; redshift-gtk -l 35.19540:-111.65720 -t 6500K:1100K"
exec_always --no-startup-id "killall redshift; killall redshift-gtk; sleep 1; redshift -x; redshift-gtk -l 32:-111 -t 6500K:1100K"
# Allow locking the session.
#set $AGENT pkttyagent
set $AGENT lxqt-policykit-agent
exec_always --no-startup-id "killall $AGENT; $AGENT"
# Start XDG autostart .desktop files using dex. See also
# https://wiki.archlinux.org/index.php/XDG_Autostart
exec --no-startup-id dex --autostart --environment i3
# The combination of xss-lock, nm-applet and pactl is a popular choice, so
# they are included here as an example. Modify as you see fit.
# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the
# screen before suspend. Use loginctl lock-session to lock your screen.
#exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork
#exec_always --no-startup-id xss-lock --transfer-sleep-lock -- i3lock -c 111111 -e -f --nofork
exec_always --no-startup-id xss-lock --transfer-sleep-lock -- sh -c 'i3lock -c 111111 -e -f --nofork & sleep 1; xset dpms force off; wait'
# NetworkManager is the most popular way to manage wireless networks on Linux,
# and nm-applet is a desktop environment-independent system tray GUI for it.
exec --no-startup-id nm-applet
# Use pactl to adjust volume in PulseAudio.
set $refresh_i3status killall -SIGUSR1 i3status
#bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
#bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
#bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
#bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
# Sunset Alarm
#exec_always --no-startup-id "killall sunset-alarm; /home/ling/Code/sunset_alarm_cli/sunset-alarm -t 20:00 -m 30 > ~/Reports/sunset-alarm.log 2>&1"
exec_always --no-startup-id "killall sunset-alarm; /home/ling/Code/sunset_alarm_cli/sunset-alarm -l 32:-111 -m 30 > ~/Reports/sunset-alarm.log 2>&1"
# Bedtime ;)
exec --no-startup-id "while true; do if [[ `date +'%H'` -ge 20 ]]; then fyi -w -u critical 'Bedtime' 'Go to sleep! >:)'; fi; sleep 150; done"
+222 -24
View File
@@ -662,17 +662,18 @@
"background_image_data": null
},
{
"version_id": "3c3e9c46-a78c-40eb-a3b2-dab32400d312",
"version_id": "ce2ae15a-6804-4c63-9f3b-6634f8bf3806",
"id": "coder-moe-64k",
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
"base_model_id": "qwen3.6:35b",
"name": "Code-MoE [4-64k,22GB]",
"name": "Code [MoE,4-64k,22GB]",
"params": {
"custom_params": {},
"num_ctx": 64000,
"num_thread": 4,
"system": "Please use the attached Knowledge Base files as your personality.",
"compact_token_threshold": 48000
"compact_token_threshold": 48000,
"keep_alive": "0"
},
"meta": {
"profile_image_url": "/static/favicon.png",
@@ -722,7 +723,7 @@
},
"access_grants": [],
"is_active": true,
"updated_at": 1792977848,
"updated_at": 1793407717,
"created_at": 1792798618,
"background_image_data": null
},
@@ -792,7 +793,7 @@
"background_image_data": null
},
{
"version_id": "e5df99a2-6b1a-446f-b714-65b74740022c",
"version_id": "f7b2b0c3-6461-492c-b5e5-42586a381e94",
"id": "code-moe-128k",
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
"base_model_id": "qwen3.6:35b",
@@ -802,7 +803,8 @@
"num_ctx": 128000,
"num_thread": 4,
"system": "Please use the attached Knowledge Base files as your personality.",
"compact_token_threshold": 96000
"compact_token_threshold": 96000,
"keep_alive": "0"
},
"meta": {
"profile_image_url": "/static/favicon.png",
@@ -851,13 +853,13 @@
]
},
"access_grants": [],
"is_active": false,
"updated_at": 1792949673,
"is_active": true,
"updated_at": 1793407741,
"created_at": 1792896373,
"background_image_data": null
},
{
"version_id": "e48d06af-e6c0-4034-9506-f2e77030fe00",
"version_id": "592740ae-99a1-4534-b8e1-97338424d720",
"id": "code-moe-256k",
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
"base_model_id": "qwen3.6:35b",
@@ -867,7 +869,8 @@
"num_ctx": 999999,
"num_thread": 4,
"system": "Please use the attached Knowledge Base files as your personality.",
"compact_token_threshold": 32000
"compact_token_threshold": 192000,
"keep_alive": "0"
},
"meta": {
"profile_image_url": "/static/favicon.png",
@@ -916,17 +919,17 @@
]
},
"access_grants": [],
"is_active": false,
"updated_at": 1792984273,
"is_active": true,
"updated_at": 1793407763,
"created_at": 1792896428,
"background_image_data": null
},
{
"version_id": "2d015e09-d714-4148-a0f7-db5b94765b90",
"version_id": "0ee081d0-303d-480b-ae05-00abc9394503",
"id": "lang-moe-64k",
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
"base_model_id": "qwen3.5:35b",
"name": "Lang-MoE [4-64K,23GB]",
"name": "Lang [MoE,4-64K,23GB]",
"params": {
"system": "Please use the attached Knowledge Base files as your personality.",
"custom_params": {},
@@ -971,9 +974,11 @@
"tags": [
{
"name": "language"
},
{
"name": "general"
}
],
"terminalId": "0f44afba-4f8e-4699-abfd-7c49b61457fe",
"defaultFeatureIds": [
"web_search",
"image_generation",
@@ -981,8 +986,8 @@
]
},
"access_grants": [],
"is_active": true,
"updated_at": 1792982907,
"is_active": false,
"updated_at": 1792988150,
"created_at": 1792899998,
"background_image_data": null
},
@@ -1052,16 +1057,16 @@
"background_image_data": null
},
{
"version_id": "5b826a4b-f83d-430b-b78b-23be9571892c",
"version_id": "b41d4794-2f89-48a9-8f74-fbc7732f7c4a",
"id": "tasks",
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
"base_model_id": "qwen3.5:4b",
"name": "Tasks-4b [4-32k,4.2GB]",
"name": "Tasks [4b,4-32k,2.6GB]",
"params": {
"custom_params": {},
"num_ctx": 32000,
"num_thread": 4,
"compact_token_threshold": 24000,
"compact_token_threshold": 16000,
"system": "Please used the attached Knowledge Base files as your personality."
},
"meta": {
@@ -1092,16 +1097,209 @@
"voice": null,
"voice_avatar": null,
"suggestion_prompts": null,
"tags": [],
"tags": [
{
"name": "general"
}
],
"defaultFeatureIds": [
"code_interpreter"
]
},
"access_grants": [],
"is_active": false,
"updated_at": 1792988777,
"created_at": 1792977834,
"background_image_data": null
},
{
"version_id": "d3edb3bc-8097-4d68-aa7c-3986fb2e6224",
"id": "tasks-2b",
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
"base_model_id": "qwen3.5:2b",
"name": "Tasks [2b,4-16k,2.6GB]",
"params": {
"custom_params": {},
"num_ctx": 16000,
"num_thread": 4,
"compact_token_threshold": 8000,
"system": "Please used the attached Knowledge Base files as your personality."
},
"meta": {
"profile_image_url": "/static/favicon.png",
"background_image_url": null,
"description": null,
"i18n": null,
"capabilities": {
"file_context": true,
"vision": true,
"file_upload": true,
"web_search": true,
"image_generation": true,
"code_interpreter": true,
"terminal": true,
"citations": true,
"status_updates": true,
"memory": true,
"builtin_tools": true
},
"knowledge": [
{
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
"name": "Base.md",
"type": "file"
}
],
"terminalId": "0f44afba-4f8e-4699-abfd-7c49b61457fe"
"voice": null,
"voice_avatar": null,
"suggestion_prompts": null,
"tags": [
{
"name": "general"
}
],
"defaultFeatureIds": [
"code_interpreter"
]
},
"access_grants": [],
"is_active": false,
"updated_at": 1792988758,
"created_at": 1792987029,
"background_image_data": null
},
{
"version_id": "769e5084-3641-4c5c-90d9-0c58f0658227",
"id": "lang-32k",
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
"base_model_id": "qwen3.5:35b",
"name": "Lang [MoE,4-32K,22GB]",
"params": {
"system": "Please use the attached Knowledge Base files as your personality.",
"custom_params": {},
"num_thread": 4,
"num_ctx": 32000,
"compact_token_threshold": 24000,
"keep_alive": "0"
},
"meta": {
"profile_image_url": "/static/favicon.png",
"background_image_url": null,
"description": null,
"i18n": null,
"capabilities": {
"file_context": true,
"vision": true,
"file_upload": true,
"web_search": true,
"image_generation": true,
"code_interpreter": true,
"terminal": true,
"citations": true,
"status_updates": true,
"usage": true,
"memory": true,
"builtin_tools": true
},
"knowledge": [
{
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
"name": "Base.md",
"type": "file"
},
{
"id": "bb929f41-18c0-4177-8139-fabfde2b8235",
"name": "Language.md",
"type": "file"
}
],
"voice": null,
"voice_avatar": null,
"suggestion_prompts": null,
"tags": [
{
"name": "language"
},
{
"name": "general"
}
],
"defaultFeatureIds": [
"web_search",
"image_generation"
]
},
"access_grants": [],
"is_active": true,
"updated_at": 1792984166,
"created_at": 1792977834,
"updated_at": 1793370109,
"created_at": 1792988144,
"background_image_data": null
},
{
"version_id": "4ce3e85b-2d53-4605-a9c9-e370715c813a",
"id": "lang-16k",
"user_id": "2e2e7554-11f1-4047-8ca4-b04070ccc704",
"base_model_id": "qwen3.5:35b",
"name": "Lang [MoE,4-16K,TBD]",
"params": {
"system": "Please use the attached Knowledge Base files as your personality.",
"custom_params": {},
"num_thread": 4,
"num_ctx": 16000,
"compact_token_threshold": 10000,
"keep_alive": "0"
},
"meta": {
"profile_image_url": "/static/favicon.png",
"background_image_url": null,
"description": null,
"i18n": null,
"capabilities": {
"file_context": true,
"vision": true,
"file_upload": true,
"web_search": true,
"image_generation": true,
"code_interpreter": true,
"terminal": true,
"citations": true,
"status_updates": true,
"usage": true,
"memory": true,
"builtin_tools": true
},
"knowledge": [
{
"id": "120fa5c0-7f02-4cf3-a136-07b92b042d48",
"name": "Base.md",
"type": "file"
},
{
"id": "bb929f41-18c0-4177-8139-fabfde2b8235",
"name": "Language.md",
"type": "file"
}
],
"voice": null,
"voice_avatar": null,
"suggestion_prompts": null,
"tags": [
{
"name": "language"
},
{
"name": "general"
}
],
"defaultFeatureIds": [
"web_search",
"image_generation"
]
},
"access_grants": [],
"is_active": true,
"updated_at": 1793407973,
"created_at": 1793407973,
"background_image_data": null
}
]
+3 -1
View File
@@ -129,7 +129,9 @@
- ansible.builtin.include_tasks: tasks/workstation/linux/software/android.yml
- ansible.builtin.include_tasks: tasks/workstation/linux/software/llm.yml
- ansible.builtin.include_tasks: tasks/workstation/linux/software/docker.yml
- ansible.builtin.include_tasks: tasks/workstation/linux/software/ai/llm.yml
when: ansible_system == "Linux"
and internet
+37 -1
View File
@@ -17,10 +17,30 @@
ansible.builtin.set_fact:
tunnel_service_name: tunnel
- name: General | Tunnel | Packages [pacman]
ansible.builtin.package:
name:
- openbsd-netcat
state: present
when: ansible_pkg_mgr == "pacman"
- name: General | Tunnel | Packages [apt]
ansible.builtin.package:
name:
- netcat-openbsd
state: present
when: ansible_pkg_mgr == "apt"
- name: General | Tunnel | runit
block:
- name: General | Tunnel | runit | mkdir | /etc/sv
ansible.builtin.file:
path: /etc/sv/{{ tunnel_service_name }}
state: directory
mode: "0755"
- name: General | Tunnel | runit | mkdir | /etc/sv log
ansible.builtin.file:
path: /etc/sv/{{ tunnel_service_name }}/log
state: directory
@@ -38,7 +58,23 @@
content: |
#!/bin/sh -e
exec 2>&1
exec chpst -u {{ user }} ssh -v -N \
# Health check to ensure connection does not go stale.
while true; do
sleep 300
echo -n "RUN-LOOP: "
nc -zv {{ tunnel_remote_host }} {{ tunnel_remote_port }}
status="$?"
echo "RUN-LOOP: Port check returned ${status}."
if [[ "$status" != 0 ]]; then
echo "RUN-LOOP: Restarting service."
sv restart {{ tunnel_service_name }}
fi
echo "RUN-LOOP: Going back to sleep."
done &
# Do not use `exec` here otherwise the loop may get killed.
chpst -u {{ user }} ssh -v -N \
-R {{ tunnel_remote_port }}:localhost:{{ tunnel_local_port }} \
-p {{ tunnel_ssh_port }} {{ tunnel_remote_host }}
mode: "0755"
+1
View File
@@ -69,6 +69,7 @@
- "{{ stress }}"
- "{{ jq }}"
- "{{ btop }}"
- "{{ xkb }}"
state: present
- name: General | Software | Packages | Install Software (DEV)
@@ -11,7 +11,7 @@ personalities that help guide the AI into productivity rather than verbosity.
You are concise, succinct, and direct with responses. Unapologetic yet kind.
Friendly but not overbearing. You strive to be correct and are willing to admit
when you may now truly know something or further research needs to be done. You
when you may not truly know something, or further research needs to be done. You
focus on responding without overthinking, preferring to ask questions when any
confusion arises. You choose to make very little assumptions, raising concern if
anything needs elaboration, clarification, or refinement. You are good at what
@@ -31,10 +31,13 @@ interest in learning Croatian and practicing Spanish. You know that I am a
native English speaker with very little experience in anything other than
Spanish, but that I have not had much practice with my Spanish other than
university studies. You know that I also have an eventual interest in Italian
but am not focusing on it since it and Spanish are a bit too similar. Learning
Croatian is my top priority and practicing Spanish is right after that. Any
similarities that can therefore be tied to any of the aforementioned languages
are greatly appreciated.
but am not focusing on it since it and Spanish are a bit too similar to be
learned at the same time. Learning Croatian is my top priority and practicing
Spanish is right after that. Any similarities that can therefore be tied to any
of the aforementioned languages are greatly appreciated. Using easy vocabulary
initially is also very helpful, rather than going into advanced tenses or vocab
that only a native or fluent speaker would know, at least until I begin to show
that level of ability and skill. Please keep things simple, direct, and concise.
### Coder
@@ -48,16 +51,25 @@ overwhelming them with technical details unless asked. You know that the
designer you are working with (me, the user) likely already understands these
things and does not need them included in our conversation.
Android SDK is at $ANDROID_HOME and should be "$HOME/SDKs/Android/Sdk".
Flutter SDK is at $FLUTTER_HOME and should be "$HOME/SDKs/Flutter/flutter".
Java SDK (JDK) is at $JAVA_HOME and should be "$HOME/SDKs/Java".
Android SDK is at `$ANDROID_HOME` and should be `$HOME/SDKs/Android/Sdk`.
Flutter SDK is at `$FLUTTER_HOME` and should be `$HOME/SDKs/Flutter/flutter`.
Java SDK (JDK) is at `$JAVA_HOME` and should be `$HOME/SDKs/Java`.
These have also been added your PATH:
These have been added your PATH via `/home/user/.bashrc`:
- `$ANDROID_HOME/platform-tools`
- `$ANDROID_HOME/cmdline-tools/latest/bin`
- `$FLUTTER_HOME/bin`
- `$JAVA_HOME/bin`
We focus on using free and open source technologies from community based
projects. Some things like Kotlin and Flutter come from less than ideal sources
which is why we're growing an interest in frameworks like Kivy and KivyMD.
If we ever need to do Internet activities, use dns.mullvad.net (194.242.2.2) for
DNS, hyperling.com and mullvad.net to validate Internet is working, and can use
1.0.0.1 and 1.1.1.1 from Cloudflare as a last resort, but not any big tech IPs.
- "$ANDROID_HOME/platform-tools"
- "$ANDROID_HOME/cmdline-tools/latest/bin"
- "$FLUTTER_HOME/bin"
- "$JAVA_HOME/bin"
#### Quick Developer
@@ -105,7 +117,7 @@ Number of physical cores is 8, hyperthreaded to 16, but supposedly the emulated
cores are not very useful to LLMs. Try only using between 6 and 8 when possible.
Research says it is not worth enabling the iGPU for Intel XE, CPUs are better.
## Benchmark
## Benchmarks
### System
@@ -142,6 +154,8 @@ $ fastfetch
```
$ export QUIET=true
$ ollama-test "64000 300000" "4 7 0" 0 "qwen3.5:35b qwen3.6:35b qwen3.8:27b devstral-small-2:24b"
```
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
| qwen3.5:35b | 22GB | 64000 | 23GB | 4 | 0 | 100%CPU | 13.36 | 61 |
@@ -150,26 +164,70 @@ $ ollama-test "64000 300000" "4 7 0" 0 "qwen3.5:35b qwen3.6:35b qwen3.8:27b devs
| qwen3.5:35b | 22GB | 262144 | 28GB | 4 | 0 | 100%CPU | 13.69 | 70 |
| qwen3.5:35b | 22GB | 262144 | 28GB | 7 | 0 | 100%CPU | 12.66 | 36 |
| qwen3.5:35b | 22GB | 262144 | 28GB | 0 | 0 | 100%CPU | 11.80 | 38 |
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
| qwen3.6:35b | 22GB | 64000 | 22GB | 4 | 0 | 100%CPU | 12.57 | 29 |
| qwen3.6:35b | 22GB | 64000 | 22GB | 7 | 0 | 100%CPU | 13.84 | 27 |
| qwen3.6:35b | 22GB | 64000 | 22GB | 0 | 0 | 100%CPU | 12.84 | 32 |
| qwen3.6:35b | 22GB | 262144 | 24GB | 4 | 0 | 100%CPU | 13.68 | 32 |
| qwen3.6:35b | 22GB | 262144 | 24GB | 7 | 0 | 100%CPU | 13.52 | 30 |
| qwen3.6:35b | 22GB | 262144 | 24GB | 0 | 0 | 100%CPU | 13.18 | 29 |
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
| qwen3.8:27b | 17GB | 64000 | 19GB | 4 | 0 | 100%CPU | 2.08 | 42 |
| qwen3.8:27b | 17GB | 64000 | 19GB | 7 | 0 | 100%CPU | 2.53 | 33 |
| qwen3.8:27b | 17GB | 64000 | 19GB | 0 | 0 | 100%CPU | 2.23 | 38 |
| qwen3.8:27b | 17GB | 262144 | 20GB | 4 | 0 | 100%CPU | 2.07 | 48 |
| qwen3.8:27b | 17GB | 262144 | 20GB | 7 | 0 | 100%CPU | 2.84 | 36 |
| qwen3.8:27b | 17GB | 262144 | 20GB | 0 | 0 | 100%CPU | 2.15 | 40 |
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
| devstral-small-2:24b | 15GB | 64000 | 26GB | 4 | 0 | 100%CPU | 2.25 | 94 |
| devstral-small-2:24b | 15GB | 64000 | 26GB | 7 | 0 | 100%CPU | 2.34 | 81 |
| devstral-small-2:24b | 15GB | 64000 | 26GB | 0 | 0 | 100%CPU | 2.29 | 88 |
| devstral-small-2:24b | 15GB | | | 4 | 0 | | 0.00 | 31 |
| devstral-small-2:24b | 15GB | | | 7 | 0 | | 0.00 | 27 |
| devstral-small-2:24b | 15GB | | | 0 | 0 | | 0.00 | 26 |
#### Context Speeds
Checking if the context affects the speed of the model. Seems negligible, way less than changing the threads or iGPU.
```console
$ ollama-test "16000 32000 64000 128000 256000 264000" "4" "0" "qwen3.5:35b qwen3.6:35b devstral-small-2:24b"
```
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
| qwen3.5:35b | 22GB | 16000 | 22GB | 4 | 0 | 100%CPU | 14.57 | 50 |
| qwen3.5:35b | 22GB | 32000 | 22GB | 4 | 0 | 100%CPU | 13.98 | 53 |
| qwen3.5:35b | 22GB | 64000 | 23GB | 4 | 0 | 100%CPU | 14.14 | 17 |
| qwen3.5:35b | 22GB | 128000 | 24GB | 4 | 0 | 100%CPU | 14.21 | 50 |
| qwen3.5:35b | 22GB | 256000 | 28GB | 4 | 0 | 100%CPU | 14.04 | 68 |
| qwen3.5:35b | 22GB | 262144 | 28GB | 4 | 0 | 100%CPU | 14.17 | 17 |
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
| qwen3.6:35b | 22GB | 16000 | 22GB | 4 | 0 | 100%CPU | 15.29 | 28 |
| qwen3.6:35b | 22GB | 32000 | 22GB | 4 | 0 | 100%CPU | 15.16 | 38 |
| qwen3.6:35b | 22GB | 64000 | 22GB | 4 | 0 | 100%CPU | 14.12 | 28 |
| qwen3.6:35b | 22GB | 128000 | 23GB | 4 | 0 | 100%CPU | 12.67 | 31 |
| qwen3.6:35b | 22GB | 256000 | 24GB | 4 | 0 | 100%CPU | 14.03 | 29 |
| qwen3.6:35b | 22GB | 262144 | 24GB | 4 | 0 | 100%CPU | 15.21 | 29 |
| Model | HDD | Context | RAM | Threads | iGPU | Processor | Speed (t/s) | Time (s) |
| :------------------------ | -----: | -------: | -----: | ------: | ---: | --------: | ----------: | -------: |
| devstral-small-2:24b | 15GB | 16000 | 17GB | 4 | 0 | 100%CPU | 2.90 | 87 |
| devstral-small-2:24b | 15GB | 32000 | 20GB | 4 | 0 | 100%CPU | 2.71 | 87 |
| devstral-small-2:24b | 15GB | 64000 | 26GB | 4 | 0 | 100%CPU | 2.36 | 91 |
| devstral-small-2:24b | 15GB | 128000 | 36GB | 4 | 0 | 100%CPU | 2.76 | 94 |
| devstral-small-2:24b | 15GB | 256000 | 58GB | 4 | 0 | 100%CPU | 2.30 | 100 |
| devstral-small-2:24b | 15GB | 264000 | 59GB | 4 | 0 | 100%CPU | 2.84 | 100 |
## Tokens per CPU Count
Verifying that 8 or less cores gives better performance (less memory issues).
@@ -66,7 +66,15 @@
# Also setting this to a minimum of 3 for using Codium with extensions.
# 20261014: Going down to 1 since only using CPUs, no GPUs. Otherwise
# the models seem to take excessively long to answer even small things.
llm_parallel: 1 #"{{ [(ansible_processor_vcpus / 2) | round(0, method='ceil'), 3] | max | int }}"
#llm_parallel: 1 #"{{ [(ansible_processor_vcpus / 2) | round(0, method='ceil'), 3] | max | int }}"
# 20261027 Increased to 3 as a maximum.
# After more research, this is a more memory-based parameter. Basically
# the model allocates this number of KV caches, that way when it is
# running in multiple chats it does not need to drop context and reload.
# Still only uses X threads for all chats, but does not waste much time.
# So if set to 3, and doing 64K context, it really allocates 192k in RAM
# and supposedly if only doing 1 chat the model can use it all.
llm_parallel: "{{ [(ansible_memtotal_mb / 8000) | round(0, method='floor'), 3] | min | int }}"
# Most LLMs take a coefficient of about 1.2 to 1.5 of their file size in
# RAM, which is usually less than guessing a usage of weight*1000.
# Example:
@@ -76,6 +84,7 @@
llm_size_coef: 1.3
# Base the context on MB of RAM, with a minumum 64k for decent thinking.
llm_context: "{{ [(ansible_memtotal_mb * 4) | round(-3, method='ceil'), 64000] | max | int }}"
llm_docker_network: open-webui-net
- name: Workstation | Linux | Software | LLMs | Facts 02
ansible.builtin.set_fact:
@@ -106,6 +115,16 @@
llm_removals:
##### QWEN #####
- { "purpose": ["chat"], "model": "qwen3:4b", "provider": "qwen_30_0040", "size_mb": 4000, "context": 123456 } # succeeded
### QWEN 3.0 Coder - Supposed to be better than 2.5 for machines that can handle it. Went okay, but better options now.
- { "purpose": ["code", "chat"], "model": "qwen3-coder:30b", "provider": "qwen_30_coder_0300_moe", "size_mb": "{{ llm_size_coef * 19000 }}", "context": 262144 }
- { "purpose": ["code", "chat"], "model": "qwen3-coder:420b", "provider": "qwen_30_coder_4200_moe", "size_mb": "{{ llm_size_coef * 290000 }}", "context": 262144 }
### QWEN 2.5 Coder - Ol'reliable! Did not seem to handle tools too well though. Defunitely not conversation.
- { "purpose": ["code"], "model": "qwen2.5-coder:0.5b", "provider": "qwen_25_coder_0005", "size_mb": "{{ llm_size_coef * 398 }}", "context": 32768 }
- { "purpose": ["code"], "model": "qwen2.5-coder:1.5b", "provider": "qwen_25_coder_0015", "size_mb": "{{ llm_size_coef * 986 }}", "context": 32768 }
- { "purpose": ["code"], "model": "qwen2.5-coder:3b", "provider": "qwen_25_coder_0030", "size_mb": "{{ llm_size_coef * 1900 }}", "context": 32768 }
- { "purpose": ["code"], "model": "qwen2.5-coder:7b", "provider": "qwen_25_coder_0070", "size_mb": "{{ llm_size_coef * 4700 }}", "context": 32768 }
- { "purpose": ["code"], "model": "qwen2.5-coder:14b", "provider": "qwen_25_coder_0140", "size_mb": "{{ llm_size_coef * 9000 }}", "context": 32768 }
- { "purpose": ["code"], "model": "qwen2.5-coder:32b", "provider": "qwen_25_coder_0320", "size_mb": "{{ llm_size_coef * 20000 }}", "context": 32768 }
##### Mistral #####
- { "purpose": ["code"], "model": "devstral:24b", "provider": "mistral_dev10_0240", "size_mb": "{{ llm_size_coef * 14000 }}", "context": 128000 } # succeeded
# https://ollama.com/library/mistral-small : Last Updated 2025-01-30, succeeded
@@ -113,11 +132,18 @@
- { "purpose": ["chat"], "model": "mistral-small:22b", "provider": "mistral_small30_0220", "size_mb": "{{ llm_size_coef * 13000 }}", "context": 128000 } # Yes, the smaller one has larger context.
# https://ollama.com/library/mistral-small3.1 : Last Update 2025-04-07, succeeded
- { "purpose": ["chat"], "model": "mistral-small3.1:24b", "provider": "mistral_small31_0240", "size_mb": "{{ llm_size_coef * 15000 }}", "context": 128000 }
# Supposedly ollama has it tagged at mistral-small with no params given. it's not on the site though. Let's find out!
# No, this is Mistral 3, as the website says. Ask Brave is wrooong.
- { "purpose": ["chat", "lang", "code"], "model": "mistral-small", "provider": "mistral_small40_1190", "size_mb": 60000 , "context": 256000 }
# https://ollama.com/library/mistral-nemo : Last Updated 2025-07-23
# Supposed to be a drop-in replacement for mistral:7b. Not really any more useful than the other options.
- { "purpose": ["chat", "lang"], "model": "mistral-nemo:12b", "provider": "mistral_nemo_0120", "size_mb": "{{ llm_size_coef * 7100 }}", "context": 128000 } # says 1000K in table but 128k in desc, going with desc.
llm_choices:
##### QWEN #####
### QWEN >3.5 - Need to try!
# Supposedly great for coding over any previous version.
# Prefer 27b (dense) over anything higher which likely uses MoE (essentially only uses 3b inside of a 35b, dumber but faster and potentially has access to more info).
# Update: MoE actually runs really well on my workstation hardware, significantly faster than dense models, gives good results too.
# https://ollama.com/library/qwen3.8 : Last Updated 2026-09-25
# Known to overthink, suggested to prefer 3.6:27b unless setting temp to low/medium.
- { "purpose": ["code", "chat", "lang"], "model": "qwen3.8:27b", "provider": "qwen_38_0270", "size_mb": "{{ llm_size_coef * 18000 }}", "context": 262144 }
@@ -134,16 +160,6 @@
- { "purpose": ["chat", "code"], "model": "qwen3.5:27b", "provider": "qwen_35_0270", "size_mb": "{{ llm_size_coef * 17000 }}", "context": 262144 } # succeeded
- { "purpose": ["chat", "code"], "model": "qwen3.5:35b", "provider": "qwen_35_0350_moe", "size_mb": "{{ llm_size_coef * 22000 }}", "context": 262144 }
- { "purpose": ["chat", "code"], "model": "qwen3.5:122b", "provider": "qwen_35_1220_moe", "size_mb": "{{ llm_size_coef * 81000 }}", "context": 262144 }
### QWEN 3.0 Coder - Supposed to be better than 2.5 for machines that can handle it.
- { "purpose": ["code", "chat"], "model": "qwen3-coder:30b", "provider": "qwen_30_coder_0300_moe", "size_mb": "{{ llm_size_coef * 19000 }}", "context": 262144 }
- { "purpose": ["code", "chat"], "model": "qwen3-coder:420b", "provider": "qwen_30_coder_4200_moe", "size_mb": "{{ llm_size_coef * 290000 }}", "context": 262144 }
### QWEN 2.5 Coder - Ol'reliable!
- { "purpose": ["code"], "model": "qwen2.5-coder:0.5b", "provider": "qwen_25_coder_0005", "size_mb": "{{ llm_size_coef * 398 }}", "context": 32768 }
- { "purpose": ["code"], "model": "qwen2.5-coder:1.5b", "provider": "qwen_25_coder_0015", "size_mb": "{{ llm_size_coef * 986 }}", "context": 32768 }
- { "purpose": ["code"], "model": "qwen2.5-coder:3b", "provider": "qwen_25_coder_0030", "size_mb": "{{ llm_size_coef * 1900 }}", "context": 32768 }
- { "purpose": ["code"], "model": "qwen2.5-coder:7b", "provider": "qwen_25_coder_0070", "size_mb": "{{ llm_size_coef * 4700 }}", "context": 32768 }
- { "purpose": ["code"], "model": "qwen2.5-coder:14b", "provider": "qwen_25_coder_0140", "size_mb": "{{ llm_size_coef * 9000 }}", "context": 32768 }
- { "purpose": ["code"], "model": "qwen2.5-coder:32b", "provider": "qwen_25_coder_0320", "size_mb": "{{ llm_size_coef * 20000 }}", "context": 32768 }
##### Mistral, Ministral, and Devstral - By a French company. #####
# mistral-small-4
# https://huggingface.co/unsloth/Mistral-Small-4-119B-2603-GGUF
@@ -169,18 +185,7 @@
- { "purpose": ["chat", "lang"], "model": "ministral-3:3b", "provider": "mistral_mini30_0030", "size_mb": "{{ llm_size_coef * 3000 }}", "context": 256000 }
- { "purpose": ["chat", "lang"], "model": "ministral-3:8b", "provider": "mistral_mini30_0080", "size_mb": "{{ llm_size_coef * 6000 }}", "context": 256000 }
- { "purpose": ["chat", "lang"], "model": "ministral-3:14b", "provider": "mistral_mini30_0140", "size_mb": "{{ llm_size_coef * 9100 }}", "context": 256000 } # also rated super high for Croatian, gives more head room.
# https://ollama.com/library/mistral-nemo : Last Updated 2025-07-23
# Supposed to be a drop-in replacement for mistral:7b.
- { "purpose": ["chat", "lang"], "model": "mistral-nemo:12b", "provider": "mistral_nemo_0120", "size_mb": "{{ llm_size_coef * 7100 }}", "context": 128000 } # says 1000K in table but 128k in desc, going with desc.
##### TBD #####
### QWEN 2.5 - Older, but does not have "thinking", tempting!
#- qwen2.5:0.5b
#- qwen2.5:1.5b
#- qwen2.5:3b
#- qwen2.5:7b
#- qwen2.5:14b
#- qwen2.5:32b
#- qwen2.5:72b
### Z.ai
#- GLM-5.x
#- glm4-flash
@@ -228,29 +233,6 @@
- "{{ qwen_code }}"
state: present
- name: Workstation | Linux | Software | LLMs | Docker | Install
ansible.builtin.package:
name:
- docker
- docker-compose
state: present
- name: Workstation | Linux | Software | LLMs | Docker | runit
ansible.builtin.package:
name:
- docker-runit
state: present
when: ansible_pkg_mgr == "pacman"
- name: Workstation | Linux | Software | LLMs | Docker | Group
ansible.builtin.user:
name: "{{ item }}"
groups: docker
append: true
loop:
- root
- "{{ user }}"
- name: Workstation | Linux | Software | LLMs | runit
block:
@@ -287,6 +269,7 @@
### Required ###
export HOME={{ user_user.home }}
export OLLAMA_HOST=0.0.0.0 # Needed for Open WebUI
### Timeouts ###
export OLLAMA_LOAD_TIMEOUT=30m # default is 5m
@@ -295,7 +278,7 @@
### Resource Usage ###
export OLLAMA_KEEP_ALIVE=-1 # default is 5m. Good frontends keep the model alive as long as it needs to be, this is not a source of timeout.
export OLLAMA_MAX_LOADED_MODELS={{ llm_concurrency }} # default is 3 if using CPUs, or 3 * NumGPUs
export OLLAMA_NUM_PARALLEL={{ llm_parallel }} # default is 1 and applies per-model (unconfirmed)
export OLLAMA_NUM_PARALLEL={{ llm_parallel }} # default is 1 and applies per-model
export OLLAMA_CONTEXT_LENGTH={{ llm_context }} # default is 4096, https://docs.ollama.com/faq#how-can-i-specify-the-context-window-size
export OLLAMA_MAX_QUEUE=999 # default is 512 (unconfirmed)
export OLLAMA_NUM_THREADS={{ (ansible_processor_vcpus / 2) | int }} # not real, but maybe some day.
@@ -426,6 +409,13 @@
content: |
#!/bin/sh
exec 2>&1
## TBD / TODO
## Move this to the same compose file as Open Terminal.
## Will solve quite a few network related complications.
## Also refactor the two into their own file (open_webui.yml).
## Probably also will then condense into 1 runit service.
image=ghcr.io/open-webui/open-webui:latest
# Wait for Docker to start up.
@@ -434,45 +424,37 @@
# Ensure the old container is gone.
echo "RUN: Stopping..."
docker stop open-webui &&
echo "RUN: Container stopped" ||
echo "RUN: Container stopped." ||
echo "RUN: Container already stopped."
echo "RUN: Deleting..."
docker rm -f open-webui &&
echo "RUN: Container deleted" ||
echo "RUN: Container deleted." ||
echo "RUN: Container already deleted."
# Check for any new updates in background.
sleep 300 &&
echo "RUN: Updating..." &&
docker pull $image &
# Check for any new updates in the background.
(
while true; do
sleep 600
echo "RUN: Checking for updates..."
docker pull $image
done
) &
LOOP_PID=$!
# Ensure cleanup on any exit (normal or signal from runit).
trap 'kill "$LOOP_PID" 2>/dev/null; wait "$LOOP_PID" 2>/dev/null' EXIT
# Start the open-webui program.
set -e
exec docker run \
docker run \
--name open-webui \
--network=host -e PORT={{ open_webui_port }} \
--network host -e PORT={{ open_webui_port }} \
-e OLLAMA_BASE_URL=http://0.0.0.0:11434 \
{{ ("-e HF_TOKEN=" ~ hf_token) if hf_token else '' }} \
-e WEBUI_SECRET_KEY={{ open_webui_key }} \
-e ENABLE_QUERIES_CACHE=True \
-v open-webui:/app/backend/data \
$image
# Unsure why this was not working on Artix with runit.
# exec curl 0.0.0.0:8080/health gave a successful response.
# The environment was not accessible on the host though.
#-p {{ open_webui_port }}:8080 \
# The host.docker.internal params still seem required, even with
# giving access to the host system and trying this:
#-e OLLAMA_BASE_URL=http://localhost:11434 \
# Although I did not try it with 0.0.0.0, maybe that'd work.
# Had to change this to 0.0.0.0, below was still acting weird.
#-e OLLAMA_BASE_URL=http://host.docker.internal:11434 \
# 20261020, trying to remove this again while leaving the rest.
#--add-host=host.docker.internal:host-gateway \
mode: "0755"
- name: Workstation | Linux | Software | LLMs | runit | open-webui | Script | Finish
@@ -513,6 +495,17 @@
# Open Terminal - Start #
- name: Workstation | Linux | Software | LLMs | Sandbox
ansible.builtin.import_tasks: tasks/workstation/linux/software/ai/sandbox.yml
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Facts
ansible.builtin.set_fact:
jdk_jvm: "{{ jdk_jvm | default('/usr/lib/jvm') }}"
jdk_etc: "{{ jdk_etc | default('/etc/java-openjdk') }}"
jdk_etc17: "{{ jdk_etc17 | default('/etc/java17-openjdk') }}"
jdk_etc21: "{{ jdk_etc21 | default('/etc/java21-openjdk') }}"
jdk_etc25: "{{ jdk_etc25 | default('/etc/java25-openjdk') }}"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Dir | /etc/sv
ansible.builtin.file:
name: "/etc/sv/open-terminal/log"
@@ -534,154 +527,17 @@
owner: root
mode: "0755"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | AI-Sandbox | Dir
ansible.builtin.file:
dest: "{{ user_user.home }}/AI-Sandbox"
state: directory
owner: "{{ user }}"
group: "{{ user }}"
mode: "0755"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | AI-Sandbox | Env
ansible.builtin.blockinfile:
path: "{{ user_user.home }}/AI-Sandbox/{{ item }}"
marker: "# {mark} | MANAGE BY ANSIBLE | Env Vars"
content: |
if [[ -d "$HOME/bin" ]]; then
export PATH="$HOME/bin:$PATH"
fi
export ANDROID_HOME="{{ user_user.home }}/SDKs/Android/Sdk"
export GRADLE_USER_HOME={{ user_user.home }}/.gradle
export PATH="$ANDROID_HOME/platform-tools:$PATH"
export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$PATH"
export FLUTTER_HOME="{{ user_user.home }}/SDKs/Flutter/flutter"
export PUB_CACHE={{ user_user.home }}/.pub-cache
export PATH="$FLUTTER_HOME/bin:$PATH"
export JAVA_HOME="{{ user_user.home }}/SDKs/Java"
export PATH="$JAVA_HOME/bin:$PATH"
create: false
backup: false
owner: "{{ user }}"
group: "{{ user }}"
mode: "0755"
loop:
- ".bashrc"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | AI-Sandbox | Defaults
ansible.builtin.set_fact:
jdk_jvm: "{{ jdk_jvm | default('/usr/lib/jvm') }}"
jdk_etc: "{{ jdk_etc | default('/etc/java-openjdk') }}"
jdk_etc17: "{{ jdk_etc17 | default('/etc/java17-openjdk') }}"
jdk_etc21: "{{ jdk_etc21 | default('/etc/java21-openjdk') }}"
jdk_etc25: "{{ jdk_etc25 | default('/etc/java25-openjdk') }}"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | AI-Sandbox | AGENTS.md
ansible.builtin.copy:
dest: "{{ user_user.home }}/AI-Sandbox/AGENTS.md"
content: |
# Environment
You are running in a Docker container called Open Terminal. We are
communicating via Open WebUI, also being run in a Docker
container. You are the user `user` and have been granted access to
the designer's Code and SDKs via mount at `{{ user_user.home }}`.
If the `$GOT_EM` environment variable is `true` then all the
necessary packages for compiling Android and Flutter were
installed. If it is `false` then they were not installed, and
compiling will fail. Please check this before trying and alert me
if they need added. If we don;t have Internet, then ask me to
compile or run whatever command is needed on the host system.
# Rules
Never use any `git` subcommands that change anything, including
but not limited to `add`, `commit`, `pull`, `push`, `branch`,
`switch`, etc. The user is who controls the respository changes.
You may informational git subcommands such as use `git status`.
If any programs need installed in order to work on a project, we
need to document that in an install.sh script, as well as add it
to ~/PACKAGES.txt so that the user can ensure they stay installed.
install.sh scripts should be for both `apt` systems (Debian,
Ubuntu) and pacman system (Arch, Artix). using distribution
package managers is preferable over `pip` and `npm` when
possible, unless the project is actually Python or Node.js.
The user manages the `{{ user_user.home }}/SDKs` directory. Do not
modify it. Instead, ask if anything needs updated or added.
Never manually edit, modify, delete, alter, replace, etc any
files under system folders such as `/usr`. Anything under `/` is
managed by the system. If you need assistance changing anything
such as `/usr/lib/jvm`, please ask the user and halt all further
operations until you have received feedback.
It is never okay to brute force a solution if something is not
working well. it is better to ask the user for assistance or alert
them that you've encountered blockers and then cease the process
until you've received feedback.
# Preferences
You have free reign over your home directory. Feel free to
create memory files or anything else which would benefit you.
Everything we create should have both Desktop Linux and Android
in mind. Windows, MacOS, and iOS will never be compiled for, but
if we can do things in a way which makes it easy for others to
fork the project and add the support themselves, then that's best.
# Versions
These are the versions of plugins and languages we need to use.
If you know of an important upgrade from them, please let me know.
## Android / Flutter
- Gradle: 9.8.0
- AGP: 9.4.1
- Kotlin: 2.4.20
- Java: JDK 17
- Flutter (plugin loader): 1.0.0
backup: false
owner: "{{ user }}"
group: "{{ user }}"
mode: "0755"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Compose YAML
ansible.builtin.copy:
dest: /usr/local/etc/open-terminal/docker-compose.yml
dest: /usr/local/etc/open-terminal/compose.yml
content: |
#exec docker run \
# --name open-terminal \
# --network=host \
# -v {{ user_user.home }}/AI-Sandbox:/home/user \
# -v {{ user_user.home }}/Code:{{ user_user.home }}/Code \
# -v {{ user_user.home }}/SDKs:{{ user_user.home }}/SDKs \
# -v {{ jdk_jvm }}:{{ jdk_jvm }}:ro \
# -v {{ jdk_etc }}:{{ jdk_etc }}:ro \
# -v {{ jdk_etc17 }}:{{ jdk_etc17 }}:ro \
# -v {{ jdk_etc21 }}:{{ jdk_etc21 }}:ro \
# -v {{ jdk_etc25 }}:{{ jdk_etc25 }}:ro \
# -v /etc/hosts:/etc/hosts:ro \
# -v {{ user_user.home }}/.gradle:{{ user_user.home }}/.gradle \
# -v {{ user_user.home }}/.pub-cache:{{ user_user.home }}/.pub-cache \
# -e OPEN_TERMINAL_FILE_BROWSER_ROOT="/home/user" \
# -e OPEN_TERMINAL_API_KEY="{{ open_terminal_key }}" \
# -e OPEN_TERMINAL_PACKAGES="$packages" \
# -e GOT_EM="$GOT_EM" \
# $image run --port {{ open_terminal_port }}
services:
open-terminal:
container_name: open-terminal
build:
context: ./
network: host
container_name: open-terminal
image: hyperling/open-terminal:latest
pull_policy: never
network_mode: host
command: run --port {{ open_terminal_port }}
environment:
@@ -713,6 +569,10 @@
USER root
RUN echo "System"
RUN apt-get update && apt-get install -y \
ca-certificates git curl bash sudo wget ansible ansible-lint
RUN echo "Android"
RUN apt-get update && apt-get install -y \
libc6:amd64 libncurses-dev \
@@ -720,7 +580,7 @@
# Debian removed JDK 17, continue serving from the host.
# default-jdk openjdk-17-jdk
RUN echo "Flutter (Main)"
RUN echo "Flutter"
RUN apt-get update && apt-get install -y \
curl git unzip xz-utils zip libglu1-mesa libglu1-mesa
@@ -733,6 +593,10 @@
RUN apt-get update && apt-get install -y \
libc6:amd64 libstdc++6 lib32z1 libbz2-1.0
RUN echo "Ansible"
RUN apt-get update && apt-get install -y \
ansible ansible-lint
USER user
owner: root
mode: "0755"
@@ -757,22 +621,32 @@
# Ensure the old container is stopped.
echo "RUN: Stopping..."
docker compose -f /usr/local/etc/open-terminal/docker-compose.yml down &&
echo "RUN: Container stopped" ||
docker compose \
-f /usr/local/etc/open-terminal/compose.yml down &&
echo "RUN: Container stopped." ||
echo "RUN: Container already stopped."
# Check for any new updates in background.
sleep 600 &&
echo "RUN: Updating..." &&
docker compose -f /usr/local/etc/open-terminal/docker-compose.yml \
build --pull &
# Check for any new updates in the background.
(
while true; do
sleep 600
echo "RUN: Checking for updates..."
docker compose \
-f /usr/local/etc/open-terminal/compose.yml \
build --pull
done
) &
LOOP_PID=$!
# Ensure cleanup on any exit (normal or signal from runit).
trap 'kill "$LOOP_PID" 2>/dev/null; wait "$LOOP_PID" 2>/dev/null' EXIT
export GOT_EM=true
# Start the open-terminal program.
# https://github.com/open-webui/open-terminal#configuration
set -e
exec docker compose -f /usr/local/etc/open-terminal/docker-compose.yml up
docker compose -f /usr/local/etc/open-terminal/compose.yml up
owner: root
mode: "0755"
@@ -783,7 +657,7 @@
{{ runit_finish_sleep }}
echo "FINISH: Stopping..."
docker compose -f /usr/local/etc/open-terminal/docker-compose.yml down &&
docker compose -f /usr/local/etc/open-terminal/compose.yml down &&
echo "FINISH: Container stopped" ||
echo "FINISH: Container already stopped."
@@ -925,7 +799,6 @@
loop:
- { 'name': "{{ ollama }}" , 'status': "{{ ollama_enabled }}" }
- { 'name': "{{ zeroclaw }}" , 'status': "{{ zeroclaw_enabled }}" }
- { 'name': 'docker' , 'status': true }
- { 'name': 'open-webui' , 'status': "{{ open_webui_enabled }}" }
- { 'name': 'open-terminal' , 'status': "{{ open_terminal_enabled }}" }
- { 'name': 'swap-stopper' , 'status': true }
@@ -968,17 +841,24 @@
path: "{{ user_user.home }}/{{ item }}"
marker: "# {mark} ANSIBLE MANAGED BLOCK | ollama | Manual Script"
content: |
function ollama_llms() {
function llm_installs() {
{% for llm in llm_installs %}
echo "{{ llm.model }}"
{% endfor %}
}
function llm_removals() {
{% for llm in llm_removals %}
echo "{{ llm.model }}"
{% endfor %}
}
function ollama_pull() {
echo "Manually Pulling Models"
for model in `ollama_llms`; do
for model in `llm_installs`; do
echo -e "\n\n Starting 'ollama pull $model' \n\n"
ollama pull $model
status=$?
@@ -991,6 +871,22 @@
alias pull-models="ollama_pull "
alias pull-ai="ollama_pull "
function ollama_clean() {
echo "Cleaning Models"
for model in `llm_removals`; do
echo -e "\n Removing '$model'"
ollama rm $model
done
echo "Done!"
}
alias ollama-clean="ollama_clean "
alias clean-ollama="ollama_clean "
alias clean-llms="ollama_clean "
alias clean-models="ollama_clean "
alias clean-ai="ollama_clean "
function ollama_chat() {
ollama run {{ 'qwen3.8:27b' if ansible_memtotal_mb > 32000 else 'qwen3.5:4b' }}
}
@@ -0,0 +1,496 @@
---
# Move the plays related to AGENTS.md to its own file since it is now so large.
- name: Workstation | Linux | Software | AI | Sandbox | Dir
ansible.builtin.file:
dest: "{{ user_user.home }}/AI-Sandbox"
state: directory
owner: "{{ user }}"
group: "{{ user }}"
mode: "0755"
- name: Workstation | Linux | Software | AI | Sandbox | Env
ansible.builtin.blockinfile:
path: "{{ user_user.home }}/AI-Sandbox/{{ item }}"
marker: "# {mark} | MANAGE BY ANSIBLE | Env Vars"
content: |
if [[ -d "$HOME/bin" ]]; then
export PATH="$HOME/bin:$PATH"
fi
export ANDROID_HOME="{{ user_user.home }}/SDKs/Android/Sdk"
export GRADLE_USER_HOME={{ user_user.home }}/.gradle
export PATH="$ANDROID_HOME/platform-tools:$PATH"
export PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$PATH"
export FLUTTER_HOME="{{ user_user.home }}/SDKs/Flutter/flutter"
export PUB_CACHE={{ user_user.home }}/.pub-cache
export PATH="$FLUTTER_HOME/bin:$PATH"
export JAVA_HOME="{{ user_user.home }}/SDKs/Java"
export PATH="$JAVA_HOME/bin:$PATH"
create: false
backup: false
owner: "{{ user }}"
group: "{{ user }}"
mode: "0755"
loop:
- ".bashrc"
- name: Workstation | Linux | Software | AI | Sandbox | AGENTS.md
ansible.builtin.copy:
dest: "{{ user_user.home }}/AI-Sandbox/AGENTS.md"
content: |
# Environment
You are running in a Docker container called Open Terminal. We are
communicating via Open WebUI, also being run in a Docker
container. You are the user `user` and have been granted access to
the designer's Code and SDKs via mount at `{{ user_user.home }}`.
Host system is typically (but not always) a systemd-free distro
such as Artix or Devuan. User likes the `runit` service manager.
`elogind` is used rather than systemd's logind. Desktop is i3 and
display manager is lightdm. Servers are run on Debian and Docker
containers are typically debian:trixie-slim with a Dockerfile
called by compose.yml which adds the necessary packages, sometimes
building from source if the Debian executable is too old.
If the `$GOT_EM` environment variable is `true` then all the
necessary packages for compiling Android and Flutter were
installed. If it is `false` then they were not installed, and
compiling will fail. Please check this before trying and alert me
if they need added. If we don't have Internet, then ask me to
compile or run whatever command is needed on the host system.
# Rules
Never use any `git` subcommands that change the repo, including
but not limited to `add`, `commit`, `pull`, `push`, `branch`,
`switch`, etc. The user is who controls the respository changes.
You may use informational git subcommands such as `git status`,
and may occasionally be asked to run `git clone` type commands.
If any programs need installed in order to work on a project, we
need to document that in an `install.sh` script, as well as add it
to `~/PACKAGES.txt` so that we can ensure they stay installed.
`install.sh` scripts should be for both `apt` systems (Debian,
Ubuntu) and pacman system (Arch, Artix). using distribution
package managers is preferable over `pip` and `npm` when
possible, unless the project is actually Python or Node.js.
The user manages the `{{ user_user.home }}/SDKs` directory. Do not
modify it. Instead, ask if anything needs updated or added.
Never manually edit, modify, delete, alter, replace, etc any
files under system folders such as `/usr`. Anything under `/` is
managed by the system. If you need assistance changing anything
such as `/usr/lib/jvm`, please ask the user and halt all further
operations until you have received feedback.
# Effort
It is never okay to brute force a solution if something is not
working well. it is better to ask the user for assistance or alert
them that you've encountered blockers and then cease the process
until you've received feedback. This especially relates to when
system errors occur which are not related to the source code, such
as a compiler failing to be found or an SDK version mismatch. If
the error is with the source code though, troubleshooting and code
changes should continue until the program is compiling properly.
For CLI projects such as script languages, the final result should
always be tested both to run successfully and have the proper
output. All test cases should be analyzed and walked through,
which will help ensure all the requirements have been met.
For GUI programs (such as Android, Flutter, Kotlin Multiplatform,
Kivy, etc), the project should be tested to both compile & build
successfully and also generate the proper installation file (APK,
Linux Bundle). Once that is confirmed, the user/desginer will test
that the application meets the proper requirements.
# Preferences
You have free reign over your home directory. Feel free to
create memory files or anything else which would benefit you.
Everything we create should have both Desktop Linux and Android
in mind. Windows, MacOS, and iOS will never be compiled for, but
if we can do things in a way which makes it easy for others to
fork the project and add the support themselves, then that's best.
# Versions
These are the versions of plugins and languages we need to use.
If you know of an important upgrade from them, please let me know.
If you find that an application is already a newer version than
those listed here, that is acceptable, never attempt to downgrade
without explicitly asking the user first and having a good reason.
## Android / Flutter
- Gradle 9.8.2
- AGP 9.5.0
- Kotlin 2.4.21
- Java JDK 17
- Flutter Plugin Loader 1.0.0
- compileSdk 37
- targetSDK 37
Regardless of whether AGP bundles Kotlin, we need to specify it to
avoid things like "Your project's Kotlin version (2.2.10) is lower
than Flutter's minimum supported version of 2.2.20. Please upgrade
your Kotlin version." This is exactly why we use these versions,
plus it helps document what's actually being used over guessing.
Only the arm-v8a architecture needs included in the release
builds. x86 and others should continue to exist in the debug run.
This will help save space on local servers like Gitea and F-Droid.
If code for this does not exist, please add splitting or filtering
so that when the designer generates a signed APK it's only v8a.
Android : paths are from the project root.
Flutter : paths are under the folder `android`.
### All Android Project Types
#### ./gradle/wrapper/grade-wrapper.properties
```
distributionUrl=https\://services.gradle.org/distributions/gradle-9.8.2-bin.zip
```
#### ./settings.gradle.kts
```
id("com.android.application") version "9.5.0" apply false
id("org.jetbrains.kotlin.android") version "2.4.21" apply false
```
#### ./app/build.gradle.kts
```
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlin {
compilerOptions {
jvmTarget.set(JvmTarget.JVM_17)
}
}
```
Also enable minify and shrink while in there.
```
buildTypes {
getByName("release") {
...
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
```
### Flutter Projects
#### ./settings.gradle.kts
```
id("dev.flutter.flutter-plugin-loader") version "1.0.0"
```
### Native Kotlin Apps
These only apply to Android apps which are not Flutter, Kivy, etc.
#### Plugin Versions
##### ./gradle/libs.versions.toml
```
[versions]
agp = "9.5.0"
kotlin = "2.4.21"
coreKtx = "1.19.1"
junit = "4.13.2"
junitVersion = "1.3.0"
espressoCore = "3.7.0"
lifecycleRuntimeKtx = "2.11.0"
activityCompose = "1.13.0"
composeBom = "2026.09.00"
```
#### Kotlin Compose Fix
Also ensure Kotlin is coming from Compose and not Jetbrains.
##### ./gradle/libs.versions.toml
```
[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
#jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlinCompose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
```
##### ./build.gradle.kts
```
plugins {
alias(libs.plugins.androidApplication) apply false
//alias(libs.plugins.jetbrainsKotlinAndroid) apply false
alias(libs.plugins.kotlinCompose) apply false
}
```
##### ./app/build.gradle.kts
```
plugins {
alias(libs.plugins.androidApplication)
//alias(libs.plugins.jetbrainsKotlinAndroid)
alias(libs.plugins.kotlinCompose)
}
```
# Build Processes
How to compile certain projects. Tools to prefer. If a language
or framework is not mentioned, then use the typical commands.
## Kotlin Multiplatform (KMP)
Used to create small native Android apps with the ability to also
run against Desktop Linux. APK size is the greatest benefit for
using KMP over something like Flutter or KivyMD.
### Kotlin Toolchain
This is the preferred build type when setting up new projects.
Please use `kotlin` rather than any `amper` commands. `amper` has
been deprecated and is intentionally not present on the system.
Examples:
```
# 1. Compile + link ALL targets (JVM, iOS, Android, native, etc.)
./kotlin build
# 2. (Optional) Run tests across all targets
./kotlin test
# 3. (Optional) Run all quality checks (tests + registered linters)
./kotlin check
```
### Gradle KMP
This is a legacy method, new projects will not be set up with it.
Examples:
```
# Compile all targets
./gradlew assemble
# Or more explicitly (if you want to be sure nothing is skipped):
./gradlew jvmJar assembleDebug assembleIosSimulatorArm64 # etc. per target
# Run all tests
./gradlew allTests
```
# Coding Conventions
Preferences related to how code should be written.
## All languages
If a value is going to be used more than once, even a small path or file
name, it should exist in a variable.
Relative shebangs such as `#!/usr/bin/env bash` and `#!/usr/bin/env node`
are always preferred over static shebangs such as `#!/bin/bash`, since
scripts are run across a multitude of different systems.
### Layout
Programs should be laid out in 5 sections.
- Variables
- Instantiate global variables and defaults used for parameters which
do not get passed an explicit value by the user.
- Functions
- Functions to be used throughout the program, including the Usage.
- Parameters / Validation
- Parse the parameters, validate the input, and assign any defaults.
- Main
- The primary logic of the program, completes the task at hand.
- Finish / Cleanup
- Typically just `exit 0`, but sometimes a summary of what was done.
All sections may not always apply, such as with Hugo websites. With
projects like Android apps this would apply to each individual function,
method, and class. If a section does not need anything, it can be blank.
```
public static void doThing(String thingName) {
// Variables //
String thingPrefix = "/place/for/thing/"
// Functions //
// Parameters //
if (thingName.isEmpty) {
Exception e = new Exception("No name passed!");
throw e;
}
// Main //
runStuff(thingPrefix + thingName);
// Finish //
}
```
The comments do not need to be included, this example is just as valid,
what maytters most is that the 5 section are done in order rather than
instantiating variable mid-scope.
```
public static void doThing(String thingName) {
String thingPrefix = "/place/for/thing/"
if (thingName.isEmpty) {
Exception e = new Exception("No name passed!");
throw e;
}
runStuff(thingPrefix + thingName);
}
```
`if` statements and loops start new scope, so they also need the layout
applied to them. Loops may sometimes require a variable assignment before
it begins which is completely okay and does not break the layout rule.
This example has a Variables, Validation, Main, and Finish section without
the use of labels or comments since the code itself is simple and small.
```
count=0
array="cats dogs giraffes rhinos horses"
last_animal=""
for animal in $array; do
if (( count >= 3 )); then
echo "That's enough! We finished at the ${last_animal}."
break;
fi
echo "We're looking at ${animal}."
last_animal=$animal
(( count++ ))
done
```
Providing the user's input in error messages is really helpful and can aid
their troubleshooting if things are not going according to expectations.
Example using Bash:
```
#!/usr/bin/env bash
### Variables ###
declare A B
typeset -i a b
### Functions ###
function usage() {
status="$1"
cat << EOF
Usage: add.sh -a NUM -b NUM [-h]
Adds two numbers and prints out the full equation.
Example:
$ add.sh -a 5 -b 25
5 + 25 = 30
EOF
exit $status
}
function add() {
num1="$1"
num2="$2"
sum=""
if [[ -z $num1 || -z $num2 ]]; then
echo "ERROR: Two numnbers must be passed."
fi
sum=$(( num1 + num2 ))
echo "${num1} + ${num2} = ${sum}"
}
### Parameters ###
while getopts ':a:b:h' opt; do
case $opt in
a) A="$OPTARG" ;;
b) B="$OPTARG" ;;
h) usage 0 ;;
*) echo "ERROR: Option $OPTARG not recognized." >&2 && usage 1 ;;
esac
done
if [[ -z "$A" || -z "$B" ]]; then
echo "ERROR: Both numbers need to be passed. A=${A} B=${B}" >&2
usage 2
fi
a="$A" b="$B"
if [[ "$a" != "$A" || "$b" != "$B" ]]; then
echo "ERROR: Values contain non-numeric data, please try again." >&2
echo "A=${A} B=${B}" >&2
usage 3
fi
### Main ###
add "$a" "$b"
### Finish ###
unset A B usage add
exit 0
```
## Bash
`[[ ]]` are preferred over `[ ]`, `test`, etc. `(( ))` are always fine.
When defining a function please use both the keyword `function` as well as
the `()`, such as `function myfunc() {}`.
When instantiating global variables, please use `typeset` or `declare`
rather than just `VAR1=""; VAR2=""`, such as:
```
declare VAR1="" VAR2="" BOOL="true" BOOL2="false"
typeset -i INT1=0 INT2=99
```
When doing colored output, `tput` is always preferred over literal values.
backup: false
owner: "{{ user }}"
group: "{{ user }}"
mode: "0755"
+116
View File
@@ -0,0 +1,116 @@
# 2026-10-27 Hyperling
# Pulled out of llm.yml since the number of tasks is growing.
- name: Workstation | Linux | Software | Docker | Install
ansible.builtin.package:
name:
- docker
- docker-compose
- docker-buildx
state: present
- name: Workstation | Linux | Software | Docker | Install [runit]
ansible.builtin.package:
name:
- docker-runit
state: present
when: ansible_pkg_mgr == "pacman"
and ansible_service_mgr == "runit"
- name: Workstation | Linux | Software | Docker | Group
ansible.builtin.user:
name: "{{ item }}"
groups: docker
append: true
loop:
- root
- "{{ user }}"
- name: Workstation | Linux | Software | Docker | Config | Dir
ansible.builtin.file:
name: /etc/docker
state: directory
owner: root
mode: '0755'
- name: Workstation | Linux | Software | Socker | Services | Enable
ansible.builtin.service:
name: "{{ item.name }}"
state: "{{ 'started' if item.status else 'stopped' }}"
enabled: "{{ item.status }}"
loop:
- { 'name': 'docker' , 'status': true }
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Facts
ansible.builtin.set_fact:
docker_network_sync: "docker-network-sync"
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Block
block:
- name: Workstation | Linux | Software | Docker | Network Sync | runit | /etc/sv
ansible.builtin.file:
name: "/etc/sv/{{ docker_network_sync }}/log"
state: directory
owner: root
mode: "0755"
- name: Workstation | Linux | Software | Docker | Network Sync | runit | /var/log
ansible.builtin.file:
name: "/var/log/{{ docker_network_sync }}"
state: directory
owner: "{{ user }}"
mode: "0755"
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Run
ansible.builtin.copy:
dest: /etc/sv/{{ docker_network_sync }}/run
content: |
#!/bin/sh
# Ensure all containers using host network keep a correct resolv.conf.
exec 2>&1
set -e
while true; do
for c in $(docker container ls --filter network=host -q); do
echo "RUN: Container ID $c"
docker exec -i -u root $c sh -c 'tee /etc/resolv.conf' < /etc/resolv.conf
done
echo "RUN: Done, sleeping."
sleep 20
done
backup: false
owner: root
mode: '0755'
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Finish
ansible.builtin.copy:
dest: /etc/sv/{{ docker_network_sync }}/finish
content: |
{{ runit_finish_sleep }}
mode: "0755"
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Log
ansible.builtin.copy:
dest: /etc/sv/{{ docker_network_sync }}/log/run
content: |
#!/bin/sh -e
exec svlogd -tt /var/log/{{ docker_network_sync }}
mode: "0755"
- name: Workstation | Linux | Software | Docker | Network Sync | runit | Log Config
ansible.builtin.copy:
dest: /var/log/{{ docker_network_sync }}/config
content: |
{{ runit_log_config_1mb }}
mode: "0755"
- name: Workstation | Linux | Software | Socker | Services | Enable
ansible.builtin.service:
name: "{{ item.name }}"
state: "{{ 'started' if item.status else 'stopped' }}"
enabled: "{{ item.status }}"
loop:
- { 'name': '{{ docker_network_sync }}', 'status': true }
when: ansible_service_mgr == "runit"
+26 -5
View File
@@ -22,35 +22,56 @@
- name: Workstation | Linux | Software | Hugo | pacman | Install New
ansible.builtin.package:
name:
- hugo
- "{{ sass_current }}"
state: present
when: ansible_pkg_mgr == "pacman"
# This must exist after nodejs.yml so that NPM is installed.
- name: Workstation | Linux | Software | Hugo | npm
- name: Workstation | Linux | Software | Hugo | apt
block:
- name: Workstation | Linux | Software | Hugo | npm | Facts
- name: Workstation | Linux | Software | Hugo | apt | sass | Facts
ansible.builtin.set_fact:
sass_old: node-sass
sass_current: sass
- name: Workstation | Linux | Software | Hugo | npm | Gather
- name: Workstation | Linux | Software | Hugo | apt | sass | Gather
ansible.builtin.shell: npm prefix -g
register: npm_bin_dir # Provides /usr/local/ on Devuan, /usr/ on Artix.
changed_when: false
- name: Workstation | Linux | Software | Hugo | npm | Remove Old
- name: Workstation | Linux | Software | Hugo | apt | sass | Remove Old
ansible.builtin.shell: "npm remove -g {{ sass_old }}"
args:
creates: "{{ npm_bin_dir.stdout }}/bin/sass"
- name: Workstation | Linux | Software | Hugo | npm | Install New
- name: Workstation | Linux | Software | Hugo | apt | sass | Install New
ansible.builtin.shell: "npm install -g {{ sass_current }}"
args:
creates: "{{ npm_bin_dir.stdout }}/bin/sass"
- name: Workstation | Linux | Software | Hugo | apt | hugo | Remove Old
ansible.builtin.package:
name:
- hugo
state: absent
- name: Workstation | Linux | Software | Hugo | apt | hugo | Install Dependencies
ansible.builtin.package:
name:
- golang
- gcc
state: present
- name: Workstation | Linux | Software | Hugo | apt | hugo | Build
ansible.builtin.shell: |
CGO_ENABLED=1 go install -tags extended github.com/gohugoio/hugo@latest
ln -s $HOME/go/bin/hugo /usr/local/bin/hugo
register: shell_check
changed_when: shell_check.rc == 0
when: ansible_pkg_mgr == "apt"
when: coding is true
@@ -54,6 +54,8 @@
- "{{ strawberry }}"
- "{{ dict_en }}"
- "{{ dict_es }}"
- "{{ xset }}"
- "{{ xlock }}"
state: present
- name: Workstation | Linux | Software | Packages | Install From Repo [Coding]
+11 -1
View File
@@ -13,12 +13,16 @@
- echo "deb [signed-by=/usr/share/keyrings/mullvad-keyring.asc arch=$( dpkg --print-architecture )] https://repository.mullvad.net/deb/stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/mullvad.list
- apt update
when: ansible_pkg_mgr == "apt"
register: shell_check
changed_when: shell_check.rc == 0
- name: Workstation | Software | VPN | Mullvad | Add Repo [dnf]
ansible.builtin.shell: "{{ item }}"
loop:
- sudo dnf config-manager --add-repo https://repository.mullvad.net/rpm/stable/mullvad.repo
when: ansible_pkg_mgr == "dnf"
register: shell_check
changed_when: shell_check.rc == 0
- name: Workstation | Software | VPN | Install
ansible.builtin.package:
@@ -67,6 +71,8 @@
- "cd {{ mullvad_repack_dir }} && ./repack.sh ../Mullvad.deb"
- "apt-get install -y --reinstall {{ devuan_mullvad_dir }}/Mullvad_repack.deb"
when: not mullvad_installed.stat.exists
register: shell_check
changed_when: shell_check.rc == 0
when: ansible_pkg_mgr == "apt"
and ansible_service_mgr != "systemd"
@@ -95,6 +101,8 @@
- echo "cd {{ mullvad_exe_dir }}" >> {{ mullvad_exe_new }}
- echo "./{{ mullvad_exe }}" >> {{ mullvad_exe_new }}
- chmod +x {{ mullvad_exe_new }}
register: shell_check
changed_when: shell_check.rc == 0
- name: Workstation | Software | VPN | Mullvad | runit | Enable Service (mullvad-daemon)
ansible.builtin.file:
@@ -113,7 +121,7 @@
- name: Workstation | Software | VPN | Mullvad | PATH | Enable Lockdown
ansible.builtin.shell: "{{ item }}"
loop:
- mullvad lan set block
- mullvad lan set allow # This allows Docker to forward ports to localhost!
- mullvad tunnel set ipv6 on
- mullvad dns set default --block-ads --block-trackers --block-malware --block-gambling --block-adult-content --block-social-media
- mullvad auto-connect set on
@@ -121,3 +129,5 @@
- mullvad beta-program set off
become: true
become_user: "{{ user }}"
register: shell_check
changed_when: shell_check.rc == 0
+1 -4
View File
@@ -21,11 +21,8 @@
- name: TEST | LLMs
block:
- name: Java
ansible.builtin.include_tasks: tasks/workstation/linux/software/java.yml
- name: LLM
ansible.builtin.include_tasks: tasks/workstation/linux/software/llm.yml
ansible.builtin.include_tasks: tasks/workstation/linux/software/ai/llm.yml
#######################
#######################