Skip to content

Commit 0b5b8d1

Browse files
committed
copy: broaden ButtonSpa action-app branding
1 parent 2c20ec2 commit 0b5b8d1

15 files changed

Lines changed: 197 additions & 170 deletions

File tree

.launch-hints.yaml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
name: ButtonSpa.app
44
slug: buttonspa
55
app_type: web-app
6-
audience: people who talk faster than they type and want cute tools that still do useful work
7-
problem: "most transcription and automation tools feel cold, slow, or built like subscription bait"
6+
audience: people who want tiny interfaces for real workflows without opening a whole app
7+
problem: "APIs, webhooks, and automations are powerful but usually ugly, intimidating, or hidden behind dashboards"
88
promise: "ButtonSpa - Make cute buttons that do real things."
99
cta: Reply if you want the link.
1010
differentiators:
1111
- >-
1212
I'm Pablo. I build tools with personality and soul. ButtonSpa lets you
13-
design beautiful voice buttons with real-time AI transcription, then save
14-
them as tiny apps.
13+
turn useful actions into beautiful tappable buttons, then save them as
14+
tiny apps.
1515
- "Make cute buttons that do real things."
16-
- "A playful builder for tiny action apps, starting with voice buttons."
16+
- "A playful builder for tiny action apps, starting with voice transcription."
1717
proof_points:
1818
- "\U0001FAC1 Breathe - Gentle breathing animation"
1919
- ⬆️ Bounce - Satisfying vertical bounce
@@ -26,10 +26,12 @@ keywords:
2626
- ButtonSpa.app
2727
- button spa
2828
- web app
29-
audience: people who talk faster than they type and want cute tools that still do useful work
29+
audience: people who want tiny interfaces for real workflows without opening a whole app
3030
intent:
31+
- API buttons
32+
- webhook buttons
3133
- voice transcription
3234
- tiny action apps
3335
- save to phone
3436
manual_notes:
35-
- Lead with voice buttons today. Let webhooks and APIs feel like the next natural room in the spa.
37+
- Lead with tiny action apps. Voice transcription is the first working treatment, not the whole brand.

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
> **Make cute buttons that do real things.**
44
5-
ButtonSpa is a playful builder for tiny action apps. Today it helps you design
6-
beautiful voice recording buttons with real-time Gemini transcription, tactile
7-
effects, and PWA export. The wider shape is simple: polished buttons that can be
8-
shared, embedded, installed, and eventually wired to webhooks or APIs.
5+
ButtonSpa is a playful builder for tiny action apps: APIs, webhooks, and useful
6+
workflows wrapped in buttons people actually want to tap. Today it starts with
7+
voice transcription, tactile effects, and PWA export. The wider shape is simple:
8+
polished buttons that can be shared, embedded, installed, and wired to whatever
9+
work needs one good tap.
910

1011
## Core Features
1112

components/PWAShareModal.tsx

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export default function PWAShareModal({
7373
if (!options.quiet) {
7474
playSound.success();
7575
hapticService.buttonSuccess();
76-
toast("PWA ready to share! 🎉", "success");
76+
toast("Tiny app link ready! 🎉", "success");
7777
}
7878
} catch (error) {
7979
console.error("PWA generation error:", error);
@@ -118,9 +118,9 @@ export default function PWAShareModal({
118118
<div class="bg-gradient-to-r from-purple-500 to-pink-500 p-6 text-white">
119119
<div class="flex justify-between items-center">
120120
<div>
121-
<h2 class="text-2xl font-black">Save Button as App</h2>
121+
<h2 class="text-2xl font-black">Save as Tiny App</h2>
122122
<p class="text-sm opacity-90 mt-1">
123-
Install on your phone's home screen
123+
Give this button its own home screen icon.
124124
</p>
125125
</div>
126126
<button
@@ -147,9 +147,11 @@ export default function PWAShareModal({
147147
// PIN Setup UI (only show if API key exists)
148148
<div class="space-y-4">
149149
<div class="text-center">
150-
<h3 class="text-xl font-bold mb-2">🔐 Share with API Key?</h3>
150+
<h3 class="text-xl font-bold mb-2">
151+
🔐 Keep voice transcription with it?
152+
</h3>
151153
<p class="text-sm text-gray-600">
152-
Include your transcription features
154+
Protect the Gemini key with a PIN before sharing.
153155
</p>
154156
</div>
155157

@@ -163,7 +165,7 @@ export default function PWAShareModal({
163165
(e.target as HTMLInputElement).checked}
164166
class="w-5 h-5 rounded"
165167
/>
166-
<span class="font-medium">Include API Key (Protected)</span>
168+
<span class="font-medium">Include API key with PIN</span>
167169
</label>
168170

169171
{includeApiKey.value && (
@@ -193,7 +195,7 @@ export default function PWAShareModal({
193195
disabled={includeApiKey.value && !isValidPIN(pin.value)}
194196
class="w-full py-4 bg-gradient-to-r from-purple-500 to-pink-500 text-white rounded-2xl font-black hover:from-purple-600 hover:to-pink-600 transition-all disabled:opacity-50"
195197
>
196-
Generate Share Link
198+
Create Install Link
197199
</button>
198200
</div>
199201
)
@@ -210,7 +212,7 @@ export default function PWAShareModal({
210212
/>
211213
</div>
212214
<p class="mt-3 text-sm text-gray-600">
213-
📱 Scan with your phone's camera
215+
📱 Scan to open this button.
214216
</p>
215217
</div>
216218

@@ -241,57 +243,57 @@ export default function PWAShareModal({
241243
onClick={copyLink}
242244
class="w-full py-4 bg-black text-white rounded-2xl font-black hover:bg-gray-800 transition-colors flex items-center justify-center gap-2"
243245
>
244-
<span>📋</span> Copy Link
246+
<span>📋</span> Copy Install Link
245247
</button>
246248

247249
<button
248250
type="button"
249251
onClick={openOnPhone}
250252
class="w-full py-4 bg-purple-500 text-white rounded-2xl font-black hover:bg-purple-600 transition-colors flex items-center justify-center gap-2"
251253
>
252-
<span>📲</span> Open on This Device
254+
<span>📲</span> Open Button
253255
</button>
254256
</div>
255257

256258
{/* What Happens Next */}
257259
<div class="border-t pt-4 bg-gradient-to-r from-purple-50 to-pink-50 rounded-xl p-4">
258260
<h3 class="font-bold mb-3 text-purple-800">
259-
✨ What You Get:
261+
✨ What happens next
260262
</h3>
261263
<div class="space-y-2 text-sm text-gray-700">
262264
<div class="flex gap-2">
263265
<span>📱</span>
264266
<span>
265-
Your button becomes an app icon on your home screen
267+
Home screen icon generated from this button
266268
</span>
267269
</div>
268270
<div class="flex gap-2">
269-
<span>🎤</span>
271+
<span>🔘</span>
270272
<span>
271-
Tap the icon → Opens just your button (no ButtonSpa)
273+
Opens straight to the action, without the studio
272274
</span>
273275
</div>
274276
<div class="flex gap-2">
275277
<span>📋</span>
276278
<span>
277-
Record → Get transcription → Auto-copies to clipboard
279+
Voice buttons record, transcribe, and copy text
278280
</span>
279281
</div>
280282
<div class="flex gap-2">
281283
<span>🔗</span>
282284
<span>
283-
Share this link with friends → They get the same button!
285+
Share the link to send the same tiny app
284286
</span>
285287
</div>
286288
</div>
287289
</div>
288290

289291
{/* Simple Install Steps */}
290292
<div class="mt-4 p-3 bg-yellow-50 rounded-xl border-2 border-yellow-200">
291-
<p class="text-xs font-bold text-yellow-800 mb-2">
292-
📲 How to Install:
293+
<p class="text-sm font-bold text-yellow-800 mb-2">
294+
📲 Install steps
293295
</p>
294-
<div class="text-xs space-y-1">
296+
<div class="text-sm space-y-1">
295297
<div>
296298
<span class="font-bold">iPhone:</span>{" "}
297299
Open in Safari → Tap Share → Add to Home Screen

components/panels/MagicPanel.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export default function MagicPanel({
2020
{onApiKeyChange && (
2121
<div>
2222
<h4 class="text-lg font-black text-gray-900 mb-2">
23-
Gemini API Key
23+
Voice Starter
2424
{apiKeyValue && apiKeyValue.trim() !== "" && (
2525
<span class="ml-2 text-green-600">✓ Voice Active</span>
2626
)}
@@ -29,7 +29,8 @@ export default function MagicPanel({
2929
{!apiKeyValue || apiKeyValue.trim() === ""
3030
? (
3131
<>
32-
⚠️ Add your API key to enable voice transcription -{" "}
32+
Voice transcription is the first ButtonSpa action. Paste a
33+
Gemini key to turn recordings into copied text.{" "}
3334
<a
3435
href="https://aistudio.google.com/app/apikey"
3536
target="_blank"
@@ -40,11 +41,11 @@ export default function MagicPanel({
4041
hapticService.buttonPress();
4142
}}
4243
>
43-
Get free API key →
44+
Get a free Gemini key →
4445
</a>
4546
</>
4647
)
47-
: "Voice transcription is automatically enabled with your API key"}
48+
: "Voice transcription is on. Recordings will be transcribed and copied."}
4849
</p>
4950
<input
5051
type="password"
@@ -69,10 +70,10 @@ export default function MagicPanel({
6970
{onCustomPromptChange && (
7071
<div>
7172
<h4 class="text-lg font-black text-gray-900 mb-2">
72-
Custom Instructions
73+
Transcript Treatment
7374
</h4>
7475
<p class="text-sm text-gray-600 mb-3">
75-
Add special instructions for transcription (optional)
76+
Tell ButtonSpa how to clean up the transcript.
7677
</p>
7778
<textarea
7879
value={customPromptValue}

components/panels/ShipPanel.tsx

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -77,15 +77,19 @@ export default function ShipPanel(
7777
return (
7878
<div class="space-y-2">
7979
<div>
80-
<h4 class="text-lg font-black text-gray-900 mb-2">Share Your Button</h4>
80+
<h4 class="text-lg font-black text-gray-900 mb-2">Ship Your Button</h4>
8181
<p class="text-sm text-gray-600 mb-3">
82-
Export your button to use anywhere!
82+
Turn this design into a link, a phone app, or a standalone file.
8383
</p>
8484

8585
{/* Export Buttons */}
8686
<div class="space-y-2">
87+
{/* Save to Phone Button */}
8788
<button
88-
onClick={() => handleExport("html")}
89+
onClick={() => {
90+
playSound.primaryClick();
91+
showPWAModal.value = true;
92+
}}
8993
onMouseEnter={() => playSound.hover()}
9094
type="button"
9195
class="w-full h-12 px-6 rounded-2xl border-2 font-bold text-sm transition-all hover:shadow-md active:scale-95 bg-yellow-200 hover:bg-yellow-300 text-black"
@@ -94,13 +98,11 @@ export default function ShipPanel(
9498
boxShadow: "4px 4px 0px rgba(0,0,0,0.85)",
9599
}}
96100
>
97-
📄 Download HTML File
101+
📱 Save as Tiny App
98102
</button>
99103

100-
{
101-
/* COMMENTED OUT: PWA ZIP Export - not useful for most users
102104
<button
103-
onClick={() => handleExport("pwa")}
105+
onClick={() => handleExport("share")}
104106
onMouseEnter={() => playSound.hover()}
105107
type="button"
106108
class="w-full h-12 px-6 rounded-2xl border-2 font-bold text-sm transition-all hover:shadow-md active:scale-95 bg-yellow-200 hover:bg-yellow-300 text-black"
@@ -109,17 +111,11 @@ export default function ShipPanel(
109111
boxShadow: "4px 4px 0px rgba(0,0,0,0.85)",
110112
}}
111113
>
112-
📦 Export PWA (ZIP)
114+
🔗 Copy Design Link
113115
</button>
114-
*/
115-
}
116116

117-
{/* Save to Phone Button */}
118117
<button
119-
onClick={() => {
120-
playSound.primaryClick();
121-
showPWAModal.value = true;
122-
}}
118+
onClick={() => handleExport("html")}
123119
onMouseEnter={() => playSound.hover()}
124120
type="button"
125121
class="w-full h-12 px-6 rounded-2xl border-2 font-bold text-sm transition-all hover:shadow-md active:scale-95 bg-yellow-200 hover:bg-yellow-300 text-black"
@@ -128,11 +124,13 @@ export default function ShipPanel(
128124
boxShadow: "4px 4px 0px rgba(0,0,0,0.85)",
129125
}}
130126
>
131-
📱 Save to Phone
127+
📄 Download HTML
132128
</button>
133129

130+
{
131+
/* COMMENTED OUT: PWA ZIP Export - not useful for most users
134132
<button
135-
onClick={() => handleExport("share")}
133+
onClick={() => handleExport("pwa")}
136134
onMouseEnter={() => playSound.hover()}
137135
type="button"
138136
class="w-full h-12 px-6 rounded-2xl border-2 font-bold text-sm transition-all hover:shadow-md active:scale-95 bg-yellow-200 hover:bg-yellow-300 text-black"
@@ -141,27 +139,29 @@ export default function ShipPanel(
141139
boxShadow: "4px 4px 0px rgba(0,0,0,0.85)",
142140
}}
143141
>
144-
🔗 Copy Share Link
142+
📦 Export PWA (ZIP)
145143
</button>
144+
*/
145+
}
146146
</div>
147147
</div>
148148

149149
{/* Export Info - More compact and friendly */}
150150
<div class="mt-2 p-2 bg-yellow-50 rounded-xl border-2 border-yellow-300">
151-
<h5 class="font-bold text-xs mb-1">What can I do?</h5>
152-
<ul class="text-xs space-y-0.5 text-gray-700">
151+
<h5 class="font-bold text-xs mb-1">Best exits</h5>
152+
<ul class="text-xs sm:text-sm space-y-1 text-gray-700">
153153
<li>
154-
<strong>HTML File</strong> - Works on any website
154+
<strong>Tiny app</strong> - home screen button with its own icon
155155
</li>
156156
<li>
157-
<strong>Save to Phone</strong> - Add to home screen like an app
157+
<strong>Design link</strong> - send the editable button
158158
</li>
159159
<li>
160-
<strong>Share Link</strong> - Send your design to friends
160+
<strong>HTML</strong> - drop it into a site
161161
</li>
162162
{apiKeyValue && (
163163
<li class="text-green-700 font-bold">
164-
✓ Voice transcription included in exports!
164+
✓ Voice transcription included in exports
165165
</li>
166166
)}
167167
</ul>

0 commit comments

Comments
 (0)