Bluesky app fork with some witchin' additions 馃挮 witchsky.app
bluesky fork client
117
fork

Configure Feed

Select the types of activity you want to include in your feed.

at b87d29a13dfe94e6f4963e548589fb2c2ff4782f 547 lines 21 kB view raw
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', 'app.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: process.env.WITCHSKY_BUNDLE_ID || 'app.witchsky', 67 appleTeamId: process.env.WITCHSKY_APPLE_TEAM_ID || 'B3LX46C5HS', 68 config: { 69 usesNonExemptEncryption: false, 70 }, 71 icon: IOS_ICON_FILE, 72 infoPlist: { 73 CADisableMinimumFrameDurationOnPhone: true, 74 UIBackgroundModes: ['remote-notification'], 75 NSCameraUsageDescription: 76 'Used for profile pictures, posts, and other kinds of content.', 77 NSMicrophoneUsageDescription: 78 'Used for posts and other kinds of content.', 79 NSPhotoLibraryAddUsageDescription: 80 'Used to save images to your library.', 81 NSPhotoLibraryUsageDescription: 82 'Used for profile pictures, posts, and other kinds of content', 83 CFBundleSpokenName: 'witchsky.app', 84 CFBundleLocalizations: [ 85 'en', 86 'an', 87 'ast', 88 'ca', 89 'cy', 90 'da', 91 'de', 92 'el', 93 'eo', 94 'es', 95 'eu', 96 'fi', 97 'fr', 98 'fy', 99 'ga', 100 'gd', 101 'gl', 102 'hi', 103 'hu', 104 'ia', 105 'id', 106 'it', 107 'ja', 108 'km', 109 'ko', 110 'ne', 111 'nl', 112 'pl', 113 'pt-BR', 114 'pt-PT', 115 'ro', 116 'ru', 117 'sv', 118 'th', 119 'tr', 120 'uk', 121 'vi', 122 'yue', 123 'zh-Hans', 124 'zh-Hant', 125 ], 126 }, 127 associatedDomains: ASSOCIATED_DOMAINS, 128 entitlements: { 129 'com.apple.developer.kernel.increased-memory-limit': true, 130 'com.apple.developer.kernel.extended-virtual-addressing': true, 131 'com.apple.security.application-groups': process.env 132 .WITCHSKY_BUNDLE_ID 133 ? `group.${process.env.WITCHSKY_BUNDLE_ID}` 134 : 'group.app.witchsky', 135 // 'com.apple.developer.device-information.user-assigned-device-name': true, 136 }, 137 privacyManifests: { 138 NSPrivacyCollectedDataTypes: [ 139 { 140 NSPrivacyCollectedDataType: 'NSPrivacyCollectedDataTypeCrashData', 141 NSPrivacyCollectedDataTypeLinked: false, 142 NSPrivacyCollectedDataTypeTracking: false, 143 NSPrivacyCollectedDataTypePurposes: [ 144 'NSPrivacyCollectedDataTypePurposeAppFunctionality', 145 ], 146 }, 147 { 148 NSPrivacyCollectedDataType: 149 'NSPrivacyCollectedDataTypePerformanceData', 150 NSPrivacyCollectedDataTypeLinked: false, 151 NSPrivacyCollectedDataTypeTracking: false, 152 NSPrivacyCollectedDataTypePurposes: [ 153 'NSPrivacyCollectedDataTypePurposeAppFunctionality', 154 ], 155 }, 156 { 157 NSPrivacyCollectedDataType: 158 'NSPrivacyCollectedDataTypeOtherDiagnosticData', 159 NSPrivacyCollectedDataTypeLinked: false, 160 NSPrivacyCollectedDataTypeTracking: false, 161 NSPrivacyCollectedDataTypePurposes: [ 162 'NSPrivacyCollectedDataTypePurposeAppFunctionality', 163 ], 164 }, 165 ], 166 NSPrivacyAccessedAPITypes: [ 167 { 168 NSPrivacyAccessedAPIType: 169 'NSPrivacyAccessedAPICategoryFileTimestamp', 170 NSPrivacyAccessedAPITypeReasons: ['C617.1', '3B52.1', '0A2A.1'], 171 }, 172 { 173 NSPrivacyAccessedAPIType: 'NSPrivacyAccessedAPICategoryDiskSpace', 174 NSPrivacyAccessedAPITypeReasons: ['E174.1', '85F4.1'], 175 }, 176 { 177 NSPrivacyAccessedAPIType: 178 'NSPrivacyAccessedAPICategorySystemBootTime', 179 NSPrivacyAccessedAPITypeReasons: ['35F9.1'], 180 }, 181 { 182 NSPrivacyAccessedAPIType: 183 'NSPrivacyAccessedAPICategoryUserDefaults', 184 NSPrivacyAccessedAPITypeReasons: ['CA92.1', '1C8F.1'], 185 }, 186 ], 187 }, 188 }, 189 androidStatusBar: { 190 barStyle: 'light-content', 191 }, 192 // Dark nav bar in light mode is better than light nav bar in dark mode 193 androidNavigationBar: { 194 barStyle: 'light-content', 195 }, 196 android: { 197 icon: './assets/app-icons/android_icon_legacy_light.png', 198 adaptiveIcon: { 199 foregroundImage: './assets/icon-android-foreground.png', 200 monochromeImage: './assets/icon-android-monochrome.png', 201 backgroundColor: '#ED5345', 202 }, 203 googleServicesFile: './google-services.json', 204 package: process.env.WITCHSKY_BUNDLE_ID || 'app.witchsky', 205 intentFilters: [ 206 { 207 action: 'VIEW', 208 autoVerify: true, 209 data: [ 210 { 211 scheme: 'https', 212 host: 'witchsky.app', 213 }, 214 { 215 scheme: 'https', 216 host: 'deer.social', 217 }, 218 { 219 scheme: 'https', 220 host: 'bsky.app', 221 }, 222 ...(IS_DEV 223 ? [ 224 { 225 scheme: 'http', 226 host: 'localhost:19006', 227 }, 228 ] 229 : []), 230 ], 231 category: ['BROWSABLE', 'DEFAULT'], 232 }, 233 ], 234 }, 235 web: { 236 favicon: './assets/favicon.png', 237 }, 238 // updates: { 239 // url: 'https://updates.bsky.app/manifest', 240 // enabled: UPDATES_ENABLED, 241 // fallbackToCacheTimeout: 30000, 242 // codeSigningCertificate: UPDATES_ENABLED 243 // ? './code-signing/certificate.pem' 244 // : undefined, 245 // codeSigningMetadata: UPDATES_ENABLED 246 // ? { 247 // keyid: 'main', 248 // alg: 'rsa-v1_5-sha256', 249 // } 250 // : undefined, 251 // checkAutomatically: 'NEVER', 252 // channel: UPDATES_CHANNEL, 253 // }, 254 updates: { 255 url: 'https://updates.bsky.app/manifest', 256 enabled: UPDATES_ENABLED, 257 fallbackToCacheTimeout: 30000, 258 codeSigningCertificate: UPDATES_ENABLED 259 ? './code-signing/certificate.pem' 260 : undefined, 261 codeSigningMetadata: UPDATES_ENABLED 262 ? { 263 keyid: 'main', 264 alg: 'rsa-v1_5-sha256', 265 } 266 : undefined, 267 checkAutomatically: 'NEVER', 268 }, 269 plugins: [ 270 'expo-video', 271 'expo-localization', 272 'expo-web-browser', 273 [ 274 'react-native-edge-to-edge', 275 {android: {enforceNavigationBarContrast: false}}, 276 ], 277 ...(USE_SENTRY 278 ? [ 279 /** @type {[string, any]} */ ([ 280 '@sentry/react-native/expo', 281 { 282 organization: 'blueskyweb', 283 project: 'app', 284 url: 'https://sentry.io', 285 }, 286 ]), 287 ] 288 : []), 289 [ 290 'expo-build-properties', 291 { 292 ios: { 293 deploymentTarget: '15.1', 294 buildReactNativeFromSource: true, 295 ccacheEnabled: IS_DEV, 296 extraPods: [ 297 { 298 name: 'MCEmojiPicker', 299 git: 'https://github.com/bluesky-social/MCEmojiPicker.git', 300 branch: 'main', 301 }, 302 ], 303 }, 304 android: { 305 compileSdkVersion: 36, 306 targetSdkVersion: 35, 307 buildToolsVersion: '35.0.0', 308 buildReactNativeFromSource: IS_PRODUCTION, 309 }, 310 }, 311 ], 312 [ 313 'expo-notifications', 314 { 315 icon: './assets/icon-android-notification.png', 316 color: '#ED5345', 317 sounds: PLATFORM === 'ios' ? ['assets/dm.aiff'] : ['assets/dm.mp3'], 318 }, 319 ], 320 'react-native-compressor', 321 [ 322 '@bitdrift/react-native', 323 { 324 networkInstrumentation: true, 325 }, 326 ], 327 './plugins/starterPackAppClipExtension/withStarterPackAppClip.js', 328 './plugins/withGradleJVMHeapSizeIncrease.js', 329 './plugins/withAndroidManifestLargeHeapPlugin.js', 330 './plugins/withAndroidManifestFCMIconPlugin.js', 331 './plugins/withAndroidManifestIntentQueriesPlugin.js', 332 './plugins/withAndroidStylesAccentColorPlugin.js', 333 './plugins/withAndroidNoJitpackPlugin.js', 334 './plugins/shareExtension/withShareExtensions.js', 335 './plugins/notificationsExtension/withNotificationsExtension.js', 336 [ 337 'expo-font', 338 { 339 fonts: [ 340 './assets/fonts/inter/InterVariable.woff2', 341 './assets/fonts/inter/InterVariable-Italic.woff2', 342 './assets/fonts/google-sans-flex/GoogleSansFlex-Regular.ttf', 343 // Android only 344 './assets/fonts/inter/Inter-Regular.otf', 345 './assets/fonts/inter/Inter-Italic.otf', 346 './assets/fonts/inter/Inter-Medium.otf', 347 './assets/fonts/inter/Inter-MediumItalic.otf', 348 './assets/fonts/inter/Inter-SemiBold.otf', 349 './assets/fonts/inter/Inter-SemiBoldItalic.otf', 350 './assets/fonts/inter/Inter-Bold.otf', 351 './assets/fonts/inter/Inter-BoldItalic.otf', 352 // Google Sans Flex - Android only 353 // 9pt optical size 354 './assets/fonts/google-sans-flex/GoogleSansFlex_9pt-Thin.ttf', 355 './assets/fonts/google-sans-flex/GoogleSansFlex_9pt-ExtraLight.ttf', 356 './assets/fonts/google-sans-flex/GoogleSansFlex_9pt-Light.ttf', 357 './assets/fonts/google-sans-flex/GoogleSansFlex_9pt-Regular.ttf', 358 './assets/fonts/google-sans-flex/GoogleSansFlex_9pt-Medium.ttf', 359 './assets/fonts/google-sans-flex/GoogleSansFlex_9pt-SemiBold.ttf', 360 './assets/fonts/google-sans-flex/GoogleSansFlex_9pt-Bold.ttf', 361 './assets/fonts/google-sans-flex/GoogleSansFlex_9pt-ExtraBold.ttf', 362 './assets/fonts/google-sans-flex/GoogleSansFlex_9pt-Black.ttf', 363 // 24pt optical size (default) 364 './assets/fonts/google-sans-flex/GoogleSansFlex_24pt-Thin.ttf', 365 './assets/fonts/google-sans-flex/GoogleSansFlex_24pt-ExtraLight.ttf', 366 './assets/fonts/google-sans-flex/GoogleSansFlex_24pt-Light.ttf', 367 './assets/fonts/google-sans-flex/GoogleSansFlex_24pt-Regular.ttf', 368 './assets/fonts/google-sans-flex/GoogleSansFlex_24pt-Medium.ttf', 369 './assets/fonts/google-sans-flex/GoogleSansFlex_24pt-SemiBold.ttf', 370 './assets/fonts/google-sans-flex/GoogleSansFlex_24pt-Bold.ttf', 371 './assets/fonts/google-sans-flex/GoogleSansFlex_24pt-ExtraBold.ttf', 372 './assets/fonts/google-sans-flex/GoogleSansFlex_24pt-Black.ttf', 373 // 36pt optical size 374 './assets/fonts/google-sans-flex/GoogleSansFlex_36pt-Thin.ttf', 375 './assets/fonts/google-sans-flex/GoogleSansFlex_36pt-ExtraLight.ttf', 376 './assets/fonts/google-sans-flex/GoogleSansFlex_36pt-Light.ttf', 377 './assets/fonts/google-sans-flex/GoogleSansFlex_36pt-Regular.ttf', 378 './assets/fonts/google-sans-flex/GoogleSansFlex_36pt-Medium.ttf', 379 './assets/fonts/google-sans-flex/GoogleSansFlex_36pt-SemiBold.ttf', 380 './assets/fonts/google-sans-flex/GoogleSansFlex_36pt-Bold.ttf', 381 './assets/fonts/google-sans-flex/GoogleSansFlex_36pt-ExtraBold.ttf', 382 './assets/fonts/google-sans-flex/GoogleSansFlex_36pt-Black.ttf', 383 // 72pt optical size 384 './assets/fonts/google-sans-flex/GoogleSansFlex_72pt-Thin.ttf', 385 './assets/fonts/google-sans-flex/GoogleSansFlex_72pt-ExtraLight.ttf', 386 './assets/fonts/google-sans-flex/GoogleSansFlex_72pt-Light.ttf', 387 './assets/fonts/google-sans-flex/GoogleSansFlex_72pt-Regular.ttf', 388 './assets/fonts/google-sans-flex/GoogleSansFlex_72pt-Medium.ttf', 389 './assets/fonts/google-sans-flex/GoogleSansFlex_72pt-SemiBold.ttf', 390 './assets/fonts/google-sans-flex/GoogleSansFlex_72pt-Bold.ttf', 391 './assets/fonts/google-sans-flex/GoogleSansFlex_72pt-ExtraBold.ttf', 392 './assets/fonts/google-sans-flex/GoogleSansFlex_72pt-Black.ttf', 393 // 120pt optical size 394 './assets/fonts/google-sans-flex/GoogleSansFlex_120pt-Thin.ttf', 395 './assets/fonts/google-sans-flex/GoogleSansFlex_120pt-ExtraLight.ttf', 396 './assets/fonts/google-sans-flex/GoogleSansFlex_120pt-Light.ttf', 397 './assets/fonts/google-sans-flex/GoogleSansFlex_120pt-Regular.ttf', 398 './assets/fonts/google-sans-flex/GoogleSansFlex_120pt-Medium.ttf', 399 './assets/fonts/google-sans-flex/GoogleSansFlex_120pt-SemiBold.ttf', 400 './assets/fonts/google-sans-flex/GoogleSansFlex_120pt-Bold.ttf', 401 './assets/fonts/google-sans-flex/GoogleSansFlex_120pt-ExtraBold.ttf', 402 './assets/fonts/google-sans-flex/GoogleSansFlex_120pt-Black.ttf', 403 ], 404 }, 405 ], 406 [ 407 'expo-splash-screen', 408 { 409 ios: { 410 enableFullScreenImage_legacy: true, // iOS only 411 backgroundColor: '#006AFF', // primary_500 412 image: './assets/splash/splash.png', 413 resizeMode: 'cover', 414 dark: { 415 enableFullScreenImage_legacy: true, // iOS only 416 backgroundColor: '#262220', // primary_900 417 image: './assets/splash/splash-dark.png', 418 resizeMode: 'cover', 419 }, 420 }, 421 android: { 422 backgroundColor: '#E25C50', // primary_500 423 image: './assets/splash/android-splash-logo-white.png', 424 imageWidth: 102, // even division of 306px 425 dark: { 426 backgroundColor: '#ED5345', // primary_900 427 image: './assets/splash/android-splash-logo-white.png', 428 imageWidth: 102, 429 }, 430 }, 431 }, 432 ], 433 [ 434 '@mozzius/expo-dynamic-app-icon', 435 { 436 /** 437 * Default set 438 */ 439 default_light: { 440 ios: './assets/app-icons/ios_icon_legacy_light.png', 441 android: './assets/app-icons/android_icon_legacy_light.png', 442 prerendered: true, 443 }, 444 default_dark: { 445 ios: './assets/app-icons/ios_icon_legacy_dark.png', 446 android: './assets/app-icons/android_icon_legacy_dark.png', 447 prerendered: true, 448 }, 449 450 /** 451 * Bluesky+ core set 452 */ 453 // core_aurora: { 454 // ios: './assets/app-icons/ios_icon_core_aurora.png', 455 // android: './assets/app-icons/android_icon_core_aurora.png', 456 // prerendered: true, 457 // }, 458 // core_bonfire: { 459 // ios: './assets/app-icons/ios_icon_core_bonfire.png', 460 // android: './assets/app-icons/android_icon_core_bonfire.png', 461 // prerendered: true, 462 // }, 463 // core_sunrise: { 464 // ios: './assets/app-icons/ios_icon_core_sunrise.png', 465 // android: './assets/app-icons/android_icon_core_sunrise.png', 466 // prerendered: true, 467 // }, 468 // core_sunset: { 469 // ios: './assets/app-icons/ios_icon_core_sunset.png', 470 // android: './assets/app-icons/android_icon_core_sunset.png', 471 // prerendered: true, 472 // }, 473 // core_midnight: { 474 // ios: './assets/app-icons/ios_icon_core_midnight.png', 475 // android: './assets/app-icons/android_icon_core_midnight.png', 476 // prerendered: true, 477 // }, 478 // core_flat_blue: { 479 // ios: './assets/app-icons/ios_icon_core_flat_blue.png', 480 // android: './assets/app-icons/android_icon_core_flat_blue.png', 481 // prerendered: true, 482 // }, 483 // core_flat_white: { 484 // ios: './assets/app-icons/ios_icon_core_flat_white.png', 485 // android: './assets/app-icons/android_icon_core_flat_white.png', 486 // prerendered: true, 487 // }, 488 // core_flat_black: { 489 // ios: './assets/app-icons/ios_icon_core_flat_black.png', 490 // android: './assets/app-icons/android_icon_core_flat_black.png', 491 // prerendered: true, 492 // }, 493 // core_classic: { 494 // ios: './assets/app-icons/ios_icon_core_classic.png', 495 // android: './assets/app-icons/android_icon_core_classic.png', 496 // prerendered: true, 497 // }, 498 }, 499 ], 500 ['expo-screen-orientation', {initialOrientation: 'PORTRAIT_UP'}], 501 ['expo-location'], 502 [ 503 'expo-contacts', 504 { 505 contactsPermission: 506 'I agree to allow Bluesky to use my contacts for friend discovery until I opt out.', 507 }, 508 ], 509 ], 510 extra: { 511 eas: { 512 build: { 513 experimental: { 514 ios: { 515 // appExtensions: [ 516 // { 517 // targetName: 'Share-with-Bluesky', 518 // bundleIdentifier: env.WITCHSKY_BUNDLE_ID ? `${env.WITCHSKY_BUNDLE_ID}.Share-with-Bluesky` : 'app.witchsky.Share-with-Bluesky', 519 // entitlements: { 520 // 'com.apple.security.application-groups': [ 521 // process.env.WITCHSKY_BUNDLE_ID ? `group.${process.env.WITCHSKY_BUNDLE_ID}` : 'group.app.witchsky', 522 // ], 523 // }, 524 // }, 525 // { 526 // targetName: 'BlueskyNSE', 527 // bundleIdentifier: process.env.WITCHSKY_BUNDLE_ID ? `${process.env.WITCHSKY_BUNDLE_ID}.BlueskyNSE` : 'app.witchsky.BlueskyNSE', 528 // entitlements: { 529 // 'com.apple.security.application-groups': [ 530 // process.env.WITCHSKY_BUNDLE_ID ? `group.${process.env.WITCHSKY_BUNDLE_ID}` : 'group.app.witchsky', 531 // ], 532 // }, 533 // }, 534 // { 535 // targetName: 'BlueskyClip', 536 // bundleIdentifier: process.env.WITCHSKY_BUNDLE_ID ? `${process.env.WITCHSKY_BUNDLE_ID}.AppClip` : 'app.witchsky.AppClip', 537 // }, 538 // ], 539 }, 540 }, 541 }, 542 projectId: 'da056e41-38f9-4fee-a534-b9c5891f9c8d', 543 }, 544 }, 545 }, 546 } 547}