Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
87d395d
wip new prompt input ui/tools menu
shatfield4 Feb 26, 2026
e73d462
New chat history layout with chat bubbles (#4985)
shatfield4 Feb 26, 2026
6c90286
fix colors for prompt input
shatfield4 Feb 26, 2026
0185801
redesign workspace llm selector, extract text size + model picker to …
shatfield4 Feb 27, 2026
36e8115
Add Lovora custom Docker image with cloudflared + CI/CD pipeline
AndreasRamsli Feb 27, 2026
7e7e98b
Fix workflow branch: trigger on master not main
AndreasRamsli Feb 27, 2026
fa5bd14
Trigger Lovora build
AndreasRamsli Feb 27, 2026
de0d5ab
Remove paths filter to trigger build on all master pushes
AndreasRamsli Feb 27, 2026
3969f4e
Trigger fresh Lovora build
AndreasRamsli Feb 27, 2026
0ff94b9
Fix cloudflared token env var name for RunPod secrets
AndreasRamsli Feb 27, 2026
49cfe79
Fix supervisord permissions: run as root, drop anythingllm for app pr…
AndreasRamsli Feb 27, 2026
1f5d929
Override ENTRYPOINT for supervisord, use original entrypoint for Anyt…
AndreasRamsli Feb 27, 2026
d83fa14
Merge branch '4983-feat-new-chat-history-implementation' into 5066-ne…
shatfield4 Feb 28, 2026
da7cdce
refactor ToolsMenu component
shatfield4 Feb 28, 2026
74c6d04
Fix cloudflared token env var: use CLOUDFLARE_TOKEN not RUNPOD_SECRET…
AndreasRamsli Feb 28, 2026
f9eafa6
Fix crash loop: run node directly instead of entrypoint script, add c…
AndreasRamsli Feb 28, 2026
207c195
Auto-fix /workspace permissions on every container boot
AndreasRamsli Feb 28, 2026
2b7fad8
Rebrand: replace AnythingLLM with Lovora in UI text and tab title
AndreasRamsli Feb 28, 2026
0c0c34c
Add Happy Birthday PJ message to login page
AndreasRamsli Feb 28, 2026
bc35b35
Build frontend from source to include branding changes
AndreasRamsli Feb 28, 2026
792a245
Fix COPY paths for repo-root build context
AndreasRamsli Feb 28, 2026
fe7dcec
Disable build cache to force fresh frontend build
AndreasRamsli Feb 28, 2026
1fb6872
Add Happy Birthday PJ to main chat interface greeting
AndreasRamsli Feb 28, 2026
38d425e
fix colors/refactor WorkspaceModelPicker
shatfield4 Mar 2, 2026
0c37eca
fix spacing in ws model picker, change order of tools menu tabs
shatfield4 Mar 3, 2026
e9468f2
fix slash commands showing /reset instead of /exit during active agen…
shatfield4 Mar 3, 2026
cea5582
refactor ToolsMenu to be much simpler
shatfield4 Mar 3, 2026
7c25c59
cleanup, fix behavior of setupup provider in WorkspaceModelPicker
shatfield4 Mar 3, 2026
f28344a
simplify AgentSkillsTab toggle logic
shatfield4 Mar 4, 2026
8cce125
add english translations for new components
shatfield4 Mar 4, 2026
8e257fe
merge master into 4983-feat-new-chat-history-implementation
shatfield4 Mar 5, 2026
70b4aed
Update entrypoint.sh
AndreasRamsli Mar 5, 2026
823fcea
fix: create /collector/hotdir on startup to fix document uploads
AndreasRamsli Mar 5, 2026
536d361
ci: add workflow_dispatch trigger to deploy workflow
AndreasRamsli Mar 5, 2026
c40bd62
fix: remove mkdir from entrypoint, done in Dockerfile as root
AndreasRamsli Mar 5, 2026
c37c9e2
fix: create /collector/hotdir as root with correct permissions in Doc…
AndreasRamsli Mar 5, 2026
9c44a65
fix: create /collector/hotdir as root with correct permissions
AndreasRamsli Mar 5, 2026
32e4968
fix: create /collector/hotdir with correct ownership in Dockerfile
AndreasRamsli Mar 5, 2026
6338c8f
fix: correct RUN syntax for /collector/hotdir creation
AndreasRamsli Mar 5, 2026
72de8e5
fix: correct RUN block for /collector/hotdir creation
AndreasRamsli Mar 5, 2026
49e78e9
fix: persist SQLite DB to /workspace via symlink on boot
AndreasRamsli Mar 5, 2026
2519635
Merge branch 'master' into 4983-feat-new-chat-history-implementation
timothycarambat Mar 5, 2026
69bbe08
Implement new citations UI (#5038)
shatfield4 Mar 5, 2026
b16f770
remove legacy slash command/agent popups, add ToolsMenu keyboard nav
shatfield4 Mar 6, 2026
3b34a55
fix spacing of workspace model picker text
shatfield4 Mar 6, 2026
d98a7c8
Merge branch '4983-feat-new-chat-history-implementation' into 5066-ne…
shatfield4 Mar 6, 2026
27eaa5b
fix SourcesSidebar and TextSizeMenu positioning after merge
shatfield4 Mar 6, 2026
db04d9e
fix keyboard nav in ToolsMenu when clicking on tools button to open
shatfield4 Mar 6, 2026
452f249
typo
shatfield4 Mar 6, 2026
13d3f0a
only auto pop up tools menu when prompt input is empty with /
shatfield4 Mar 6, 2026
0d879ca
fix z index for tools menu on citation
shatfield4 Mar 6, 2026
3ce2ad8
fix behavior of / in prompt input
shatfield4 Mar 6, 2026
4b494ad
move global window agent session state to module level variable
shatfield4 Mar 6, 2026
2b47d68
fix: robustly persist SQLite DB to /workspace on every boot
AndreasRamsli Mar 6, 2026
5b283a9
fix prompt input not clearing on /reset
shatfield4 Mar 6, 2026
de63b63
missing translations
shatfield4 Mar 6, 2026
dc8c201
revert translating slash command
shatfield4 Mar 6, 2026
38ba383
fix STT auto-submit not working on home page
shatfield4 Mar 6, 2026
328b47b
Normalize translations for new prompt input/tools menu UI (#5130)
shatfield4 Mar 6, 2026
5b1ecdf
fix: symlink /collector/hotdir and anythingllm.db to /workspace on boot
AndreasRamsli Mar 7, 2026
8e2b885
Fix collector hotdir symlinks on RunPod
codex Mar 7, 2026
14b7241
Merge remote-tracking branch 'upstream/master' into codex/upstream-sy…
codex Mar 8, 2026
a9304b9
fix: satisfy frontend prettier checks after upstream sync
codex Mar 8, 2026
7d2c386
fix: scope workspace chat access by user
codex Mar 8, 2026
34da72e
merge: integrate upstream PR 5070 prompt input UI
codex Mar 8, 2026
1243264
fix: adapt PR 5070 tools menu to localized skills API
codex Mar 8, 2026
826dc98
Merge branch 'codex/upstream-sync-20260308-pr5070'
codex Mar 8, 2026
27f1970
fix: omit OpenRouter user field from requests
codex Mar 8, 2026
818712b
Remove birthday UI and alias workspace name
codex Mar 9, 2026
90a92c6
Add Norwegian Bokmal UI locale
codex Mar 9, 2026
09b709f
fix citation drawer switching behavior
codex Mar 9, 2026
51cf348
sync selected upstream chat ui fixes
codex Mar 10, 2026
a408290
Add automatic mode and multimodal agent attachments
codex Mar 10, 2026
0c7b556
Build Lovora image from full source
codex Mar 10, 2026
9f1474b
Fix Lovora full-source image permissions
codex Mar 10, 2026
1d0c95d
Fix sticky parsed file attachment panel
codex Mar 11, 2026
8db17b0
Add local development setup scripts
codex Mar 11, 2026
4556884
Restore parsed file tooltip behavior
codex Mar 11, 2026
6ac032a
Fix custom logo asset handling and sizing
codex Mar 14, 2026
7eb3a2f
Add full-source citation viewer support
codex Mar 14, 2026
c065057
Render citation source links from markdown
codex Mar 14, 2026
0bf793e
Merge remote-tracking branch 'upstream/master'
codex Mar 15, 2026
59bb917
refactor(theme): add 6-color palette tokens to tailwind config and re…
codex Mar 15, 2026
efb0009
refactor(theme): replace CSS theme variables with 6-color palette
codex Mar 15, 2026
2ef9816
refactor(theme): replace hardcoded color classes with new palette acr…
codex Mar 15, 2026
d0159a6
fix(theme): replace bg-zinc-950 page shells with bg-theme-bg-container
codex Mar 15, 2026
2ae0967
refactor(theme): normalize inline rgba values to infinite-night/* Tai…
codex Mar 15, 2026
bf217ce
feat(branding): add Lovora SVG logo assets and update LogoContext
codex Mar 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
name: Build & Push Lovora Image

on:
push:
branches: [master]
workflow_dispatch:

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Set image tags
id: vars
run: |
SHORT_SHA="${GITHUB_SHA::8}"
echo "short_sha=${SHORT_SHA}" >> "$GITHUB_OUTPUT"

- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USER }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Build & push
uses: docker/build-push-action@v6
id: build
with:
context: .
file: ./ramsli-custom/full-source.Dockerfile
push: true
platforms: linux/amd64
tags: |
andreasramsli/lovora:latest
andreasramsli/lovora:${{ steps.vars.outputs.short_sha }}
no-cache: true

- name: Verify backend code in built image
run: |
docker pull andreasramsli/lovora:${{ steps.vars.outputs.short_sha }}
docker run --rm --entrypoint /bin/bash andreasramsli/lovora:${{ steps.vars.outputs.short_sha }} -lc \
"grep -n 'VALID_CHAT_MODES' /app/server/models/workspace.js && grep -n 'automatic' /app/server/models/workspace.js"
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,9 @@ aws_cf_deploy_anything_llm.json
yarn.lock
*.bak
.idea
.local-storage/
.local-dev/
frontend/.env
server/.env.development
collector/.env.development
.gstack/
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,21 @@ Mintplex Labs & the community maintain a number of deployment methods, scripts,
- `yarn dev:frontend` To boot the frontend locally (from root of repo).
- `yarn dev:collector` To then run the document collector (from root of repo).

### Faster local Lovora workflow

For day-to-day Lovora iteration, use the helper scripts from the repo root:

- `yarn local:setup` clones env templates, creates local storage, installs dependencies, and runs Prisma generate/migrate.
- `yarn local:start` starts `server`, `frontend`, and `collector` together.

If you want the setup script to clone the repo into a fresh directory first:

```bash
bash ./scripts/local-dev-setup.sh --clone-dir /path/to/lovora-local --repo-url https://github.com/AndreasRamsli/lovora.git
```

After setup, add your real provider keys to `server/.env.development` if you want local agent/model behavior to match production.

[Learn about documents](./server/storage/documents/DOCUMENTS.md)

[Learn about vector caching](./server/storage/vector-cache/VECTOR_CACHE.md)
Expand Down
22 changes: 9 additions & 13 deletions frontend/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,22 @@
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>AnythingLLM | Your personal LLM trained on anything</title>
<title>Lovora | Your personal AI assistant</title>

<meta name="title" content="AnythingLLM | Your personal LLM trained on anything">
<meta name="description" content="AnythingLLM | Your personal LLM trained on anything">
<meta name="title" content="Lovora | Your personal AI assistant">
<meta name="description" content="Lovora | Your personal AI assistant">

<!-- Facebook -->
<meta property="og:type" content="website">
<meta property="og:url" content="https://anythingllm.com">
<meta property="og:title" content="AnythingLLM | Your personal LLM trained on anything">
<meta property="og:description" content="AnythingLLM | Your personal LLM trained on anything">
<meta property="og:image"
content="https://raw.githubusercontent.com/Mintplex-Labs/anything-llm/master/images/promo.png">
<meta property="og:url" content="https://ramsli.tech">
<meta property="og:title" content="Lovora | Your personal AI assistant">
<meta property="og:description" content="Lovora | Your personal AI assistant">

<!-- Twitter -->
<meta property="twitter:card" content="summary_large_image">
<meta property="twitter:url" content="https://anythingllm.com">
<meta property="twitter:title" content="AnythingLLM | Your personal LLM trained on anything">
<meta property="twitter:description" content="AnythingLLM | Your personal LLM trained on anything">
<meta property="twitter:image"
content="https://raw.githubusercontent.com/Mintplex-Labs/anything-llm/master/images/promo.png">
<meta property="twitter:url" content="https://ramsli.tech">
<meta property="twitter:title" content="Lovora | Your personal AI assistant">
<meta property="twitter:description" content="Lovora | Your personal AI assistant">

<link rel="icon" href="/favicon.png" />
<link rel="apple-touch-icon" href="/favicon.png" />
Expand Down
20 changes: 8 additions & 12 deletions frontend/src/LogoContext.jsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
import { createContext, useEffect, useState } from "react";
import AnythingLLM from "./media/logo/anything-llm.png";
import AnythingLLMDark from "./media/logo/anything-llm-dark.png";
import DefaultLoginLogoLight from "./media/illustrations/login-logo.svg";
import DefaultLoginLogoDark from "./media/illustrations/login-logo-light.svg";
import LogoLight from "./media/logo/lovora-light.svg";
import LogoDark from "./media/logo/lovora-dark.svg";
import System from "./models/system";

export const REFETCH_LOGO_EVENT = "refetch-logo";
Expand All @@ -18,23 +16,21 @@ export function LogoProvider({ children }) {
const [isCustomLogo, setIsCustomLogo] = useState(false);

async function fetchInstanceLogo() {
const DefaultLoginLogo = isLightMode()
? DefaultLoginLogoDark
: DefaultLoginLogoLight;
const defaultLogo = isLightMode() ? LogoLight : LogoDark;
try {
const { isCustomLogo, logoURL } = await System.fetchLogo();
if (logoURL) {
setLogo(logoURL);
setLoginLogo(isCustomLogo ? logoURL : DefaultLoginLogo);
setLoginLogo(isCustomLogo ? logoURL : defaultLogo);
setIsCustomLogo(isCustomLogo);
} else {
isLightMode() ? setLogo(AnythingLLMDark) : setLogo(AnythingLLM);
setLoginLogo(DefaultLoginLogo);
setLogo(defaultLogo);
setLoginLogo(defaultLogo);
setIsCustomLogo(false);
}
} catch (err) {
isLightMode() ? setLogo(AnythingLLMDark) : setLogo(AnythingLLM);
setLoginLogo(DefaultLoginLogo);
setLogo(defaultLogo);
setLoginLogo(defaultLogo);
setIsCustomLogo(false);
console.error("Failed to fetch logo:", err);
}
Expand Down
8 changes: 6 additions & 2 deletions frontend/src/components/DefaultChat/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { safeJsonParse } from "@/utils/request";
export default function DefaultChatContainer() {
const { t } = useTranslation();
const { user } = useUser();
const { logo } = useLogo();
const { logo, isCustomLogo } = useLogo();
const [lastVisitedWorkspace, setLastVisitedWorkspace] = useState(null);
const [{ workspaces, loading }, setWorkspaces] = useState({
workspaces: [],
Expand Down Expand Up @@ -77,7 +77,11 @@ export default function DefaultChatContainer() {
<img
src={logo}
alt="Custom Logo"
className=" w-[200px] h-fit mb-5 rounded-lg"
className={`mb-5 rounded-lg object-contain ${
isCustomLogo
? "max-w-[320px] max-h-[120px] w-auto h-auto"
: "w-[200px] h-fit"
}`}
/>
<h1 className="text-white text-2xl font-semibold">
{t("home.welcome")}, {user.username}!
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/components/Footer/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ export default function Footer() {
>
<GithubLogo
weight="fill"
className="h-5 w-5 text-white light:text-slate-800"
className="h-5 w-5 text-white light:text-infinite-night"
/>
</Link>
</div>
Expand All @@ -77,7 +77,7 @@ export default function Footer() {
>
<BookOpen
weight="fill"
className="h-5 w-5 text-white light:text-slate-800"
className="h-5 w-5 text-white light:text-infinite-night"
/>
</Link>
</div>
Expand All @@ -93,7 +93,7 @@ export default function Footer() {
>
<DiscordLogo
weight="fill"
className="h-5 w-5 text-white light:text-slate-800"
className="h-5 w-5 text-white light:text-infinite-night"
/>
</Link>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import Workspace from "@/models/workspace";
import { Tooltip } from "react-tooltip";
import { safeJsonParse } from "@/utils/request";
import { useTranslation } from "react-i18next";
import { getWorkspaceDisplayName } from "@/utils/workspaceDisplay";

function WorkspaceDirectory({
workspace,
Expand Down Expand Up @@ -92,7 +93,7 @@ function WorkspaceDirectory({
<div className="px-8">
<div className="flex items-center justify-start w-[560px]">
<h3 className="text-white text-base font-bold ml-5">
{workspace.name}
{getWorkspaceDisplayName(workspace)}
</h3>
</div>
<div className="relative w-[560px] h-[445px] bg-theme-settings-input-bg rounded-2xl mt-5 border border-theme-modal-border">
Expand All @@ -119,7 +120,7 @@ function WorkspaceDirectory({
<div className="px-8">
<div className="flex items-center justify-start w-[560px]">
<h3 className="text-white text-base font-bold ml-5">
{workspace.name}
{getWorkspaceDisplayName(workspace)}
</h3>
</div>
<div className="relative w-[560px] h-[445px] mt-5">
Expand Down
4 changes: 3 additions & 1 deletion frontend/src/components/Modals/ManageWorkspace/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import useUser from "../../../hooks/useUser";
import DocumentSettings from "./Documents";
import DataConnectors from "./DataConnectors";
import ModalWrapper from "@/components/ModalWrapper";
import { getWorkspaceDisplayName } from "@/utils/workspaceDisplay";

const noop = () => {};
const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
Expand Down Expand Up @@ -44,7 +45,8 @@ const ManageWorkspace = ({ hideModal = noop, providedSlug = null }) => {
<div className="relative p-6 border-b rounded-t border-theme-modal-border">
<div className="w-full flex gap-x-2 items-center">
<h3 className="text-xl font-semibold text-white overflow-hidden overflow-ellipsis whitespace-nowrap">
{t("connectors.manage.editing")} "{workspace.name}"
{t("connectors.manage.editing")} "
{getWorkspaceDisplayName(workspace)}"
</h3>
</div>
<button
Expand Down
Loading