# Project export: Dashi

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: UC Berkeley AI Hackathon 2025
- Tagline: Dashi is an enhanced assistant that lives on your computer, always ready to assist you.
- Devpost: https://devpost.com/software/dashi
- GitHub: https://github.com/ehcaw/dashi
- Team: 2 GitHub contributor(s) — ehcaw (9 commits), elusiphe (3 commits)

## Devpost submission (written by the team)

### Inspiration

There was a twitter post mentioning how nobody has built a widget app with the little FaceID emoticon. 😊

### What it does

Dashi aims to solve the shortcomings of Siri using modern AI functionalities. Using features like tool calling and MCP servers, we give an AI assistant like Siri much more capability.

### How we built it

We built the agent powering Dashi with Letta's new sleep time voice agent.

### Challenges we ran into

The mix of environments (cloud apis, local functions) caused a lot of trouble during Dashi's development. Letta's integration with other services such as Vapi also had some issues, forcing us to debug for hours.

### Accomplishments we're proud of

We built a clean, opinionated UI that the user can easily navigate to use their assistant. Dashi is lightweight (thanks to Tauri) and lives on your system idly until you need it.

### What we learned

MCP is not completely fleshed out and the agent ecosystem has a far way to go in standardizing how agents are built. Cut and paste integrations are finnicky and hard to debug without a constant support team (Thank you Charles and Sarah!)

### What's next

Make it modular by allowing the user to customize their own assistant (add their own tools, bring their own MCP servers, etc.) Improve the UI/UX across all of Dashi's capabilities, ensuring a seamless experience for the user.

## README (from the GitHub repository)

# dashi

This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).

## Getting Started

First, run the development server:

```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```

Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.

You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.

This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.

## Learn More

To learn more about Next.js, take a look at the following resources:

- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.

You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!

## Deploy on Vercel

The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.

Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.


## Detected evidence (automated analysis)

Indexed codebase: 22 recognized source files, 102 KB.
- CSS (language) — detected in the code
- Next.js (technology) — detected in the code
- React (technology) — detected in the code
- Rust (language) — detected in the code
- Tailwind CSS (technology) — detected in the code
- TypeScript (language) — detected in the code
- Python (language) — claimed on Devpost, not found in the code

## Codebase structure (from repository index)

### Files (37 of 37)

```
.gitignore
bun.lock
components.json
eslint.config.mjs
next.config.ts
package.json
postcss.config.mjs
public/imdashianimate.json
README.md
src-tauri/.gitignore
src-tauri/build.rs
src-tauri/capabilities/default.json
src-tauri/Cargo.lock
src-tauri/Cargo.toml
src-tauri/groq_rs/Cargo.toml
src-tauri/groq_rs/src/lib.rs
src-tauri/groq_rs/src/message.rs
src-tauri/icons/icon.icns
src-tauri/src/audio.rs
src-tauri/src/lib.rs
src-tauri/src/main.rs
src-tauri/tauri.conf.json
src/app/globals.css
src/app/layout.tsx
src/app/newpage/page.tsx
src/app/page.tsx
src/components/Overlay.tsx
src/components/ui/button.tsx
src/components/ui/card.tsx
src/components/ui/dashimain.tsx
src/components/ui/input.tsx
src/components/ui/musicnotes.tsx
src/lib/letta.ts
src/lib/tts.ts
src/lib/utils.ts
src/utils/McpManager.ts
tsconfig.json
```

### Dependencies

- package.json: @copilotkit/react-core@^1.9.1, @copilotkit/react-ui@^1.9.1, @eslint/eslintrc@^3, @letta-ai/letta-client@^0.1.132, @radix-ui/react-slot@^1.2.3, @tailwindcss/postcss@^4, @tauri-apps/cli@^2.5.0, @types/node@^20, @types/react@^19, @types/react-dom@^19, class-variance-authority@^0.7.1, clsx@^2.1.1, eslint@^9, eslint-config-next@15.3.4, framer-motion@^12.18.1, lottie-react@^2.4.1, lucide-react@^0.522.0, next@15.3.4, react@^19.0.0, react-dom@^19.0.0, tailwind-merge@^3.3.1, tailwindcss@^4, tw-animate-css@^1.3.4, typescript@^5, use-mcp@^0.0.9
- src-tauri/Cargo.toml: dotenv@0.15.0, groq_api_rust, hound@3.5.1, log@0.4, once_cell@1.21.3, serde@1.0, serde_json@1.0, tauri@2.5.0, tauri-build@2.2.0, tauri-plugin-log@2.0.0-rc, tokio@1.45.1
- src-tauri/groq_rs/Cargo.toml: hound@3.5.1, log@0.4.21, reqwest@0.12.5, serde@1.0.203, serde_json@1.0.117, thiserror@1.0.61, tokio@1.38.0, tokio-macros@2.3.0

### Recent commits (newest first)

- Merge pull request #2 from ehcaw/linda
- chatbox fix
- linda pls fix
- fixed dat hoe
- domain expansion gojo
- we so back
- Merge pull request #1 from ehcaw/linda
- bruh
- Initial
- Initial
- Initial commit
- Initial commit from Create Next App

## Key source files (fetched from GitHub, selected and truncated for size)

### package.json

```
{
  "name": "dashi",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev --turbopack",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "@copilotkit/react-core": "^1.9.1",
    "@copilotkit/react-ui": "^1.9.1",
    "@letta-ai/letta-client": "^0.1.132",
    "@radix-ui/react-slot": "^1.2.3",
    "class-variance-authority": "^0.7.1",
    "clsx": "^2.1.1",
    "framer-motion": "^12.18.1",
    "lottie-react": "^2.4.1",
    "lucide-react": "^0.522.0",
    "next": "15.3.4",
    "react": "^19.0.0",
    "react-dom": "^19.0.0",
    "tailwind-merge": "^3.3.1",
    "use-mcp": "^0.0.9"
  },
  "devDependencies": {
    "@eslint/eslintrc": "^3",
    "@tailwindcss/postcss": "^4",
    "@tauri-apps/cli": "^2.5.0",
    "@types/node": "^20",
    "@types/react": "^19",
    "@types/react-dom": "^19",
    "eslint": "^9",
    "eslint-config-next": "15.3.4",
    "tailwindcss": "^4",
    "tw-animate-css": "^1.3.4",
    "typescript": "^5"
  }
}

```

### src-tauri/Cargo.toml

```
[package]
name = "app"
version = "0.1.0"
description = "A Tauri App"
authors = ["you"]
license = ""
repository = ""
edition = "2021"
rust-version = "1.77.2"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[lib]
name = "app_lib"
crate-type = ["staticlib", "cdylib", "rlib"]

[build-dependencies]
tauri-build = { version = "2.2.0", features = [] }

[dependencies]
serde_json = "1.0"
serde = { version = "1.0", features = ["derive"] }
log = "0.4"
tauri = { version = "2.5.0", features = [] }
tauri-plugin-log = "2.0.0-rc"
hound = "3.5.1"
tokio = "1.45.1"
once_cell = "1.21.3"
groq_api_rust = { path = "./groq_rs" }
dotenv = "0.15.0"

```

### src-tauri/groq_rs/Cargo.toml

```
[package]
name = "groq_api_rust"
version = "0.2.51"
edition = "2021"
authors = ["<ryannguyenc@gmail.com>"]
description = "This library provides the ability to interact with the Groq API."
license = "Apache-2.0"
keywords = ["groq", "llm", "ai", "language", "api"]
categories = ["api-bindings"]


[dependencies]
hound = "3.5.1"
log = "0.4.21"
reqwest = { version = "0.12.5", features = ["blocking", "json", "multipart"] }
serde = { version = "1.0.203", features = ["derive"] }
serde_json = "1.0.117"
thiserror = "1.0.61"

[dev-dependencies]
tokio = { version = "1.38.0", features = ["macros", "fs"] }
tokio-macros = "2.3.0"

```

### src-tauri/src/main.rs

```rust
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
use dotenv::dotenv;

fn main() {
  dotenv().ok();
  app_lib::run();
}

```

### src/app/layout.tsx

```typescript
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
import { CopilotKit } from "@copilotkit/react-core";

const geistSans = Geist({
  variable: "--font-geist-sans",
  subsets: ["latin"],
});

const geistMono = Geist_Mono({
  variable: "--font-geist-mono",
  subsets: ["latin"],
});

export const metadata: Metadata = {
  title: "Create Next App",
  description: "Generated by create next app",
};

export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body
        className={`${geistSans.variable} ${geistMono.variable} antialiased`}
      >
        <CopilotKit publicApiKey="ck_pub_bd6434fb990a79d38df40606ee2e059a">
          {children}
        </CopilotKit>
      </body>
    </html>
  );
}

```

### src/app/page.tsx

```typescript
"use client";

import TwoDifferentVectors from "@/components/ui/musicnotes";
import { useState } from "react";
import AnimatedVectorBox from "@/components/ui/dashimain";

export default function Home() {
  const [boxWidth, setBoxWidth] = useState(100);

  const vectorPaths = [
    "M34.4363 58.929C35.531 57.78 37.3466 57.6793 38.5633 58.7259C39.8191 59.8065 39.9612 61.7014 38.8807 62.9573L38.6199 63.2542C35.9001 66.289 32.5388 68.1077 28.8582 68.1077C25.1873 68.1076 21.803 66.298 19.0232 63.2864L18.7557 62.9915L18.656 62.8734C17.6643 61.6344 17.8083 59.8215 19.0086 58.7562C20.2093 57.6908 22.0264 57.7642 23.1385 58.8968L23.2439 59.0091L23.6238 59.4212C25.5177 61.3948 27.3384 62.1076 28.8582 62.1077C30.4697 62.1077 32.3858 61.3061 34.3328 59.0433L34.4363 58.929Z",
    "M10.9998 46.0003C13.2089 46.0003 14.9998 47.7912 14.9998 50.0003C14.9996 52.2093 13.2088 54.0003 10.9998 54.0003H9.9998C7.79084 54.0003 6.00003 52.2092 5.9998 50.0003C5.9998 47.7912 7.7907 46.0004 9.9998 46.0003H10.9998Z",
    "M47.9998 46.0003C50.2089 46.0003 51.9998 47.7912 51.9998 50.0003C51.9996 52.2093 50.2088 54.0003 47.9998 54.0003H46.9998C44.7908 54.0003 43 52.2092 42.9998 50.0003C42.9998 47.7912 44.7907 46.0004 46.9998 46.0003H47.9998Z",
    "M14.576 3.09992C22.7629 -0.37136 32.0812 -0.855216 39.5291 1.28742C46.7916 3.37686 53.1167 8.32172 53.5262 16.2259L53.5418 16.6048V16.7591C53.505 18.3458 52.2292 19.6427 50.6248 19.6868C48.9689 19.7322 47.5896 18.4257 47.5437 16.7698C47.4228 12.3788 44.0147 8.8217 37.8709 7.05402C31.7968 5.30651 23.8891 5.66836 16.9178 8.62433C10.292 11.4339 8.21574 15.6995 8.15214 19.4446C8.11527 21.6222 8.75174 23.7768 9.80937 25.6107C14.1745 23.733 19.0447 22.3322 23.8641 21.4495C32.2293 19.9175 41.0304 19.8392 47.3621 21.9622C53.1083 23.8889 56.7656 26.6279 57.1258 30.4964C57.3 32.369 56.6025 33.9505 55.7947 35.0736C54.9927 36.1884 53.9539 37.0448 53.0057 37.595C48.585 40.1599 41.8361 41.4447 34.4041 41.1292C26.8911 40.8103 18.3552 38.8474 10.2156 34.5657L10.076 34.4915L9.94316 34.4036C9.34618 34.0039 8.7721 33.5572 8.22441 33.0706C6.98364 33.7723 5.84552 34.5166 4.83476 35.2982C3.52412 36.3114 1.64022 36.0705 0.626751 34.7601C-0.386569 33.4494 -0.145623 31.5656 1.16484 30.5521C2.17972 29.7673 3.28124 29.0252 4.45195 28.3255C2.96215 25.6369 2.09922 22.5254 2.15312 19.3431C2.2618 12.9398 6.0436 6.71785 14.576 3.09992ZM45.4549 27.6507C40.4866 25.9849 32.8331 25.907 24.9441 27.3519C21.3892 28.003 17.9062 28.9415 14.7195 30.1126C21.4908 33.3558 28.4834 34.873 34.659 35.1351C41.4364 35.4227 46.9145 34.1922 49.9939 32.4056C50.3086 32.223 50.6778 31.9112 50.9236 31.5696C51.1601 31.2409 51.154 31.0756 51.1521 31.053C51.1508 31.0387 51.1431 30.9654 51.0594 30.8216C50.9699 30.6682 50.7801 30.4128 50.3894 30.0823C49.5836 29.4007 48.0851 28.5326 45.4549 27.6507Z",
  ];

  return (
    <main
      className="flex min-h-screen items-start justify-center p-4"
      style={{
        backgroundImage: "url(/darkmodemonterey.jpg)",
        backgroundSize: "cover",
        backgroundPosition: "center",
        backgroundRepeat: "no-repeat",
      }}
    >
      <div style={{ marginTop: "50px" }}>
        <AnimatedVectorBox width={boxWidth} vectorPaths={vectorPaths} />
      </div>
    </main>
  );
}

```

### src/app/newpage/page.tsx

```typescript
'use client';

import TwoDifferentVectors from '@/components/ui/musicnotes';
import { useState } from 'react';
import AnimatedVectorBox from '@/components/ui/dashimain';

export default function Home() {
  const [boxWidth, setBoxWidth] = useState(100);

  const vectorPaths = ["M34.4363 58.929C35.531 57.78 37.3466 57.6793 38.5633 58.7259C39.8191 59.8065 39.9612 61.7014 38.8807 62.9573L38.6199 63.2542C35.9001 66.289 32.5388 68.1077 28.8582 68.1077C25.1873 68.1076 21.803 66.298 19.0232 63.2864L18.7557 62.9915L18.656 62.8734C17.6643 61.6344 17.8083 59.8215 19.0086 58.7562C20.2093 57.6908 22.0264 57.7642 23.1385 58.8968L23.2439 59.0091L23.6238 59.4212C25.5177 61.3948 27.3384 62.1076 28.8582 62.1077C30.4697 62.1077 32.3858 61.3061 34.3328 59.0433L34.4363 58.929Z", "M10.9998 46.0003C13.2089 46.0003 14.9998 47.7912 14.9998 50.0003C14.9996 52.2093 13.2088 54.0003 10.9998 54.0003H9.9998C7.79084 54.0003 6.00003 52.2092 5.9998 50.0003C5.9998 47.7912 7.7907 46.0004 9.9998 46.0003H10.9998Z", "M47.9998 46.0003C50.2089 46.0003 51.9998 47.7912 51.9998 50.0003C51.9996 52.2093 50.2088 54.0003 47.9998 54.0003H46.9998C44.7908 54.0003 43 52.2092 42.9998 50.0003C42.9998 47.7912 44.7907 46.0004 46.9998 46.0003H47.9998Z", "M14.576 3.09992C22.7629 -0.37136 32.0812 -0.855216 39.5291 1.28742C46.7916 3.37686 53.1167 8.32172 53.5262 16.2259L53.5418 16.6048V16.7591C53.505 18.3458 52.2292 19.6427 50.6248 19.6868C48.9689 19.7322 47.5896 18.4257 47.5437 16.7698C47.4228 12.3788 44.0147 8.8217 37.8709 7.05402C31.7968 5.30651 23.8891 5.66836 16.9178 8.62433C10.292 11.4339 8.21574 15.6995 8.15214 19.4446C8.11527 21.6222 8.75174 23.7768 9.80937 25.6107C14.1745 23.733 19.0447 22.3322 23.8641 21.4495C32.2293 19.9175 41.0304 19.8392 47.3621 21.9622C53.1083 23.8889 56.7656 26.6279 57.1258 30.4964C57.3 32.369 56.6025 33.9505 55.7947 35.0736C54.9927 36.1884 53.9539 37.0448 53.0057 37.595C48.585 40.1599 41.8361 41.4447 34.4041 41.1292C26.8911 40.8103 18.3552 38.8474 10.2156 34.5657L10.076 34.4915L9.94316 34.4036C9.34618 34.0039 8.7721 33.5572 8.22441 33.0706C6.98364 33.7723 5.84552 34.5166 4.83476 35.2982C3.52412 36.3114 1.64022 36.0705 0.626751 34.7601C-0.386569 33.4494 -0.145623 31.5656 1.16484 30.5521C2.17972 29.7673 3.28124 29.0252 4.45195 28.3255C2.96215 25.6369 2.09922 22.5254 2.15312 19.3431C2.2618 12.9398 6.0436 6.71785 14.576 3.09992ZM45.4549 27.6507C40.4866 25.9849 32.8331 25.907 24.9441 27.3519C21.3892 28.003 17.9062 28.9415 14.7195 30.1126C21.4908 33.3558 28.4834 34.873 34.659 35.1351C41.4364 35.4227 46.9145 34.1922 49.9939 32.4056C50.3086 32.223 50.6778 31.9112 50.9236 31.5696C51.1601 31.2409 51.154 31.0756 51.1521 31.053C51.1508 31.0387 51.1431 30.9654 51.0594 30.8216C50.9699 30.6682 50.7801 30.4128 50.3894 30.0823C49.5836 29.4007 48.0851 28.5326 45.4549 27.6507Z"]

  return (
    <main 
      className="flex min-h-screen items-start justify-center p-4"
      style={{
        backgroundImage: 'url(/darkmodemonterey.jpg)',
        backgroundSize: 'cover',
        backgroundPosition: 'center',
        backgroundRepeat: 'no-repeat',
      }}
    >
      <div style={{ marginTop: '50px' }}>
        <AnimatedVectorBox width={boxWidth} vectorPaths={vectorPaths} />
      </div>
    </main>
  );
}




```

### next.config.ts

```typescript
import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  /* config options here */
};

export default nextConfig;

```

### src-tauri/build.rs

```rust
fn main() {
  tauri_build::build()
}

```

### src/lib/utils.ts

```typescript
import { clsx, type ClassValue } from "clsx"
import { twMerge } from "tailwind-merge"

export function cn(...inputs: ClassValue[]) {
  return twMerge(clsx(inputs))
}

```

[13 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]