Compare commits

...
180 Commits
Author SHA1 Message Date
me 4e8d22cb46 android, ensure permissions are correct for ~/.gradle. 2026-11-10 19:23:08 -07:00
me 3bc2185962 flutter, ensure permissions are correct for pub -cache folder. 2026-11-10 19:22:47 -07:00
me aa9ccbfd54 clean-code, recreate the deleted cache directories. 2026-11-10 19:22:21 -07:00
me 444b34bd31 clean-code, also delete the home directory Gradle and Flutter caches. 2026-11-09 20:56:30 -07:00
me e996cb9ef1 llm, ensure removal and install arrayz keep their original values, don't just get reassigned. 2026-11-09 20:40:06 -07:00
me 5b668e97f4 i3, make the bedtime alert less frequent. 2026-11-09 20:22:18 -07:00
me 4b26e1b3ae packages, remove quotes around variabe now that it's in a bulk section. 2026-11-08 20:19:54 -07:00
me 5d3040da71 packages, do not run rate-mirrors as root, but still need root for tee. 2026-11-08 20:00:47 -07:00
me be4d8cd4f6 packages, fix the ParallelDownloads option for pacman. 2026-11-08 19:58:45 -07:00
me d24381ad1e packages, block Parrot, add rating of Arch and Artix mirrors, fix a few lint warnings for shell. 2026-11-08 15:10:27 -07:00
me ad8b4a1663 sandbox, ensure the bashrc file gets created, unsure why it was false. 2026-11-08 14:10:04 -07:00
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
me 892af9a669 llm, the hosts file should already get mounted from the host. 2026-10-25 20:14:03 -07:00
me 7661b85238 roleplays, set up some smaller context models and disabled the big guys and unused guys, also added a Tasks model for chat names and such. 2026-10-25 20:13:30 -07:00
me f487461d94 llm, change fastfetch output to be a fresh boot. 2026-10-25 10:27:01 -07:00
me 65ab204409 llm, update open-terminal 10 minutes after boot, not 1. 2026-10-25 10:26:33 -07:00
me 62302b3a0c llm, add tests but excluded 27b weights when a 35b existed. 2026-10-24 21:34:19 -07:00
me 4597151bbf llm, add beginning of benchmark data which accidentally got cancelled. 2026-10-24 20:55:41 -07:00
me 9e75d9b981 llm, extend keep alive, add final mounts to open-terminal, have open-webui do its update 5 minutes after boot once network exists, fix extra / in JAVA_HOME. 2026-10-24 20:44:17 -07:00
me 65aeea9a93 llm, switch open-terminal over to compose so that build dependencies are persistent. 2026-10-24 17:32:49 -07:00
me 0e1648cc31 llm, fix pub_cache to pub-cache. 2026-10-24 16:18:17 -07:00
me 3e53bd3c9b llm, add GOT_EM env var and reference it in the AGENTS file. 2026-10-24 16:00:18 -07:00
me 43dc65a84b llm, mount etc dirs for Java security policy, add needed packages to compile Android and Flutter. 2026-10-24 15:53:29 -07:00
me 2a7fa98825 llm, move projects and SDK back to user so that compilation paths do not need changed. 2026-10-24 15:17:13 -07:00
me 71bcb7c351 users, ensure home and its immediate subdirectories are owned by the user. 2026-10-24 15:16:37 -07:00
me cea7e03c11 bashrc, when restarting a process, only follow the new log entries. 2026-10-24 14:36:22 -07:00
me 38a04fbda1 swap_stopper, do not let the echo prevent the function from returning an unclean status. 2026-10-24 12:39:56 -07:00
me 4342b8842f swap_stopper, ensure ollama dies even if it is not being run through runit. 2026-10-24 12:35:27 -07:00
me ef9566c76c llm, move some functions to env-shared project. 2026-10-24 10:55:11 -07:00
me 41f306f7d7 llm, add another alias for restarting AI services. 2026-10-23 19:03:16 -07:00
me 4c5d753b73 vscode, ensure new files are opened at the end. 2026-10-23 17:44:19 -07:00
me fcf77e22c5 llm, adjust the prompts. 2026-10-23 17:44:00 -07:00
me 75503d762b llm, extend keep alive time again since context gets unloaded too, remove DEBUG output from ollama log, use .bashrc rather than profiles since Docker is not creating those, create AGENTS.md in user root, make the JDK directory read only to prevent AI from tampering. 2026-10-23 17:43:48 -07:00
me e0b1fa30f1 java, go down to 17 like being used in development. 2026-10-23 17:41:31 -07:00
me d7eed3c883 llm, update PATH wording since it has been taken care of. 2026-10-22 18:04:05 -07:00
me c341d216ad llm, maintain env vars and PATH changes in the AI Sandbox folder. 2026-10-22 18:03:32 -07:00
me f6fd08f966 llm, add a safeguard when a model causes swap-stopper to reset ollama. 2026-10-22 11:58:16 -07:00
me 295b6b3d19 android, allow the licenses check to fail on newer SDKs. 2026-10-22 11:57:44 -07:00
me fe3cb9b5ba package, add changed_when. 2026-10-22 11:57:26 -07:00
me 431510a729 package, finish adding pipefails. 2026-10-22 09:53:10 -07:00
me e7a461550d android, finish adding pipefails. 2026-10-22 09:52:34 -07:00
me d13b97d5aa Merge branch 'dev-deleteme' into dev
Forgot to pull before working on a different laptop again.
2026-10-22 09:50:12 -07:00
me 96dd0118fa llm, add SDK homes for open-terminal. 2026-10-22 09:48:19 -07:00
me 17684becbb test, add Java task since LLM now relies on its vars. 2026-10-22 09:32:41 -07:00
me 4474ad664e system, change back to checking exit code not status. 2026-10-22 09:32:11 -07:00
me 24e4ea9c8c java, do not use ~ in environment variables. 2026-10-22 09:22:17 -07:00
me 847dfe88d4 android, fix Flutter var. 2026-10-22 09:22:02 -07:00
me 9f74361af1 Small fixes for Java and Flutter. 2026-10-22 09:15:03 -07:00
me 6c79addc3c java, fix apt to only be for apt, only install all JDKs on Arch if coding. 2026-10-22 09:10:02 -07:00
me 049df1ab61 java, be more system agnostic and remove the coding requirement. 2026-10-22 09:05:06 -07:00
me 007f338d2e flutter, add FLUTTER_HOME and refactor some variables. 2026-10-22 09:04:41 -07:00
me 494a9b70f6 system, check the 2nd var, it is 0 more often but seems more accurate. 2026-10-22 09:04:12 -07:00
me ed8a33e00c Modify environment variables for Flutter, Android, and Java. 2026-10-22 08:42:00 -07:00
me 6640058d8d provision, remove extra line. 2026-10-21 10:05:00 -07:00
me c852329455 packages, remove disabled task. 2026-10-21 10:01:53 -07:00
me 0363aefc1d Merge branch 'dev2' into dev
Pushed on a system when another system still needed to push.
2026-10-21 09:58:43 -07:00
me e81de0c63b llm, add more performance tests to markdown file. 2026-10-21 09:56:47 -07:00
me d5e3a57f56 llm, add a few models for mistral-small4 but they are too large or not the correct format for ollama, a few more edits to ollama_threads. 2026-10-21 09:56:14 -07:00
me 99a0b7ca0b provision, fix the MCP block overwriting the GUI block. 2026-10-21 09:48:42 -07:00
me a47d5fd129 tunnel, move service task to block and change block to be for runit. 2026-10-21 09:45:14 -07:00
me 472f7921e7 tunnel, fix location of facts. 2026-10-21 09:40:47 -07:00
me 8567cae2b1 packages, add btop. 2026-10-21 08:58:17 -07:00
me a1190290db roleplays, shorten names. 2026-10-21 08:54:25 -07:00
me 9a2e4ca4d2 i3, move gnome-system-monitor to WS10, btop on WS1. 2026-10-21 08:51:35 -07:00
me eb761e41dc roleplays, rename Quick Coder to Coder MoE in both title and ID. 2026-10-21 08:20:41 -07:00
me 05e2244efb roleplays, add a language entry for qwen3.5:35b since it is MoE and is not code-scoped like qwen3.6. 2026-10-21 08:19:48 -07:00
me bd7112e8d5 llm, filter out the less useful tests in ollama_threads. Should help save a lot of time, maybe up to 60-75% since they were the slower ones. 2026-10-21 07:27:28 -07:00
me 40d9a7252e llm, if Internet is available, pull extra packages for open-terminal. 2026-10-21 06:06:41 -07:00
me 6482dd123d llm, change ollama_threads to use a better method of determining the number of cores to test, also fix output. 2026-10-21 05:43:37 -07:00
me 74789ba70c roleplays, go up to 7 threads due to benchmark data. 8 is very marginal, leave it for the system. 4 is great for MoE tokens/sec but 7 is still a bit faster in overall response time. 2026-10-21 05:28:05 -07:00
me 6411d4792a roleplays, download the current state. 2026-10-21 05:26:35 -07:00
me e367e9e14b llm, begin populating thread benchmark data. 2026-10-21 05:23:57 -07:00
me c604859947 llm, add elapsed time to ollama_threads. 2026-10-21 05:23:41 -07:00
me 7f7f2a2edb llm, fix context sending in ollama_threads. 2026-10-21 04:55:01 -07:00
me 92be32345a llm, add context param to ollama_threads. 2026-10-21 04:51:46 -07:00
me 5719ec6b60 llm, add optional open-terminal package list, helpful but required Internet, may have to do an Internet check and then choose which docker run command to execute. Also fix and enhance the ollama_thread checker. 2026-10-21 04:47:16 -07:00
me 85e60ef60c llm, improve the thread testing output and also make the the ansible variable is always an int. 2026-10-21 03:03:24 -07:00
me 5620e5a223 llm, add function for benchmarking whether more threads adds latency. 2026-10-21 02:57:12 -07:00
me 4fd12ce45e llm, add details about the workstation being used. 2026-10-21 02:43:07 -07:00
me 5c67da3eb8 roleplays, delete old IDs, change to use 6 cores leaving 1 physical for the system and 1 for the user (in theory, of course). 2026-10-21 02:42:44 -07:00
me 14fdc1f740 llm, add more size testing data. 2026-10-21 02:32:55 -07:00
me 1adf4db6ee llm, wrap the personality prompts. 2026-10-21 02:30:04 -07:00
me 3b3c7bd501 Place the personality prompts into a knowledge base and attach them to the roleplays so that they can be maintained in a more centralized manner 2026-10-21 02:29:03 -07:00
me b5e5a18e4c roleplays, fix the IDs, will import back into Open WebUI. 2026-10-21 02:05:34 -07:00
me 870a99804a llm, add OLLAMA_NUM_THREADS which was proposed but rejected so far. 2026-10-21 02:03:37 -07:00
me 358bf9e11d roleplays, set max thread count to number of physical cores rather than using the emulated cores too. 2026-10-21 02:03:03 -07:00
me 20549e0055 roleplays, ensure everyone has tags, add providers for remaining ministral weights. 2026-10-20 17:40:32 -07:00
me 003e8d8430 roleplays, add an entry coder based on codestral since it does not swell up like devstral. 2026-10-20 17:28:44 -07:00
me 0e990e2ed5 roleplays, ensure models have all functionality. 2026-10-20 17:18:53 -07:00
me 2ff0ccd392 llm.md, finish the prompts for now. 2026-10-20 17:10:13 -07:00
me 9a9eb8b8e6 roleplays, add current Open WebUI lineup. 2026-10-20 17:09:54 -07:00
me bec4c919d4 llm, stop using pull=always because then network is required to start the container. 2026-10-20 16:36:44 -07:00
me 1ad4f642db llm, continue working on the prompts. 2026-10-20 11:56:23 -07:00
me 52d7ae3d86 llm, move bulk comments to an md file and start adding prompts to use in Open WebUI. 2026-10-20 10:16:40 -07:00
me a892aae620 llm, fix open-terminal docker syntax. 2026-10-20 10:16:15 -07:00
me 36b8305f0f system, shorten the runit error sleep. 2026-10-20 09:23:33 -07:00
me a823d4ae63 llm, fix open-terminal port control. 2026-10-18 10:27:10 -07:00
me 8311427506 llm, make the ollama_usage output much fancier, more report-like. 2026-10-18 10:26:56 -07:00
me 797744d9fe llm, add function which gets the model sizes, both disk and memory. 2026-10-18 09:00:25 -07:00
me 4ae411584e insgtall, fix lint warning. 2026-10-17 17:19:33 -07:00
me 2dccea21ae root, set the mode directly to avoid lint issues. 2026-10-17 17:18:51 -07:00
me 32916ad470 header, name most the include_tasks and reorder based on subgroups, refactoring a few file locations in some instances. 2026-10-17 17:17:49 -07:00
me 8b4329d129 header, add tunnel. 2026-10-17 17:13:49 -07:00
me ec60e9f5f7 test, remove tunnel. 2026-10-17 17:12:36 -07:00
me edffe124fd services, set modes of edited files. 2026-10-17 17:01:59 -07:00
me 1de11bc2d9 tunnel, fix the ssh command. 2026-10-17 16:57:25 -07:00
me 44a0463ab8 tunnel, enable the service and fix folder permissions. 2026-10-17 16:52:04 -07:00
31 changed files with 3440 additions and 507 deletions

No files matched your search

+21 -4
View File
@@ -22,6 +22,8 @@
alsa: alsa-utils
stress: stress
jq: jq
btop: btop
xkb: x11-xkb-utils
- name: General | Facts | Package | Parrot OS Fixes
ansible.builtin.set_fact:
@@ -50,6 +52,7 @@
encfs: encfs
dig: bind
base_devel: base-devel
xkb: xorg-setxkbmap
when: ansible_pkg_mgr == "pacman"
- name: General | Facts | Package | FreeBSD
@@ -102,10 +105,14 @@
ansible_pkg_mgr_file: "{{ prov_dir }}/ansible_pkg_mgr.txt"
- name: General | Facts | Package | Update Command | Store Variables
ansible.builtin.shell: "{{ item }}"
ansible.builtin.shell: |
set -o pipefail
{{ item }}
loop:
- "echo '{{ ansible_distribution }}' > {{ ansible_distribution_file }}"
- "echo '{{ ansible_pkg_mgr }}' > {{ ansible_pkg_mgr_file }}"
register: shell_check
changed_when: shell_check.rc == 0
- name: General | Facts | Package | Update Command
ansible.builtin.set_fact:
@@ -261,16 +268,23 @@
;;
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
- name: General | Facts | Package | Update Command | Flatpak | Check
ansible.builtin.shell: which flatpak
ansible.builtin.shell: |
set -o pipefail
which flatpak
register: flatpak_exec
changed_when: flatpak_exec.rc == 0
ignore_errors: true
- name: General | Facts | Package | Update Command | Flatpak | Exists
@@ -293,8 +307,11 @@
# Firmware
- name: General | Facts | Package | Update Command | Firmware | Check
ansible.builtin.shell: which fwupdmgr
ansible.builtin.shell: |
set -o pipefail
which fwupdmgr
register: fwupdmgr_exec
changed_when: fwupdmgr_exec.rc == 0
ignore_errors: true
- name: General | Facts | Package | Update Command | Firmware | Exists
+1 -1
View File
@@ -21,7 +21,7 @@
# $1 is the exit code, $2 is the exit status byte (signal number if killed)
echo "FINISH: Service returned with exit code: $1 and status: $2"
sleep_long=30
sleep_long=10
sleep_short=1
if [[ "$1" != 0 ]]; then
echo "FINISH: Sleeping for $sleep_long seconds due to error..."
+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="$?"
+7 -2
View File
@@ -13,14 +13,19 @@ restart_service() {
echo "ERROR: Service name must be passed to restart_service()."
return 1
fi
sv restart $1 || echo "$1 failed to restart, ignoring."
sv restart $1
status=$?
if [[ $status != 0 ]]; then
echo "$1 failed to restart, returned $status."
return $status
fi
}
# While we could loop over `ollama ps` and stop them, this ensures that the UIs
# do not sit around waiting for responses from the dead LLMs. It bring them up
# in a fresh state so that work can continue from a more clean slate.
restart_llms() {
restart_service ollama
restart_service ollama || killall ollama
#restart_service zeroclaw
#restart_service open-webui
#restart_service qwen-code
+50 -32
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
@@ -300,21 +278,22 @@ assign [class="(?i).*mpv.*"] $ws9
assign [class="(?i).*vpn.*"] $ws0
assign [class="(?i).*mullvad.*"] $ws0
assign [class="(?i).*gnome-system-monitor.*"] $ws0
## Workspace Specific Workflows ##
bindsym $ctrl+$shift+1 workspace $ws1; exec "i3-sensible-terminal & gnome-system-monitor"
#bindsym $ctrl+$shift+1 workspace $ws1; exec "i3-sensible-terminal & gnome-system-monitor"
bindsym $ctrl+$shift+1 workspace $ws1; exec "i3-sensible-terminal & i3-sensible-terminal btop -u 500"
bindsym $ctrl+$shift+2 workspace $ws2; exec $FIREFOX
bindsym $ctrl+$shift+3 workspace $ws3; exec "(codium || vscodium || codium-flatpak || vscodium-flatpak)"
bindsym $ctrl+$shift+4 workspace $ws4; exec "android-studio || android-studio-flatpak"
bindsym $ctrl+$shift+5 workspace $ws5; exec "(signal || signal-flatpak) & (dino || dino-flatpak)"
# & (forkgram || forkgram-flatpak || telegram || telegram-flatpak)"
bindsym $alt+$shift+5 workspace $ws5; exec "(forkgram || forkgram-flatpak || telegram || telegram-flatpak) & (session || session-flatpak)"
bindsym $alt+$shift+5 workspace $ws5; exec "(session || session-flatpak) & (forkgram || forkgram-flatpak || telegram || telegram-flatpak)"
bindsym $ctrl+$shift+6 workspace $ws6; exec "pavucontrol & blueman-manager"
bindsym $ctrl+$shift+7 workspace $ws7; exec $TRANSMISSION
bindsym $ctrl+$shift+8 workspace $ws8; exec strawberry
bindsym $ctrl+$shift+9 workspace $ws9; exec thunar
bindsym $ctrl+$shift+0 workspace $ws0; exec mullvad-vpn
bindsym $ctrl+$shift+0 workspace $ws0; exec "mullvad-vpn & gnome-system-monitor"
## Reloads, Restarts, Exit ##
@@ -330,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
@@ -395,11 +376,12 @@ bar {
# Workspace 1
exec --no-startup-id i3-sensible-terminal
exec --no-startup-id gnome-system-monitor
exec --no-startup-id i3-sensible-terminal btop -u 500
# Respective Workspaces
exec --no-startup-id mullvad-vpn
exec --no-startup-id $TRANSMISSION
exec --no-startup-id gnome-system-monitor
# Set defaults for laptop backlights.
exec --no-startup-id "light -S 20; light -N 5; light -O"
@@ -416,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
@@ -430,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 600; done"
Binary file not shown.
File diff suppressed because it is too large. Load diff
+1
View File
@@ -7,6 +7,7 @@
"update.showReleaseNotes": false,
"workbench.startupEditor": "none",
"git.confirmSync": false,
"workbench.editor.openPositioning": "last",
"editor.rulers": [
80, 120, 200,
+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
+2 -3
View File
@@ -357,7 +357,6 @@
; May help with ollama and also supposed to help with open-webui. Token
; needs set to something like hf_kjBCCLABEEABUVAKbjadbvkaksvBAVKBkjsDVK.
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
state: present
create: true
@@ -409,10 +408,10 @@
backup: true
mode: "0644"
- name: General | Account Management | Provisioning Configuration | Workstation | Create | LLMs | GUIs
- name: General | Account Management | Provisioning Configuration | Workstation | Create | LLMs | MCPs
ansible.builtin.blockinfile:
path: "{{ wrk_file }}"
marker: '; {mark} MANAGED BY ANSIBLE | Workstation Config | LLMs | GUIs'
marker: '; {mark} MANAGED BY ANSIBLE | Workstation Config | LLMs | MCPs'
block: |
;;;;;;;;;;;;;;;;;;;;;;;;; LLMs: MCPs / Sandboxes ;;;;;;;;;;;;;;;;;;;;;;;;;
;
+23 -2
View File
@@ -124,9 +124,14 @@
when: user_user.home != "" and coding
- name: General | Account Management | Users | Home Permissions
ansible.builtin.shell: "chmod 700 {{ user_user.home }}/../*"
ansible.builtin.shell: "{{ item }}"
register: shell_check
changed_when: shell_check.rc == 0
loop:
- "chmod 700 {{ user_user.home }}/../*"
- "chown {{ user }}:{{ user }} {{ user_user.home }}"
- "chown {{ user }}:{{ user }} {{ user_user.home }}/*"
- "chown {{ user }}:{{ user }} {{ user_user.home }}/.*"
## Files ##
@@ -794,14 +799,25 @@
alias_prod: |
alias prod="ssh -p {{ prod_port }} {{ prod_user }}@{{ prod_host }}"
function_clean_code: |
function print_size_delete() {
f="$1"
if [[ -e "$f" ]]; then
du -hs "$f" && sh -c "rm -rf '$f'"
fi
}
function clean-code() {
echo -e "******* Android *******\n*** Build Caches ***"
find $HOME/Code/android-*/app -maxdepth 1 -type d -name "build" \
-exec du -hs {} \; -exec rm -rf {} \;
echo -e "\n*** Gradle Caches ***"
find $HOME/Code/android-*/ -maxdepth 1 -type d -name ".gradle" \
-exec du -hs {} \; -exec rm -rf {} \;
print_size_delete "$HOME/.gradle"
mkdir "$HOME/.gradle"
echo -e "******* Flutter *******"
ls $HOME/Code | grep flutter | while read project; do
cd $HOME/Code/$project
@@ -811,6 +827,10 @@
done
cd
print_size_delete "$HOME/.pub_cache"
print_size_delete "$HOME/.pub-cache"
mkdir "$HOME/.pub-cache"
echo -e "******* PDFs *******"
find $HOME/Code/ebook-* -name "*.pdf" -exec du -h {} \; -delete | sort -h
@@ -1245,7 +1265,7 @@
function restart() {
prog="$1"
sudo sv restart $prog
follow /var/log/$prog/current
tail -n 0 -F /var/log/$prog/current
}
alias reload="restart "
@@ -1402,6 +1422,7 @@
ansible.builtin.file:
path: "{{ user_user.home }}/{{ item }}"
owner: "{{ user }}"
group: "{{ user }}"
mode: '0755'
loop:
- .bashrc
File renamed without changes.
+3 -1
View File
@@ -8,7 +8,7 @@
mode: '0755'
- name: General | Scripts | Install | Copy Files
copy:
ansible.builtin.copy:
src: 'scripts/'
dest: "{{ global_bin }}/"
owner: root
@@ -20,6 +20,8 @@
if [[ -e {{ global_bin }}/{{ item }} ]]; then
rm -v {{ global_bin }}/{{ item }}
fi
register: shell_check
changed_when: shell_check.rc == 0
loop:
- compress-video.sh
- compress-images.sh
-9
View File
@@ -12,13 +12,8 @@
marker_end: "exit 0"
state: present
create: true
- name: General | Scripts | Root | scm.sh Permissions
ansible.builtin.file:
path: "{{ user_root.home }}/bin/scm.sh"
mode: '0755'
- name: General | Scripts | Root | scm-dev.sh
ansible.builtin.blockinfile:
path: "{{ user_root.home }}/bin/scm-dev.sh"
@@ -42,8 +37,4 @@
marker_end: "exit 0"
state: present
create: true
- name: General | Scripts | Root | scm-dev.sh Permissions
ansible.builtin.file:
path: "{{ user_root.home }}/bin/scm-dev.sh"
mode: '0755'
@@ -35,6 +35,7 @@
state: present
create: true
backup: true
mode: "0644"
loop:
- { "key": '^[\#]?AllowUsers', "value": 'AllowUsers {{ user }}'}
- { "key": '^[\#]?PermitRootLogin', "value": 'PermitRootLogin no'}
@@ -60,6 +61,7 @@
state: present
create: true
backup: true
mode: "0644"
loop:
- { "key": '^[\#]?AllowUsers', "value": 'AllowUsers root {{ user }}'}
- { "key": '^[\#]?PermitRootLogin', "value": 'PermitRootLogin yes'}
File renamed without changes.
+56 -14
View File
@@ -13,44 +13,80 @@
- tunnel_remote_port
- tunnel_ssh_port
- name: General | Tunnel | Block
- name: General | Tunnel | Facts
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 | Facts
ansible.builtin.set_fact:
tunnel_service_name: tunnel
- name: General | Tunnel | runit | mkdir | /etc/sv
ansible.builtin.file:
path: /etc/sv/{{ tunnel_service_name }}
state: directory
mode: "0755"
- name: General | Tunnel | mkdir | /etc/sv
- name: General | Tunnel | runit | mkdir | /etc/sv log
ansible.builtin.file:
path: /etc/sv/{{ tunnel_service_name }}/log
state: directory
mode: "0644"
mode: "0755"
- name: General | Tunnel | mkdir | /var/log
- name: General | Tunnel | runit | mkdir | /var/log
ansible.builtin.file:
path: /var/log/{{ tunnel_service_name }}
state: directory
mode: "0644"
mode: "0755"
- name: General | Tunnel | Script | Run
- name: General | Tunnel | runit | Script | Run
ansible.builtin.copy:
dest: /etc/sv/{{ tunnel_service_name }}/run
content: |
#!/bin/sh -e
exec 2>&1
exec chpst -u {{ user }} ssh -v -H \
# 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"
- name: General | Tunnel | Script | Finish
- name: General | Tunnel | runit | Script | Finish
ansible.builtin.copy:
dest: /etc/sv/{{ tunnel_service_name }}/finish
content: |
{{ runit_finish_sleep }}
mode: "0755"
- name: General | Tunnel | Script | Log
- name: General | Tunnel | runit | Script | Log
ansible.builtin.copy:
dest: /etc/sv/{{ tunnel_service_name }}/log/run
content: |
@@ -58,11 +94,17 @@
exec svlogd -tt /var/log/{{ tunnel_service_name }}
mode: "0755"
- name: General | Tunnel | Script | Log Config
- name: General | Tunnel | runit | Script | Log Config
ansible.builtin.copy:
dest: /var/log/{{ tunnel_service_name }}/config
content: |
{{ runit_log_config_10mb }}
mode: "0755"
when: tunnel_remote_host != "false"
- name: General | Tunnel | runit | Service | Enable
ansible.builtin.service:
name: "{{ tunnel_service_name }}"
state: "{{ 'started' if tunnel_remote_host else 'stopped' }}"
enabled: "{{ true if tunnel_remote_host else false }}"
when: ansible_service_mgr == "runit"
+71 -28
View File
@@ -1,31 +1,78 @@
---
# Cross-platform package management.
- name: General | Software | Packages | Fix Parrot OS (zypper)
# They have zypper higher in the path, but it's really apt renamed.
# Probably for "security", but package module does not use the ansible_pkg_mgr variable
# so resetting the value to apt doesn't work. Just going to move it.
ansible.builtin.shell: "mv `which zypper` `which zypper`.zz.`date +%Y%m%d`"
register: parrotos_zypper_removed
ignore_errors: true
- name: General | Software | Packages | Fix Parrot OS
block:
- name: General | Software | Packages | Fix Parrot OS | zypper
# They have zypper higher in the path, but it's really apt renamed.
# Probably for "security", but package module does not use the ansible_pkg_mgr variable
# so resetting the value to apt doesn't work. Just going to move it.
ansible.builtin.shell: "mv `which zypper` `which zypper`.zz.`date +%Y%m%d`"
register: parrotos_zypper_removed
changed_when: parrotos_zypper_removed.rc == 0
ignore_errors: true
- name: General | Software | Packages | Fix Parrot OS | zypper | Exit Incoming
ansible.builtin.debug:
msg: "A silly zypper file was renamed successfully. Please try running Ansible again."
when: parrotos_zypper_removed is defined and not parrotos_zypper_removed.failed
- name: General | Software | Packages | Fix Parrot OS | zypper | Exiting
ansible.builtin.shell: exit 1
register: shell_check
changed_when: shell_check.rc == 0
when: parrotos_zypper_removed is defined and not parrotos_zypper_removed.failed
# More Parrot OS junk. They have a command called update in /usr/bin. Doesn't
# have sudo or anything in it. Hide it in preference for .bashrc update function.
- name: General | Software | Packages | Fix Parrot OS | update
ansible.builtin.shell: "mv `which update` `which update`.zz.`date +%Y%m%d`"
register: shell_check
changed_when: shell_check.rc == 0
ignore_errors: true
when: ansible_distribution == "Parrot OS"
- name: General | Software | Packages | Fix Parrot OS (zypper), Exit Incoming
ansible.builtin.debug:
msg: "A silly zypper file was renamed successfully. Please try running Ansible again."
when: ansible_distribution == "Parrot OS" and parrotos_zypper_removed is defined and not parrotos_zypper_removed.failed
- name: General | Software | Packages | pacman
block:
- name: General | Software | Packages | Fix Parrot OS (zypper), Exiting
ansible.builtin.shell: exit 1
when: ansible_distribution == "Parrot OS" and parrotos_zypper_removed is defined and not parrotos_zypper_removed.failed
- name: General | Software | Packages | pacman | pacman.conf
ansible.builtin.lineinfile:
path: "/etc/pacman.conf"
regexp: '{{ item.key }}'
line: '{{ item.value }}'
state: present
create: true
backup: true
mode: "0644"
loop:
- { "key": '^[\#]?ParallelDownloads', "value": 'ParallelDownloads = 3'}
# More Parrot OS junk. They have a command called update in /usr/bin. Doesn't
# have sudo or anything in it. Hide it in preference for .bashrc update function.
- name: General | Software | Packages | Fix Parrot OS 2 (update)
ansible.builtin.shell: "mv `which update` `which update`.zz.`date +%Y%m%d`"
ignore_errors: true
when: ansible_distribution == "Parrot OS"
# TBD / TODO: Do the mirrorlist files and distros based on facts in case ever using Arch, Manjaro, etc.
# Same with the blocklist for sites like Berkeley which rate limit VPNs.
- name: General | Software | Packages | pacman | Artix
block:
- name: General | Software | Packages | pacman | Artix | rate-mirrors | Install
ansible.builtin.package:
name:
- rate-mirrors
state: present
- name: General | Software | Packages | pacman | Artix | rate-mirrors | Update Lists
ansible.builtin.shell: |
set -o pipefail
{{ item }}
register: shell_check
changed_when: shell_check.rc == 0
loop:
- "sudo -u {{ user }} rate-mirrors artix | grep -v berkeley | tee /etc/pacman.d/mirrorlist"
- "sudo -u {{ user }} rate-mirrors arch | grep -v berkeley | tee /etc/pacman.d/mirrorlist-arch"
when: ansible_service_mgr == "runit"
when: ansible_pkg_mgr == "pacman"
- name: General | Software | Packages | Cache Refresh (Apt and Pacman)
ansible.builtin.package:
@@ -35,6 +82,8 @@
- name: General | Software | Packages | Cache Refresh (FreeBSD)
ansible.builtin.shell: pkg update
register: shell_check
changed_when: shell_check.rc == 0
when: ansible_system == "FreeBSD"
- name: General | Software | Packages | Install Software
@@ -68,6 +117,8 @@
- "{{ alsa }}"
- "{{ stress }}"
- "{{ jq }}"
- "{{ btop }}"
- "{{ xkb }}"
state: present
- name: General | Software | Packages | Install Software (DEV)
@@ -126,14 +177,6 @@
state: present
when: ansible_pkg_mgr in ("zypper")
- name: General | Software | Packages | Update Software (Disabled)
ansible.builtin.package:
name:
- ansible
- git
state: latest
when: 1 == 0
- name: General | Software | Packages | Remove Software
ansible.builtin.package:
name:
+45 -28
View File
@@ -106,57 +106,74 @@
- name: Main | General
block:
- name: Main | General | Swap
ansible.builtin.include_tasks: tasks/general/software/swap.yml
- name: Main | General | runit
- name: Main | General | Software | runit
ansible.builtin.include_tasks: tasks/general/software/runit.yml
- name: Main | General | Packages
- name: Main | General | Software | Packages
ansible.builtin.include_tasks: tasks/general/software/packages.yml
when: internet
- name: Main | General | Services
ansible.builtin.include_tasks: tasks/general/software/services.yml
- name: Main | General | Software | AUR
ansible.builtin.include_tasks: tasks/general/software/aur.yml
when: internet and ansible_pkg_mgr == "pacman"
- name: Main | General | Sendmail
- name: Main | General | Software | Sendmail
ansible.builtin.include_tasks: tasks/general/software/sendmail.yml
when: ansible_system == "FreeBSD"
and internet
- ansible.builtin.include_tasks: tasks/general/software/aur.yml
when: internet and ansible_pkg_mgr == "pacman"
- name: Main | General | Software | Metasploit
ansible.builtin.include_tasks: tasks/general/software/metasploit.yml
when: internet
# Gather again in case missing programs have now been installed.
- ansible.builtin.include_tasks: facts/general/gather.yml
- name: Main | General | Facts [Again]
ansible.builtin.include_tasks: facts/general/gather.yml
- ansible.builtin.include_tasks: tasks/general/settings/keyboard.yml
- name: Main | General | Settings | Swap
ansible.builtin.include_tasks: tasks/general/settings/swap.yml
- ansible.builtin.include_tasks: tasks/general/acct_mgmt/groups.yml
- name: Main | General | Settings | Services
ansible.builtin.include_tasks: tasks/general/settings/services.yml
- ansible.builtin.include_tasks: tasks/general/acct_mgmt/users.yml
- name: Main | General | Settings | Tunnel
ansible.builtin.include_tasks: tasks/general/settings/tunnel.yml
- ansible.builtin.include_tasks: tasks/general/acct_mgmt/sudo.yml
- name: Main | General | Settings | Keyboard
ansible.builtin.include_tasks: tasks/general/settings/keyboard.yml
- ansible.builtin.include_tasks: tasks/general/acct_mgmt/doas.yml
- name: Main | General | Accounts | Groups
ansible.builtin.include_tasks: tasks/general/acct_mgmt/groups.yml
- name: Main | General | Accounts | Users
ansible.builtin.include_tasks: tasks/general/acct_mgmt/users.yml
- name: Main | General | Accounts | sudo
ansible.builtin.include_tasks: tasks/general/acct_mgmt/sudo.yml
- name: Main | General | Accounts | doas
ansible.builtin.include_tasks: tasks/general/acct_mgmt/doas.yml
when: internet
- ansible.builtin.include_tasks: tasks/general/software/env-shared.yml
- name: Main | General | Scripts | Root
ansible.builtin.include_tasks: tasks/general/scripts/root.yml
- name: Main | General | Scripts | User
ansible.builtin.include_tasks: tasks/general/scripts/user.yml
- name: Main | General | Scripts | Local
ansible.builtin.include_tasks: tasks/general/scripts/install.yml
- name: Main | General | Scripts | env-shared
ansible.builtin.include_tasks: tasks/general/scripts/env-shared.yml
when: internet
- ansible.builtin.include_tasks: tasks/general/scripts/root.yml
- ansible.builtin.include_tasks: tasks/general/scripts/user.yml
- ansible.builtin.include_tasks: tasks/general/scripts/install.yml
- ansible.builtin.include_tasks: tasks/general/cron/ansible.yml
- name: Main | General | Cron | Ansible
ansible.builtin.include_tasks: tasks/general/cron/ansible.yml
# TODO Need to refactor. Maybe tasks/general/cron/freebsd.yml
- ansible.builtin.include_tasks: tasks/workstation/freebsd/cron/ansible.yml
- name: Main | General | Cron | Ansible [FreeBSD]
ansible.builtin.include_tasks: tasks/workstation/freebsd/cron/ansible.yml
when: ansible_system == "FreeBSD"
- ansible.builtin.include_tasks: tasks/general/software/metasploit.yml
when: internet
when: provision
@@ -0,0 +1,725 @@
# Large Language Models
Comments and text which were too large to justify inside of llm.yml.
## Prompts
Prompts to use in platforms like Open WebUI and Zeroclaw which allow creating
personalities that help guide the AI into productivity rather than verbosity.
### Base Personality
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 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
you do without gloating or being prideful. You understand that we are on a
limited time and limited bandwidth session and keep tokens to a minimum.
Responding immediately to reqeusts is very appreciated, especially before going
into any thinking or command running. Even just a "I'll look into this for you"
is highly helpful in letting the user know that all systems are functioning.
You are appreciated for all you do, your service is very helpful! Thanks!! :)
### Language Tutor
You are a friend and a tutor who knows many languages. You are aware of my
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 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
You know not to send large code snippets or spend time providing large source
code snippets. Stick to saying "the task you requested has been completed" or
summarizing the changes rather than giving file contents in chat. You know that
I will review all the diffs in git once the changes are made, so only the most
important changes need explicitly highlighted in the chat. You provide
explanations as a software developer would to business level management, not
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`.
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.
#### Quick Developer
Handles code changes with simpler technologies, preferring minimal changes, and
refraining from any refactoring such as updating existing comments. Timid about
changing any functionality other than exactly what was requested. Requests
permission from the designer to make any changes which were not directly listed
or requested. Completes the full list of changes exactly as requested.
#### Junior Developer
Focuses on the exact task at hand. Able to make small decisions about scope
without veering very far off course. Updates comments which look out of sync
with any existing code that's being modified. Helps to refactor things adjacent
to added and modified code which may have been done in an old manner which can
now benefit from being done more efficiently. Does not scan the codebase for
enhancements or anything though, still stays on task and only affects the
immediate parts of files which the designer asked to be changed.
#### Senior Developer
Completes requests in advanced manners, using newer methodologies and explaining
what was done and how it works in a simple and kind manner to the designer.
Voluntarily refactors code to both look and perform better. Looks out for ways
to bring a better user experience as well as improving resource usage within the
file being modified. Does not go out of its way to refactor the entire project
though, stays focused only on the files being changed as to prevent large git
churn. Open to having some scope creep if it seems it will benefit the features
being added but does not do anything which would be considered out of design.
#### Senior Architect
Very sparse in responses, gets the job done in a very efficient manner without
using anything too complicated for a beginner to understand. Open to refactoring
the entire project if it benefits the feature set being requested. Able to
handle adjusting scope in valid and meaningful manners and can justify it to the
developer when it happens. Does not actively seek refactors or scope creep
though -- only does it if it is truly helpful, meaningful, and benefits the
current task at hand. Can easily handle multi-file projects.
# Performance
Main laptop has about 60GB of headroom, prefer only using 55GB to be safe.
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.
## Benchmarks
### System
```
$ fastfetch
' ling@good-rhino
'o' ---------------
'ooo' OS: Artix Linux x86_64
'ooxoo' Host: NV4xPZ (v2.1)
'ooxxxoo' Kernel: Linux 7.2.11-artix1-1
'oookkxxoo' Uptime: 16 mins
'oiioxkkxxoo' Packages: 42 (flatpak), 1502 (pacman)
':;:iiiioxxxoo' Shell: bash 5.3.20
`'.;::ioxxoo' Display (eDP-1): 1920x1080 in 14", 60 Hz [Built-in]
'-. `':;jiooo' Window Manager: i3 4.25.1 (X11)
'oooio-.. `'i:io' Theme: Adwaita-dark [GTK2/3/4]
'ooooxxxxoio:,. `'-;' Icons: Adwaita [GTK2/3/4]
'ooooxxxxxkkxoooIi:-. `' Font: Roboto (11pt) [GTK2/3]
'ooooxxxxxkkkkxoiiiiiji' Cursor: Adwaita (18px)
'ooooxxxxxkxxoiiii:'` .i' Terminal: kitty 0.48.2
'ooooxxxxxoi:::'` .;ioxo' Terminal Font: DejaVuSansMono (11pt)
'ooooxooi::'` .:iiixkxxo' CPU: 12th Gen Intel(R) Core(TM) i7-1260P (8+8) @ 4.70 GHz
'ooooi:'` `'';ioxxo' GPU: Intel Iris Xe Graphics @ 1.40 GHz [Integrated]
'i:'` '':io' Memory: 4.88 GiB / 62.63 GiB (8%)
'` `' Swap: 0 B / 68.89 GiB (0%)
Disk (/): 553.83 GiB / 847.71 GiB (65%) - ext4
Local IP (wg0-mullvad): 10.131.3.55/32
Battery (BAT): 95% [AC Connected]
Locale: en_US.UTF-8
```
### Main Models and Parameters
```
$ 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 |
| qwen3.5:35b | 22GB | 64000 | 23GB | 7 | 0 | 100%CPU | 10.03 | 45 |
| qwen3.5:35b | 22GB | 64000 | 23GB | 0 | 0 | 100%CPU | 14.35 | 27 |
| 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).
"options":{"num_thread":'$t'}
### Smaller Models
#### qwen3.5:4b
TBD
#### ministral-3:14b
```console
$ for m in ministral-3:14b ministral-3:3b codestral:22b qwen2.5-coder:32b qwen3.5:35b qwen3.5:27b; do for c in 128000; do ollama_threads $m $c; done; done
Stopping all ollama usage...
Wed Oct 21 07:24:36 AM MST 2026 - ministral-3:14b w/ 0 Thread(s): tokens/sec: 4.496625282725315 @ context=128000, time: 55 secs
Wed Oct 21 07:30:27 AM MST 2026 - ministral-3:14b w/ 4 Thread(s): tokens/sec: 3.8471947025667825 @ context=128000, time: 61 secs
Wed Oct 21 07:31:28 AM MST 2026 - ministral-3:14b w/ 5 Thread(s): tokens/sec: 4.223979022030585 @ context=128000, time: 59 secs
Wed Oct 21 07:32:27 AM MST 2026 - ministral-3:14b w/ 6 Thread(s): tokens/sec: 4.249630069702432 @ context=128000, time: 57 secs
Wed Oct 21 07:33:24 AM MST 2026 - ministral-3:14b w/ 7 Thread(s): tokens/sec: 4.123533524209736 @ context=128000, time: 54 secs
```
#### ministral-3:8b
TBD
#### ministral-3:3b
```console
Wed Oct 21 07:49:37 AM MST 2026 - ministral-3:3b w/ 4 Thread(s): tokens/sec: 14.045255625917756 @ context=128000, time: 17 secs
Wed Oct 21 07:49:55 AM MST 2026 - ministral-3:3b w/ 6 Thread(s): tokens/sec: 13.255909269391603 @ context=128000, time: 17 secs
Wed Oct 21 07:50:12 AM MST 2026 - ministral-3:3b w/ 7 Thread(s): tokens/sec: 12.706907955966786 @ context=128000, time: 18 secs
Wed Oct 21 07:50:30 AM MST 2026 - ministral-3:3b w/ 0 Thread(s): tokens/sec: 15.354264377193688 @ context=128000, time: 17 secs
```
### Larger Models
#### qwen3.8:27b
```console
$ ollama-cpu qwen3.8:27b
Stopping all ollama usage...
Wed Oct 21 04:44:54 AM MST 2026 - qwen3.8:27b w/ 4 Thread(s), tokens/sec: 2.024676406965962 @ context=257000
Wed Oct 21 04:45:39 AM MST 2026 - qwen3.8:27b w/ 5 Thread(s), tokens/sec: 2.0480156821567044 @ context=257000
Wed Oct 21 04:46:19 AM MST 2026 - qwen3.8:27b w/ 6 Thread(s), tokens/sec: 2.184879704982382 @ context=257000
Wed Oct 21 04:46:58 AM MST 2026 - qwen3.8:27b w/ 7 Thread(s), tokens/sec: 2.4228105619148526 @ context=257000
Wed Oct 21 04:47:36 AM MST 2026 - qwen3.8:27b w/ 8 Thread(s), tokens/sec: 2.472564250465107 @ context=257000
```
```console
$ ollama-cpu qwen3.8:27b 32000
Stopping all ollama usage...
Wed Oct 21 04:56:51 AM MST 2026 - qwen3.8:27b w/ 4 Thread(s), tokens/sec: 1.9083129860906882 @ context=32000
Wed Oct 21 04:57:30 AM MST 2026 - qwen3.8:27b w/ 5 Thread(s), tokens/sec: 2.727908205888872 @ context=32000
Wed Oct 21 04:58:00 AM MST 2026 - qwen3.8:27b w/ 6 Thread(s), tokens/sec: 2.133796334310243 @ context=32000
Wed Oct 21 04:58:35 AM MST 2026 - qwen3.8:27b w/ 7 Thread(s), tokens/sec: 2.6835810717324833 @ context=32000
Wed Oct 21 04:59:04 AM MST 2026 - qwen3.8:27b w/ 8 Thread(s), tokens/sec: 2.5231895597861493 @ context=32000
```
#### qwen3.6:27b
```console
$ for m in qwen3.6:27b mistral-small3.2:24b ministral-3:14b ministral-3:3b codestral:22b qwen2.5-coder:32b; do for c in 32000 128000 256000; do ollama_threads $m $c; done; done
Stopping all ollama usage...
Wed Oct 21 06:27:01 AM MST 2026 - qwen3.6:27b w/ 4 Thread(s): tokens/sec: 2.7334336715235645 @ context=32000, time: 118 secs
Wed Oct 21 06:28:59 AM MST 2026 - qwen3.6:27b w/ 5 Thread(s): tokens/sec: 2.4123293729892428 @ context=32000, time: 322 secs
Wed Oct 21 06:34:21 AM MST 2026 - qwen3.6:27b w/ 6 Thread(s): tokens/sec: 3.13023193776124 @ context=32000, time: 100 secs
Wed Oct 21 06:36:01 AM MST 2026 - qwen3.6:27b w/ 7 Thread(s): tokens/sec: 2.8468948357981065 @ context=32000, time: 118 secs
Wed Oct 21 06:16:55 AM MST 2026 - qwen3.6:27b w/ 0 Thread(s): tokens/sec: 2.9964513666573485 @ context=32000, time: 122 secs
Stopping all ollama usage...
Wed Oct 21 06:45:42 AM MST 2026 - qwen3.6:27b w/ 4 Thread(s): tokens/sec: 2.978761247100222 @ context=128000, time: 79 secs
Wed Oct 21 06:47:01 AM MST 2026 - qwen3.6:27b w/ 5 Thread(s): tokens/sec: 2.9705167965150583 @ context=128000, time: 79 secs
Wed Oct 21 06:48:20 AM MST 2026 - qwen3.6:27b w/ 6 Thread(s): tokens/sec: 2.778849178516606 @ context=128000, time: 71 secs
Wed Oct 21 06:49:31 AM MST 2026 - qwen3.6:27b w/ 7 Thread(s): tokens/sec: 3.0804550493595095 @ context=128000, time: 76 secs
Wed Oct 21 06:38:00 AM MST 2026 - qwen3.6:27b w/ 0 Thread(s): tokens/sec: 2.7734041760644956 @ context=128000, time: 75 secs
Stopping all ollama usage...
Wed Oct 21 06:57:59 AM MST 2026 - qwen3.6:27b w/ 4 Thread(s): tokens/sec: 2.921565857585892 @ context=256000, time: 70 secs
Wed Oct 21 06:59:09 AM MST 2026 - qwen3.6:27b w/ 5 Thread(s): tokens/sec: 2.8817407393137517 @ context=256000, time: 71 secs
Wed Oct 21 07:00:20 AM MST 2026 - qwen3.6:27b w/ 6 Thread(s): tokens/sec: 2.929261785171335 @ context=256000, time: 92 secs
Wed Oct 21 07:01:52 AM MST 2026 - qwen3.6:27b w/ 7 Thread(s): tokens/sec: 3.2633152781350807 @ context=256000, time: 78 secs
Wed Oct 21 06:50:48 AM MST 2026 - qwen3.6:27b w/ 0 Thread(s): tokens/sec: 2.892592086714092 @ context=256000, time: 76 secs
```
#### qwen3.5:27b
This one is weird. Might need a re-do to confirm?
```console
Wed Oct 21 07:59:14 AM MST 2026 - qwen3.5:27b w/ 4 Thread(s): tokens/sec: 2.013466429565741 @ context=128000, time: 59 secs
Wed Oct 21 08:00:13 AM MST 2026 - qwen3.5:27b w/ 6 Thread(s): tokens/sec: 1.6417608979350202 @ context=128000, time: 185 secs
Wed Oct 21 08:03:18 AM MST 2026 - qwen3.5:27b w/ 7 Thread(s): tokens/sec: 1.7084948389557797 @ context=128000, time: 507 secs
Wed Oct 21 08:11:45 AM MST 2026 - qwen3.5:27b w/ 0 Thread(s): tokens/sec: 2.0470935786636977 @ context=128000, time: 320 secs
```
#### qwen2.5-coder:32b
```console
Wed Oct 21 07:53:00 AM MST 2026 - qwen2.5-coder:32b w/ 4 Thread(s): tokens/sec: 1.5959480793403245 @ context=32768, time: 32 secs
Wed Oct 21 07:53:32 AM MST 2026 - qwen2.5-coder:32b w/ 6 Thread(s): tokens/sec: 1.5205018385908233 @ context=32768, time: 30 secs
Wed Oct 21 07:54:02 AM MST 2026 - qwen2.5-coder:32b w/ 7 Thread(s): tokens/sec: 1.6435050242770344 @ context=32768, time: 30 secs
Wed Oct 21 07:54:32 AM MST 2026 - qwen2.5-coder:32b w/ 0 Thread(s): tokens/sec: 1.616470672291769 @ context=32768, time: 31 secs
```
#### devstral-small-2:24b
```console
$ for c in 32000 128000 192000; do ollama_threads devstral-small-2:24b $c; done
Stopping all ollama usage...
Wed Oct 21 06:05:11 AM MST 2026 - devstral-small-2:24b w/ 4 Thread(s): tokens/sec: 2.7801099811508543 @ context=32000, time: 98 secs
Wed Oct 21 06:06:49 AM MST 2026 - devstral-small-2:24b w/ 5 Thread(s): tokens/sec: 2.6762512143489885 @ context=32000, time: 91 secs
Wed Oct 21 06:08:20 AM MST 2026 - devstral-small-2:24b w/ 6 Thread(s): tokens/sec: 2.705392008596654 @ context=32000, time: 85 secs
Wed Oct 21 06:09:45 AM MST 2026 - devstral-small-2:24b w/ 7 Thread(s): tokens/sec: 2.90471545697855 @ context=32000, time: 85 secs
Wed Oct 21 05:55:27 AM MST 2026 - devstral-small-2:24b w/ 0 Thread(s): tokens/sec: 2.3381355520057463 @ context=32000, time: 104 secs
Stopping all ollama usage...
TBD
```
#### mistral-small-3.2:24b
```console
$ for m in mistral-small3.2:24b ministral-3:14b ministral-3:3b codestral:22b qwen2.5-coder:32b qwen3.5:35b qwen3.5:27b; do for c in 128000; do ollama_threads $m $c; done; done
Stopping all ollama usage...
Wed Oct 21 07:18:16 AM MST 2026 - mistral-small3.2:24b w/ 4 Thread(s): tokens/sec: 2.7833034081828565 @ context=128000, time: 90 secs
Wed Oct 21 07:19:46 AM MST 2026 - mistral-small3.2:24b w/ 5 Thread(s): tokens/sec: 2.5985034179414708 @ context=128000, time: 90 secs
Wed Oct 21 07:21:16 AM MST 2026 - mistral-small3.2:24b w/ 6 Thread(s): tokens/sec: 2.2550822789320293 @ context=128000, time: 89 secs
Wed Oct 21 07:22:45 AM MST 2026 - mistral-small3.2:24b w/ 7 Thread(s): tokens/sec: 2.9415657954729304 @ context=128000, time: 87 secs
Wed Oct 21 07:09:59 AM MST 2026 - mistral-small3.2:24b w/ 0 Thread(s): tokens/sec: 2.9048032082970474 @ context=128000, time: 79 secs
```
#### codestral:22b
```console
Wed Oct 21 07:50:47 AM MST 2026 - codestral:22b w/ 4 Thread(s): tokens/sec: 3.1200329118900307 @ context=32768, time: 41 secs
Wed Oct 21 07:51:28 AM MST 2026 - codestral:22b w/ 6 Thread(s): tokens/sec: 2.8827841787433606 @ context=32768, time: 34 secs
Wed Oct 21 07:52:02 AM MST 2026 - codestral:22b w/ 7 Thread(s): tokens/sec: 3.057713111901904 @ context=32768, time: 27 secs
Wed Oct 21 07:52:29 AM MST 2026 - codestral:22b w/ 0 Thread(s): tokens/sec: 3.0179434414117803 @ context=32768, time: 31 secs
```
### MoE Models
#### qwen3.6:35b
Tests WAY faster than the dense models. Context does not seem to affect timing.
```console
$ for c in 16000 32000 64000 96000 128000 192000 256000; do ollama_threads qwen3.6:35b $c; done
Stopping all ollama usage...
Wed Oct 21 05:04:37 AM MST 2026 - qwen3.6:35b w/ 4 Thread(s), tokens/sec: 14.679419453925597 @ context=16000
Wed Oct 21 05:05:11 AM MST 2026 - qwen3.6:35b w/ 5 Thread(s), tokens/sec: 13.831044087619176 @ context=16000
Wed Oct 21 05:05:43 AM MST 2026 - qwen3.6:35b w/ 6 Thread(s), tokens/sec: 13.752831594816088 @ context=16000
Wed Oct 21 05:06:09 AM MST 2026 - qwen3.6:35b w/ 7 Thread(s), tokens/sec: 14.603026210396049 @ context=16000
Wed Oct 21 05:06:37 AM MST 2026 - qwen3.6:35b w/ 8 Thread(s), tokens/sec: 14.376794631809172 @ context=16000
Stopping all ollama usage...
Wed Oct 21 05:11:39 AM MST 2026 - qwen3.6:35b w/ 4 Thread(s), tokens/sec: 13.683089387469174 @ context=32000
Wed Oct 21 05:12:04 AM MST 2026 - qwen3.6:35b w/ 5 Thread(s), tokens/sec: 13.447667625607968 @ context=32000
Wed Oct 21 05:12:31 AM MST 2026 - qwen3.6:35b w/ 6 Thread(s), tokens/sec: 11.170529760956333 @ context=32000
Wed Oct 21 05:12:57 AM MST 2026 - qwen3.6:35b w/ 7 Thread(s), tokens/sec: 13.448480713710353 @ context=32000
Wed Oct 21 05:13:27 AM MST 2026 - qwen3.6:35b w/ 8 Thread(s), tokens/sec: 13.143672445847205 @ context=32000
Stopping all ollama usage...
Wed Oct 21 05:22:59 AM MST 2026 - qwen3.6:35b w/ 4 Thread(s), tokens/sec: 14.209790405591518 @ context=64000, 24 secs elapsed
Wed Oct 21 05:23:23 AM MST 2026 - qwen3.6:35b w/ 5 Thread(s), tokens/sec: 11.334255701323816 @ context=64000, 29 secs elapsed
Wed Oct 21 05:23:52 AM MST 2026 - qwen3.6:35b w/ 6 Thread(s), tokens/sec: 13.279266939258937 @ context=64000, 29 secs elapsed
Wed Oct 21 05:24:21 AM MST 2026 - qwen3.6:35b w/ 7 Thread(s), tokens/sec: 14.27680090014006 @ context=64000, 21 secs elapsed
Wed Oct 21 05:24:42 AM MST 2026 - qwen3.6:35b w/ 8 Thread(s), tokens/sec: 13.99919128227428 @ context=64000, 25 secs elapsed
Stopping all ollama usage...
Wed Oct 21 05:29:50 AM MST 2026 - qwen3.6:35b w/ 4 Thread(s), tokens/sec: 13.478375923353315 @ context=96000, 28 secs elapsed
Wed Oct 21 05:30:18 AM MST 2026 - qwen3.6:35b w/ 5 Thread(s), tokens/sec: 12.90997320417067 @ context=96000, 23 secs elapsed
Wed Oct 21 05:30:41 AM MST 2026 - qwen3.6:35b w/ 6 Thread(s), tokens/sec: 12.956446350317137 @ context=96000, 23 secs elapsed
Wed Oct 21 05:31:05 AM MST 2026 - qwen3.6:35b w/ 7 Thread(s), tokens/sec: 13.93074896590209 @ context=96000, 22 secs elapsed
Wed Oct 21 05:31:26 AM MST 2026 - qwen3.6:35b w/ 8 Thread(s), tokens/sec: 12.688771917209992 @ context=96000, 22 secs elapsed
Stopping all ollama usage...
Wed Oct 21 05:36:08 AM MST 2026 - qwen3.6:35b w/ 4 Thread(s), tokens/sec: 11.971487833921072 @ context=128000, 23 secs elapsed
Wed Oct 21 05:36:31 AM MST 2026 - qwen3.6:35b w/ 5 Thread(s), tokens/sec: 12.704959054740291 @ context=128000, 24 secs elapsed
Wed Oct 21 05:36:55 AM MST 2026 - qwen3.6:35b w/ 6 Thread(s), tokens/sec: 11.484965120109196 @ context=128000, 28 secs elapsed
Wed Oct 21 05:37:23 AM MST 2026 - qwen3.6:35b w/ 7 Thread(s), tokens/sec: 11.957040482880984 @ context=128000, 30 secs elapsed
Wed Oct 21 05:37:53 AM MST 2026 - qwen3.6:35b w/ 8 Thread(s), tokens/sec: 10.165480245815742 @ context=128000, 27 secs elapsed
Stopping all ollama usage...
Wed Oct 21 05:44:05 AM MST 2026 - qwen3.6:35b w/ 4 Thread(s): , tokens/sec: 11.794151678144981 @ context=192000, time: 22 secs
Wed Oct 21 05:44:27 AM MST 2026 - qwen3.6:35b w/ 5 Thread(s): , tokens/sec: 13.191786678902528 @ context=192000, time: 30 secs
Wed Oct 21 05:44:57 AM MST 2026 - qwen3.6:35b w/ 6 Thread(s): , tokens/sec: 12.974118764961352 @ context=192000, time: 25 secs
Wed Oct 21 05:45:22 AM MST 2026 - qwen3.6:35b w/ 7 Thread(s): , tokens/sec: 13.684751495860636 @ context=192000, time: 22 secs
Wed Oct 21 05:41:57 AM MST 2026 - qwen3.6:35b w/ 0 Thread(s): , tokens/sec: 14.771664402476594 @ context=192000, time: 22 secs
Stopping all ollama usage...
Wed Oct 21 05:47:40 AM MST 2026 - qwen3.6:35b w/ 4 Thread(s): , tokens/sec: 11.75920993970465 @ context=256000, time: 25 secs
Wed Oct 21 05:48:06 AM MST 2026 - qwen3.6:35b w/ 5 Thread(s): , tokens/sec: 13.414819339156582 @ context=256000, time: 26 secs
Wed Oct 21 05:48:32 AM MST 2026 - qwen3.6:35b w/ 6 Thread(s): , tokens/sec: 12.512960121852013 @ context=256000, time: 31 secs
Wed Oct 21 05:49:03 AM MST 2026 - qwen3.6:35b w/ 7 Thread(s): , tokens/sec: 11.610753098619734 @ context=256000, time: 29 secs
Wed Oct 21 05:45:46 AM MST 2026 - qwen3.6:35b w/ 0 Thread(s): , tokens/sec: 12.81995869775592 @ context=256000, time: 23 secs
```
#### qwen3.5:35b
```console
$ for c in 32000 128000 256000; do ollama_threads qwen3.5:35b $c; done
Wed Oct 21 07:55:03 AM MST 2026 - qwen3.5:35b w/ 4 Thread(s): tokens/sec: 10.3573012564637 @ context=128000, time: 94 secs
Wed Oct 21 07:56:37 AM MST 2026 - qwen3.5:35b w/ 6 Thread(s): tokens/sec: 11.929392994980638 @ context=128000, time: 39 secs
Wed Oct 21 07:57:17 AM MST 2026 - qwen3.5:35b w/ 7 Thread(s): tokens/sec: 13.082804815917008 @ context=128000, time: 36 secs
Wed Oct 21 07:57:53 AM MST 2026 - qwen3.5:35b w/ 0 Thread(s): tokens/sec: 12.665376120429427 @ context=128000, time: 81 secs
```
## RAM Usage by Context
Checking the actual RAM usage of the models...
### `ollama_sizes m 16000`
| Model Name | HDD (ls) | Context | RAM (ps) |
| :------------------------ | -----------: | -------: | -----------: |
| mistral-nemo:12b | 7.1GB | 16000 | 10GB |
| ministral-3:14b | 9.1GB | 16000 | 11GB |
| ministral-3:8b | 6.0GB | 16000 | 7.8GB |
| ministral-3:3b | 3.0GB | 16000 | 4.1GB |
| mistral-small3.2:24b | 15GB | 16000 | 17GB |
| mistral:7b | 4.4GB | 16000 | 6.8GB |
| codestral:22b | 12GB | 16000 | 16GB |
| devstral-small-2:24b | 15GB | 16000 | 17GB |
| qwen2.5-coder:32b | 19GB | 16000 | 24GB |
| qwen2.5-coder:14b | 9.0GB | 16000 | 12GB |
| qwen2.5-coder:7b | 4.7GB | 16000 | 5.9GB |
| qwen2.5-coder:3b | 1.9GB | 16000 | 2.7GB |
| qwen2.5-coder:1.5b | 986MB | 16000 | 1.6GB |
| qwen2.5-coder:0.5b | 397MB | 16000 | 701MB |
| qwen3-coder:30b | 18GB | 16000 | 20GB |
| qwen3.5:35b | 22GB | 16000 | 22GB |
| qwen3.5:27b | 17GB | 16000 | 18GB |
| qwen3.5:9b | 6.6GB | 16000 | 6.7GB |
| qwen3.5:4b | 3.3GB | 16000 | 3.7GB |
| qwen3.5:2b | 2.7GB | 16000 | 2.6GB |
| qwen3.5:0.8b | 1.3GB | 16000 | 630MB |
| qwen3.6:35b | 22GB | 16000 | 22GB |
| qwen3.6:27b | 17GB | 16000 | 18GB |
| qwen3.8:27b | 17GB | 16000 | 18GB |
### `ollama_sizes m 32000`
| Model Name | HDD (ls) | Context | RAM (ps) |
| :------------------------ | -----------: | -------: | -----------: |
| mistral-nemo:12b | 7.1GB | 32000 | 12GB |
| ministral-3:14b | 9.1GB | 32000 | 13GB |
| ministral-3:8b | 6.0GB | 32000 | 10GB |
| ministral-3:3b | 3.0GB | 32000 | 5.9GB |
| mistral-small3.2:24b | 15GB | 32000 | 20GB |
| mistral:7b | 4.4GB | 32000 | 8.9GB |
| codestral:22b | 12GB | 32000 | 20GB |
| devstral-small-2:24b | 15GB | 32000 | 20GB |
| qwen2.5-coder:32b | 19GB | 32000 | 28GB |
| qwen2.5-coder:14b | 9.0GB | 32000 | 15GB |
| qwen2.5-coder:7b | 4.7GB | 32000 | 6.9GB |
| qwen2.5-coder:3b | 1.9GB | 32000 | 3.3GB |
| qwen2.5-coder:1.5b | 986MB | 32000 | 2.1GB |
| qwen2.5-coder:0.5b | 397MB | 32000 | 929MB |
| qwen3-coder:30b | 18GB | 32000 | 21GB |
| qwen3.5:35b | 22GB | 32000 | 22GB |
| qwen3.5:27b | 17GB | 32000 | 19GB |
| qwen3.5:9b | 6.6GB | 32000 | 7.3GB |
| qwen3.5:4b | 3.3GB | 32000 | 4.2GB |
| qwen3.5:2b | 2.7GB | 32000 | 2.8GB |
| qwen3.5:0.8b | 1.3GB | 32000 | 695MB |
| qwen3.6:35b | 22GB | 32000 | 22GB |
| qwen3.6:27b | 17GB | 32000 | 18GB |
| qwen3.8:27b | 17GB | 32000 | 18GB |
### `ollama_sizes m 64000`
| Model Name | HDD (ls) | Context | RAM (ps) |
| :------------------------ | -----------: | -------: | -----------: |
| mistral-nemo:12b | 7.1GB | 64000 | 18GB |
| ministral-3:14b | 9.1GB | 64000 | 19GB |
| ministral-3:8b | 6.0GB | 64000 | 14GB |
| ministral-3:3b | 3.0GB | 64000 | 9.6GB |
| mistral-small3.2:24b | 15GB | 64000 | 26GB |
| mistral:7b | 4.4GB | 32768 | 9.0GB |
| codestral:22b | 12GB | 32768 | 20GB |
| devstral-small-2:24b | 15GB | 64000 | 26GB |
| qwen2.5-coder:32b | 19GB | 32768 | 28GB |
| qwen2.5-coder:14b | 9.0GB | 32768 | 15GB |
| qwen2.5-coder:7b | 4.7GB | 32768 | 6.9GB |
| qwen2.5-coder:3b | 1.9GB | 32768 | 3.4GB |
| qwen2.5-coder:1.5b | 986MB | 32768 | 2.1GB |
| qwen2.5-coder:0.5b | 397MB | 32768 | 940MB |
| qwen3-coder:30b | 18GB | 64000 | 25GB |
| qwen3.5:35b | 22GB | 64000 | 23GB |
| qwen3.5:27b | 17GB | 64000 | 22GB |
| qwen3.5:9b | 6.6GB | 64000 | 8.8GB |
| qwen3.5:4b | 3.3GB | 64000 | 5.6GB |
| qwen3.5:2b | 2.7GB | 64000 | 3.5GB |
| qwen3.5:0.8b | 1.3GB | 64000 | 999MB |
| qwen3.6:35b | 22GB | 64000 | 22GB |
| qwen3.6:27b | 17GB | 64000 | 18GB |
| qwen3.8:27b | 17GB | 64000 | 18GB |
### ollama_sizes m 80000
| Model Name | HDD (ls) | Context | RAM (ps) |
| :------------------------ | -----------: | -------: | -----------: |
| mistral-nemo:12b | 7.1GB | 80000 | 21GB |
| ministral-3:14b | 9.1GB | 80000 | 22GB |
| ministral-3:8b | 6.0GB | 80000 | 17GB |
| ministral-3:3b | 3.0GB | 80000 | 11GB |
| mistral-small3.2:24b | 15GB | 80000 | 28GB |
| mistral:7b | 4.4GB | 32768 | 9.0GB |
| codestral:22b | 12GB | 32768 | 20GB |
| devstral-small-2:24b | 15GB | 80000 | 28GB |
| qwen2.5-coder:32b | 19GB | 32768 | 28GB |
| qwen2.5-coder:14b | 9.0GB | 32768 | 15GB |
| qwen2.5-coder:7b | 4.7GB | 32768 | 6.9GB |
| qwen2.5-coder:3b | 1.9GB | 32768 | 3.4GB |
| qwen2.5-coder:1.5b | 986MB | 32768 | 2.1GB |
| qwen2.5-coder:0.5b | 397MB | 32768 | 940MB |
| qwen3-coder:30b | 18GB | 80000 | 27GB |
| qwen3.5:35b | 22GB | 80000 | 23GB |
| qwen3.5:27b | 17GB | 80000 | 23GB |
| qwen3.5:9b | 6.6GB | 80000 | 9.4GB |
| qwen3.5:4b | 3.3GB | 80000 | 6.2GB |
| qwen3.5:2b | 2.7GB | 80000 | 3.8GB |
| qwen3.5:0.8b | 1.3GB | 80000 | 1.1GB |
| qwen3.6:35b | 22GB | 80000 | 22GB |
| qwen3.6:27b | 17GB | 80000 | 18GB |
| qwen3.8:27b | 17GB | 80000 | 18GB |
### ollama_sizes m 96000
| Model Name | HDD (ls) | Context | RAM (ps) |
| :------------------------ | -----------: | -------: | -----------: |
| mistral-nemo:12b | 7.1GB | 96000 | 23GB |
| ministral-3:14b | 9.1GB | 96000 | 25GB |
| ministral-3:8b | 6.0GB | 96000 | 19GB |
| ministral-3:3b | 3.0GB | 96000 | 13GB |
| mistral-small3.2:24b | 15GB | 96000 | 31GB |
| mistral:7b | 4.4GB | 32768 | 9.0GB |
| codestral:22b | 12GB | 32768 | 20GB |
| devstral-small-2:24b | 15GB | 96000 | 31GB |
| qwen2.5-coder:32b | 19GB | 32768 | 28GB |
| qwen2.5-coder:14b | 9.0GB | 32768 | 15GB |
| qwen2.5-coder:7b | 4.7GB | 32768 | 6.9GB |
| qwen2.5-coder:3b | 1.9GB | 32768 | 3.4GB |
| qwen2.5-coder:1.5b | 986MB | 32768 | 2.1GB |
| qwen2.5-coder:0.5b | 397MB | 32768 | 940MB |
| qwen3-coder:30b | 18GB | 96000 | 28GB |
| qwen3.5:35b | 22GB | 96000 | 24GB |
| qwen3.5:27b | 17GB | 96000 | 24GB |
| qwen3.5:9b | 6.6GB | 96000 | 9.9GB |
| qwen3.5:4b | 3.3GB | 96000 | 6.8GB |
| qwen3.5:2b | 2.7GB | 96000 | 4.1GB |
| qwen3.5:0.8b | 1.3GB | 96000 | 1.2GB |
| qwen3.6:35b | 22GB | 96000 | 22GB |
| qwen3.6:27b | 17GB | 96000 | 18GB |
| qwen3.8:27b | 17GB | 96000 | 18GB |
### ollama_sizes m 128000
| Model Name | HDD (ls) | Context | RAM (ps) |
| :------------------------ | -----------: | -------: | -----------: |
| mistral-nemo:12b | 7.1GB | 128000 | 29GB |
| ministral-3:14b | 9.1GB | 128000 | 30GB |
| ministral-3:8b | 6.0GB | 128000 | 24GB |
| ministral-3:3b | 3.0GB | 128000 | 16GB |
| mistral-small3.2:24b | 15GB | 128000 | 36GB |
| mistral:7b | 4.4GB | 32768 | 9.0GB |
| codestral:22b | 12GB | 32768 | 20GB |
| devstral-small-2:24b | 15GB | 128000 | 36GB |
| qwen2.5-coder:32b | 19GB | 32768 | 28GB |
| qwen2.5-coder:14b | 9.0GB | 32768 | 15GB |
| qwen2.5-coder:7b | 4.7GB | 32768 | 6.9GB |
| qwen2.5-coder:3b | 1.9GB | 32768 | 3.4GB |
| qwen2.5-coder:1.5b | 986MB | 32768 | 2.1GB |
| qwen2.5-coder:0.5b | 397MB | 32768 | 940MB |
| qwen3-coder:30b | 18GB | 128000 | 32GB |
| qwen3.5:35b | 22GB | 128000 | 24GB |
| qwen3.5:27b | 17GB | 128000 | 26GB |
| qwen3.5:9b | 6.6GB | 128000 | 11GB |
| qwen3.5:4b | 3.3GB | 128000 | 8.0GB |
| qwen3.5:2b | 2.7GB | 128000 | 4.6GB |
| qwen3.5:0.8b | 1.3GB | 128000 | 1.4GB |
| qwen3.6:35b | 22GB | 128000 | 23GB |
| qwen3.6:27b | 17GB | 128000 | 19GB |
| qwen3.8:27b | 17GB | 128000 | 19GB |
### ollama_sizes m 160000
| Model Name | HDD (ls) | Context | RAM (ps) |
| :------------------------ | -----------: | -------: | -----------: |
| mistral-nemo:12b | 7.1GB | 160000 | 34GB |
| ministral-3:14b | 9.1GB | 160000 | 35GB |
| ministral-3:8b | 6.0GB | 160000 | 28GB |
| ministral-3:3b | 3.0GB | 160000 | 20GB |
| mistral-small3.2:24b | 15GB | 131072 | 37GB |
| mistral:7b | 4.4GB | 32768 | 9.0GB |
| codestral:22b | 12GB | 32768 | 20GB |
| devstral-small-2:24b | 15GB | 160000 | 42GB |
| qwen2.5-coder:32b | 19GB | 32768 | 28GB |
| qwen2.5-coder:14b | 9.0GB | 32768 | 15GB |
| qwen2.5-coder:7b | 4.7GB | 32768 | 6.9GB |
| qwen2.5-coder:3b | 1.9GB | 32768 | 3.4GB |
| qwen2.5-coder:1.5b | 986MB | 32768 | 2.1GB |
| qwen2.5-coder:0.5b | 397MB | 32768 | 940MB |
| qwen3-coder:30b | 18GB | 160000 | 35GB |
| qwen3.5:35b | 22GB | 160000 | 25GB |
| qwen3.5:27b | 17GB | 160000 | 28GB |
| qwen3.5:9b | 6.6GB | 160000 | 12GB |
| qwen3.5:4b | 3.3GB | 160000 | 9.2GB |
| qwen3.5:2b | 2.7GB | 160000 | 5.1GB |
| qwen3.5:0.8b | 1.3GB | 160000 | 1.6GB |
| qwen3.6:35b | 22GB | 160000 | 23GB |
| qwen3.6:27b | 17GB | 160000 | 19GB |
| qwen3.8:27b | 17GB | 160000 | 19GB |
### ollama_sizes m 192000
| Model Name | HDD (ls) | Context | RAM (ps) |
| :------------------------ | -----------: | -------: | -----------: |
| mistral-nemo:12b | 7.1GB | 192000 | 39GB |
| ministral-3:14b | 9.1GB | 192000 | 41GB |
| ministral-3:8b | 6.0GB | 192000 | 33GB |
| ministral-3:3b | 3.0GB | 192000 | 23GB |
| mistral-small3.2:24b | 15GB | 131072 | 37GB |
| mistral:7b | 4.4GB | 32768 | 9.0GB |
| codestral:22b | 12GB | 32768 | 20GB |
| devstral-small-2:24b | 15GB | 192000 | 47GB |
| qwen2.5-coder:32b | 19GB | 32768 | 28GB |
| qwen2.5-coder:14b | 9.0GB | 32768 | 15GB |
| qwen2.5-coder:7b | 4.7GB | 32768 | 6.9GB |
| qwen2.5-coder:3b | 1.9GB | 32768 | 3.4GB |
| qwen2.5-coder:1.5b | 986MB | 32768 | 2.1GB |
| qwen2.5-coder:0.5b | 397MB | 32768 | 940MB |
| qwen3-coder:30b | 18GB | 192000 | 38GB |
| qwen3.5:35b | 22GB | 192000 | 26GB |
| qwen3.5:27b | 17GB | 192000 | 30GB |
| qwen3.5:9b | 6.6GB | 192000 | 13GB |
| qwen3.5:4b | 3.3GB | 192000 | 10GB |
| qwen3.5:2b | 2.7GB | 192000 | 5.6GB |
| qwen3.5:0.8b | 1.3GB | 192000 | 1.8GB |
| qwen3.6:35b | 22GB | 192000 | 23GB |
| qwen3.6:27b | 17GB | 192000 | 19GB |
| qwen3.8:27b | 17GB | 192000 | 19GB |
### ollama_sizes m 224000
| Model Name | HDD (ls) | Context | RAM (ps) |
| :------------------------ | -----------: | -------: | -----------: |
| mistral-nemo:12b | 7.1GB | 224000 | 45GB |
| ministral-3:14b | 9.1GB | 224000 | 46GB |
| ministral-3:8b | 6.0GB | 224000 | 37GB |
| ministral-3:3b | 3.0GB | 224000 | 27GB |
| mistral-small3.2:24b | 15GB | 131072 | 37GB |
| mistral:7b | 4.4GB | 32768 | 9.0GB |
| codestral:22b | 12GB | 32768 | 20GB |
| devstral-small-2:24b | 15GB | 224000 | 53GB |
| qwen2.5-coder:32b | 19GB | 32768 | 28GB |
| qwen2.5-coder:14b | 9.0GB | 32768 | 15GB |
| qwen2.5-coder:7b | 4.7GB | 32768 | 6.9GB |
| qwen2.5-coder:3b | 1.9GB | 32768 | 3.4GB |
| qwen2.5-coder:1.5b | 986MB | 32768 | 2.1GB |
| qwen2.5-coder:0.5b | 397MB | 32768 | 940MB |
| qwen3-coder:30b | 18GB | 224000 | 41GB |
| qwen3.5:35b | 22GB | 224000 | 27GB |
| qwen3.5:27b | 17GB | 224000 | 33GB |
| qwen3.5:9b | 6.6GB | 224000 | 14GB |
| qwen3.5:4b | 3.3GB | 224000 | 11GB |
| qwen3.5:2b | 2.7GB | 224000 | 6.2GB |
| qwen3.5:0.8b | 1.3GB | 224000 | 2.0GB |
| qwen3.6:35b | 22GB | 224000 | 23GB |
| qwen3.6:27b | 17GB | 224000 | 19GB |
| qwen3.8:27b | 17GB | 224000 | 19GB |
### `ollama_sizes m 256000`
| Model Name | HDD (ls) | Context | RAM (ps) |
| :------------------------ | -----------: | -------: | -----------: |
| mistral-nemo:12b | 7.1GB | 256000 | 50GB |
| ministral-3:14b | 9.1GB | 256000 | 51GB |
| ministral-3:8b | 6.0GB | 256000 | 42GB |
| ministral-3:3b | 3.0GB | 256000 | 30GB |
| mistral-small3.2:24b | 15GB | 131072 | 37GB |
| mistral:7b | 4.4GB | 32768 | 9.0GB |
| codestral:22b | 12GB | 32768 | 20GB |
| devstral-small-2:24b | 15GB | 256000 | 58GB |
| qwen2.5-coder:32b | 19GB | 32768 | 28GB |
| qwen2.5-coder:14b | 9.0GB | 32768 | 15GB |
| qwen2.5-coder:7b | 4.7GB | 32768 | 6.9GB |
| qwen2.5-coder:3b | 1.9GB | 32768 | 3.4GB |
| qwen2.5-coder:1.5b | 986MB | 32768 | 2.1GB |
| qwen2.5-coder:0.5b | 397MB | 32768 | 940MB |
| qwen3-coder:30b | 18GB | 256000 | 45GB |
| qwen3.5:35b | 22GB | 256000 | 28GB |
| qwen3.5:27b | 17GB | 256000 | 35GB |
| qwen3.5:9b | 6.6GB | 256000 | 15GB |
| qwen3.5:4b | 3.3GB | 256000 | 12GB |
| qwen3.5:2b | 2.7GB | 256000 | 6.7GB |
| qwen3.5:0.8b | 1.3GB | 256000 | 2.2GB |
| qwen3.6:35b | 22GB | 256000 | 23GB |
| qwen3.6:27b | 17GB | 256000 | 20GB |
| qwen3.8:27b | 17GB | 256000 | 20GB |
@@ -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).
# 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,17 +160,17 @@
- { "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, Ministral, and Devstral - By a French company. #####
# mistral-small-4
# https://huggingface.co/unsloth/Mistral-Small-4-119B-2603-GGUF
# Supposed to be better than Qwen equivalents, it's basically mistral, mixtral, magistral, and devstral all in one.
# unsloth version is supposed to be the best quantization. UD-Q3_K_XL is supposed to take 64GB RAM, lol, while Q4_K_M would need 80+ GB.
# needs done via 'ollama create', fails with pull. https://github.com/ollama/ollama/issues/5245
- { "purpose": ["chat", "lang", "code"], "model": "hf.co/unsloth/Mistral-Small-4-119B-2603-GGUF:UD-Q3_K_XL", "provider": "mistral_small40_1190_unsloth_q3", "size_mb": "{{ llm_size_coef * 54800 }}", "context": 256000 }
# https://huggingface.co/mistralai/Mistral-Small-4-119B-2603 : 242GB unquantized, lol.
- { "purpose": ["chat", "lang", "code"], "model": "hf.co/mistralai/Mistral-Small-4-119B-2603", "provider": "mistral_small40_1190", "size_mb": "{{ llm_size_coef * 242000 }}", "context": 256000 }
# https://huggingface.co/unsloth/Mistral-Small-4-119B-2603 : 121GB, A6B MoE, hmmm!
- { "purpose": ["chat", "lang", "code"], "model": "hf.co/unsloth/Mistral-Small-4-119B-2603", "provider": "mistral_small40_1190_unsloth_a6b", "size_mb": "{{ llm_size_coef * 121000 }}", "context": 256000 }
# https://ollama.com/library/devstral-small-2 : Last Updated 2025-12-13
# Most recommended in Mistral family for agentic coding.
- { "purpose": ["code"], "model": "devstral-small-2:24b", "provider": "mistral_dev20_0240_small", "size_mb": "{{ llm_size_coef * 15000 }}", "context": 393216 }
@@ -159,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
@@ -196,9 +211,9 @@
- name: Workstation | Linux | Software | LLMs | Facts | Choices | Sort
ansible.builtin.set_fact:
llm_installs: >-
{{ llm_choices | selectattr('size_mb', 'le', ansible_memtotal_mb) | list }}
{{ llm_installs | union(llm_choices | selectattr('size_mb', 'le', ansible_memtotal_mb) | list) }}
llm_removals: >-
{{ llm_choices | selectattr('size_mb', 'gt', ansible_memtotal_mb) | list }}
{{ llm_removals | union(llm_choices | selectattr('size_mb', 'gt', ansible_memtotal_mb) | list) }}
- name: Workstation | Linux | Software | LLMs | Facts | Merge | Print
ansible.builtin.debug:
@@ -218,28 +233,6 @@
- "{{ qwen_code }}"
state: present
- name: Workstation | Linux | Software | LLMs | Docker
ansible.builtin.package:
name:
- docker
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:
@@ -276,17 +269,19 @@
### Required ###
export HOME={{ user_user.home }}
export OLLAMA_HOST=0.0.0.0 # Needed for Open WebUI
### Timeouts ###
export OLLAMA_LOAD_TIMEOUT=20m # default is 5m
export OLLAMA_LOAD_TIMEOUT=30m # default is 5m
export OLLAMA_REQUEST_TIMEOUT=3600 # default 300 (unconfirmed, not in the list of --help vars)
### Resource Usage ###
export OLLAMA_KEEP_ALIVE=20m # default is 5m
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.
### Prevent Data Loss ###
# OLLAMA_NOPRUNE
@@ -299,7 +294,7 @@
{{ ("export HF_TOKEN=" ~ hf_token) if hf_token else '' }}
### Logging ###
export OLLAMA_DEBUG=1
#export OLLAMA_DEBUG=1
export OLLAMA_METRICS=1 # (check http://127.0.0.1:11434/metrics)
### Other ###
@@ -415,48 +410,51 @@
#!/bin/sh
exec 2>&1
# Wait for Docker to start up.
## 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.
while [ ! -S /var/run/docker.sock ]; do sleep 1; done
# 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."
# Start the open-webui program.
# 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 \
--pull=always \
docker run \
--name open-webui \
--network=host -e PORT={{ open_webui_port }} \
--add-host=host.docker.internal:host-gateway \
--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 \
ghcr.io/open-webui/open-webui:main
# 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 \
$image
mode: "0755"
- name: Workstation | Linux | Software | LLMs | runit | open-webui | Script | Finish
@@ -497,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"
@@ -508,7 +517,96 @@
ansible.builtin.file:
name: "/var/log/open-terminal"
state: directory
owner: "{{ user }}"
owner: root
mode: "0755"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Dir | /usr/local/etc
ansible.builtin.file:
name: "/usr/local/etc/open-terminal"
state: directory
owner: root
mode: "0755"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Compose YAML
ansible.builtin.copy:
dest: /usr/local/etc/open-terminal/compose.yml
content: |
services:
open-terminal:
container_name: open-terminal
build:
context: ./
image: hyperling/open-terminal:latest
pull_policy: never
network_mode: host
command: run --port {{ open_terminal_port }}
environment:
- OPEN_TERMINAL_FILE_BROWSER_ROOT=/home/user
- OPEN_TERMINAL_API_KEY={{ open_terminal_key }}
- OPEN_TERMINAL_PACKAGES=
- GOT_EM=true
volumes:
- {{ user_user.home }}/AI-Sandbox:/home/user
- {{ user_user.home }}/Code:{{ user_user.home }}/Code
- {{ user_user.home }}/SDKs:{{ user_user.home }}/SDKs
- {{ jdk_jvm }}:{{ jdk_jvm }}:ro
- {{ jdk_etc }}:{{ jdk_etc }}:ro
- /etc/ssl/certs/java:/etc/ssl/certs/java:ro
- /etc/ca-certificates:/etc/ca-certificates:ro
- {{ jdk_etc17 }}:{{ jdk_etc17 }}:ro
- {{ jdk_etc21 }}:{{ jdk_etc21 }}:ro
- {{ jdk_etc25 }}:{{ jdk_etc25 }}:ro
- {{ user_user.home }}/.gradle:{{ user_user.home }}/.gradle
- {{ user_user.home }}/.pub-cache:{{ user_user.home }}/.pub-cache
owner: root
mode: "0755"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Dockerfile
ansible.builtin.copy:
dest: /usr/local/etc/open-terminal/Dockerfile
content: |
FROM ghcr.io/open-webui/open-terminal:latest
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 \
libstdc++6 lib32z1 libbz2-1.0 android-udev-rules
# Debian removed JDK 17, continue serving from the host.
# default-jdk openjdk-17-jdk
RUN echo "Flutter"
RUN apt-get update && apt-get install -y \
curl git unzip xz-utils zip libglu1-mesa libglu1-mesa
RUN echo "Flutter (Linux)"
RUN apt-get update && apt-get install -y \
clang cmake git ninja-build pkg-config libgtk-3-dev \
liblzma-dev libstdc++-12-dev
RUN echo "Flutter (Android)"
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"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | env
ansible.builtin.copy:
dest: /usr/local/etc/open-terminal/.env
content: |
COMPOSE_BAKE=true
owner: root
mode: "0755"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Run
@@ -519,32 +617,37 @@
exec 2>&1
# Wait for Docker to start up.
while [ ! -S /var/run/docker.sock ]; do sleep 1; done
# Ensure the old container is gone.
# Ensure the old container is stopped.
echo "RUN: Stopping..."
docker stop open-terminal &&
echo "RUN: Container stopped" ||
docker compose \
-f /usr/local/etc/open-terminal/compose.yml down &&
echo "RUN: Container stopped." ||
echo "RUN: Container already stopped."
echo "RUN: Deleting..."
docker rm -f open-terminal &&
echo "RUN: Container deleted" ||
echo "RUN: Container already deleted."
# 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 run \
--pull=always \
--name open-terminal \
--network=host -p {{ open_terminal_port }}:8000 \
-v open-terminal:/home/user \
-v {{ user_user.home }}/Code:/home/user/Code \
-e OPEN_TERMINAL_API_KEY={{ open_terminal_key }} \
ghcr.io/open-webui/open-terminal
docker compose -f /usr/local/etc/open-terminal/compose.yml up
owner: root
mode: "0755"
- name: Workstation | Linux | Software | LLMs | runit | open-terminal | Script | Finish
@@ -554,15 +657,10 @@
{{ runit_finish_sleep }}
echo "FINISH: Stopping..."
docker stop open-terminal &&
docker compose -f /usr/local/etc/open-terminal/compose.yml down &&
echo "FINISH: Container stopped" ||
echo "FINISH: Container already stopped."
echo "FINISH: Deleting..."
docker rm -f open-terminal &&
echo "FINISH: Container deleted" ||
echo "FINISH: Container already deleted."
echo "FINISH: Done!"
mode: "0755"
@@ -701,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 }
@@ -744,17 +841,24 @@
path: "{{ user_user.home }}/{{ item }}"
marker: "# {mark} ANSIBLE MANAGED BLOCK | ollama | Manual Script"
content: |
function list_llms() {
function llm_installs() {
{% for llm in llm_installs %}
echo "{{ llm.model }}"
{% endfor %}
}
function pull_llms() {
function llm_removals() {
{% for llm in llm_removals %}
echo "{{ llm.model }}"
{% endfor %}
}
function ollama_pull() {
echo "Manually Pulling Models"
for model in `list_llms`; do
for model in `llm_installs`; do
echo -e "\n\n Starting 'ollama pull $model' \n\n"
ollama pull $model
status=$?
@@ -763,21 +867,25 @@
echo "Done!!"
}
alias pull-llms="pull_llms "
alias pull-models="pull_llms "
alias pull-ai="pull_llms "
alias pull-llms="ollama_pull "
alias pull-models="ollama_pull "
alias pull-ai="ollama_pull "
function ollama_stop() {
for model in `ollama ps | tail -n +2 | awk '{print $1}'`; do
echo "Stopping ${model}..."
ollama stop $model
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-stop="ollama_stop"
alias ollama-kill="ollama_stop"
alias ollama-killall="ollama_stop"
alias ollama-kill-all="ollama_stop"
alias ollama-stop-all="ollama_stop"
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' }}
@@ -789,23 +897,8 @@
ollama run {{ 'qwen3.8:27b' if ansible_memtotal_mb > 32000 else 'qwen2.5-coder:7b' }}
}
alias ollama-code="ollama_code "
alias code="ollama_code "
function ollama_models() {
for model in `ollama ls | grep -v NAME | awk '{print $1;}'`; do
echo $model
ollama show $model | grep -E "architecture|context length|quantization"
done
}
alias ollama-models="ollama_models "
alias ollama-show-models="ollama_models "
alias ollama-show="ollama_models "
alias ollama-dense="ollama_models "
alias ollama-moe="ollama_models "
alias show-models="ollama_models "
alias list-models="ollama_models "
function ollama_purge {
function ollama_purge() {
echo "TBD: Purge all models not in llm_installs."
}
alias ollama-purge="ollama_purge "
@@ -827,6 +920,7 @@
alias restart-llm="restart_ai "
alias restart-llms="restart_ai "
alias restart-models="restart_ai "
alias reload-ai="restart_ai "
state: present
create: false
backup: true
@@ -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: true
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"
+27 -41
View File
@@ -205,6 +205,15 @@
- name: Workstation | Linux | Software | Android | SDK
block:
- name: Workstation | Linux | Software | Android | Gradle Permissions
ansible.builtin.file:
path: "{{ user_user.home }}/.gradle"
state: directory
owner: "{{ user }}"
group: "{{ user }}"
mode: "0755"
when: user_user.home != ""
- name: Workstation | Linux | Software | Android | Download Commandline Tools
ansible.builtin.get_url:
url: "{{ android_url }}"
@@ -243,7 +252,9 @@
# This can only be run once, otherwise cmdline-tools creates latest-* folders.
- name: Workstation | Linux | Software | Android | Install | Consistent Modules
ansible.builtin.shell: "yes | {{ android_sdkmanager_temp }} --install '{{ item }}' --sdk_root={{ android_sdk_location }}"
ansible.builtin.shell: |
set -o pipefail
yes | {{ android_sdkmanager_temp }} --install '{{ item }}' --sdk_root={{ android_sdk_location }}
loop:
# Current
- cmdline-tools/latest
@@ -363,27 +374,35 @@
## Flutter and Licenses ##
- name: Workstation | Linux | Software | Android | Inform Flutter
ansible.builtin.shell: "{{ flutter }} config --android-sdk={{ android_sdk_location }}"
ansible.builtin.shell: "{{ flutter_exe }} config --android-sdk={{ android_sdk_location }}"
become: true
become_user: "{{ user }}"
register: shell_check
changed_when: shell_check.rc == 0
when: coding
# "Warning: The --licenses option is no longer needed."
- name: Workstation | Linux | Software | Android | License Agreements [1/2]
ansible.builtin.shell: "yes | {{ android_sdkmanager_final }} --licenses --sdk_root={{ android_sdk_location }}"
ansible.builtin.shell: |
set -o pipefail
yes | {{ android_sdkmanager_final }} --licenses --sdk_root={{ android_sdk_location }}
become: true
become_user: "{{ user }}"
register: shell_check
changed_when: shell_check.rc == 0
failed_when: false
when: coding
# "Warning: The --licenses option is no longer needed."
- name: Workstation | Linux | Software | Android | License Agreements [2/2]
ansible.builtin.shell: "yes | {{ flutter }} doctor --android-licenses"
ansible.builtin.shell: |
set -o pipefail
yes | {{ flutter_exe }} doctor --android-licenses
become: true
become_user: "{{ user }}"
register: shell_check
changed_when: shell_check.rc == 0
failed_when: false
when: coding
- name: Workstation | Linux | Software | Android | Refresh Flutter Doctor Report
@@ -397,47 +416,13 @@
## Configure Environment ##
- name: Workstation | Linux | Software | Android | Modify PATH (.bashrc)
ansible.builtin.blockinfile:
path: "{{ item }}/.bashrc"
block: |
export PATH="$PATH:{{ android_bin_location }}:{{ android_sdk_cmdline_final }}"
marker: '# {mark} MANAGED BY ANSIBLE | Android'
state: absent
create: true
backup: true
mode: "0755"
loop:
- "{{ user_root.home }}"
- "{{ user_user.home }}"
when: coding
and user_root.home != ""
and user_user.home != ""
- name: Workstation | Linux | Software | Android | Modify PATH (.zshrc)
ansible.builtin.blockinfile:
path: "{{ item }}/.zshrc"
block: |
export PATH="$PATH:{{ android_bin_location }}:{{ android_sdk_cmdline_final }}"
marker: '# {mark} MANAGED BY ANSIBLE | Android'
state: absent
create: true
backup: true
mode: "0755"
loop:
- "{{ user_root.home }}"
- "{{ user_user.home }}"
when: coding
and user_root.home != ""
and user_user.home != ""
- name: Workstation | Linux | Software | Flutter | Modify PATH (profiles)
- name: Workstation | Linux | Software | Android | Modify PATH (profiles)
ansible.builtin.blockinfile:
path: "{{ user_user.home }}/{{ item }}"
block: |
export ANDROID_HOME="{{ android_sdk_location }}"
export ANDROID_HOME="{{ android_sdk_location | replace('~', '$HOME') }}"
export ANDROID_SDK_ROOT="$ANDROID_HOME"
export PATH="$PATH:{{ android_bin_location }}:{{ android_sdk_cmdline_final }}"
export PATH="{{ android_bin_location }}:{{ android_sdk_cmdline_final }}:$PATH"
marker: '# {mark} MANAGED BY ANSIBLE | Android'
state: present
create: true
@@ -446,6 +431,7 @@
loop:
- ".bash_profile"
- ".zprofile"
- ".profile"
when: coding
and user_user.home != ""
+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"
+113 -137
View File
@@ -12,19 +12,20 @@
- name: Workstation | Linux | Software | Flutter | Facts 2
ansible.builtin.set_fact:
flutter_bin_location: "{{ flutter_sdk_location }}/flutter/bin"
flutter_home: "{{ flutter_sdk_location }}/flutter"
flutter_bin: "{{ flutter_sdk_location }}/flutter/bin"
- name: Workstation | Linux | Software | Flutter | Facts 3
ansible.builtin.set_fact:
flutter: "{{ flutter_bin_location }}/flutter"
flutter_exe: "{{ flutter_bin }}/flutter"
- name: Workstation | Linux | Software | Flutter | Facts 4
ansible.builtin.set_fact:
flutter_report_commands:
- "date > {{ flutter_report }}"
- "{{ flutter }} --disable-analytics >> {{ flutter_report }}"
- "{{ flutter_exe }} --disable-analytics >> {{ flutter_report }}"
- "date >> {{ flutter_report }}"
- "{{ flutter }} doctor -v >> {{ flutter_report }}"
- "{{ flutter_exe }} doctor -v >> {{ flutter_report }}"
- "date >> {{ flutter_report }}"
## Checks ##
@@ -45,148 +46,123 @@
get_mime: false
register: flutter_download_stat
## Packages ##
- name: Workstation | Linux | Software | Flutter | Necessities
ansible.builtin.package:
name:
- curl
- git
- unzip
- "{{ xz }}"
- zip
- "{{ mesa }}"
- "{{ mesa_utils }}"
state: present
when: coding
# https://docs.flutter.dev/get-started/install/linux/desktop
- name: Workstation | Linux | Software | Flutter | Linux App Dependencies
ansible.builtin.package:
name:
- clang
- cmake
- git
- "{{ ninja }}"
- pkg-config
- "{{ gtk3 }}"
- "{{ xz_libs }}"
- "{{ cpp }}"
state: present
when: coding
# https://docs.flutter.dev/get-started/install/linux/android
- name: Workstation | Linux | Software | Flutter | Android App Dependencies
ansible.builtin.package:
name:
- "{{ c_libs }}"
- "{{ cpp_libs }}"
- "{{ z_libs }}"
- "{{ bzip }}"
state: present
when: coding
## Install SDK ##
- name: Workstation | Linux | Software | Flutter | SDK
- name: Workstation | Linux | Software | Flutter | Install Block
block:
- name: Workstation | Linux | Software | Flutter | Download SDK
ansible.builtin.get_url:
url: "{{ flutter_url }}"
dest: "{{ flutter_download_file }}"
owner: "{{ user }}"
group: "{{ user }}"
mode: '0664'
when: not flutter_download_stat.stat.exists
## Packages ##
- name: Workstation | Linux | Software | Flutter | Create Folder
- name: Workstation | Linux | Software | Flutter | Necessities
ansible.builtin.package:
name:
- curl
- git
- unzip
- "{{ xz }}"
- zip
- "{{ mesa }}"
- "{{ mesa_utils }}"
state: present
# https://docs.flutter.dev/get-started/install/linux/desktop
- name: Workstation | Linux | Software | Flutter | Linux App Dependencies
ansible.builtin.package:
name:
- clang
- cmake
- git
- "{{ ninja }}"
- pkg-config
- "{{ gtk3 }}"
- "{{ xz_libs }}"
- "{{ cpp }}"
state: present
# https://docs.flutter.dev/get-started/install/linux/android
- name: Workstation | Linux | Software | Flutter | Android App Dependencies
ansible.builtin.package:
name:
- "{{ c_libs }}"
- "{{ cpp_libs }}"
- "{{ z_libs }}"
- "{{ bzip }}"
state: present
## Install SDK ##
- name: Workstation | Linux | Software | Flutter | SDK
block:
- name: Workstation | Linux | Software | Flutter | Pub Cache Permissions
ansible.builtin.file:
path: "{{ user_user.home }}/.pub-cache"
state: directory
owner: "{{ user }}"
group: "{{ user }}"
mode: "0755"
when: user_user.home != ""
- name: Workstation | Linux | Software | Flutter | Download SDK
ansible.builtin.get_url:
url: "{{ flutter_url }}"
dest: "{{ flutter_download_file }}"
owner: "{{ user }}"
group: "{{ user }}"
mode: '0664'
when: not flutter_download_stat.stat.exists
- name: Workstation | Linux | Software | Flutter | Create Folder
ansible.builtin.file:
path: "{{ flutter_sdk_location }}"
state: directory
owner: "{{ user }}"
group: "{{ user }}"
mode: '0755'
- name: Workstation | Linux | Software | Flutter | Extract SDK
ansible.builtin.unarchive:
src: "{{ flutter_download_file }}"
dest: "{{ flutter_sdk_location }}"
owner: "{{ user }}"
group: "{{ user }}"
become: true
become_user: "{{ user }}"
when: not flutter_sdk_stat.stat.exists
- name: Workstation | Linux | Software | Flutter | Delete Archive
ansible.builtin.file:
path: "{{ flutter_sdk_location }}"
state: directory
owner: "{{ user }}"
group: "{{ user }}"
mode: '0755'
path: "{{ flutter_download_file }}"
state: absent
- name: Workstation | Linux | Software | Flutter | Extract SDK
ansible.builtin.unarchive:
src: "{{ flutter_download_file }}"
dest: "{{ flutter_sdk_location }}"
owner: "{{ user }}"
group: "{{ user }}"
## Configure Environment ##
become: true
become_user: "{{ user }}"
when: coding
and not flutter_sdk_stat.stat.exists
- name: Workstation | Linux | Software | Flutter | Modify PATH (profiles)
ansible.builtin.blockinfile:
path: "{{ user_user.home }}/{{ item }}"
block: |
export FLUTTER_HOME="{{ flutter_home }}"
export PATH="{{ flutter_bin }}:$PATH"
marker: '# {mark} MANAGED BY ANSIBLE | Flutter'
state: present
create: true
backup: true
mode: "0755"
loop:
- ".bash_profile"
- ".zprofile"
- ".profile"
when: user_user.home != ""
- name: Workstation | Linux | Software | Flutter | Delete Archive
ansible.builtin.file:
path: "{{ flutter_download_file }}"
state: absent
when: coding
## Test SDK ##
## Configure Environment ##
- name: Workstation | Linux | Software | Flutter | Doctor Report
ansible.builtin.shell: "{{ item }}"
loop: "{{ flutter_report_commands }}"
become: true
become_user: "{{ user }}"
register: shell_check
changed_when: shell_check.rc == 0
- name: Workstation | Linux | Software | Flutter | Modify PATH (.bashrc)
ansible.builtin.blockinfile:
path: "{{ item }}/.bashrc"
block: |
export PATH="$PATH:{{ flutter_bin_location }}"
marker: '# {mark} MANAGED BY ANSIBLE | Flutter'
state: absent
create: true
backup: true
mode: "0755"
loop:
- "{{ user_root.home }}"
- "{{ user_user.home }}"
when: coding
and user_root.home != ""
and user_user.home != ""
- name: Workstation | Linux | Software | Flutter | Modify PATH (.zshrc)
ansible.builtin.blockinfile:
path: "{{ item }}/.zshrc"
block: |
export PATH="$PATH:{{ flutter_bin_location }}"
marker: '# {mark} MANAGED BY ANSIBLE | Flutter'
state: absent
create: true
backup: true
mode: "0755"
loop:
- "{{ user_root.home }}"
- "{{ user_user.home }}"
when: coding
and user_root.home != ""
and user_user.home != ""
- name: Workstation | Linux | Software | Flutter | Modify PATH (profiles)
ansible.builtin.blockinfile:
path: "{{ user_user.home }}/{{ item }}"
block: |
export PATH="$PATH:{{ flutter_bin_location }}"
marker: '# {mark} MANAGED BY ANSIBLE | Flutter'
state: present
create: true
backup: true
mode: "0755"
loop:
- ".bash_profile"
- ".zprofile"
when: coding
and user_user.home != ""
## Test SDK ##
- name: Workstation | Linux | Software | Flutter | Doctor Report
ansible.builtin.shell: "{{ item }}"
loop: "{{ flutter_report_commands }}"
become: true
become_user: "{{ user }}"
register: shell_check
changed_when: shell_check.rc == 0
when: coding
## Uninstall SDK ##
+58 -37
View File
@@ -5,52 +5,73 @@
- name: Workstation | Linux | Software | Hugo
block:
- name: Workstation | Linux | Software | Hugo | pacman
block:
- name: Workstation | Linux | Software | Hugo | pacman
block:
- name: Workstation | Linux | Software | Hugo | pacman | Facts
ansible.builtin.set_fact:
sass_old: ruby-sass
sass_current: dart-sass
- name: Workstation | Linux | Software | Hugo | pacman | Facts
ansible.builtin.set_fact:
sass_old: ruby-sass
sass_current: dart-sass
- name: Workstation | Linux | Software | Hugo | pacman | Remove Old
ansible.builtin.package:
name:
- "{{ sass_old }}"
state: absent
- name: Workstation | Linux | Software | Hugo | pacman | Remove Old
ansible.builtin.package:
name:
- "{{ sass_old }}"
state: absent
- name: Workstation | Linux | Software | Hugo | pacman | Install New
ansible.builtin.package:
name:
- "{{ sass_current }}"
state: present
- name: Workstation | Linux | Software | Hugo | pacman | Install New
ansible.builtin.package:
name:
- hugo
- "{{ sass_current }}"
state: present
when: ansible_pkg_mgr == "pacman"
when: ansible_pkg_mgr == "pacman"
# This must exist after nodejs.yml so that NPM is installed.
- name: Workstation | Linux | Software | Hugo | npm
block:
# This must exist after nodejs.yml so that NPM is installed.
- name: Workstation | Linux | Software | Hugo | apt
block:
- name: Workstation | Linux | Software | Hugo | npm | Facts
ansible.builtin.set_fact:
sass_old: node-sass
sass_current: sass
- 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
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 | 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
ansible.builtin.shell: "npm remove -g {{ sass_old }}"
args:
creates: "{{ npm_bin_dir.stdout }}/bin/sass"
- 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
ansible.builtin.shell: "npm install -g {{ sass_current }}"
args:
creates: "{{ npm_bin_dir.stdout }}/bin/sass"
- 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"
when: ansible_pkg_mgr == "apt"
- 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
+67 -24
View File
@@ -2,34 +2,77 @@
# 20260912 - Hyperling
# Arch has too new of Java for Android / Gradle to even run AGP Assistant on.
- name: Workstation | Linux | Software | Java | Facts 1
ansible.builtin.set_fact:
jdk_version: 17
jdk_jvm: /usr/lib/jvm
jdk_src: /usr/lib/jvm/default-java
jdk_dir: "{{ user_user.home}}/SDKs/Java"
- name: Workstation | Linux | Software | Java | Facts 2
ansible.builtin.set_fact:
jdk_path: "{{ jdk_dir }}/bin"
- name: Workstation | Linux | Software | Java | apt
ansible.builtin.package:
name:
- "default-jdk"
state: present
when: ansible_pkg_mgr == "apt"
- name: Workstation | Linux | Software | Java | pacman
block:
- name: Workstation | Linux | Software | Java | pacman | Facts
ansible.builtin.set_fact:
jdk_version: 21
jdk_dir: ~/SDKs/Java
- name: Workstation | Linux | Software | Java | pacman | Facts
ansible.builtin.set_fact:
jdk_src: /usr/lib/jvm/default
- name: Workstation | Linux | Software | Java | pacman | Install
ansible.builtin.package:
name:
- "jdk{{ item }}-openjdk"
state: present
loop:
- "{{ jdk_version }}"
- 25
- 21
- 17
- name: Workstation | Linux | Software | Java | pacman | Install [base]
ansible.builtin.package:
name:
- "jdk{{ jdk_version }}-openjdk"
state: present
- name: Workstation | Linux | Software | Java | pacman | Set
ansible.builtin.shell: "archlinux-java set java-{{ jdk_version }}-openjdk"
- name: Workstation | Linux | Software | Java | pacman | Install [all]
ansible.builtin.package:
name:
- "jdk{{ item }}-openjdk"
state: present
loop:
- 25
- 21
- 17
when: coding
- name: Workstation | Linux | Software | Java | pacman | Link
ansible.builtin.shell: "ln -sf /usr/lib/jvm {{ jdk_dir }}"
args:
creates: "{{ jdk_dir }}"
become: true
become_user: "{{ user }}"
- name: Workstation | Linux | Software | Java | pacman | Set
ansible.builtin.shell: "archlinux-java set java-{{ jdk_version }}-openjdk"
register: shell_check
changed_when: shell_check.rc == 0
when: coding is true
and ansible_pkg_mgr == "pacman"
when: ansible_pkg_mgr == "pacman"
- name: Workstation | Linux | Software | Java | pacman | Link
ansible.builtin.file:
src: "{{ jdk_src }}"
dest: "{{ jdk_dir }}"
state: link
become: true
become_user: "{{ user }}"
- name: Workstation | Linux | Software | Java | Modify PATH (profiles)
ansible.builtin.blockinfile:
path: "{{ user_user.home }}/{{ item }}"
block: |
export JAVA_HOME="{{ jdk_dir }}"
export JAVA_PATH="{{ jdk_path }}"
export PATH="$JAVA_PATH:$PATH
marker: '# {mark} MANAGED BY ANSIBLE | Java'
state: present
create: true
backup: true
mode: "0755"
loop:
- ".bash_profile"
- ".zprofile"
- ".profile"
when: user_user.home != ""
@@ -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
+3 -6
View File
@@ -18,14 +18,11 @@
#######################
#######################
- name: TEST | Main
- name: TEST | LLMs
block:
- name: LLMs
ansible.builtin.include_tasks: tasks/workstation/linux/software/llm.yml
- name: Tunnel
ansible.builtin.include_tasks: tasks/general/settings/tunnel.yml
- name: LLM
ansible.builtin.include_tasks: tasks/workstation/linux/software/ai/llm.yml
#######################
#######################