Skip to content

Commit a15979a

Browse files
authored
Merge pull request #43 from BlueBubblesApp/fit-quiz
Add an "Is BlueBubbles a good fit for me?" questionnaire
2 parents 9d053d9 + f6a3dbc commit a15979a

5 files changed

Lines changed: 622 additions & 0 deletions

File tree

scripts/verify-build.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const REQUIRED_PAGES = [
3030
'install/index.html',
3131
'faq/index.html',
3232
'compatibility/index.html',
33+
'is-it-for-me/index.html',
3334
'donate/index.html',
3435
// Not linked from anywhere, but Creem validates this URL -- so a build
3536
// that stops emitting it should fail rather than pass quietly.

src/data/fit.ts

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
/** Questions for "Is BlueBubbles a good fit for me?".
2+
*
3+
* Every constraint here is real and traceable to the FAQ or the install guide:
4+
* a Mac is required (a VM counts), the server only relays while that Mac is
5+
* awake, Full Disk Access is mandatory, and SMS is not supported. The tone is
6+
* light; the answers are not.
7+
*/
8+
9+
export type Tone = 'good' | 'info' | 'warn';
10+
11+
export interface Choice {
12+
id: string;
13+
label: string;
14+
/** Ends the quiz immediately. Used only where the answer is genuinely fatal. */
15+
disqualifies?: boolean;
16+
/**
17+
* Steers the result to "probably not" without ending the quiz. For answers
18+
* that are a serious problem but not a hard impossibility -- a managed Mac,
19+
* say, where the block is policy and permissions rather than physics.
20+
*/
21+
blocks?: boolean;
22+
/** Carried through to the result. */
23+
note?: string;
24+
/**
25+
* A clause naming why this answer counts, used to compose the result
26+
* sentence. Written to read after "the sticking point:" or in a list, so it
27+
* starts lowercase and carries no full stop.
28+
*/
29+
reason?: string;
30+
tone?: Tone;
31+
}
32+
33+
export interface Question {
34+
id: string;
35+
question: string;
36+
/** A line of context under the question. */
37+
help?: string;
38+
choices: Choice[];
39+
}
40+
41+
/**
42+
* Whether the 2.x Swift server has shipped.
43+
*
44+
* Until it has, the questionnaire must not talk about it: there is no "current
45+
* 2.x server" for a reader to be on, and telling someone their Mac is too old
46+
* for a release that does not exist is worse than not asking at all. Flip this
47+
* to true on release day and the macOS question swaps to the 2.x framing --
48+
* Sonoma floor, OpenCore Legacy Patcher, the lot.
49+
*
50+
* The rest of the quiz is unaffected; this is the only question that differs.
51+
*/
52+
export const V2_RELEASED = false;
53+
54+
/** Asked while 1.x is the only server. macOS version changes which Private API
55+
* features are available, but does not decide whether BlueBubbles runs. */
56+
const MACOS_QUESTION_TODAY: Question = {
57+
id: 'macos',
58+
question: 'What macOS version is that Mac on?',
59+
help: 'BlueBubbles runs on a wide range of macOS versions. Newer ones simply expose more of what iMessage can do.',
60+
choices: [
61+
{ id: 'ventura-plus', label: 'Ventura (13) or newer', tone: 'good' },
62+
{
63+
id: 'bigsur-monterey',
64+
label: 'Big Sur (11) or Monterey (12)',
65+
tone: 'info',
66+
note: 'Everything central works. A few of the newer Private API features -- editing and unsending among them -- want Ventura or later.',
67+
},
68+
{
69+
id: 'catalina-older',
70+
label: 'Catalina (10.15) or older',
71+
tone: 'info',
72+
note: 'BlueBubbles works here, but noticeably less of it: several Private API features need Big Sur or later. The compatibility tables in the FAQ spell out which.',
73+
},
74+
{
75+
id: 'unsure',
76+
label: 'I am not sure',
77+
tone: 'info',
78+
note: 'Check the Apple menu, then About This Mac. Any reasonably recent macOS is fine; newer ones just unlock more features.',
79+
},
80+
],
81+
};
82+
83+
/** Asked once 2.x has shipped, when the version decides which server you run. */
84+
const MACOS_QUESTION_V2: Question = {
85+
id: 'macos',
86+
question: 'What macOS version is that Mac on?',
87+
help: 'The current server needs Sonoma or newer. Older Macs are not shut out, but they are on an older server.',
88+
choices: [
89+
{ id: 'tahoe', label: 'Tahoe (26)', tone: 'good' },
90+
{ id: 'sequoia', label: 'Sequoia (15)', tone: 'good' },
91+
{
92+
id: 'sonoma',
93+
label: 'Sonoma (14)',
94+
tone: 'good',
95+
note: 'Sonoma runs the current server. A handful of the newer Private API features need Sequoia or Tahoe, but the core of BlueBubbles is all there.',
96+
},
97+
{
98+
id: 'older',
99+
label: 'Ventura (13) or older',
100+
reason: 'the Mac is on a macOS too old for the current server',
101+
tone: 'warn',
102+
note: 'BlueBubbles still works, but on the 1.x server rather than the current 2.x one, and 1.x is in maintenance rather than active development. If that Mac can take a newer macOS, upgrading is the simplest fix. If Apple has dropped it, OpenCore Legacy Patcher will often get an older Mac onto Sonoma or later. Failing both, a newer second-hand Mac is the other way out.',
103+
},
104+
{
105+
id: 'unsure',
106+
label: 'I am not sure',
107+
tone: 'info',
108+
note: 'Check the Apple menu, then About This Mac. Sonoma or newer runs the current server; Ventura or older runs the 1.x server, which is no longer actively developed.',
109+
},
110+
],
111+
};
112+
113+
const MACOS_QUESTION: Question = V2_RELEASED ? MACOS_QUESTION_V2 : MACOS_QUESTION_TODAY;
114+
115+
export const QUESTIONS: readonly Question[] = [
116+
{
117+
id: 'mac',
118+
question: 'Do you have a Mac, or a way to get one?',
119+
help: "This is the big one. BlueBubbles needs a Mac signed in to iMessage to do the actual talking — there's no way around it.",
120+
choices: [
121+
{ id: 'have', label: 'Yes, I have a Mac', tone: 'good' },
122+
{
123+
id: 'buy',
124+
label: 'I could pick up a cheap old one',
125+
tone: 'good',
126+
note: 'A second-hand Mac mini is the usual route. It does not need to be fast — it only relays messages.',
127+
},
128+
{
129+
id: 'vm',
130+
label: "I'd run macOS in a virtual machine",
131+
tone: 'info',
132+
note: 'Running macOS in a VM works, and there are guides for it in the docs and on the subreddit. Expect a fiddlier setup than real Apple hardware, and be aware it is a grey area under macOS licensing.',
133+
},
134+
{
135+
id: 'none',
136+
label: 'No, and I have no plans to',
137+
reason: "you do not have a Mac",
138+
disqualifies: true,
139+
note: 'Without a Mac there is nothing to connect to. This is the one requirement with no workaround.',
140+
},
141+
],
142+
},
143+
MACOS_QUESTION,
144+
{
145+
id: 'uptime',
146+
question: 'Can that Mac stay awake and online?',
147+
help: 'Your Mac is the bridge. When it sleeps, the bridge is out.',
148+
choices: [
149+
{ id: 'always', label: 'It can run 24/7', tone: 'good' },
150+
{
151+
id: 'mostly',
152+
label: 'Most of the time',
153+
tone: 'info',
154+
note: 'Messages sent while the Mac is asleep arrive once it wakes, rather than being lost.',
155+
},
156+
{
157+
id: 'sometimes',
158+
label: 'Only when I happen to be using it',
159+
reason: 'your Mac will not be awake much',
160+
tone: 'warn',
161+
note: 'BlueBubbles will still work, but only while that Mac is awake. If it spends most of the day shut, you will miss notifications until you open it. Worth setting the Mac to stay awake and to restart after a power cut.',
162+
},
163+
],
164+
},
165+
{
166+
id: 'managed',
167+
question: 'Is the Mac managed by a school, an employer, or an MDM?',
168+
help: 'Managed Macs tend to lock down exactly the things BlueBubbles needs.',
169+
choices: [
170+
{ id: 'personal', label: "No, it's mine", tone: 'good' },
171+
{ id: 'unsure', label: "I'm not sure", tone: 'info', note: 'If it was handed to you by an IT department, assume it is managed and check before installing anything.' },
172+
{
173+
id: 'managed',
174+
label: 'Yes, it belongs to a school or employer',
175+
reason: 'the Mac belongs to a school or employer',
176+
tone: 'warn',
177+
blocks: true,
178+
note: 'Probably not for you. BlueBubbles needs Full Disk Access and, for the extra features, a helper installed into Messages. Managed Macs usually block both — and doing it anyway may well breach the device policy you agreed to. Use a personal Mac instead.',
179+
},
180+
],
181+
},
182+
{
183+
id: 'client',
184+
question: "Where do you want to read your messages?",
185+
help: 'This is the whole point, so it is worth being clear about it.',
186+
choices: [
187+
{ id: 'android', label: 'Android', tone: 'good' },
188+
{ id: 'desktop', label: 'Windows or Linux', tone: 'good' },
189+
{ id: 'web', label: 'In a browser', tone: 'good' },
190+
{
191+
id: 'apple',
192+
label: 'Only on an iPhone or iPad',
193+
reason: 'you only read messages on Apple devices',
194+
tone: 'warn',
195+
blocks: true,
196+
note: 'You already have iMessage on those. BlueBubbles exists to get iMessage onto things Apple does not cover, so there is not much here for you.',
197+
},
198+
],
199+
},
200+
{
201+
id: 'sms',
202+
question: 'Do you want green-bubble SMS and RCS as well?',
203+
help: 'BlueBubbles carries these too, but they reach your Mac by way of an iPhone, so a phone number is involved.',
204+
choices: [
205+
{ id: 'no', label: 'No, iMessage is all I need', tone: 'good' },
206+
{
207+
id: 'iphone',
208+
label: 'Yes, and I have an iPhone with a SIM in it',
209+
tone: 'good',
210+
note: 'With the iPhone and the Mac signed in to the same Apple ID, texts forward to the Mac on their own. If they do not show up, check Text Message Forwarding under Settings then Messages on the iPhone. Once they land in Messages, BlueBubbles picks them up alongside iMessage.',
211+
},
212+
{
213+
id: 'no-iphone',
214+
label: 'Yes, but I have no iPhone with a number',
215+
reason: 'SMS and RCS need an iPhone with a phone number',
216+
tone: 'warn',
217+
note: 'SMS and RCS arrive by Text Message Forwarding from an iPhone, so a phone number is required. The usual workaround is a cheap prepaid SIM in an old iPhone, kept on the same Apple ID purely to relay texts. Without one you still get iMessage -- just not the green bubbles.',
218+
},
219+
],
220+
},
221+
{
222+
id: 'setup',
223+
question: 'How do you feel about a bit of setup?',
224+
help: 'Installing a server app, granting permissions, connecting a Google account for notifications. Roughly twenty minutes.',
225+
choices: [
226+
{ id: 'fine', label: 'Happy to tinker', tone: 'good' },
227+
{ id: 'guided', label: "I'll manage if there are instructions", tone: 'good', note: 'The install guide walks through every step, with screenshots.' },
228+
{
229+
id: 'none',
230+
label: 'I want it to just work with no configuration',
231+
reason: 'you would rather not configure anything',
232+
tone: 'warn',
233+
note: 'This is self-hosted software: you run the server yourself, so there is some assembly. Nothing hard, but it is not nothing.',
234+
},
235+
],
236+
},
237+
] as const;
238+
239+
export interface Verdict {
240+
id: 'yes' | 'maybe' | 'no';
241+
title: string;
242+
blurb: string;
243+
}
244+
245+
export const VERDICTS: Record<Verdict['id'], Verdict> = {
246+
yes: {
247+
id: 'yes',
248+
title: 'Yes — this is built for you',
249+
blurb: 'You have what BlueBubbles needs, and none of the usual blockers. Install the server on your Mac, then the app wherever you want to read your messages.',
250+
},
251+
maybe: {
252+
id: 'maybe',
253+
title: 'Yes, with a couple of caveats',
254+
blurb: 'BlueBubbles will work for you.',
255+
},
256+
no: {
257+
id: 'no',
258+
title: 'Honestly? Probably not',
259+
blurb: 'We would rather tell you now than after an hour of setup.',
260+
},
261+
};

src/data/site.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ export const FOOTER_LINKS: readonly NavItem[] = [
5454
{ href: '/', label: 'Home' },
5555
{ href: '/downloads/', label: 'Downloads' },
5656
{ href: '/install/', label: 'Install' },
57+
{ href: '/is-it-for-me/', label: 'Is it for me?' },
5758
{ href: '/faq/', label: 'FAQ' },
5859
{ href: LINKS.webApp, label: 'Web App', external: true },
5960
{ href: '/donate/', label: 'Donate' },

src/pages/index.astro

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,13 @@ import devices from '@assets/devices.png';
6767
</a>
6868
</div>
6969

70+
<p class="mt-5 text-sm text-muted">
71+
Not sure it suits your setup? <a
72+
href="/is-it-for-me/"
73+
class="font-medium text-accent underline underline-offset-4">Answer a few questions</a
74+
> and we'll tell you straight.
75+
</p>
76+
7077
<ul class="mx-auto mt-10 grid max-w-md grid-cols-1 gap-3 sm:grid-cols-2 lg:mx-0">
7178
{STORES.map((store) => <li><StoreButton {...store} /></li>)}
7279
</ul>

0 commit comments

Comments
 (0)