A local-first private AI assistant for everyday use. Runs on-device models with encrypted P2P sync, and supports sharing chats publicly on ATProto.
10
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: Fixes + refactors around packaging

madclaws ab3af761 b5badba3

+212 -61
+10
CHANGELOG.md
··· 5 5 6 6 ## [Unreleased] 7 7 8 + ## [0.4.4] - 2026-03-16 9 + 10 + ### Added 11 + - Added a core daemon process which will be useful for handling background processes in https://github.com/tilesprivacy/tiles/pull/102 12 + 13 + - Use `tiles daemon stop` and `tiles daemon start` for starting and stopping the daemon explicitly. NOTE: daemon will auto-start when you run `tiles`. 14 + 15 + - Added support for fully offline/portable installer in https://github.com/tilesprivacy/tiles/pull/97 16 + 17 + 8 18 ## [0.4.3] - 2026-03-08 9 19 10 20 ### Added
+1 -1
Cargo.lock
··· 4365 4365 4366 4366 [[package]] 4367 4367 name = "tiles" 4368 - version = "0.4.3" 4368 + version = "0.4.4" 4369 4369 dependencies = [ 4370 4370 "anyhow", 4371 4371 "async-std",
+1
justfile
··· 23 23 24 24 bundle_pkg: 25 25 ./pkg/build.sh 26 + ./pkg/bundle_network_installer.sh 26 27 27 28 bundle_model_pkg: 28 29 ./pkg/build_model.sh
+1 -18
pkg/build.sh
··· 71 71 72 72 73 73 # Creating .pkg 74 - pkgbuild --root pkgroot --scripts pkg/scripts --identifier com.tilesprivacy.tiles --version "$VERSION" "tiles-${VERSION}-unsigned".pkg 75 - 76 - 77 - # signing 78 - productsign \ 79 - --sign "$DEVELOPER_ID_INSTALLER" \ 80 - "tiles-${VERSION}-unsigned.pkg" \ 81 - "tiles-${VERSION}.pkg" 82 - 83 - rm "tiles-${VERSION}-unsigned.pkg" 84 - 85 - # notarizing 86 - xcrun notarytool submit "tiles-${VERSION}.pkg"\ 87 - --keychain-profile "tiles-notary-profile" \ 88 - --wait 89 - 90 - # staple the approval ticket to pkg 91 - xcrun stapler staple "tiles-${VERSION}.pkg" 74 + pkgbuild --root pkgroot --scripts pkg/scripts --identifier com.tilesprivacy.tiles --version "$VERSION" pkg/tiles-unsigned.pkg 92 75
+16 -10
pkg/build_full.sh
··· 4 4 5 5 VERSION=$(grep '^version' tiles/Cargo.toml | head -1 | awk -F'"' '{print $2}') 6 6 7 - # bundling the models 8 - productbuild --package "tiles-${VERSION}".pkg --package tiles-model.pkg "tiles-${VERSION}-full-unsigned".pkg 7 + 8 + productbuild \ 9 + --distribution pkg/distribution.xml \ 10 + --resources pkg/resources \ 11 + --package-path pkg/ \ 12 + pkg/tiles-full-unsigned.pkg 9 13 10 14 11 15 # signing 16 + # 12 17 productsign \ 13 18 --sign "$DEVELOPER_ID_INSTALLER" \ 14 - "tiles-${VERSION}-full-unsigned.pkg" \ 15 - "tiles-${VERSION}-full.pkg" 19 + pkg/tiles-full-unsigned.pkg \ 20 + pkg/tiles-full.pkg 16 21 17 22 # notarizing 18 - xcrun notarytool submit "tiles-${VERSION}-full.pkg"\ 19 - --keychain-profile "tiles-notary-profile" \ 20 - --wait 23 + # 24 + # xcrun notarytool submit pkg/tiles-full.pkg \ 25 + # --keychain-profile "tiles-notary-profile" \ 26 + # --wait 21 27 22 - # staple the approval ticket to pkg 23 - xcrun stapler staple "tiles-${VERSION}-full.pkg" 24 - 28 + # # staple the approval ticket to pkg 29 + # xcrun stapler staple pkg/tiles-full.pkg 25 30 31 + rm pkg/tiles-full-unsigned.pkg
+2 -1
pkg/build_model.sh
··· 1 1 # model pkg command, run when model changes, or need a local copy for final pkg 2 2 MODELS_VERSION=1.0 3 - pkgbuild --root pkgroot_models --identifier com.tilesprivacy.tiles_models --version "$MODELS_VERSION" tiles-model.pkg 3 + 4 + pkgbuild --root pkgroot_models --identifier com.tilesprivacy.tiles_models --version "$MODELS_VERSION" pkg/tiles-model.pkg
+29
pkg/bundle_network_installer.sh
··· 1 + #!/usr/bin/env bash 2 + 3 + set -euo pipefail 4 + 5 + VERSION=$(grep '^version' tiles/Cargo.toml | head -1 | awk -F'"' '{print $2}') 6 + 7 + productbuild \ 8 + --distribution pkg/distribution_network.xml \ 9 + --resources pkg/resources \ 10 + --package-path pkg/ \ 11 + pkg/tiles-dist-unsigned.pkg 12 + 13 + 14 + # signing 15 + productsign \ 16 + --sign "$DEVELOPER_ID_INSTALLER" \ 17 + pkg/tiles-dist-unsigned.pkg \ 18 + pkg/tiles.pkg 19 + 20 + # notarizing 21 + xcrun notarytool submit pkg/tiles.pkg \ 22 + --keychain-profile "tiles-notary-profile" \ 23 + --wait 24 + 25 + # staple the approval ticket to pkg 26 + xcrun stapler staple pkg/tiles.pkg 27 + 28 + rm pkg/tiles-unsigned.pkg 29 + rm pkg/tiles-dist-unsigned.pkg
+32
pkg/distribution.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <installer-gui-script minSpecVersion="1"> 3 + <title>Tiles</title> 4 + 5 + 6 + <!-- <background file="sidebar.png" mime-type="image/png" scaling="proportionally" alignment="left"/> --> 7 + 8 + 9 + <!-- <background-darkAqua file="sidebar.png" mime-type="image/png" scaling="proportionally" alignment="left"/> --> 10 + 11 + 12 + <options customize="never"/> 13 + 14 + <welcome file="welcome.html"/> 15 + 16 + <conclusion file="conclusion.html"/> 17 + 18 + <choices-outline> 19 + <line choice="app" /> 20 + <line choice="model" /> 21 + </choices-outline> 22 + 23 + <choice id="app" visible="true" start_selected="true" title="app"> 24 + <pkg-ref id="com.tilesprivacy.tiles" onConclusion="none">tiles-unsigned.pkg</pkg-ref> 25 + </choice> 26 + 27 + <choice id="model" visible="true" start_selected="true" title="model"> 28 + <pkg-ref id="com.tilesprivacy.tiles_models" onConclusion="none">tiles-model.pkg</pkg-ref> 29 + </choice> 30 + 31 + 32 + </installer-gui-script>
+29
pkg/distribution_network.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <installer-gui-script minSpecVersion="1"> 3 + <title>Tiles</title> 4 + 5 + 6 + <!-- <background file="sidebar.png" mime-type="image/png" scaling="proportionally" alignment="left"/> --> 7 + 8 + 9 + <!-- <background-darkAqua file="sidebar.png" mime-type="image/png" scaling="proportionally" alignment="left"/> --> 10 + 11 + 12 + <options customize="never"/> 13 + 14 + <welcome file="welcome_network.html"/> 15 + 16 + <conclusion file="conclusion.html"/> 17 + 18 + <choices-outline> 19 + <line choice="app" /> 20 + </choices-outline> 21 + 22 + <choice id="app" visible="true" start_selected="true" title="app"> 23 + <pkg-ref id="com.tilesprivacy.tiles" onConclusion="none">tiles-unsigned.pkg</pkg-ref> 24 + </choice> 25 + 26 + 27 + </installer-gui-script> 28 + 29 +
+2 -1
pkg/pkg_building.md
··· 10 10 just bundle_pkg 11 11 ``` 12 12 13 - Creates tiles-<VERSION>.pkg, signs and notarize it 13 + Creates tiles.pkg, signs and notarize it 14 14 15 15 16 16 ### Offline Installer ··· 40 40 just bundle_pkg_full 41 41 42 42 ``` 43 + Creates tiles-full.pkg, signs and notarize it
+18 -4
pkg/resources/conclusion.html
··· 1 1 <html> 2 - <body style="font-family: -apple-system, sans-serif;"> 3 - <h2>Tiles Installed!!</h2> 2 + <head> 3 + <meta charset="utf-8"> 4 + <style> 5 + body { 6 + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, Arial, sans-serif; 7 + font-size: 13px; 8 + } 9 + </style> 10 + </head> 4 11 12 + <body> 13 + <h2>Tiles Installed 🚀</h2> 5 14 <p>The <b>tiles</b> CLI is now installed.</p> 6 15 7 16 <p>Open Terminal and run:</p> 8 17 9 - <pre>tiles</pre> 18 + <pre>tiles</pre><br> 19 + 20 + <p>Then complete CLI onboarding to set up your account and start using the chat interface.</p> 10 21 11 22 <p>For more options run:</p> 12 23 13 - <pre>tiles --help</pre> 24 + <pre>tiles --help</pre><br><br> 25 + 26 + <p style="font-size: 0.8em;"><i>keep on tiling...</i></p> 27 + 14 28 </body> 15 29 </html>
pkg/resources/sidebar.png

This is a binary file and will not be displayed.

+23
pkg/resources/welcome.html
··· 1 + <html> 2 + <head> 3 + <style> 4 + body { 5 + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, Arial, sans-serif; 6 + font-size: 13px; 7 + } 8 + </style> 9 + </head> 10 + 11 + <body> 12 + <h2>Welcome to the Offline Tiles installer.</h2> 13 + 14 + <p> 15 + Tiles is your private and secure AI assistant for everyday use. Developed as an independent open source project, made possible by wonderful sponsors.<br><br> 16 + 17 + This setup installs the Tiles runtime, dependencies, and the default <i>gpt-oss-20b</i> model so the system works fully offline with no additional downloads.<br><br> 18 + 19 + Tiles installs its CLI and runtime in <i><b>/usr/local</b></i> so that it is available system-wide. MacOS will request administrator authorization (password or Touch ID) to allow this installation. 20 + 21 + </p> 22 + </body> 23 + </html>
+24
pkg/resources/welcome_network.html
··· 1 + <html> 2 + <head> 3 + <style> 4 + body { 5 + font-family: -apple-system, BlinkMacSystemFont, "Helvetica Neue", Helvetica, Arial, sans-serif; 6 + font-size: 13px; 7 + } 8 + </style> 9 + </head> 10 + 11 + <body> 12 + <h2>Welcome to the Network Tiles installer.</h2> 13 + 14 + <p> 15 + Tiles is your private and secure AI assistant for everyday use. Developed as an independent open source project, made possible by wonderful sponsors.<br><br> 16 + 17 + This setup installs the Tiles runtime and required dependencies. 18 + During onboarding you will be prompted to download a model.<br><br> 19 + 20 + Tiles installs its CLI and runtime in <i><b>/usr/local</b></i> so that it is available system-wide. MacOS will request administrator authorization (password or Touch ID) to allow this installation. 21 + 22 + </p> 23 + </body> 24 + </html>
+3 -5
scripts/install.sh
··· 3 3 4 4 ENV="prod" # prod is another env, try taking it from github env 5 5 REPO="tilesprivacy/tiles" 6 - # VERSION="${TILES_VERSION:-latest}" 6 + VERSION=$(grep '^version' tiles/Cargo.toml | head -1 | awk -F'"' '{print $2}') 7 + 7 8 VERSION="0.4.3" 8 - # INSTALL_DIR="$HOME/.local/bin" # CLI install location 9 9 INSTALL_DIR="/usr/local/bin" # CLI install location 10 - # SERVER_DIR="$HOME/.local/lib/tiles/server" # Python server folder 11 - # MODELFILE_DIR="$HOME/.local/lib/tiles/modelfiles" # Python server folder 12 10 13 11 SERVER_DIR="/usr/local/share/tiles/server" # Python server folder 14 - MODELFILE_DIR="/usr/local/share/tiles/modelfiles" # Python server folder 12 + MODELFILE_DIR="/usr/local/share/tiles/modelfiles" # Modelfile server folder 15 13 16 14 TMPDIR="$(mktemp -d)" 17 15 OS=$(uname -s | tr '[:upper:]' '[:lower:]')
+1 -1
server/stack/requirements/app-server/packages-app-server.txt
··· 4 4 anyio==4.12.1 5 5 black==25.9.0 6 6 certifi==2026.2.25 7 - charset-normalizer==3.4.5 7 + charset-normalizer==3.4.6 8 8 click==8.3.1 9 9 fastapi==0.119.0 10 10 filelock==3.25.2
+2 -2
server/stack/requirements/app-server/pylock.app-server.meta.json
··· 1 1 { 2 2 "lock_input_hash": "sha256:c836d5cfb697330a57241b2b8f275a804178488ec906b19866809ef33c95ba81", 3 3 "lock_version": 1, 4 - "locked_at": "2026-03-13T17:42:07.680623+00:00", 4 + "locked_at": "2026-03-15T22:15:15.536434+00:00", 5 5 "other_inputs_hash": "sha256:63b3c2cfe2ec414938e81dace7aac779c7b902bae681618cd8827e9f16880985", 6 - "requirements_hash": "sha256:641adc25f61b50b1a2c832d6e2bca50ff879f623e3956bb04a5792ee8679ed57", 6 + "requirements_hash": "sha256:71fb833c54864760da900c69c2a0829e19fef2c6b6e8c174162fdb7f021a4eb3", 7 7 "version_inputs_hash": "sha256:58db986b7cd72eeded675f7c9afd8138fe024fb51451131b5562922bbde3cf43" 8 8 }
+17 -17
server/stack/requirements/app-server/pylock.app-server.toml
··· 75 75 76 76 [[packages]] 77 77 name = "charset-normalizer" 78 - version = "3.4.5" 78 + version = "3.4.6" 79 79 index = "https://pypi.org/simple" 80 80 81 81 [[packages.wheels]] 82 - url = "https://files.pythonhosted.org/packages/f5/48/9f34ec4bb24aa3fdba1890c1bddb97c8a4be1bd84ef5c42ac2352563ad05/charset_normalizer-3.4.5-cp313-cp313-macosx_10_13_universal2.whl" 83 - upload-time = 2026-03-06T06:01:37Z 84 - size = 280788 82 + url = "https://files.pythonhosted.org/packages/1e/1d/4fdabeef4e231153b6ed7567602f3b68265ec4e5b76d6024cf647d43d981/charset_normalizer-3.4.6-cp313-cp313-macosx_10_13_universal2.whl" 83 + upload-time = 2026-03-15T18:51:15Z 84 + size = 294823 85 85 86 86 [packages.wheels.hashes] 87 - sha256 = "ac59c15e3f1465f722607800c68713f9fbc2f672b9eb649fe831da4019ae9b23" 87 + sha256 = "11afb56037cbc4b1555a34dd69151e8e069bee82e613a73bef6e714ce733585f" 88 88 89 89 [[packages.wheels]] 90 - url = "https://files.pythonhosted.org/packages/94/0a/af49691938dfe175d71b8a929bd7e4ace2809c0c5134e28bc535660d5262/charset_normalizer-3.4.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 91 - upload-time = 2026-03-06T06:01:43Z 92 - size = 195572 90 + url = "https://files.pythonhosted.org/packages/2b/58/a199d245894b12db0b957d627516c78e055adc3a0d978bc7f65ddaf7c399/charset_normalizer-3.4.6-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" 91 + upload-time = 2026-03-15T18:51:21Z 92 + size = 206587 93 93 94 94 [packages.wheels.hashes] 95 - sha256 = "0625665e4ebdddb553ab185de5db7054393af8879fb0c87bd5690d14379d6819" 95 + sha256 = "530e8cebeea0d76bdcf93357aa5e41336f48c3dc709ac52da2bb167c5b8271d9" 96 96 97 97 [[packages.wheels]] 98 - url = "https://files.pythonhosted.org/packages/84/31/faa6c5b9d3688715e1ed1bb9d124c384fe2fc1633a409e503ffe1c6398c1/charset_normalizer-3.4.5-cp313-cp313-musllinux_1_2_x86_64.whl" 99 - upload-time = 2026-03-06T06:01:56Z 100 - size = 197509 98 + url = "https://files.pythonhosted.org/packages/53/e9/5f85f6c5e20669dbe56b165c67b0260547dea97dba7e187938833d791687/charset_normalizer-3.4.6-cp313-cp313-musllinux_1_2_x86_64.whl" 99 + upload-time = 2026-03-15T18:51:34Z 100 + size = 208652 101 101 102 102 [packages.wheels.hashes] 103 - sha256 = "c7a80a9242963416bd81f99349d5f3fce1843c303bd404f204918b6d75a75fd6" 103 + sha256 = "6cceb5473417d28edd20c6c984ab6fee6c6267d38d906823ebfe20b03d607dc2" 104 104 105 105 [[packages.wheels]] 106 - url = "https://files.pythonhosted.org/packages/c5/60/3a621758945513adfd4db86827a5bafcc615f913dbd0b4c2ed64a65731be/charset_normalizer-3.4.5-py3-none-any.whl" 107 - upload-time = 2026-03-06T06:03:17Z 108 - size = 55455 106 + url = "https://files.pythonhosted.org/packages/2a/68/687187c7e26cb24ccbd88e5069f5ef00eba804d36dde11d99aad0838ab45/charset_normalizer-3.4.6-py3-none-any.whl" 107 + upload-time = 2026-03-15T18:53:23Z 108 + size = 61455 109 109 110 110 [packages.wheels.hashes] 111 - sha256 = "9db5e3fcdcee89a78c04dffb3fe33c79f77bd741a624946db2591c81b2fc85b0" 111 + sha256 = "947cf925bc916d90adba35a64c82aace04fa39b46b52d4630ece166655905a69" 112 112 113 113 [[packages]] 114 114 name = "click"
+1 -1
tiles/Cargo.toml
··· 1 1 [package] 2 2 name = "tiles" 3 - version = "0.4.3" 3 + version = "0.4.4" 4 4 edition = "2024" 5 5 6 6 [dependencies]