Repository navigation
stallkit 0.1.0
First public release.
Added
- Setup that checks as it goes.
stallkit initwrites.envwith the shared secret
typed hidden and verifies the credential against Etsy.stallkit setupwalks every
prerequisite and names the single next command;stallkit doctorruns the same
checklist without asking anything, for scripts. - OAuth 2.0 with PKCE. A one-shot
localhostlistener catches the redirect, or you
paste the address back. Tokens live in~/.stallkit/token.jsonwith0600
permissions and refresh themselves, including mid-batch. - Bulk listings from a spreadsheet.
listings template,listings pulland
listings push. An emptylisting_idcreates a draft, a filled one updates. The whole
file is validated before anything is sent — titles, the 13-tag and 20-character rules,
enum values, prices, image count, format and size — and one bad row stops the run
unless--partialis given. New listings are always drafts. - Orders and tracking.
orders pullexports orders to CSV (--since,--unshipped),
orders carrierslists valid carrier names per country, andorders shipuploads
tracking in bulk after a dry run and a confirmation. - SEO.
seo auditscores every listing out of 100, worst first, plus shop-level
checks for listings competing for the same searches.seo keywordssamples what
actually ranks for a term — tags, title phrases, price band — with only a keystring.
seo suggestcombines both for one listing. - Designs in, drafts out.
drop initcreates a workspace folder;drop template
copies business settings from a listing you built by hand;drop runcomposites
loose artwork onto your mockups, researches each concept, writes titles and tags
within Etsy's limits and produces areview.csvwithout sending anything;drop auto
uploads folders of finished photos as drafts, with an upload history that prevents
duplicates. - Print-area calibration.
drop calibratesets where a design lands on each mockup,
shares it with every mockup of the same size, imports a pixel-based file, and draws
the rectangle on the mockup so it can be checked before it is saved. - Images that match what the seller sees. Phone photos are turned upright from their
EXIF orientation, colour profiles are converted to sRGB, transparent templates are
flattened onto white, 16-bit greyscale keeps its tone, and JPEGs keep full colour
resolution. Formats Etsy refuses are converted, and the row says so. --anonymisehides shop name, ids, titles, URLs and tags in terminal output so a
screenshot can be shared.
Notes on Etsy's API
Recorded here and in the code so nobody has to re-derive them:
x-api-keymust carry both the keystring and the shared secret, colon-joined, on
every request including unauthenticated ones. PKCE removes the client secret from the
token exchange only — not from this header.- Callback URLs may be
http://orhttps://, and the host must be a domain name.
localhostis accepted;127.0.0.1is rejected. Etsy's prose docs say https-only,
which is narrower than what is enforced and leads you to build the wrong flow. - Rate limits are per app. A Personal Access app gets 5 requests/second and 5,000
per day — not the 10/sec and 10,000/day the general documentation quotes. - Array form fields such as
tagsandmaterialsare comma-joined strings, not
repeated keys. Repeated keys silently drop all but one value. createDraftListingtakes form encoding;createReceiptShipmenttakes JSON.- Listing images must be JPG, PNG or GIF, at most 20MB, and at most ten per listing.
- There is no idempotency key, so non-idempotent writes are never retried on a timeout
or a 5xx — a repeat would mean a duplicate listing, or a second email to a buyer.