-                                {#each config.filter((p) => !p.required) as prop (prop.name)}
+                                {#each config.filter(p => !p.required) as prop (prop.name)}
                                     
 {
+        await update?.downloadAndInstall(event => {
             switch (event.event) {
                 case 'Started':
                     totalDownload = (event.data.contentLength as number) / 1000.0;
diff --git a/src/components/Welcome.svelte b/src/components/Welcome.svelte
index d2a8736..a458215 100644
--- a/src/components/Welcome.svelte
+++ b/src/components/Welcome.svelte
@@ -21,8 +21,8 @@
         
Welcome to Tome
         
             Thanks for being an early adopter! We appreciate you kicking the tires of our
-            Technical Preview as we explore making local LLMs, MCP, and AI app composition
-            a better experience.
+            Technical Preview
+            as we explore making local LLMs, MCP, and AI app composition a better experience.
         
         
             This is an extremely early build. There will be problems – edges are rough – features
diff --git a/src/hooks.client.ts b/src/hooks.client.ts
index 8f69ea3..eb08862 100644
--- a/src/hooks.client.ts
+++ b/src/hooks.client.ts
@@ -39,19 +39,13 @@ export const init: ClientInit = async () => {
     await Config.migrate();
     info('[green]✔ config migrated');
 
-    await startup.addCheck(
-        StartupCheck.Agreement,
-        async () => Config.agreedToWelcome,
-    );
+    await startup.addCheck(StartupCheck.Agreement, async () => Config.agreedToWelcome);
 
-    await startup.addCheck(
-        StartupCheck.UpdateAvailable,
-        async () => await isUpToDate(),
-    );
+    await startup.addCheck(StartupCheck.UpdateAvailable, async () => await isUpToDate());
 
     await startup.addCheck(
         StartupCheck.NoModels,
-        async () => Engine.all().flatMap(e => e.models).length > 0,
+        async () => Engine.all().flatMap(e => e.models).length > 0
     );
 };
 
diff --git a/src/lib/deeplinks.ts b/src/lib/deeplinks.ts
index c2a2fbd..77afe46 100644
--- a/src/lib/deeplinks.ts
+++ b/src/lib/deeplinks.ts
@@ -13,7 +13,7 @@ export enum DeepLinks {
 }
 
 export function setupDeeplinks() {
-    listen(DeepLinks.InstallMcpServer, async (event) => {
+    listen(DeepLinks.InstallMcpServer, async event => {
         goto(`/mcp-servers/install?config=${event.payload}`);
     });
 }
diff --git a/src/lib/engines/gemini/client.ts b/src/lib/engines/gemini/client.ts
index 052b352..f2299a2 100644
--- a/src/lib/engines/gemini/client.ts
+++ b/src/lib/engines/gemini/client.ts
@@ -29,7 +29,7 @@ export default class Gemini implements Client {
         tools?: Tool[],
         options?: Options
     ): Promise {
-        const messages = history.map((m) => GeminiMessage.from(m)).compact();
+        const messages = history.map(m => GeminiMessage.from(m)).compact();
 
         let config: GenerateContentConfig = {
             temperature: options?.temperature,
@@ -50,7 +50,7 @@ export default class Gemini implements Client {
         let toolCalls: ToolCall[] = [];
 
         if (functionCalls) {
-            toolCalls = functionCalls.map((tc) => ({
+            toolCalls = functionCalls.map(tc => ({
                 function: {
                     name: tc.name as string,
                     arguments: tc.args || {},
@@ -69,8 +69,8 @@ export default class Gemini implements Client {
 
     async models(): Promise {
         return (await this.client.models.list()).page
-            .filter((model) => this.supportedModels.includes(model.name as string))
-            .map((model) => {
+            .filter(model => this.supportedModels.includes(model.name as string))
+            .map(model => {
                 const metadata = model;
                 const name = metadata.name?.replace('models/', '') as string;
 
diff --git a/src/lib/engines/gemini/message.ts b/src/lib/engines/gemini/message.ts
index 49372e7..921e081 100644
--- a/src/lib/engines/gemini/message.ts
+++ b/src/lib/engines/gemini/message.ts
@@ -67,7 +67,7 @@ function fromToolResponse(message: IMessage): Content {
     // Find the `toolCall` message for this response
     const session = Session.find(message.sessionId as number);
     const messages = Session.messages(session);
-    const call = messages.flatMap((m) => m.toolCalls).find((tc) => tc.id == message.toolCallId);
+    const call = messages.flatMap(m => m.toolCalls).find(tc => tc.id == message.toolCallId);
 
     return {
         role: 'user',
diff --git a/src/lib/engines/gemini/tool.ts b/src/lib/engines/gemini/tool.ts
index 48e0594..8b1d98b 100644
--- a/src/lib/engines/gemini/tool.ts
+++ b/src/lib/engines/gemini/tool.ts
@@ -32,7 +32,7 @@ function from(tools: Tool | Tool[]): ToolListUnion {
 }
 
 function fromMany(tools: Tool[]): FunctionDeclaration[] {
-    return tools.map((tool) => fromOne(tool));
+    return tools.map(tool => fromOne(tool));
 }
 
 function fromOne(tool: Tool): FunctionDeclaration {
diff --git a/src/lib/engines/ollama/client.ts b/src/lib/engines/ollama/client.ts
index d8180fa..ae0a025 100644
--- a/src/lib/engines/ollama/client.ts
+++ b/src/lib/engines/ollama/client.ts
@@ -24,7 +24,7 @@ export default class Ollama implements Client {
         tools: Tool[] = [],
         options: Options = {}
     ): Promise {
-        const messages = history.map((m) => this.message.from(m));
+        const messages = history.map(m => this.message.from(m));
         const response = await this.client.chat({
             model: model.name,
             messages,
@@ -57,9 +57,7 @@ export default class Ollama implements Client {
     async models(): Promise {
         const models = (await this.client.list()).models;
 
-        return Promise.all(
-            models.map(async (model) => await this.info(model.name))
-        );
+        return Promise.all(models.map(async model => await this.info(model.name)));
     }
 
     async info(name: string): Promise {
diff --git a/src/lib/engines/ollama/message.ts b/src/lib/engines/ollama/message.ts
index 170dbb4..c4ae9d6 100644
--- a/src/lib/engines/ollama/message.ts
+++ b/src/lib/engines/ollama/message.ts
@@ -10,7 +10,7 @@ export function from(message: IMessage): Message {
     return {
         role: message.role,
         content: message.content,
-        tool_calls: message.toolCalls?.map((c) => ({
+        tool_calls: message.toolCalls?.map(c => ({
             function: {
                 name: c.function.name,
                 arguments: c.function.arguments,
diff --git a/src/lib/engines/openai/client.ts b/src/lib/engines/openai/client.ts
index 84e9e21..2b41773 100644
--- a/src/lib/engines/openai/client.ts
+++ b/src/lib/engines/openai/client.ts
@@ -33,7 +33,7 @@ export default class OpenAI implements Client {
         tools: Tool[] = [],
         options: Options = {}
     ): Promise {
-        const messages = history.map((m) => OpenAiMessage.from(m));
+        const messages = history.map(m => OpenAiMessage.from(m));
         const response = await this.client.chat.completions.create({
             model: model.name,
             messages,
@@ -45,7 +45,7 @@ export default class OpenAI implements Client {
         let toolCalls: ToolCall[] = [];
 
         if (tool_calls) {
-            toolCalls = tool_calls.map((tc) => ({
+            toolCalls = tool_calls.map(tc => ({
                 function: {
                     name: tc.function.name,
                     arguments: JSON.parse(tc.function.arguments),
@@ -66,10 +66,10 @@ export default class OpenAI implements Client {
         let allModels = (await this.client.models.list()).data;
 
         if (this.supportedModels !== 'all') {
-            allModels = allModels.filter((model) => this.supportedModels.includes(model.id));
+            allModels = allModels.filter(model => this.supportedModels.includes(model.id));
         }
 
-        return allModels.map((model) => {
+        return allModels.map(model => {
             const { id, ...metadata } = model;
             const name = id.replace('models/', ''); // Gemini model ids are prefixed with "model/"
 
diff --git a/src/lib/engines/openai/message.ts b/src/lib/engines/openai/message.ts
index 6c7c822..de71bdd 100644
--- a/src/lib/engines/openai/message.ts
+++ b/src/lib/engines/openai/message.ts
@@ -53,7 +53,7 @@ function toolCalls(message: IMessage): OpenAI.ChatCompletionMessageToolCall[] |
         return;
     }
 
-    return message.toolCalls.map((call) => ({
+    return message.toolCalls.map(call => ({
         id: call.id as string,
         type: 'function',
         function: {
diff --git a/src/lib/ext.ts b/src/lib/ext.ts
index c39a492..4c89a8a 100644
--- a/src/lib/ext.ts
+++ b/src/lib/ext.ts
@@ -93,7 +93,7 @@ Array.prototype.findBy = function (
     key: string,
     value: any
 ): T | undefined {
-    return this.find((item) => item[key] == value);
+    return this.find(item => item[key] == value);
 };
 
 /**
@@ -106,5 +106,5 @@ Array.prototype.findBy = function (
  * ```
  */
 Array.prototype.compact = function (this: T[]): Exclude[] {
-    return this.filter((i) => i !== undefined) as Exclude[];
+    return this.filter(i => i !== undefined) as Exclude[];
 };
diff --git a/src/lib/http.ts b/src/lib/http.ts
index f9685e5..9924ea6 100644
--- a/src/lib/http.ts
+++ b/src/lib/http.ts
@@ -13,7 +13,10 @@ export interface HttpOptions extends RequestInit {
 }
 
 export async function fetch(url: string | URL | Request, options?: RequestInit) {
-    const response: globalThis.Response = await invoke('fetch', { url, options });
+    const response: globalThis.Response = await invoke('fetch', {
+        url,
+        options,
+    });
     const { body, ...init } = response;
     return new globalThis.Response(body, init);
 }
@@ -37,7 +40,10 @@ export abstract class HttpClient {
     async post(uri: string, options: HttpOptions = {}): Promise> {
         const raw = Object.remove(options, 'raw');
         const raise: boolean | undefined = Object.remove(options, 'raise');
-        const response = await this.request(uri, { ...options, method: 'POST' });
+        const response = await this.request(uri, {
+            ...options,
+            method: 'POST',
+        });
         return raw ? response : await this.parse(response, raise);
     }
 
@@ -51,14 +57,20 @@ export abstract class HttpClient {
     async delete(uri: string, options: HttpOptions = {}): Promise> {
         const raw = Object.remove(options, 'raw');
         const raise: boolean | undefined = Object.remove(options, 'raise');
-        const response = await this.request(uri, { ...options, method: 'DELETE' });
+        const response = await this.request(uri, {
+            ...options,
+            method: 'DELETE',
+        });
         return raw ? response : await this.parse(response, raise);
     }
 
     async head(uri: string, options: HttpOptions = {}): Promise> {
         const raw = Object.remove(options, 'raw');
         const raise: boolean | undefined = Object.remove(options, 'raise');
-        const response = await this.request(uri, { ...options, method: 'HEAD' });
+        const response = await this.request(uri, {
+            ...options,
+            method: 'HEAD',
+        });
         return raw ? response : await this.parse(response, raise);
     }
 
diff --git a/src/lib/llm.ts b/src/lib/llm.ts
index d368855..1343145 100644
--- a/src/lib/llm.ts
+++ b/src/lib/llm.ts
@@ -39,7 +39,9 @@ export class OllamaClient extends HttpClient {
             stream: false,
         });
 
-        const response = (await this.post('/api/chat', { body })) as OllamaResponse;
+        const response = (await this.post('/api/chat', {
+            body,
+        })) as OllamaResponse;
 
         let thought: string | undefined;
         let content: string = response.message.content
@@ -75,7 +77,12 @@ export class OllamaClient extends HttpClient {
 
     async connected(): Promise {
         return (
-            ((await this.get('', { raw: true, timeout: 500 })) as globalThis.Response).status == 200
+            (
+                (await this.get('', {
+                    raw: true,
+                    timeout: 500,
+                })) as globalThis.Response
+            ).status == 200
         );
     }
 
diff --git a/src/lib/logger.ts b/src/lib/logger.ts
index 5daca33..26cb2e0 100644
--- a/src/lib/logger.ts
+++ b/src/lib/logger.ts
@@ -53,7 +53,7 @@ function _log(args: any[], level: Level) {
     if (typeof args[0] !== 'string') {
         console[level](...fmt(level, ''), ...args);
     } else {
-        console[level](...args.flatMap((arg) => (typeof arg === 'string' ? fmt(level, arg) : arg)));
+        console[level](...args.flatMap(arg => (typeof arg === 'string' ? fmt(level, arg) : arg)));
     }
 }
 
@@ -70,7 +70,7 @@ function fmt(level: Level, text: string): string[] {
 function colorize(text: string): string[] {
     let args: string[] = [];
 
-    text = text.replace(/\[\w+\]/g, (block) => {
+    text = text.replace(/\[\w+\]/g, block => {
         const code = block.replace('[', '').replace(']', '');
         const color = (colors as Obj)[code];
         args.push(`color: ${color};`);
diff --git a/src/lib/mcp.ts b/src/lib/mcp.ts
index 77a0300..7147aba 100644
--- a/src/lib/mcp.ts
+++ b/src/lib/mcp.ts
@@ -10,7 +10,7 @@ export * from '$lib/mcp.d';
 // can send to the LLM.
 //
 export async function getMCPTools(session: ISession): Promise {
-    return (await invoke('get_mcp_tools', { sessionId: session.id })).map((tool) => {
+    return (await invoke('get_mcp_tools', { sessionId: session.id })).map(tool => {
         return {
             type: 'function',
             function: {
diff --git a/src/lib/models/app.ts b/src/lib/models/app.ts
index 540d7a6..fb52458 100644
--- a/src/lib/models/app.ts
+++ b/src/lib/models/app.ts
@@ -57,13 +57,13 @@ export default class App extends Model('apps') {
     };
 
     static hasContext(app: IApp): boolean {
-        return app.nodes?.find((n) => n.type == NodeType.Context) !== undefined;
+        return app.nodes?.find(n => n.type == NodeType.Context) !== undefined;
     }
 
     static context(app: IApp): string {
         return app.nodes
-            .filter((n) => n.type == NodeType.Context)
-            .map((n) => n.config.value)
+            .filter(n => n.type == NodeType.Context)
+            .map(n => n.config.value)
             .join('\n\n');
     }
 
@@ -73,7 +73,7 @@ export default class App extends Model('apps') {
     }
 
     static removeNode(app: IApp, node: Node): IApp {
-        app.nodes = app.nodes.filter((n) => n.uuid !== node.uuid);
+        app.nodes = app.nodes.filter(n => n.uuid !== node.uuid);
         return app;
     }
 
@@ -102,7 +102,7 @@ export default class App extends Model('apps') {
         ]);
 
         if (result.rowsAffected == 1) {
-            app.mcpServers = app.mcpServers.filter((m) => m.id == mcpServer.id);
+            app.mcpServers = app.mcpServers.filter(m => m.id == mcpServer.id);
             return app.mcpServers;
         }
 
diff --git a/src/lib/models/base.svelte.ts b/src/lib/models/base.svelte.ts
index e754e2e..258298f 100644
--- a/src/lib/models/base.svelte.ts
+++ b/src/lib/models/base.svelte.ts
@@ -136,7 +136,7 @@ export default function Model(table: str
         static async sync(): Promise {
             repo = [];
 
-            (await this.query(`SELECT * FROM ${table}`)).forEach((record) => this.syncOne(record));
+            (await this.query(`SELECT * FROM ${table}`)).forEach(record => this.syncOne(record));
 
             info(`[green]✔ synced ${table}`);
         }
@@ -175,7 +175,7 @@ export default function Model(table: str
          * Find an individual record by`id`.
          */
         static find(id: number | string): Interface {
-            return this.all().find((m) => m.id == Number(id)) as Interface;
+            return this.all().find(m => m.id == Number(id)) as Interface;
         }
 
         /**
@@ -189,7 +189,7 @@ export default function Model(table: str
          * Find a collection of records by a set of the model's properties.
          */
         static where(params: Partial): Interface[] {
-            return repo.filter((m) => {
+            return repo.filter(m => {
                 return Object.entries(params).every(([key, value]) => m[key] == value);
             });
         }
@@ -329,7 +329,7 @@ export default function Model(table: str
                 ).rowsAffected >= 1;
 
             if (success) {
-                instances.forEach((instance) => {
+                instances.forEach(instance => {
                     this.syncRemove(instance);
                 });
             }
@@ -343,7 +343,7 @@ export default function Model(table: str
         protected static async query(sql: string, values: unknown[] = []): Promise {
             const result: Row[] = await (await this.db()).select(sql, values);
 
-            return await Promise.all(result.map(async (row) => await this.fromSql(row)));
+            return await Promise.all(result.map(async row => await this.fromSql(row)));
         }
 
         /**
@@ -374,7 +374,7 @@ export default function Model(table: str
          * Remove an instance from the repo
          */
         private static syncRemove(instance: Interface) {
-            repo = repo.filter((i) => i.id !== instance.id);
+            repo = repo.filter(i => i.id !== instance.id);
         }
 
         /**
@@ -389,7 +389,7 @@ export default function Model(table: str
          * This leaves only persisted records(ones with an`id`).
          */
         private static removeEphemeralInstances() {
-            repo = repo.filter((record) => record.id !== undefined);
+            repo = repo.filter(record => record.id !== undefined);
         }
 
         /**
@@ -490,7 +490,7 @@ export function BareModel() {
         }
 
         static delete(instance: T) {
-            repo = repo.filter((i) => i !== instance);
+            repo = repo.filter(i => i !== instance);
         }
 
         static all(): T[] {
diff --git a/src/lib/models/config.ts b/src/lib/models/config.ts
index 8012627..e80bba2 100644
--- a/src/lib/models/config.ts
+++ b/src/lib/models/config.ts
@@ -14,11 +14,7 @@ interface Row {
     value: string;
 }
 
-type ConfigKey =
-    | 'latest-session-id'
-    | 'welcome-agreed'
-    | 'skipped-version'
-    | 'default-model';
+type ConfigKey = 'latest-session-id' | 'welcome-agreed' | 'skipped-version' | 'default-model';
 
 export default class Config extends Model('config') {
     @getset('latest-session-id')
@@ -81,7 +77,7 @@ export default class Config extends Model('config') {
 }
 
 function getset(key: ConfigKey) {
-    return function(target: object, property: string) {
+    return function (target: object, property: string) {
         function get() {
             return Config.get(key);
         }
diff --git a/src/lib/models/engine.ts b/src/lib/models/engine.ts
index 83bdc98..1b7f305 100644
--- a/src/lib/models/engine.ts
+++ b/src/lib/models/engine.ts
@@ -75,6 +75,6 @@ export default class Engine extends BareModel() {
             });
         }
 
-        Model.reset(this.all().flatMap((engine) => engine.models));
+        Model.reset(this.all().flatMap(engine => engine.models));
     }
 }
diff --git a/src/lib/models/message/ollama.ts b/src/lib/models/message/ollama.ts
index 170dbb4..c4ae9d6 100644
--- a/src/lib/models/message/ollama.ts
+++ b/src/lib/models/message/ollama.ts
@@ -10,7 +10,7 @@ export function from(message: IMessage): Message {
     return {
         role: message.role,
         content: message.content,
-        tool_calls: message.toolCalls?.map((c) => ({
+        tool_calls: message.toolCalls?.map(c => ({
             function: {
                 name: c.function.name,
                 arguments: c.function.arguments,
diff --git a/src/lib/models/message/openai.ts b/src/lib/models/message/openai.ts
index 6c7c822..de71bdd 100644
--- a/src/lib/models/message/openai.ts
+++ b/src/lib/models/message/openai.ts
@@ -53,7 +53,7 @@ function toolCalls(message: IMessage): OpenAI.ChatCompletionMessageToolCall[] |
         return;
     }
 
-    return message.toolCalls.map((call) => ({
+    return message.toolCalls.map(call => ({
         id: call.id as string,
         type: 'function',
         function: {
diff --git a/src/lib/models/session.ts b/src/lib/models/session.ts
index ce7c9c6..64772e5 100644
--- a/src/lib/models/session.ts
+++ b/src/lib/models/session.ts
@@ -86,7 +86,7 @@ export default class Session extends Base('sessions') {
 
     static async removeMcpServer(session: ISession, server: IMcpServer): Promise {
         session.config.enabledMcpServers = session.config.enabledMcpServers.filter(
-            (s) => s !== server.name
+            s => s !== server.name
         );
         return await this.update(session);
     }
diff --git a/src/lib/tool-call-migration.ts b/src/lib/tool-call-migration.ts
index 9a5530e..94304f7 100644
--- a/src/lib/tool-call-migration.ts
+++ b/src/lib/tool-call-migration.ts
@@ -4,13 +4,13 @@ import Message from '$lib/models/message';
 
 export async function migrate() {
     await Promise.all(
-        Message.all().map(async (message) => {
+        Message.all().map(async message => {
             if (message.toolCalls.length == 0) {
                 return;
             }
 
             await Promise.all(
-                message.toolCalls.map(async (tc) => {
+                message.toolCalls.map(async tc => {
                     // Ollama tool calls didn't always have an `id`. Add one
                     // now if that's the case.
                     if (!tc.id) {
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 719b847..9c2a74f 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -25,12 +25,12 @@
         }
     }
 
-    onNavigate((navigation) => {
+    onNavigate(navigation => {
         if (!document.startViewTransition) {
             return;
         }
 
-        return new Promise((resolve) => {
+        return new Promise(resolve => {
             document.startViewTransition(async () => {
                 resolve();
                 await navigation.complete;
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index ee6b7ea..3731983 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -7,11 +7,7 @@
     import Svg from '$components/Svg.svelte';
     import Updater from '$components/Updater.svelte';
     import Welcome from '$components/Welcome.svelte';
-    import startup, {
-        type Condition,
-        type OnSuccess,
-        StartupCheck,
-    } from '$lib/startup';
+    import startup, { type Condition, type OnSuccess, StartupCheck } from '$lib/startup';
 
     const messages = {
         [StartupCheck.NoModels]: 'No Engines Connected',
@@ -73,9 +69,6 @@
             {/if}
         
     {:else}
-        
+        
     {/if}
 
diff --git a/src/routes/chat/[session_id]/+page.svelte b/src/routes/chat/[session_id]/+page.svelte
index 29f5fe8..6b1fc66 100644
--- a/src/routes/chat/[session_id]/+page.svelte
+++ b/src/routes/chat/[session_id]/+page.svelte
@@ -20,14 +20,12 @@
     import Session, { type ISession } from '$lib/models/session';
 
     const session: ISession = $derived(Session.find(page.params.session_id));
-    const model: IModel | undefined = $derived(
-        Model.find(session.config.model)
-    );
+    const model: IModel | undefined = $derived(Model.find(session.config.model));
 
     const sessions: ISession[] = $derived(Session.all());
     const mcpServers: IMcpServer[] = $derived(McpServer.all());
     const engines: IEngine[] = $derived(Engine.all());
-    const hasModels = $derived(engines.flatMap((e) => e.models).length > 0);
+    const hasModels = $derived(engines.flatMap(e => e.models).length > 0);
 
     let advancedIsOpen = $state(false);
 
@@ -37,8 +35,8 @@
     }
 
     async function startMcpServers(session: ISession) {
-        session.config.enabledMcpServers.forEach(async (name) => {
-            const server = mcpServers.find((s) => s.name == name);
+        session.config.enabledMcpServers.forEach(async name => {
+            const server = mcpServers.find(s => s.name == name);
 
             if (server) {
                 await startMcpServer(server);
@@ -102,9 +100,7 @@
 
 
 {#snippet titlebar()}
-    
+    
         Chat
         
 
                     {#if advancedIsOpen}
-                        
-