mood.site Upload
Uploads image(s) to a mood.site board as PNG, replicating the mood.site upload Apple Shortcut.
ComfyUI — mood.site Upload
A custom ComfyUI node that uploads image(s) to a mood.site board, replicating the "mood.site upload template" Apple Shortcut.
Installation
Clone into ComfyUI/custom_nodes/, then restart ComfyUI:
cd ComfyUI/custom_nodes
git clone https://github.com/kkukshtel/comfyui_mood
requests is the only extra dependency (pip install -r requirements.txt).
Node: mood.site Upload
Category: mood.site
| Input | Type | Notes |
|------------|--------|----------------------------------------------------|
| images | IMAGE | One image or a batch — every frame is uploaded. |
| filename | STRING | Optional name for the image(s). Empty → auto image<random>. |
| board_id | STRING | The board's Board ID (board_id query param). |
| edit_key | STRING | The board's Edit Key (edit_key query param). Shown in plaintext — see below. |
| Output | Type | Notes |
|------------|--------|----------------------------------------------------|
| response | STRING | Raw response body from the server. |
| filename | STRING | The name(s) actually used (pass-through, one per line for a batch). |
It's an output node, so it runs even with nothing connected downstream.
API shape (reverse-engineered from the shortcut)
POST https://humehgkgnjxjkfrdxwqr.supabase.co/functions/v1/server/upload
?board_id=<BOARD_ID>&edit_key=<EDIT_KEY>
Content-Type: multipart/form-data
ids = "<name>" (one per image; the filename / id)
images = <PNG file> (one per image, sent as "<name>.png")
The shortcut sends a single clipboard image; this node sends one ids/images
field pair per image in the batch. Each name is the filename input (with an
index appended for batches), or an auto-generated image<N><N> (N = a random
0–9999 number) when filename is left empty. The shortcut used a phoneImage
prefix to tag phone uploads; that prefix is dropped here.
Encoding & errors
ComfyUI images are decoded tensors (no original file to forward), so each frame is re-encoded losslessly as PNG before upload. A rendered tensor is clean to begin with, so there's no reason to use a lossy format — and PNG is always accepted by mood.site. (The JPEG step in the shortcut existed only to handle native HEIC photos on iPhone.)
Two advanced PNG inputs (collapsed by default) tune file size vs. encode speed; both are lossless:
compress_level(0–9) — higher = smaller file, slower.optimize— extra pass for a smaller file.
The service rejects uploads for various reasons (image too large, unsupported
format, bad credentials). On any failure the node raises with the HTTP status
and the server's response body, and logs the same to the ComfyUI console
(prefixed [mood.site]). Network/timeout errors are reported the same way.
Styling
The node is styled via a small frontend extension in js/mood_style.js
(loaded through WEB_DIRECTORY):
- two link buttons — View Public Board ↗ and View Private Board ↗, and
- a logo in the top-right of the title bar.
The buttons open the board this node uploads to, using the node's own
board_id / edit_key values: https://mood.site/<board_id> for the public
view, plus ?edit=<edit_key> for the private one. (If the needed value is
empty it shows a toast instead of opening a broken URL.)
The logo is interactive in the same way: it rotates slightly on hover, kicks a bit further on click, and opens the board. It is drawn with legacy LiteGraph canvas hooks, so it appears on the Nodes v1 renderer only — the buttons work on both.
Hiding the edit key
The edit key is shown in plaintext. If you're streaming or screen-sharing a workflow and don't want it visible, collapse the node (click the dot in its title bar) — that hides all its fields.
There is no in-field masking: it never rendered on the Nodes v1 canvas renderer, so it was removed rather than shipped half-working.
Either way, the edit key is stored in plaintext in the saved workflow .json
and in PNG metadata, so don't share those files publicly regardless of what's on
screen.
The logo is an inline data: URI — nothing is fetched from the network.
Tuning constants at the top of js/mood_style.js:
LOGO_SRC— the title-bar logo (data:URI, SVG or PNG).LOGO_SIZE/LOGO_MARGIN— logo size and inset.HOVER_ANGLE/CLICK_ANGLE/EASE— the tilt animation.