~bigbes/memestudio · events

main · 80 rows

idissue_idevent_typeactorold_valuenew_valuecommentcreated_at
019f7c4a-ed78-7e5f-a8ba-1177909cc9d2memestudio-7hoclosedEugene BlikhReplaced all twelve gallery placeholders with bundled original 640px transparent PNG stickers, added alpha-aware preview/edge/compositor rendering, persisted sticker metadata, and verified browser and container packaging behavior.NULL2026-07-20T00:31:53Z
019f7c4b-1aa5-71d8-89e9-9baa7abeb988memestudio-djcclaimedEugene Blikh{"id":"memestudio-djc","title":"Reconcile manifest vs saved doc","description":"On load, a saved doc fully replaces templates and the manifest bootstrap is skipped, so rebuilding the template library won't surface new templates in an existing doc. Decide/implement a merge (keep the doc's on-selection + uploads, refresh the library list).","status":"open","priority":3,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-18T15:21:28Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T15:21:28Z","labels":["backend"]}{"assignee":"Eugene Blikh","status":"in_progress"}NULL2026-07-20T00:32:04Z
019f7c50-c4f7-7e0d-921a-4f5efa63213amemestudio-djcclosedEugene BlikhMerged saved template state with the current manifest by ID, preserving the active template and user uploads; added browser and backend-startup regression coverage.NULL2026-07-20T00:38:15Z
019f7c50-ecfa-73dc-b9d8-fbb9593d9c15memestudio-uc3claimedEugene Blikh{"id":"memestudio-uc3","title":"Persist undo history across reload","description":"Undo/redo history is in-memory; a reload restores the document but not the undo stack. Optionally persist a bounded history (or accept as-is).","status":"open","priority":3,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-18T15:21:28Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T15:21:28Z","labels":["backend","editor"]}{"assignee":"Eugene Blikh","status":"in_progress"}NULL2026-07-20T00:38:26Z
019f7c57-8e0e-7c96-8765-83176a70f57fmemestudio-uc3closedEugene BlikhPersisted a validated undo/redo window in the live draft, capped at 24 entries and 1 MiB; restored it across reload and reloads images referenced by restored states.NULL2026-07-20T00:45:40Z
019f7c57-c476-78f1-a032-9b3f1d390299memestudio-a3dclaimedEugene Blikh{"id":"memestudio-a3d","title":"Image corner-radius inspector row","description":"The image inspector spec has a Radius slider; placed images use a fixed 3px radius. Add radius to placed state + render + compositor (roundRect).","status":"open","priority":3,"issue_type":"task","owner":"bigbes@gmail.com","created_at":"2026-07-18T15:21:27Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T15:21:27Z","labels":["editor"]}{"assignee":"Eugene Blikh","status":"in_progress"}NULL2026-07-20T00:45:54Z
019f7c5b-e46d-7d56-9d44-9cf16709fd43memestudio-a3dclosedEugene BlikhAdded a 0–40px image-radius slider with a 3px compatibility default, live DOM updates, rounded compositor clipping for images and stickers, and persistence coverage.NULL2026-07-20T00:50:24Z
019f7c5c-0652-7e8e-a762-3fbd53825ddcmemestudio-cv9claimedEugene Blikh{"id":"memestudio-cv9","title":"Dynamic breadcrumb","description":"The 'Templates / Drake Hotline Bling' breadcrumb is static. Reflect the selected template/base name.","status":"open","priority":3,"issue_type":"chore","owner":"bigbes@gmail.com","created_at":"2026-07-18T15:21:27Z","created_by":"Eugene Blikh","updated_at":"2026-07-18T15:21:27Z","labels":["editor"]}{"assignee":"Eugene Blikh","status":"in_progress"}NULL2026-07-20T00:50:33Z
019f7c5e-0c4b-7cae-bb24-4bd6edfeeba1memestudio-cv9closedEugene BlikhMade the breadcrumb derive from the active template or uploaded base, with safe truncation and full-name title; verified selection, reload, and restored-history transitions.NULL2026-07-20T00:52:46Z
019f7c84-6a6c-7ae1-b162-4434fde2b04dmemestudio-d65createdEugene BlikhNULL2026-07-20T01:34:40Z
019f7c84-7a01-738e-a8e6-6fb6374156c3memestudio-d65claimedEugene Blikh{"id":"memestudio-d65","title":"Fetch Imgflip templates once on first server start","description":"Move Imgflip template acquisition out of the image/build path. On the first server start, launch a non-blocking Go job that fetches the Imgflip catalog and image bytes into SQLite; subsequent starts reuse the stored templates without contacting Imgflip. Update the template-serving path, packaging, documentation, and tests to match.","acceptance_criteria":"The server starts without waiting for Imgflip; an empty database triggers one background import; imported template metadata and image bytes persist in SQLite; a populated database does not refetch on restart; the UI can load templates through the server; builds no longer fetch or bundle generated templates; relevant Go and frontend tests/build checks pass.","status":"open","priority":1,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-19T22:34:41Z","created_by":"Eugene Blikh","updated_at":"2026-07-19T22:34:41Z"}{"assignee":"Eugene Blikh","status":"in_progress"}NULL2026-07-20T01:34:44Z
019f7c86-a85e-714c-8d19-6b79458a8816memestudio-d65updatedEugene Blikh{"id":"memestudio-d65","title":"Fetch Imgflip templates once on first server start","description":"Move Imgflip template acquisition out of the image/build path. On the first server start, launch a non-blocking Go job that fetches the Imgflip catalog and image bytes into SQLite; subsequent starts reuse the stored templates without contacting Imgflip. Update the template-serving path, packaging, documentation, and tests to match.","acceptance_criteria":"The server starts without waiting for Imgflip; an empty database triggers one background import; imported template metadata and image bytes persist in SQLite; a populated database does not refetch on restart; the UI can load templates through the server; builds no longer fetch or bundle generated templates; relevant Go and frontend tests/build checks pass.","status":"in_progress","priority":1,"issue_type":"feature","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-07-19T22:34:41Z","created_by":"Eugene Blikh","updated_at":"2026-07-19T22:34:45Z","started_at":"2026-07-19T22:34:45Z"}{"design":"Add SQLite templates plus a singleton import-completion row. Startup launches an Imgflip importer goroutine; it downloads the catalog and bounded image bodies concurrently, then commits usable templates and the completion marker in one transaction. GET /api/templates returns 202 + Retry-After until that marker exists and a manifest-shaped response afterward; GET /api/templates/{id} serves the stored blob. The browser renders immediately and polls the API in the background, while static-only hosting keeps its built-in placeholders. Remove the Docker network-fetch stage and the obsolete generator."}NULL2026-07-20T01:37:07Z
019f7c8f-0068-7232-85eb-172abbb41071memestudio-d65closedEugene BlikhImplemented asynchronous first-start Imgflip import into SQLite, local template APIs, browser readiness polling, build-stage removal, documentation, and restart/failure tests.NULL2026-07-20T01:46:14Z
019f7ca6-efd6-7d2f-b528-e2f254ad6b61memestudio-am3createdEugene BlikhNULL2026-07-20T02:12:22Z
019f7ca7-0355-7595-83c8-6453718b9779memestudio-am3claimedEugene Blikh{"id":"memestudio-am3","title":"Compact template rail and restore scrollable canvas","description":"The first-start library exposes 100 templates directly in the sidebar. That makes the sidebar's min-content height expand the app grid, vertically centers the canvas against the oversized page, and leaves most of the canvas inaccessible. Keep six popular/selected templates in the rail, move the full searchable library into an overlay picker, preserve Imgflip popularity order, and constrain sidebar/stage/inspector scrolling to the viewport.","acceptance_criteria":"The sidebar renders at most six template tiles plus an All templates action; the full 100-template library is searchable and selectable in a keyboard-accessible overlay; Imgflip catalog order drives popularity and the active template remains visible in the quick rail; the app stays exactly viewport-high; sidebar, stage, and inspector scroll independently; an oversized or zoomed canvas can be reached by scrolling/panning; relevant server, JavaScript, CSS, and Docker checks pass.","status":"open","priority":1,"issue_type":"bug","owner":"bigbes@gmail.com","created_at":"2026-07-19T23:12:23Z","created_by":"Eugene Blikh","updated_at":"2026-07-19T23:12:23Z"}{"assignee":"Eugene Blikh","status":"in_progress"}NULL2026-07-20T02:12:27Z
019f7ca8-d58b-72ce-9150-b98ea0525b8bmemestudio-am3updatedEugene Blikh{"id":"memestudio-am3","title":"Compact template rail and restore scrollable canvas","description":"The first-start library exposes 100 templates directly in the sidebar. That makes the sidebar's min-content height expand the app grid, vertically centers the canvas against the oversized page, and leaves most of the canvas inaccessible. Keep six popular/selected templates in the rail, move the full searchable library into an overlay picker, preserve Imgflip popularity order, and constrain sidebar/stage/inspector scrolling to the viewport.","acceptance_criteria":"The sidebar renders at most six template tiles plus an All templates action; the full 100-template library is searchable and selectable in a keyboard-accessible overlay; Imgflip catalog order drives popularity and the active template remains visible in the quick rail; the app stays exactly viewport-high; sidebar, stage, and inspector scroll independently; an oversized or zoomed canvas can be reached by scrolling/panning; relevant server, JavaScript, CSS, and Docker checks pass.","status":"in_progress","priority":1,"issue_type":"bug","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-07-19T23:12:23Z","created_by":"Eugene Blikh","updated_at":"2026-07-19T23:12:28Z","started_at":"2026-07-19T23:12:28Z"}{"design":"Keep six quick templates in the sidebar: the first six by Imgflip catalog rank, replacing the sixth with the active template when needed. Put all templates plus upload in a native dialog with its own search; sidebar search and Browse all open it, and Escape/native focus handling close it. Persist catalog rank in SQLite and run a one-time metadata-only rank migration for databases created before the rank column, without redownloading image blobs. Constrain the grid/flex min-heights to 100dvh, make the stage independently scrollable, size the zoom wrapper to transformed dimensions, and support wheel/scrollbar plus space- or middle-drag panning."}NULL2026-07-20T02:14:27Z
019f7cb3-5bf9-71b5-b023-6f5ac4c76ebfmemestudio-am3closedEugene BlikhImplemented six-template quick rail, searchable native full-library picker, persisted Imgflip popularity rank with metadata-only legacy migration, viewport-constrained independent scrolling, zoom-aware stage sizing, and space/middle-button panning. Go tests including race, vet/build, JS syntax, Docker build, and a 100-template headless browser interaction check pass.NULL2026-07-20T02:25:57Z
019f7cc3-0d54-7d32-b385-9b6cf416a480memestudio-5tgcreatedEugene BlikhNULL2026-07-20T02:43:05Z
019f7cc3-1c1a-7add-90ed-0c2646f60040memestudio-5tgclaimedEugene Blikh{"id":"memestudio-5tg","title":"Make preset text editable and add image transform workflow","description":"Preset captions are partly baked into layout markup, text styling lacks outline/background controls, two obsolete presets remain exposed, placed images only have one resize behavior, and imported or pasted images cannot be cropped before insertion. Unify preset captions with editable text layers, add explicit text outline and bubble-background styling, remove Speech bubble and 3-panel presets, add ratio-locked versus stretch image resizing, and route image insertion through a live crop preview.","design":"Use per-preset starter text definitions that seed real state.texts only when a preset is selected, so DOM editing, history, persistence, and compose share one model. Extend text records with outlineColor and a background object while preserving defaults for old documents. Extend placed-image records with resizeMode and make the existing corner gesture preserve ratio only in locked mode. Build one native crop dialog backed by canvas, with draggable image positioning and zoom, returning a normalized data URL through the existing image-processing pipeline; use it for gallery imports, base-template imports, and clipboard image files.","acceptance_criteria":"Every visible preset caption is represented by an editable/exported text layer; outline color is configurable with presets and a custom picker; text background supports Transparent and Bubble, with Bubble background color, radius, and background-only opacity; Speech bubble and 3-panel presets are removed and preset counts remain accurate; placed images can switch between locked-aspect resize and free stretch, persist that mode, and export identically; file imports and clipboard image paste can preview, reposition, zoom, crop, or use the full image before insertion; existing documents migrate safely; browser interaction checks plus Go, JS, and Docker gates pass.","status":"open","priority":1,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-19T23:43:06Z","created_by":"Eugene Blikh","updated_at":"2026-07-19T23:43:06Z"}{"assignee":"Eugene Blikh","status":"in_progress"}NULL2026-07-20T02:43:09Z
019f7cd6-d330-7ca2-a630-fec29cc6dc7bmemestudio-5tgclosedEugene BlikhImplemented editable text layers for every remaining preset; configurable outline and Bubble styling; removed Speech bubble and 3-panel; added Ratio/Stretch placed-image resizing; added live crop workflow for base/gallery imports and clipboard paste; documented and validated JS, browser interactions/migration, Go test/race/vet/build, and Docker build.NULL2026-07-20T03:04:41Z
019f7ce7-57b6-72a7-ba00-d67ab7df7d94memestudio-8mrcreatedEugene BlikhNULL2026-07-20T03:22:43Z
019f7ce7-7810-7d6d-8dbd-39dd125e5b3amemestudio-8mrclaimedEugene Blikh{"id":"memestudio-8mr","title":"Use selected images inside presets and expose meme actions","description":"Non-classic presets currently render placeholder gradients instead of the selected template, image mirroring is hard to discover, saved memes can only be renamed through a hidden double-click gesture, and the inspector contains an unwanted local-render footer. Make preset image slots use the active template automatically with an explicit way to choose replacement images, expose mirroring for inserted image layers, add a visible rename action for My Memes, and remove the footer.","design":"Represent preset image cells as addressable slots. Resolve each slot from a user override first, then the active template, then the existing placeholder. Render the same resolution path in DOM previews and canvas export, and let users select a slot to choose an existing gallery/template image or import through the current crop workflow. Keep placed-image mirroring on the layer model but expose it as a clear Mirror control. Add an explicit rename button to each saved-meme row while preserving inline rename behavior.","acceptance_criteria":"Demotivator, 4-panel, 2-panel, Comparison, and Deep-fried show the active template inside their image areas automatically; each preset image area can be replaced when no suitable template is selected and DOM/export agree; image layers have an obvious horizontal mirror action that persists and exports; My Memes rows have a visible rename action; the Local/Rendered in your browser footer is gone; old documents load with placeholder fallbacks; browser interaction checks plus JS, Go, and Docker gates pass.","status":"open","priority":1,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-20T00:22:44Z","created_by":"Eugene Blikh","updated_at":"2026-07-20T00:22:44Z"}{"assignee":"Eugene Blikh","status":"in_progress"}NULL2026-07-20T03:22:52Z
019f7cf3-a4aa-7441-b478-86ede8db7013memestudio-8mrclosedEugene BlikhImplemented active-template inheritance and persisted per-panel overrides for all non-classic presets, Image-tool panel replacement and upload fallback, explicit image Mirror controls, a visible end-to-end My Memes rename action, and removed the local-render footer. Validated static/browser workflows, backend persistence and rename, old-state migration, Go test/race/vet/build, JS syntax, and Docker build.NULL2026-07-20T03:36:10Z
019f7e75-8c8a-7265-ab4a-e44c68b772afmemestudio-ql5createdEugene BlikhNULL2026-07-20T10:37:40Z
019f7e75-b9a9-7392-bdf4-487e0b3f3240memestudio-ql5claimedEugene Blikh{"id":"memestudio-ql5","title":"Default to Select and make preset panels independent","description":"The editor currently starts in the wrong tool mode and fills every picture slot in multi-image presets from one active template. Start in Select mode and make every preset picture panel independently selectable, while preserving sensible single-picture preset behavior and persisted panel choices.","acceptance_criteria":"New documents start in Select mode; multi-image presets do not duplicate one template into every panel; each panel can be assigned independently through the editor; saved documents preserve assignments; existing documents remain compatible.","status":"open","priority":2,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-20T07:37:41Z","created_by":"Eugene Blikh","updated_at":"2026-07-20T07:37:41Z"}{"assignee":"Eugene Blikh","status":"in_progress"}NULL2026-07-20T10:37:52Z
019f7e7d-e833-7d3a-b001-39b9245cbc11memestudio-ql5updatedEugene Blikh{"id":"memestudio-ql5","title":"Default to Select and make preset panels independent","description":"The editor currently starts in the wrong tool mode and fills every picture slot in multi-image presets from one active template. Start in Select mode and make every preset picture panel independently selectable, while preserving sensible single-picture preset behavior and persisted panel choices.","acceptance_criteria":"New documents start in Select mode; multi-image presets do not duplicate one template into every panel; each panel can be assigned independently through the editor; saved documents preserve assignments; existing documents remain compatible.","status":"in_progress","priority":2,"issue_type":"feature","assignee":"Eugene Blikh","owner":"bigbes@gmail.com","created_at":"2026-07-20T07:37:41Z","created_by":"Eugene Blikh","updated_at":"2026-07-20T07:37:52Z","started_at":"2026-07-20T07:37:52Z"}{"acceptance_criteria":"New documents start in Select mode; multi-image presets do not duplicate one template into every panel; each panel can be assigned independently through the editor; saved documents preserve assignments; selected text exposes a persisted max-width control that matches DOM wrapping and exported output; existing documents remain compatible.","description":"The editor currently starts in the wrong tool mode and fills every picture slot in multi-image presets from one active template. Start in Select mode, make every preset picture panel independently selectable, and add a per-text-layer maximum-width control so wrapping can be adjusted in both the editor and export."}NULL2026-07-20T10:46:48Z
019f7e83-34a6-7144-9344-4f0d4c2622bcmemestudio-ql5closedEugene BlikhImplemented Select as the default tool, independent multi-image preset slots, and per-text maximum-width controls; verified preview/export behavior in Chrome and passed Go/JS/Docker quality gates.NULL2026-07-20T10:52:35Z
019f938d-ec8a-7737-99c7-7823a76b90b4memestudio-6zdcreatedEugene BlikhNULL2026-07-24T12:56:19Z
019f938e-1454-780a-97d3-e3902f46b7famemestudio-6zdclaimedEugene Blikh{"id":"memestudio-6zd","title":"Paste-from-clipboard into template picker and gallery","description":"Global paste already drops a clipboard image as a placed overlay layer. Add a Paste affordance in (1) the template picker (base image / preset slot) and (2) the image gallery (built-in-style user image), reusing the crop + prepareImage flow via navigator.clipboard.read().","status":"open","priority":2,"issue_type":"feature","owner":"bigbes@gmail.com","created_at":"2026-07-24T09:56:20Z","created_by":"Eugene Blikh","updated_at":"2026-07-24T09:56:20Z"}{"assignee":"Eugene Blikh","status":"in_progress"}NULL2026-07-24T12:56:29Z
019f9393-87e8-7f32-b2dc-2d9c26a4790dmemestudio-6zdclosedEugene BlikhAdded Paste tiles to the template picker (base image / preset slot) and the image gallery, sharing addTemplateImage/addGalleryImage with the file-upload handlers; readClipboardImage() via async clipboard, gated on clipboardImagesSupported. Verified end-to-end in headless Chrome.NULL2026-07-24T13:02:27Z