forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
1// @ts-check
2const pkg = require('./package.json')
3
4/**
5 * @param {import('@expo/config-types').ExpoConfig} _config
6 * @returns {{ expo: import('@expo/config-types').ExpoConfig }}
7 */
8module.exports = function (_config) {
9 /**
10 * App version number. Should be incremented as part of a release cycle.
11 */
12 const VERSION = pkg.version
13
14 /**
15 * Uses built-in Expo env vars
16 *
17 * @see https://docs.expo.dev/build-reference/variables/#built-in-environment-variables
18 */
19 const PLATFORM = process.env.EAS_BUILD_PLATFORM ?? 'web'
20
21 const IS_TESTFLIGHT = process.env.EXPO_PUBLIC_ENV === 'testflight'
22 const IS_PRODUCTION = process.env.EXPO_PUBLIC_ENV === 'production'
23 const IS_DEV = !IS_TESTFLIGHT && !IS_PRODUCTION
24
25 const ASSOCIATED_DOMAINS = [
26 'applinks:witchsky.app',
27 'applinks:bsky.app',
28 // When testing local services, enter an ngrok (et al) domain here. It must use a standard HTTP/HTTPS port.
29 ...(IS_DEV || IS_TESTFLIGHT ? [] : []),
30 ]
31
32 // const UPDATES_CHANNEL = IS_TESTFLIGHT
33 // ? 'testflight'
34 // : IS_PRODUCTION
35 // ? 'production'
36 // : undefined
37 // const UPDATES_ENABLED = !!UPDATES_CHANNEL
38 const UPDATES_ENABLED = IS_TESTFLIGHT || IS_PRODUCTION
39
40 const USE_SENTRY = Boolean(process.env.SENTRY_AUTH_TOKEN)
41
42 const IOS_ICON_FILE =
43 PLATFORM === 'web' // web build doesn't like .icon files
44 ? './assets/app-icons/ios_icon_legacy_light.png'
45 : IS_TESTFLIGHT
46 ? './assets/app-icons/ios_icon_testflight.icon'
47 : './assets/app-icons/ios_icon_default.icon'
48
49 return {
50 expo: {
51 version: VERSION,
52 name: 'Witchsky',
53 slug: 'witchsky',
54 scheme: ['bluesky', 'witchsky'],
55 // owner: 'blueskysocial',
56 // owner: 'neema.brown',
57 runtimeVersion: {
58 policy: 'appVersion',
59 },
60 icon: './assets/app-icons/ios_icon_legacy_light.png',
61 userInterfaceStyle: 'automatic',
62 primaryColor: '#ED5345',
63 newArchEnabled: false,
64 ios: {
65 supportsTablet: false,
66 bundleIdentifier: 'app.witchsky',
67 config: {
68 usesNonExemptEncryption: false,
69 },
70 icon: IOS_ICON_FILE,
71 infoPlist: {
72 CADisableMinimumFrameDurationOnPhone: true,
73 UIBackgroundModes: ['remote-notification'],
74 NSCameraUsageDescription:
75 'Used for profile pictures, posts, and other kinds of content.',
76 NSMicrophoneUsageDescription:
77 'Used for posts and other kinds of content.',
78 NSPhotoLibraryAddUsageDescription:
79 'Used to save images to your library.',
80 NSPhotoLibraryUsageDescription:
81 'Used for profile pictures, posts, and other kinds of content',
82 CFBundleSpokenName: 'witchsky.app',
83 CFBundleLocalizations: [
84 'en',
85 'an',
86 'ast',
87 'ca',
88 'cy',
89 'da',
90 'de',
91 'el',
92 'eo',
93 'es',
94 'eu',
95 'fi',
96 'fr',
97 'fy',
98 'ga',
99 'gd',
100 'gl',
101 'hi',
102 'hu',
103 'ia',
104 'id',
105 'it',
106 'ja',
107 'km',
108 'ko',
109 'ne',
110 'nl',
111 'pl',
112 'pt-BR',
113 'pt-PT',
114 'ro',
115 'ru',
116 'sv',
117 'th',
118 'tr',
119 'uk',
120 'vi',
121 'yue',
122 'zh-Hans',
123 'zh-Hant',
124 ],
125 },
126 associatedDomains: ASSOCIATED_DOMAINS,
127 entitlements: {
128 'com.apple.developer.kernel.increased-memory-limit': true,
129 'com.apple.developer.kernel.extended-virtual-addressing': true,
130 'com.apple.security.application-groups': 'group.app.witchsky',
131 // 'com.apple.developer.device-information.user-assigned-device-name': true,
132 },
133 privacyManifests: {
134 NSPrivacyCollectedDataTypes: [
135 {
136 NSPrivacyCollectedDataType: 'NSPrivacyCollectedDataTypeCrashData',
137 NSPrivacyCollectedDataTypeLinked: false,
138 NSPrivacyCollectedDataTypeTracking: false,
139 NSPrivacyCollectedDataTypePurposes: [
140 'NSPrivacyCollectedDataTypePurposeAppFunctionality',
141 ],
142 },
143 {
144 NSPrivacyCollectedDataType:
145 'NSPrivacyCollectedDataTypePerformanceData',
146 NSPrivacyCollectedDataTypeLinked: false,
147 NSPrivacyCollectedDataTypeTracking: false,
148 NSPrivacyCollectedDataTypePurposes: [
149 'NSPrivacyCollectedDataTypePurposeAppFunctionality',
150 ],
151 },
152 {
153 NSPrivacyCollectedDataType:
154 'NSPrivacyCollectedDataTypeOtherDiagnosticData',
155 NSPrivacyCollectedDataTypeLinked: false,
156 NSPrivacyCollectedDataTypeTracking: false,
157 NSPrivacyCollectedDataTypePurposes: [
158 'NSPrivacyCollectedDataTypePurposeAppFunctionality',
159 ],
160 },
161 ],
162 NSPrivacyAccessedAPITypes: [
163 {
164 NSPrivacyAccessedAPIType:
165 'NSPrivacyAccessedAPICategoryFileTimestamp',
166 NSPrivacyAccessedAPITypeReasons: ['C617.1', '3B52.1', '0A2A.1'],
167 },
168 {
169 NSPrivacyAccessedAPIType: 'NSPrivacyAccessedAPICategoryDiskSpace',
170 NSPrivacyAccessedAPITypeReasons: ['E174.1', '85F4.1'],
171 },
172 {
173 NSPrivacyAccessedAPIType:
174 'NSPrivacyAccessedAPICategorySystemBootTime',
175 NSPrivacyAccessedAPITypeReasons: ['35F9.1'],
176 },
177 {
178 NSPrivacyAccessedAPIType:
179 'NSPrivacyAccessedAPICategoryUserDefaults',
180 NSPrivacyAccessedAPITypeReasons: ['CA92.1', '1C8F.1'],
181 },
182 ],
183 },
184 },
185 androidStatusBar: {
186 barStyle: 'light-content',
187 },
188 // Dark nav bar in light mode is better than light nav bar in dark mode
189 androidNavigationBar: {
190 barStyle: 'light-content',
191 },
192 android: {
193 icon: './assets/app-icons/android_icon_legacy_light.png',
194 adaptiveIcon: {
195 foregroundImage: './assets/icon-android-foreground.png',
196 monochromeImage: './assets/icon-android-monochrome.png',
197 backgroundColor: '#ED5345',
198 },
199 googleServicesFile: './google-services.json',
200 package: 'app.witchsky',
201 intentFilters: [
202 {
203 action: 'VIEW',
204 autoVerify: true,
205 data: [
206 {
207 scheme: 'https',
208 host: 'witchsky.app',
209 },
210 {
211 scheme: 'https',
212 host: 'deer.social',
213 },
214 {
215 scheme: 'https',
216 host: 'bsky.app',
217 },
218 ...(IS_DEV
219 ? [
220 {
221 scheme: 'http',
222 host: 'localhost:19006',
223 },
224 ]
225 : []),
226 ],
227 category: ['BROWSABLE', 'DEFAULT'],
228 },
229 ],
230 },
231 web: {
232 favicon: './assets/favicon.png',
233 },
234 // updates: {
235 // url: 'https://updates.bsky.app/manifest',
236 // enabled: UPDATES_ENABLED,
237 // fallbackToCacheTimeout: 30000,
238 // codeSigningCertificate: UPDATES_ENABLED
239 // ? './code-signing/certificate.pem'
240 // : undefined,
241 // codeSigningMetadata: UPDATES_ENABLED
242 // ? {
243 // keyid: 'main',
244 // alg: 'rsa-v1_5-sha256',
245 // }
246 // : undefined,
247 // checkAutomatically: 'NEVER',
248 // channel: UPDATES_CHANNEL,
249 // },
250 updates: {
251 url: 'https://updates.bsky.app/manifest',
252 enabled: UPDATES_ENABLED,
253 fallbackToCacheTimeout: 30000,
254 codeSigningCertificate: UPDATES_ENABLED
255 ? './code-signing/certificate.pem'
256 : undefined,
257 codeSigningMetadata: UPDATES_ENABLED
258 ? {
259 keyid: 'main',
260 alg: 'rsa-v1_5-sha256',
261 }
262 : undefined,
263 checkAutomatically: 'NEVER',
264 },
265 plugins: [
266 'expo-video',
267 'expo-localization',
268 'expo-web-browser',
269 [
270 'react-native-edge-to-edge',
271 {android: {enforceNavigationBarContrast: false}},
272 ],
273 ...(USE_SENTRY
274 ? [
275 /** @type {[string, any]} */ ([
276 '@sentry/react-native/expo',
277 {
278 organization: 'blueskyweb',
279 project: 'app',
280 url: 'https://sentry.io',
281 },
282 ]),
283 ]
284 : []),
285 [
286 'expo-build-properties',
287 {
288 ios: {
289 deploymentTarget: '15.1',
290 buildReactNativeFromSource: true,
291 ccacheEnabled: IS_DEV,
292 extraPods: [
293 {
294 name: 'MCEmojiPicker',
295 git: 'https://github.com/bluesky-social/MCEmojiPicker.git',
296 branch: 'main',
297 },
298 ],
299 },
300 android: {
301 compileSdkVersion: 36,
302 targetSdkVersion: 35,
303 buildToolsVersion: '35.0.0',
304 buildReactNativeFromSource: IS_PRODUCTION,
305 },
306 },
307 ],
308 [
309 'expo-notifications',
310 {
311 icon: './assets/icon-android-notification.png',
312 color: '#ED5345',
313 sounds: PLATFORM === 'ios' ? ['assets/dm.aiff'] : ['assets/dm.mp3'],
314 },
315 ],
316 'react-native-compressor',
317 [
318 '@bitdrift/react-native',
319 {
320 networkInstrumentation: true,
321 },
322 ],
323 './plugins/starterPackAppClipExtension/withStarterPackAppClip.js',
324 './plugins/withGradleJVMHeapSizeIncrease.js',
325 './plugins/withAndroidManifestLargeHeapPlugin.js',
326 './plugins/withAndroidManifestFCMIconPlugin.js',
327 './plugins/withAndroidManifestIntentQueriesPlugin.js',
328 './plugins/withAndroidStylesAccentColorPlugin.js',
329 './plugins/withAndroidNoJitpackPlugin.js',
330 './plugins/shareExtension/withShareExtensions.js',
331 './plugins/notificationsExtension/withNotificationsExtension.js',
332 [
333 'expo-font',
334 {
335 fonts: [
336 './assets/fonts/inter/InterVariable.woff2',
337 './assets/fonts/inter/InterVariable-Italic.woff2',
338 // Android only
339 './assets/fonts/inter/Inter-Regular.otf',
340 './assets/fonts/inter/Inter-Italic.otf',
341 './assets/fonts/inter/Inter-Medium.otf',
342 './assets/fonts/inter/Inter-MediumItalic.otf',
343 './assets/fonts/inter/Inter-SemiBold.otf',
344 './assets/fonts/inter/Inter-SemiBoldItalic.otf',
345 './assets/fonts/inter/Inter-Bold.otf',
346 './assets/fonts/inter/Inter-BoldItalic.otf',
347 ],
348 },
349 ],
350 [
351 'expo-splash-screen',
352 {
353 ios: {
354 enableFullScreenImage_legacy: true, // iOS only
355 backgroundColor: '#006AFF', // primary_500
356 image: './assets/splash/splash.png',
357 resizeMode: 'cover',
358 dark: {
359 enableFullScreenImage_legacy: true, // iOS only
360 backgroundColor: '#262220', // primary_900
361 image: './assets/splash/splash-dark.png',
362 resizeMode: 'cover',
363 },
364 },
365 android: {
366 backgroundColor: '#E25C50', // primary_500
367 image: './assets/splash/android-splash-logo-white.png',
368 imageWidth: 102, // even division of 306px
369 dark: {
370 backgroundColor: '#ED5345', // primary_900
371 image: './assets/splash/android-splash-logo-white.png',
372 imageWidth: 102,
373 },
374 },
375 },
376 ],
377 [
378 '@mozzius/expo-dynamic-app-icon',
379 {
380 /**
381 * Default set
382 */
383 default_light: {
384 ios: './assets/app-icons/ios_icon_legacy_light.png',
385 android: './assets/app-icons/android_icon_legacy_light.png',
386 prerendered: true,
387 },
388 default_dark: {
389 ios: './assets/app-icons/ios_icon_legacy_dark.png',
390 android: './assets/app-icons/android_icon_legacy_dark.png',
391 prerendered: true,
392 },
393
394 /**
395 * Bluesky+ core set
396 */
397 // core_aurora: {
398 // ios: './assets/app-icons/ios_icon_core_aurora.png',
399 // android: './assets/app-icons/android_icon_core_aurora.png',
400 // prerendered: true,
401 // },
402 // core_bonfire: {
403 // ios: './assets/app-icons/ios_icon_core_bonfire.png',
404 // android: './assets/app-icons/android_icon_core_bonfire.png',
405 // prerendered: true,
406 // },
407 // core_sunrise: {
408 // ios: './assets/app-icons/ios_icon_core_sunrise.png',
409 // android: './assets/app-icons/android_icon_core_sunrise.png',
410 // prerendered: true,
411 // },
412 // core_sunset: {
413 // ios: './assets/app-icons/ios_icon_core_sunset.png',
414 // android: './assets/app-icons/android_icon_core_sunset.png',
415 // prerendered: true,
416 // },
417 // core_midnight: {
418 // ios: './assets/app-icons/ios_icon_core_midnight.png',
419 // android: './assets/app-icons/android_icon_core_midnight.png',
420 // prerendered: true,
421 // },
422 // core_flat_blue: {
423 // ios: './assets/app-icons/ios_icon_core_flat_blue.png',
424 // android: './assets/app-icons/android_icon_core_flat_blue.png',
425 // prerendered: true,
426 // },
427 // core_flat_white: {
428 // ios: './assets/app-icons/ios_icon_core_flat_white.png',
429 // android: './assets/app-icons/android_icon_core_flat_white.png',
430 // prerendered: true,
431 // },
432 // core_flat_black: {
433 // ios: './assets/app-icons/ios_icon_core_flat_black.png',
434 // android: './assets/app-icons/android_icon_core_flat_black.png',
435 // prerendered: true,
436 // },
437 // core_classic: {
438 // ios: './assets/app-icons/ios_icon_core_classic.png',
439 // android: './assets/app-icons/android_icon_core_classic.png',
440 // prerendered: true,
441 // },
442 },
443 ],
444 ['expo-screen-orientation', {initialOrientation: 'PORTRAIT_UP'}],
445 ['expo-location'],
446 [
447 'expo-contacts',
448 {
449 contactsPermission:
450 'I agree to allow Bluesky to use my contacts for friend discovery until I opt out.',
451 },
452 ],
453 ],
454 extra: {
455 eas: {
456 build: {
457 experimental: {
458 ios: {
459 // appExtensions: [
460 // {
461 // targetName: 'Share-with-Bluesky',
462 // bundleIdentifier: 'app.witchsky.Share-with-Bluesky',
463 // entitlements: {
464 // 'com.apple.security.application-groups': [
465 // 'group.app.witchsky',
466 // ],
467 // },
468 // },
469 // {
470 // targetName: 'BlueskyNSE',
471 // bundleIdentifier: 'app.witchsky.BlueskyNSE',
472 // entitlements: {
473 // 'com.apple.security.application-groups': [
474 // 'group.app.witchsky',
475 // ],
476 // },
477 // },
478 // {
479 // targetName: 'BlueskyClip',
480 // bundleIdentifier: 'app.witchsky.AppClip',
481 // },
482 // ],
483 },
484 },
485 },
486 projectId: 'da056e41-38f9-4fee-a534-b9c5891f9c8d',
487 },
488 },
489 },
490 }
491}