diff --git a/.github/readme.md b/.github/readme.md
index dd68b3b31..14f950e12 100644
--- a/.github/readme.md
+++ b/.github/readme.md
@@ -42,7 +42,7 @@ If you're not familiar with using the git CLI or don't understand what a branch
## What do I need other than SillyTavern?
-Since SillyTavern is only an interface, you will need access to an LLM backend to provide inference. You can use AI Horde for instant out-of-the-box chatting. Aside from that, we support many other local and cloud-based LLM backends: OpenAI-compatible API, KoboldAI, Tabby, and many more. You can read more about our supported APIs in [the FAQ](https://docs.sillytavern.app/usage/api-connections/).
+Since SillyTavern is only an interface, you will need access to an LLM backend to provide inference. You can use AI Horde for instant out-of-the-box chatting. Aside from that, we support many other local and cloud-based LLM backends: OpenAI-compatible API, KoboldAI, Tabby, and many more. You can read more about our supported APIs in [the Docs](https://docs.sillytavern.app/usage/api-connections/).
### Do I need a powerful PC to run SillyTavern?
@@ -83,9 +83,7 @@ Or get in touch with the developers directly:
SillyTavern is built around the concept of "character cards". A character card is a collection of prompts that set the behavior of the LLM and is required to have persistent conversations in SillyTavern. They function similarly to ChatGPT's GPTs or Poe's bots. The content of a character card can be anything: an abstract scenario, an assistant tailored for a specific task, a famous personality or a fictional character.
-The name field is the only required character card input. To start a neutral conversation with the language model, create a new card simply called "Assistant" and leave the rest of the boxes blank. For a more themed chat, you can provide the language model with various background details, behavior and writing patterns, and a scenario to jump start the chat.
-
-To have a quick conversation without selecting a character card or to just test the LLM connection, simply type your prompt input into the input bar on the Welcome Screen after opening SillyTavern. Please note that such chats are temporary and will not be saved.
+To have a quick conversation without selecting a character card or to just test the LLM connection, simply type your prompt input into the input bar on the Welcome Screen after opening SillyTavern. This will create an empty "Assistant" character card that you can customize later.
To get a general idea on how to define character cards, see the default character (Seraphina) or download selected community-made cards from the "Download Extensions & Assets" menu.
@@ -316,18 +314,6 @@ chmod +x launcher.sh && ./launcher.sh
**Unsupported platform: android arm LEtime-web.** 32-bit Android requires an external dependency that can't be installed with npm. Use the following command to install it: `pkg install esbuild`. Then run the usual installation steps.
-## API keys management
-
-SillyTavern saves your API keys to a `secrets.json` file in the user data directory (`/data/default-user/secrets.json` is the default path).
-
-By default, API keys will not be visible from the interface after you have saved them and refreshed the page.
-
-In order to enable viewing your keys:
-
-1. Set the value of `allowKeysExposure` to `true` in `config.yaml` file.
-2. Restart the SillyTavern server.
-3. Click the 'View hidden API keys' link at the bottom right of the API Connection Panel.
-
## Command-line arguments
You can pass command-line arguments to SillyTavern server startup to override some settings in `config.yaml`.
@@ -380,32 +366,7 @@ Most often this is for people who want to use SillyTavern on their mobile phones
Read the detailed guide on how to set up remote connections in the [Docs](https://docs.sillytavern.app/usage/remoteconnections/).
-You may also want to configure SillyTavern user profiles with (optional) password protection: [Users](https://docs.sillytavern.app/installation/st-1.12.0-migration-guide/#users).
-
-## Performance issues?
-
-### General tips
-
-1. Disable the Blur Effect and enable Reduced Motion on the User Settings panel (UI Theme toggles category).
-2. If using response streaming, set the streaming FPS to a lower value (10-15 FPS is recommended).
-3. Make sure the browser is enabled to use GPU acceleration for rendering.
-
-### Input lag
-
-Performance degradation, particularly input lag, is most commonly attributed to browser extensions. Known problematic extensions include:
-
-* iCloud Password Manager
-* DeepL Translation
-* AI-based grammar correction tools
-* Various ad-blocking extensions
-
-If you experience performance issues and cannot identify the cause, or suspect an issue with SillyTavern itself, please:
-
-1. [Record a performance profile](https://developer.chrome.com/docs/devtools/performance/reference)
-2. Export the profile as a JSON file
-3. Submit it to the development team for analysis
-
-We recommend first testing with all browser extensions and third-party SillyTavern extensions disabled to isolate the source of the performance degradation.
+You may also want to configure SillyTavern user profiles with (optional) password protection: [Users](https://docs.sillytavern.app/administration/multi-user/).
## License and credits
diff --git a/Dockerfile b/Dockerfile
index 4a90d5c90..29d394388 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -4,7 +4,7 @@ FROM node:lts-alpine3.19
ARG APP_HOME=/home/node/app
# Install system dependencies
-RUN apk add --no-cache gcompat tini git
+RUN apk add --no-cache gcompat tini git git-lfs
# Create app directory
WORKDIR ${APP_HOME}
diff --git a/default/config.yaml b/default/config.yaml
index e7fe7e196..00476a198 100644
--- a/default/config.yaml
+++ b/default/config.yaml
@@ -234,6 +234,10 @@ claude:
# should be ideal for most use cases.
# Any value other than a non-negative integer will be ignored and caching at depth will not be enabled.
cachingAtDepth: -1
+ # Use 1h TTL instead of the default 5m.
+ ## 5m: base price x 1.25
+ ## 1h: base price x 2
+ extendedTTL: false
# -- GOOGLE GEMINI API CONFIGURATION --
gemini:
# API endpoint version ("v1beta" or "v1alpha")
diff --git a/default/content/presets/openai/Default.json b/default/content/presets/openai/Default.json
index 19660ea2d..efd39d5fb 100644
--- a/default/content/presets/openai/Default.json
+++ b/default/content/presets/openai/Default.json
@@ -15,6 +15,7 @@
"custom_exclude_body": "",
"custom_include_headers": "",
"google_model": "gemini-pro",
+ "vertexai_model": "gemini-2.0-flash-001",
"temperature": 1,
"frequency_penalty": 0,
"presence_penalty": 0,
diff --git a/package-lock.json b/package-lock.json
index 159558e74..8db2e1065 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "sillytavern",
- "version": "1.12.14",
+ "version": "1.13.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "sillytavern",
- "version": "1.12.14",
+ "version": "1.13.0",
"hasInstallScript": true,
"license": "AGPL-3.0",
"dependencies": {
@@ -18,6 +18,7 @@
"@jimp/js-bmp": "^1.6.0",
"@jimp/js-gif": "^1.6.0",
"@jimp/js-tiff": "^1.6.0",
+ "@jimp/plugin-blit": "^1.6.0",
"@jimp/plugin-circle": "^1.6.0",
"@jimp/plugin-color": "^1.6.0",
"@jimp/plugin-contain": "^1.6.0",
@@ -28,6 +29,7 @@
"@jimp/plugin-flip": "^1.6.0",
"@jimp/plugin-mask": "^1.6.0",
"@jimp/plugin-quantize": "^1.6.0",
+ "@jimp/plugin-resize": "^1.6.0",
"@jimp/plugin-rotate": "^1.6.0",
"@jimp/plugin-threshold": "^1.6.0",
"@jimp/wasm-avif": "^1.6.0",
@@ -72,7 +74,7 @@
"mime-types": "^2.1.35",
"moment": "^2.30.1",
"morphdom": "^2.7.4",
- "multer": "^1.4.5-lts.1",
+ "multer": "^2.0.0",
"node-fetch": "^3.3.2",
"node-persist": "^4.0.4",
"open": "^8.4.2",
@@ -6074,9 +6076,9 @@
"license": "MIT"
},
"node_modules/multer": {
- "version": "1.4.5-lts.1",
- "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz",
- "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.0.tgz",
+ "integrity": "sha512-bS8rPZurbAuHGAnApbM9d4h1wSoYqrOqkE+6a64KLMK9yWU7gJXBDDVklKQ3TPi9DRb85cRs6yXaC0+cjxRtRg==",
"license": "MIT",
"dependencies": {
"append-field": "^1.0.0",
@@ -6088,7 +6090,7 @@
"xtend": "^4.0.0"
},
"engines": {
- "node": ">= 6.0.0"
+ "node": ">= 10.16.0"
}
},
"node_modules/multer/node_modules/mkdirp": {
diff --git a/package.json b/package.json
index 0733f177d..705c80d51 100644
--- a/package.json
+++ b/package.json
@@ -8,6 +8,7 @@
"@jimp/js-bmp": "^1.6.0",
"@jimp/js-gif": "^1.6.0",
"@jimp/js-tiff": "^1.6.0",
+ "@jimp/plugin-blit": "^1.6.0",
"@jimp/plugin-circle": "^1.6.0",
"@jimp/plugin-color": "^1.6.0",
"@jimp/plugin-contain": "^1.6.0",
@@ -18,6 +19,7 @@
"@jimp/plugin-flip": "^1.6.0",
"@jimp/plugin-mask": "^1.6.0",
"@jimp/plugin-quantize": "^1.6.0",
+ "@jimp/plugin-resize": "^1.6.0",
"@jimp/plugin-rotate": "^1.6.0",
"@jimp/plugin-threshold": "^1.6.0",
"@jimp/wasm-avif": "^1.6.0",
@@ -62,7 +64,7 @@
"mime-types": "^2.1.35",
"moment": "^2.30.1",
"morphdom": "^2.7.4",
- "multer": "^1.4.5-lts.1",
+ "multer": "^2.0.0",
"node-fetch": "^3.3.2",
"node-persist": "^4.0.4",
"open": "^8.4.2",
@@ -109,7 +111,7 @@
"type": "git",
"url": "https://github.com/SillyTavern/SillyTavern.git"
},
- "version": "1.12.14",
+ "version": "1.13.0",
"scripts": {
"start": "node server.js",
"debug": "node --inspect server.js",
diff --git a/public/css/animations.css b/public/css/animations.css
index 2477fe46a..be851765a 100644
--- a/public/css/animations.css
+++ b/public/css/animations.css
@@ -55,11 +55,14 @@
/* Flashing for highlighting animation */
@keyframes flash {
- 0%, 50%, 100% {
+ 0%,
+ 50%,
+ 100% {
opacity: 1;
}
- 25%, 75% {
+ 25%,
+ 75% {
opacity: 0.2;
}
}
diff --git a/public/css/character-group-overlay.css b/public/css/character-group-overlay.css
index 5327694a8..8f4a30580 100644
--- a/public/css/character-group-overlay.css
+++ b/public/css/character-group-overlay.css
@@ -1,4 +1,3 @@
-
#rm_print_characters_block.group_overlay_mode_select .character_select {
transition: background-color 0.4s ease;
background-color: rgba(170, 170, 170, 0.15);
@@ -28,7 +27,10 @@
height: 0 !important;
}
-#character_context_menu.hidden { display: none; }
+#character_context_menu.hidden {
+ display: none;
+}
+
#character_context_menu {
position: absolute;
padding: 3px;
diff --git a/public/css/group-avatars.css b/public/css/group-avatars.css
index 96f01e66e..72b0276c0 100644
--- a/public/css/group-avatars.css
+++ b/public/css/group-avatars.css
@@ -88,4 +88,4 @@
max-height: 50%;
width: 50%;
height: 50%;
-}
\ No newline at end of file
+}
diff --git a/public/css/logprobs.css b/public/css/logprobs.css
index 71b319539..76c3fdd3c 100644
--- a/public/css/logprobs.css
+++ b/public/css/logprobs.css
@@ -76,7 +76,7 @@
background-color: rgba(255, 0, 50, 0.4);
}
-.logprobs_output_prefix:hover ~ .logprobs_output_prefix {
+.logprobs_output_prefix:hover~.logprobs_output_prefix {
background-color: rgba(255, 0, 50, 0.4);
}
@@ -115,7 +115,8 @@
background-color: rgba(255, 255, 0, 0.05);
}
-.logprobs_tint_0:hover, .logprobs_tint_0.selected {
+.logprobs_tint_0:hover,
+.logprobs_tint_0.selected {
background-color: rgba(255, 255, 0, 0.4);
}
@@ -123,7 +124,8 @@
background-color: rgba(255, 0, 255, 0.05);
}
-.logprobs_tint_1:hover, .logprobs_tint_1.selected {
+.logprobs_tint_1:hover,
+.logprobs_tint_1.selected {
background-color: rgba(255, 0, 255, 0.4);
}
@@ -131,7 +133,8 @@
background-color: rgba(0, 255, 255, 0.05);
}
-.logprobs_tint_2:hover, .logprobs_tint_2.selected {
+.logprobs_tint_2:hover,
+.logprobs_tint_2.selected {
background-color: rgba(0, 255, 255, 0.4);
}
@@ -139,6 +142,7 @@
background-color: rgba(50, 205, 50, 0.05);
}
-.logprobs_tint_3:hover, .logprobs_tint_3.selected {
+.logprobs_tint_3:hover,
+.logprobs_tint_3.selected {
background-color: rgba(50, 205, 50, 0.4);
}
diff --git a/public/css/popup.css b/public/css/popup.css
index e477bfd75..47ed047b1 100644
--- a/public/css/popup.css
+++ b/public/css/popup.css
@@ -34,9 +34,17 @@ dialog {
}
/** Popup styles applied to the main popup */
-.popup--animation-fast { --popup-animation-speed: var(--animation-duration); }
-.popup--animation-slow { --popup-animation-speed: var(--animation-duration-slow); }
-.popup--animation-none { --popup-animation-speed: 0ms; }
+.popup--animation-fast {
+ --popup-animation-speed: var(--animation-duration);
+}
+
+.popup--animation-slow {
+ --popup-animation-speed: var(--animation-duration-slow);
+}
+
+.popup--animation-none {
+ --popup-animation-speed: 0ms;
+}
/* Styling of main popup elements */
.popup .popup-body {
@@ -190,4 +198,3 @@ body.no-blur .popup[open]::backdrop {
/* Fix weird animation issue with font-scaling during popup open */
backface-visibility: hidden;
}
-
diff --git a/public/css/promptmanager.css b/public/css/promptmanager.css
index f02b172b1..3c7f94b35 100644
--- a/public/css/promptmanager.css
+++ b/public/css/promptmanager.css
@@ -359,10 +359,15 @@
content: attr(external_piece_text);
display: block;
width: 100%;
- font-weight: 600;
+ font-weight: 500;
text-align: center;
}
.completion_prompt_manager_popup_entry_form_control #completion_prompt_manager_popup_entry_form_prompt:disabled {
visibility: hidden;
}
+
+#completion_prompt_manager_popup_entry_source_block {
+ display: flex;
+ justify-content: center;
+}
diff --git a/public/css/scrollable-button.css b/public/css/scrollable-button.css
index 9cee2c67a..d066c36a1 100644
--- a/public/css/scrollable-button.css
+++ b/public/css/scrollable-button.css
@@ -1,7 +1,10 @@
.scrollable-buttons-container {
- max-height: 50vh; /* Use viewport height instead of fixed pixels */
- -webkit-overflow-scrolling: touch; /* Momentum scrolling on iOS */
- margin-top: 1rem; /* m-t-1 is equivalent to margin-top: 1rem; */
+ /* Use viewport height instead of fixed pixels */
+ max-height: 50vh;
+ /* Momentum scrolling on iOS */
+ -webkit-overflow-scrolling: touch;
+ /* m-t-1 is equivalent to margin-top: 1rem; */
+ margin-top: 1rem;
flex-shrink: 1;
min-height: 0;
scrollbar-width: thin;
diff --git a/public/css/tags.css b/public/css/tags.css
index fb2c165fe..06766affc 100644
--- a/public/css/tags.css
+++ b/public/css/tags.css
@@ -211,6 +211,7 @@
.tag_as_folder.right_menu_button {
filter: brightness(75%) saturate(0.6);
+ margin-right: 5px;
}
.tag_as_folder.right_menu_button:hover,
diff --git a/public/css/toggle-dependent.css b/public/css/toggle-dependent.css
index d582cbbd8..ed3fd299a 100644
--- a/public/css/toggle-dependent.css
+++ b/public/css/toggle-dependent.css
@@ -45,6 +45,11 @@ body.square-avatars .avatar img {
border-radius: var(--avatar-base-border-radius) !important;
}
+body.rounded-avatars .avatar,
+body.rounded-avatars .avatar img {
+ border-radius: var(--avatar-base-border-radius-rounded) !important;
+}
+
/*char list grid mode*/
body.charListGrid #rm_print_characters_block {
@@ -226,6 +231,7 @@ body.big-avatars .avatars_inline_small .avatar img {
body.big-avatars .avatars_inline {
max-height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) + 2 * var(--avatar-base-border-radius));
}
+
body.big-avatars .avatars_inline.avatars_multiline {
max-height: fit-content;
}
@@ -233,6 +239,7 @@ body.big-avatars .avatars_inline.avatars_multiline {
body.big-avatars .avatars_inline.avatars_inline_small {
height: calc(var(--avatar-base-height) * var(--big-avatar-height-factor) * var(--inline-avatar-small-factor) + 2 * var(--avatar-base-border-radius));
}
+
body.big-avatars .avatars_inline.avatars_inline_small.avatars_multiline {
height: inherit;
}
@@ -339,10 +346,15 @@ body.documentstyle #chat .last_mes .swipe_left {
body.documentstyle #chat .mes .mesAvatarWrapper,
body.documentstyle #chat .mes .mes_block .ch_name .name_text,
body.documentstyle #chat .mes .mes_block .ch_name .timestamp,
+body.documentstyle #chat .mes .mes_block .ch_name .timestamp-icon,
body.documentstyle .mes:not(.last_mes) .ch_name .mes_buttons {
display: none !important;
}
+body.documentstyle #chat .mes_block .ch_name {
+ min-height: unset;
+}
+
/*FastUI blur removal*/
body.no-blur * {
@@ -498,3 +510,15 @@ label[for="trim_spaces"]:not(:has(input:checked)) small {
#banned_tokens_block_ooba:not(:has(#send_banned_tokens_textgenerationwebui:checked)) #banned_tokens_controls_ooba {
filter: brightness(0.5);
}
+
+#bind_preset_to_connection:checked~.toggleOff {
+ display: none;
+}
+
+#bind_preset_to_connection:not(:checked)~.toggleOn {
+ display: none;
+}
+
+label[for="bind_preset_to_connection"]:has(input:checked) {
+ color: var(--active);
+}
diff --git a/public/css/welcome.css b/public/css/welcome.css
new file mode 100644
index 000000000..1d7a15dce
--- /dev/null
+++ b/public/css/welcome.css
@@ -0,0 +1,213 @@
+#chat .mes[type="assistant_message"] .mes_button {
+ display: none;
+}
+
+.welcomePanel {
+ display: flex;
+ flex-direction: column;
+ gap: 5px;
+ padding: 10px;
+ width: 100%;
+}
+
+.welcomePanel:has(.showMoreChats) {
+ padding-bottom: 5px;
+}
+
+.welcomePanel.recentHidden .welcomeRecent,
+.welcomePanel.recentHidden .recentChatsTitle,
+.welcomePanel.recentHidden .hideRecentChats,
+.welcomePanel:not(.recentHidden) .showRecentChats {
+ display: none;
+}
+
+body.bubblechat .welcomePanel {
+ border-radius: 10px;
+ background-color: var(--SmartThemeBotMesBlurTintColor);
+ border: 1px solid var(--SmartThemeBorderColor);
+ margin-bottom: 5px;
+}
+
+body.hideChatAvatars .welcomePanel .recentChatList .recentChat .avatar {
+ display: none;
+}
+
+.welcomePanel .welcomeHeader {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: flex-end;
+}
+
+.welcomePanel .recentChatsTitle {
+ flex-grow: 1;
+ font-size: calc(var(--mainFontSize) * 1.15);
+ font-weight: 600;
+}
+
+.welcomePanel .welcomeHeaderTitle {
+ margin: 0;
+ flex-grow: 1;
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 10px;
+}
+
+.welcomePanel .welcomeHeaderVersionDisplay {
+ font-size: calc(var(--mainFontSize) * 1.3);
+ font-weight: 600;
+ flex-grow: 1;
+}
+
+.welcomePanel .welcomeHeaderLogo {
+ width: 30px;
+ height: 30px;
+}
+
+.welcomePanel .welcomeShortcuts {
+ display: flex;
+ flex-direction: row;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: center;
+ gap: 5px;
+}
+
+.welcomePanel .welcomeShortcuts .welcomeShortcutsSeparator {
+ margin: 0 2px;
+ color: var(--SmartThemeBorderColor);
+ font-size: calc(var(--mainFontSize) * 1.1);
+}
+
+.welcomeRecent .recentChatList {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ gap: 2px;
+}
+
+.welcomeRecent .welcomePanelLoader {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ flex: 1;
+ width: 100%;
+ height: 100%;
+ position: absolute;
+}
+
+.welcomePanel .recentChatList .noRecentChat {
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ align-items: baseline;
+ gap: 5px;
+ padding: 10px;
+}
+
+.welcomeRecent .recentChatList .recentChat {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ padding: 5px 10px;
+ border-radius: 10px;
+ cursor: pointer;
+ gap: 10px;
+ border: 1px solid var(--SmartThemeBorderColor);
+}
+
+.welcomeRecent .recentChatList .recentChat .avatar {
+ flex: 0;
+ align-self: center;
+}
+
+.welcomeRecent .recentChatList .recentChat:hover {
+ background-color: var(--white30a);
+}
+
+.welcomeRecent .recentChatList .recentChat .recentChatInfo {
+ display: flex;
+ flex-direction: column;
+ flex-wrap: nowrap;
+ flex-grow: 1;
+ overflow: hidden;
+ justify-content: center;
+ align-self: flex-start;
+}
+
+.welcomeRecent .recentChatList .recentChat .chatNameContainer {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ align-items: baseline;
+ font-size: calc(var(--mainFontSize) * 1);
+}
+
+.welcomeRecent .recentChatList .recentChat .chatNameContainer .chatName {
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+
+.welcomeRecent .recentChatList .recentChat .chatMessageContainer {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ gap: 5px;
+ font-size: calc(var(--mainFontSize) * 0.85);
+}
+
+.welcomeRecent .recentChatList .recentChat .chatMessageContainer .chatMessage {
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+ line-clamp: 2;
+ overflow: hidden;
+}
+
+body.big-avatars .welcomeRecent .recentChatList .recentChat .chatMessageContainer .chatMessage {
+ -webkit-line-clamp: 4;
+ line-clamp: 4;
+}
+
+.welcomeRecent .recentChatList .recentChat .chatStats {
+ display: flex;
+ flex-direction: row;
+ justify-content: flex-end;
+ align-items: baseline;
+ align-self: flex-start;
+ gap: 5px;
+}
+
+.welcomeRecent .recentChatList .recentChat .chatStats .counterBlock {
+ display: flex;
+ flex-direction: row;
+ align-items: baseline;
+ gap: 5px;
+}
+
+.welcomeRecent .recentChatList .recentChat .chatStats .counterBlock::after {
+ content: "|";
+ color: var(--SmartThemeBorderColor);
+ font-size: calc(var(--mainFontSize) * 0.95);
+}
+
+.welcomeRecent .recentChatList .recentChat.hidden {
+ display: none;
+}
+
+.welcomeRecent .recentChatList .showMoreChats {
+ align-self: center;
+}
+
+.welcomeRecent .recentChatList .showMoreChats.rotated {
+ transform: rotate(180deg);
+}
+
+@media screen and (max-width: 1000px) {
+ .welcomePanel .welcomeShortcuts a span {
+ display: none;
+ }
+}
diff --git a/public/img/pollinations.svg b/public/img/pollinations.svg
new file mode 100644
index 000000000..dad71c9d3
--- /dev/null
+++ b/public/img/pollinations.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/index.html b/public/index.html
index 954a0a57d..a7c62b44f 100644
--- a/public/index.html
+++ b/public/index.html
@@ -10,6 +10,7 @@
+