Compare commits

..
Author SHA1 Message Date
Brandon Thomas de0776009b more query refactoring, media file class 2025-10-15 02:45:49 -04:00
Brandon Thomas 11f8885bf6 error for non-loading images 2025-10-15 01:39:35 -04:00
Brandon Thomas 0e2926b179 populate video thumbnail template 2025-10-15 01:22:10 -04:00
Brandon Thomas 671e02edcb refactor fields 2025-10-15 01:00:28 -04:00
Brandon Thomas 10f8649089 frontend cleanup 2025-10-15 00:35:32 -04:00
Brandon Thomas 3aeea6d2b2 report cdn url 2025-10-15 00:25:44 -04:00
Brandon Thomas abccceb5bd add full cdn url too 2025-10-15 00:09:51 -04:00
Brandon Thomas 9add7ee1cd work in progress on task queue api 2025-10-14 23:51:20 -04:00
BFlat d551e48a23 sound toggle for veo models (#877)
- veo models if selected now has a sound toggle button which defaults to
ON/true (still needs backend link)
2025-10-14 23:30:26 +07:00
BFlat 5cb608fad6 lightbox updates (#876)
- colors will match selected theme now
- buttons relayout and added "turn into video" button for images that
will take you to the Image to Video page
- reference image matches imapge prompt row component now - opens full
preview in a separate resizable modal
2025-10-14 23:15:32 +07:00
BFlat d5ae28ca4c task queue dropdown and modal (#852)
task queue implementation
2025-10-14 00:11:40 +07:00
Brandon Thomas 8313558795 debugging for inference-job loop 2025-10-13 11:03:50 -04:00
Brandon Thomas 95173e032f Remove FAL from desktop app (for now) - build speed issue (#875)
Fal is causing really inflated build slowdowns on account of the library
using so much Serde/proc macros. We really need to rethink FAL client
workings before adding it.
2025-10-10 19:31:44 -04:00
Brandon Thomas b0f6551623 fix job builds (#873) 2025-10-10 19:00:22 -04:00
Brandon Thomas 8f2a03e21e nx fix vite build (#872) 2025-10-09 23:53:34 -04:00
Brandon Thomas 5c3760f9ec config+script to debug production builds (#871) 2025-10-09 05:07:27 -04:00
Brandon Thomas d6c1eaae5d fix inpainting thumbnails (#870) 2025-10-09 04:21:03 -04:00
Brandon Thomas d6abe9fb88 rename Nano Banana, change metadata, change predicates 2025-10-08 23:00:09 -04:00
Brandon Thomas 1e758b1b6c rename model to "Nano Banana" 2025-10-08 22:44:11 -04:00
Brandon Thomas cd40edb5f9 forgot to commit these changes 2025-10-08 21:15:31 -04:00
Brandon Thomas 3838cc3f21 artcraft task queue 2 (#869) 2025-10-08 21:14:16 -04:00
bflatastic 0fec772d9a page title for landing 2025-10-06 21:43:03 +07:00
bflatastic 1afe2ac26f footer link fixes 2025-10-06 15:30:59 +07:00
bflatastic 5eef6c0161 navbar, faq, tutorial page link fixes 2025-10-06 15:23:03 +07:00
bflatastic 6c6f7f054d update 2 faq 3d 2025-10-06 15:06:14 +07:00
bflatastic ba3d46607b 3d editor faq post update 2025-10-06 15:04:15 +07:00
BFlat 12bf504d6f faq and tutorials update to use markdown, footer updates, landing vid… (#868)
…eo layout shift fix
2025-10-06 14:57:33 +07:00
Brandon Thomas 026c2bf827 update version on website 2025-10-04 18:39:37 -04:00
Brandon Thomas d20854f75d remove service selector (#867) 2025-10-04 16:28:48 -04:00
Brandon Thomas 7c9396aa65 fix broken builds 2025-10-04 15:58:37 -04:00
Brandon Thomas 90810231da fix release script 2025-10-04 12:50:14 -04:00
Brandon Thomas e9613c6b4a boringssl got into web which conflicts with openssl on linux :( (#866) 2025-10-04 12:45:36 -04:00
Brandon Thomas cb2eb39183 bump toolchain 2025-10-04 02:13:44 -04:00
Brandon Thomas 7a100bd461 sora implementation (#865) 2025-10-04 01:58:31 -04:00
bflatastic 10c35381fa landing page text change 2025-10-02 22:53:18 +07:00
bflatastic 24c8353482 popover hover bug fix to prevent “first stays stuck open” when moving to the next 2025-10-02 14:10:23 +07:00
bflatastic eb0db3d67d first class provider selector next to model selector 2025-10-02 14:06:42 +07:00
Brandon Thomas 2d44b92bfc cleanup sora client (#863) 2025-10-02 00:27:16 -04:00
Brandon Thomas 8c36a7f98a refactor client package organization 2025-10-01 17:56:04 -04:00
Brandon Thomas a174730bf0 fix delete by calling tauri instead (#861) 2025-09-30 04:00:57 -04:00
Brandon Thomas 96ffeadbe0 github link (#860) 2025-09-29 23:10:00 -04:00
bflatastic bd93cd4f1f plan text update 2 2025-09-29 23:09:52 +07:00
bflatastic 39ad16e856 plans text change 2025-09-29 23:05:58 +07:00
bflatastic 64d589521a netlify redirects for tutorial page 2025-09-29 22:53:29 +07:00
BFlat 8c0529be0b tutorial modal for app and tutorial page for website (#859)
shared component for tutorials

app:
- tutorial modal accessible from any page on the app on the bottom right
- plays right in the modal through youtube embed
- it remembers the play progress and saves it in the zustand state so in
that current session if modal is opened again, it will continue where
the user left off

website:
- navbar updates (home and tutorials link)
- tutorial page with category buttons to filter by product or show all
- plays through youtube embed on website page
2025-09-29 16:19:59 +07:00
Brandon Thomas f198d5e90c bump version of binaries on website 2025-09-28 02:01:26 -04:00
BFlat a7f4a6eda4 dots dropdown on gallery item to edit image or delete (#858)
- each gallery item now has the three dots button on hover, clicking
shows a dropdown to edit image or delete
- reduced page size to 100 due to lag
2025-09-28 09:10:37 +07:00
Brandon Thomas 450c73a29d remove gpu loading error (#857) 2025-09-27 18:28:02 -04:00
511 changed files with 10686 additions and 6331 deletions
+3
View File
@@ -45,6 +45,9 @@ crates/lib/sqlite_queries/target/
# Javascript build directories
node_modules/
# Frontend build outputs
frontend/apps/editor3d/bundle-report.html
# Vim noise
*.swo
*.swp
@@ -0,0 +1,12 @@
{
"db_name": "SQLite",
"query": "\n UPDATE tasks\n SET is_dismissed_by_user = 1\n WHERE id = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "13d435d8f681b73e4080748dcef0579e246e41049af67e1bd79ffc06aa6ba974"
}
@@ -0,0 +1,116 @@
{
"db_name": "SQLite",
"query": "\n SELECT\n id,\n task_status,\n task_type,\n model_type,\n provider,\n provider_job_id,\n frontend_caller,\n frontend_subscriber_id,\n frontend_subscriber_payload,\n on_complete_primary_media_file_token,\n on_complete_primary_media_file_class,\n on_complete_batch_token,\n on_complete_primary_media_file_cdn_url,\n on_complete_primary_media_file_thumbnail_url_template,\n created_at as \"created_at: DateTime<Utc>\",\n updated_at as \"updated_at: DateTime<Utc>\",\n completed_at as \"completed_at: DateTime<Utc>\"\n FROM tasks\n WHERE is_dismissed_by_user == 0\n ",
"describe": {
"columns": [
{
"name": "id",
"ordinal": 0,
"type_info": "Text"
},
{
"name": "task_status",
"ordinal": 1,
"type_info": "Text"
},
{
"name": "task_type",
"ordinal": 2,
"type_info": "Text"
},
{
"name": "model_type",
"ordinal": 3,
"type_info": "Text"
},
{
"name": "provider",
"ordinal": 4,
"type_info": "Text"
},
{
"name": "provider_job_id",
"ordinal": 5,
"type_info": "Text"
},
{
"name": "frontend_caller",
"ordinal": 6,
"type_info": "Text"
},
{
"name": "frontend_subscriber_id",
"ordinal": 7,
"type_info": "Text"
},
{
"name": "frontend_subscriber_payload",
"ordinal": 8,
"type_info": "Text"
},
{
"name": "on_complete_primary_media_file_token",
"ordinal": 9,
"type_info": "Text"
},
{
"name": "on_complete_primary_media_file_class",
"ordinal": 10,
"type_info": "Text"
},
{
"name": "on_complete_batch_token",
"ordinal": 11,
"type_info": "Text"
},
{
"name": "on_complete_primary_media_file_cdn_url",
"ordinal": 12,
"type_info": "Text"
},
{
"name": "on_complete_primary_media_file_thumbnail_url_template",
"ordinal": 13,
"type_info": "Text"
},
{
"name": "created_at: DateTime<Utc>",
"ordinal": 14,
"type_info": "Int64"
},
{
"name": "updated_at: DateTime<Utc>",
"ordinal": 15,
"type_info": "Int64"
},
{
"name": "completed_at: DateTime<Utc>",
"ordinal": 16,
"type_info": "Int64"
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false,
false,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
false,
false,
true
]
},
"hash": "47f94c127abc20683b25c257aed3c2190b9bd29eb829d61392f08e10fd986767"
}
@@ -0,0 +1,12 @@
{
"db_name": "SQLite",
"query": "\n UPDATE tasks\n SET\n task_status = ?,\n on_complete_batch_token = ?,\n on_complete_primary_media_file_token = ?,\n on_complete_primary_media_file_class = ?,\n on_complete_primary_media_file_cdn_url = ?,\n on_complete_primary_media_file_thumbnail_url_template = ?\n WHERE id = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 7
},
"nullable": []
},
"hash": "50a2449b87abed7df3302a74ecd0e8ab87940077a247636680cb09b2fe488321"
}
Generated
+207 -225
View File
File diff suppressed because it is too large Load Diff
+18 -5
View File
@@ -6,7 +6,8 @@ resolver = "2"
members = [
# API clients for external services
# These might be custom implementations or wrappers over other client libraries.
"crates/api_clients/artcraft_api_defs", # TODO: api_clients/{artcraft}/{api_defs,client}
"crates/api_clients/artcraft/artcraft_api_defs", # TODO: api_clients/{artcraft}/{api_defs,client}
"crates/api_clients/artcraft/storyteller_client",
"crates/api_clients/cloud_storage",
"crates/api_clients/fal_client",
"crates/api_clients/google_drive_common",
@@ -15,7 +16,6 @@ members = [
"crates/api_clients/openai_sora_client",
"crates/api_clients/openart_client",
"crates/api_clients/runwayml_client",
"crates/api_clients/storyteller_client",
"crates/api_clients/thumbnail_generator",
# CLI tools for operations, etc.
@@ -181,7 +181,7 @@ workspace-build-acceleration = { path = "crates/workspace-build-acceleration" }
# Internal libs
# Setting paths here ensures we don't need to do so in every crate's Cargo.toml
# It makes refactoring much easier.
artcraft_api_defs = { path = "crates/api_clients/artcraft_api_defs" }
artcraft_api_defs = { path = "crates/api_clients/artcraft/artcraft_api_defs" }
build_metadata = { path = "crates/lib/build_metadata" }
cloud_storage = { path = "crates/api_clients/cloud_storage" }
cloudflare_errors = { path = "crates/lib/cloudflare_errors" }
@@ -205,7 +205,7 @@ openai_sora_client = { path = "crates/api_clients/openai_sora_client" }
primitives = { path = "crates/lib/data/primitives" }
shared_service_components = { path = "crates/lib/shared_service_components" }
sqlite_tasks = { path = "crates/schema/database/sqlite_tasks" }
storyteller_client = { path = "crates/api_clients/storyteller_client" }
storyteller_client = { path = "crates/api_clients/artcraft/storyteller_client" }
subprocess_common = { path = "crates/lib/subprocess_common" }
test_data = { path = "crates/lib/test_data" }
testing = { path = "crates/lib/testing" }
@@ -237,7 +237,7 @@ log = "0.4.27"
once_cell = "1.21.3"
rand = "0.9.1"
regex = "1.11.1"
reqwest = { version = "0.12.22", features = ["json", "cookies"] }
reqwest = { version = "0.12.23", features = ["json", "cookies"] }
reqwest-websocket = { version = "0.5.0" }
serde = { version = "1.0.219", features = ["derive"] }
serde_derive = "1.0.219"
@@ -255,3 +255,16 @@ thiserror = "2.0.12"
tokio = { version = "1.45.1", features = ["macros"] }
toml = "0.8.22"
url = { version = "2.5.4", features = ["serde"] }
# NB: wreq gets past fingerprinting, but we have to deal with platform-specific build issues.
#
# Mac:
# brew install --formula cmake pkg-config llvm
# Windows:
# choco install cmake -y
# choco install strawberryperl -y
# choco install pkgconfiglite -y
# choco install llvm -y
# choco install nasm -y
wreq = { version = "6.0.0-rc.20", features = ["json", "multipart", "cookies"] }
wreq-util = "3.0.0-rc.5"
@@ -0,0 +1,20 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
select
u.display_name,
count(*) as sessions,
a.session_duration_seconds / 60 / 60 as hours,
a.measurement_count,
u.email_address,
a.os_platform,
a.os_version,
u.created_at,
u.maybe_source,
a.last_active_at
from analytics_app_sessions as a
left outer join users as u
on a.user_token = u.token
group by a.user_token
order by hours desc;
@@ -9,6 +9,14 @@
-- tasks_v1.sqlite - initial version
-- tasks_v2.sqlite - added model_type (nullable)
-- tasks_v3.sqlite - added frontend_caller, comments
-- tasks_v4.sqlite - added is_dismissed_by_user
-- tasks_v5.sqlite - added five fields:
-- on_complete_batch_token,
-- on_complete_primary_media_file_token,
-- on_complete_primary_media_file_class,
-- on_complete_primary_media_file_cdn_url,
-- on_complete_primary_media_file_thumbnail_url_template,
--
CREATE TABLE tasks (
-- Task auto-incrementing primary key.
@@ -50,6 +58,32 @@ CREATE TABLE tasks (
-- will be re-emitted back to the frontend.
frontend_subscriber_payload TEXT,
-- Whether the user has dismissed the task from view.
is_dismissed_by_user INTEGER NOT NULL DEFAULT 0,
-- OPTIONAL.
-- When the generation completes, the batch token (if any).
-- This will point to a collection of multiple files.
on_complete_batch_token TEXT,
-- OPTIONAL.
-- When the generation completes, the media token of the "primary" media file.
-- We'll probably always generate homogenous types, but just in case this is the first or primary item in a batch.
on_complete_primary_media_file_token TEXT,
-- OPTIONAL.
-- When the generation completes, the file type of the primary media file.
-- We'll probably always generate homogenous types, but just in case this is the first or primary item in a batch.
on_complete_primary_media_file_class TEXT,
-- OPTIONAL.
-- The URL to the media file.
on_complete_primary_media_file_cdn_url TEXT,
-- OPTIONAL.
-- The URL template for the thumbnail of the primary media file.
on_complete_primary_media_file_thumbnail_url_template TEXT,
created_at INTEGER NOT NULL DEFAULT (unixepoch('now')),
updated_at INTEGER NOT NULL DEFAULT (unixepoch('now')),
completed_at INTEGER DEFAULT NULL
@@ -3,4 +3,5 @@ pub mod job_details;
pub mod media_file_cover_image_details;
pub mod media_links;
pub mod simple_entity_stats;
pub mod simple_generic_json_success;
pub mod user_details_light;
@@ -0,0 +1,7 @@
use serde_derive::{Deserialize, Serialize};
use utoipa::ToSchema;
#[derive(Serialize, Deserialize, ToSchema)]
pub struct SimpleGenericJsonSuccess {
pub success: bool,
}
@@ -0,0 +1,19 @@
use serde_derive::{Deserialize, Serialize};
use utoipa::ToSchema;
use tokens::tokens::media_files::MediaFileToken;
#[derive(Serialize, Deserialize, ToSchema)]
pub struct DeleteMediaFileRequest {
pub set_delete: bool,
/// NB: this is only to disambiguate when a user is both a mod and an author.
pub as_mod: Option<bool>,
}
/// For the URL PathInfo
#[derive(Serialize, Deserialize, ToSchema)]
pub struct DeleteMediaFilePathInfo {
pub token: MediaFileToken,
}
@@ -1 +1,2 @@
pub mod delete_media_file;
pub mod list_batch_generated_media_files;

Some files were not shown because too many files have changed in this diff Show More