Mirror — see github.com/blacksky-algorithms/blacksky.community
6
fork

Configure Feed

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

Update README; Make Blacksky default PDS

+98 -137
+82 -43
README.md
··· 1 - # Bluesky Social App 1 + # blacksky.community 2 + 3 + **blacksky.community** is a community-driven fork of the official Bluesky Social client. 4 + It’s the **primary client for the Blacksky community**, maintained *by and for* our members. 5 + We track upstream releases closely but layer on features and policies that reflect Blacksky’s 6 + values of safety, autonomy, and collective ownership. 7 + 8 + > 🗳 **Have feedback?** Join the open conversation on Polis: <https://pol.is/6vmnfmi5ps> 9 + 10 + --- 11 + 12 + ## Get the app 13 + 14 + | Platform | Link | Status | 15 + |----------|------|--------| 16 + | **Web** | <https://blacksky.community> | ✅ Live | 17 + | **iOS** | *(App Store link forthcoming)* | 🛠 WIP | 18 + | **Android** | *(Play Store link forthcoming)* | 🛠 WIP | 19 + 20 + --- 21 + 22 + ## Features — Today 23 + 24 + Blacksky ships everything you expect from the upstream Bluesky client **plus** community-specific defaults: 25 + 26 + | Area | Additions | 27 + |------|-----------| 28 + | **Safety & Moderation** | • **@blacksky.app** moderation service is the default **and cannot be disabled**, providing strong anti-harassment filtering out-of-the-box | 29 + | **Feed Control** | • **Blacksky: Trending** feed replaces Discover as the landing feed | 30 + | **On-boarding** | • New users sign up on the **Blacksky PDS** and receive `*.blacksky.app` handles | 31 + 32 + ### WIP / Planned 2 33 3 - Welcome friends! This is the codebase for the Bluesky Social app. 34 + - Private, community-only posts, [similar to Hometown](https://github.com/hometown-fork/hometown/wiki/Local-only-posting) 4 35 5 - Get the app itself: 36 + --- 6 37 7 - - **Web: [bsky.app](https://bsky.app)** 8 - - **iOS: [App Store](https://apps.apple.com/us/app/bluesky-social/id6444370199)** 9 - - **Android: [Play Store](https://play.google.com/store/apps/details?id=xyz.blueskyweb.app)** 38 + ## Philosophy 39 + 40 + - **Familiar, but unmistakably Blacksky** – default behaviour mirrors the official client so new 41 + users feel at home, while branding and safety defaults make it clear you’re on Blacksky. 42 + - **Community governance** – major feature decisions and policy changes are discussed on Polis and 43 + implemented transparently. 44 + 45 + --- 10 46 11 47 ## Development Resources 12 48 13 - This is a [React Native](https://reactnative.dev/) application, written in the TypeScript programming language. It builds on the `atproto` TypeScript packages (like [`@atproto/api`](https://www.npmjs.com/package/@atproto/api)), code for which is also open source, but in [a different git repository](https://github.com/bluesky-social/atproto). 49 + This is a **[React Native](https://reactnative.dev/)** project in **TypeScript**. 50 + It depends on the open-source **AT Protocol** packages (e.g. [`@atproto/api`](https://npm.im/@atproto/api)). 51 + A vestigial Go service in `./bskyweb/` can serve a React Native Web build, but we deploy the web 52 + front-end as static files (currently via Cloudflare Pages). 14 53 15 - There is a small amount of Go language source code (in `./bskyweb/`), for a web service that returns the React Native Web application. 54 + See **[docs/build.md](./docs/build.md)** for local setup. Nix users can leverage `flake.nix` for a 55 + one-command dev shell. 16 56 17 - The [Build Instructions](./docs/build.md) are a good place to get started with the app itself. 57 + Helpful AT Protocol links: 18 58 19 - The Authenticated Transfer Protocol ("AT Protocol" or "atproto") is a decentralized social media protocol. You don't *need* to understand AT Protocol to work with this application, but it can help. Learn more at: 59 + - Overview & Guides – <https://atproto.com/guides/overview> 60 + - GitHub Discussions – <https://github.com/bluesky-social/atproto/discussions> 61 + - Protocol Specs – <https://atproto.com/specs/atp> 20 62 21 - - [Overview and Guides](https://atproto.com/guides/overview) 22 - - [Github Discussions](https://github.com/bluesky-social/atproto/discussions) 👈 Great place to ask questions 23 - - [Protocol Specifications](https://atproto.com/specs/atp) 24 - - [Blogpost on self-authenticating data structures](https://bsky.social/about/blog/3-6-2022-a-self-authenticating-social-protocol) 25 - 26 - The Bluesky Social application encompasses a set of schemas and APIs built in the overall AT Protocol framework. The namespace for these "Lexicons" is `app.bsky.*`. 63 + --- 27 64 28 65 ## Contributions 29 66 30 - > While we do accept contributions, we prioritize high quality issues and pull requests. Adhering to the below guidelines will ensure a more timely review. 67 + > We ❤️ thoughtful contributions! Help us keep the diff small and the community safe. 31 68 32 - **Rules:** 69 + **Rules** 33 70 34 - - We may not respond to your issue or PR. 35 - - We may close an issue or PR without much feedback. 36 - - We may lock discussions or contributions if our attention is getting DDOSed. 37 - - We're not going to provide support for build issues. 71 + - We may decline or delay PRs that are too large to maintain. 72 + - We reserve the right to lock heated threads to protect contributors’ time. 38 73 39 - **Guidelines:** 74 + **Guidelines** 40 75 41 - - Check for existing issues before filing a new one please. 42 - - Open an issue and give some time for discussion before submitting a PR. 43 - - Stay away from PRs like... 44 - - Changing "Post" to "Skeet." 45 - - Refactoring the codebase, e.g., to replace React Query with Redux Toolkit or something. 46 - - Adding entirely new features without prior discussion. 76 + 1. **Open an issue first** – give the community time to discuss scope & maintenance. 77 + 2. **Prefer small patches** – anything that touches lots of upstream code is hard to carry. 78 + 3. **Put opinionated changes behind toggles**. 79 + 4. Avoid PRs that… 80 + - Rename common terms (e.g., “Post” → “Skeet”) 81 + - Replace core libraries without strong need (e.g., MobX → Redux) 82 + - Add entirely new features with no prior discussion 47 83 48 - Remember, we serve a wide community of users. Our day-to-day involves us constantly asking "which top priority is our top priority." If you submit well-written PRs that solve problems concisely, that's an awesome contribution. Otherwise, as much as we'd love to accept your ideas and contributions, we really don't have the bandwidth. That's what forking is for! 84 + If your idea isn’t a fit, feel free to **fork** – that’s the beauty of open source! 49 85 50 - ## Forking guidelines 86 + --- 51 87 52 - You have our blessing 🪄✨ to fork this application! However, it's very important to be clear to users when you're giving them a fork. 88 + ## Forking Guidelines 53 89 54 - Please be sure to: 90 + - Re-brand clearly so users don’t confuse your fork with blacksky.community. 91 + - Point analytics / error reporting to **your** endpoints. 92 + - Update support links (feedback, email, terms, etc.) to your own. 55 93 56 - - Change all branding in the repository and UI to clearly differentiate from Bluesky. 57 - - Change any support links (feedback, email, terms of service, etc) to your own systems. 58 - - Replace any analytics or error-collection systems with your own so we don't get super confused. 94 + --- 59 95 60 - ## Security disclosures 96 + ## Security Disclosures 61 97 62 - If you discover any security issues, please send an email to security@bsky.app. The email is automatically CCed to the entire team and we'll respond promptly. 98 + Found a vulnerability? 99 + Email **rudy@blacksky.app** – we will respond 100 + promptly. 63 101 64 - ## Are you a developer interested in building on atproto? 102 + --- 65 103 66 - Bluesky is an open social network built on the AT Protocol, a flexible technology that will never lock developers out of the ecosystems that they help build. With atproto, third-party integration can be as seamless as first-party through custom feeds, federated services, clients, and more. 104 + ## License 67 105 68 - ## License (MIT) 106 + **MIT** – see [./LICENSE](./LICENSE). 69 107 70 - See [./LICENSE](./LICENSE) for the full license. 108 + --- 71 109 72 110 ## P.S. 73 111 74 - We ❤️ you and all of the ways you support us. Thank you for making Bluesky a great place! 112 + Blacksky exists because of contributors like *you*. 113 + Thank you for helping us build safer, community-owned social media!
+1 -1
src/lib/constants.ts
··· 7 7 export const LOCAL_DEV_SERVICE = 8 8 Platform.OS === 'android' ? 'http://10.0.2.2:2583' : 'http://localhost:2583' 9 9 export const STAGING_SERVICE = 'https://staging.bsky.dev' 10 - export const BSKY_SERVICE = 'https://bsky.social' 10 + export const BSKY_SERVICE = 'https://blacksky.app' 11 11 export const BSKY_SERVICE_DID = 'did:web:bsky.social' 12 12 export const PUBLIC_BSKY_SERVICE = 'https://public.api.bsky.app' 13 13 export const DEFAULT_SERVICE = BSKY_SERVICE
+1 -1
src/lib/strings/url-helpers.ts
··· 55 55 try { 56 56 const urlp = new URL(url) 57 57 if (`https://${urlp.host}` === BSKY_SERVICE) { 58 - return 'Bluesky Social' 58 + return 'Blacksky Algorithms' 59 59 } 60 60 return urlp.host ? urlp.host : url 61 61 } catch (e) {
+3 -76
src/screens/Signup/StepInfo/index.tsx
··· 5 5 import * as EmailValidator from 'email-validator' 6 6 import type tldts from 'tldts' 7 7 8 - import {DEFAULT_SERVICE} from '#/lib/constants' 9 8 import {isEmailMaybeInvalid} from '#/lib/strings/email' 10 9 import {logger} from '#/logger' 11 - import {isWeb} from '#/platform/detection' 12 10 import {ScreenTransition} from '#/screens/Login/ScreenTransition' 13 11 import {is13, is18, useSignupContext} from '#/screens/Signup/state' 14 12 import {Policies} from '#/screens/Signup/StepInfo/Policies' 15 13 import {atoms as a, native} from '#/alf' 16 - import {Button, ButtonText} from '#/components/Button' 17 - import {Divider} from '#/components/Divider' 18 14 import * as DateField from '#/components/forms/DateField' 19 15 import {type DateFieldRef} from '#/components/forms/DateField/types' 20 16 import {FormError} from '#/components/forms/FormError' ··· 23 19 import {Envelope_Stroke2_Corner0_Rounded as Envelope} from '#/components/icons/Envelope' 24 20 import {Lock_Stroke2_Corner0_Rounded as Lock} from '#/components/icons/Lock' 25 21 import {Ticket_Stroke2_Corner0_Rounded as Ticket} from '#/components/icons/Ticket' 26 - import {InlineLinkText} from '#/components/Link' 27 22 import {Loader} from '#/components/Loader' 28 - import {Text} from '#/components/Typography' 29 23 import {BackNextButtons} from '../BackNextButtons' 30 24 31 25 function sanitizeDate(date: Date): Date { ··· 40 34 41 35 export function StepInfo({ 42 36 onPressBack, 43 - onPressSignIn, 44 37 isServerError, 45 38 refetchServer, 46 39 isLoadingStarterPack, 47 40 }: { 48 41 onPressBack: () => void 49 - onPressSignIn: () => void 50 42 isServerError: boolean 51 43 refetchServer: () => void 52 44 isLoadingStarterPack: boolean ··· 86 78 return 87 79 } 88 80 89 - if (state.serviceUrl === DEFAULT_SERVICE) { 90 - return dispatch({ 91 - type: 'setError', 92 - value: _( 93 - msg`Please choose a 3rd party service host, or sign up on bsky.app.`, 94 - ), 95 - }) 96 - } 97 - 98 81 if (state.serviceDescription?.inviteCodeRequired && !inviteCode) { 99 82 return dispatch({ 100 83 type: 'setError', ··· 162 145 return ( 163 146 <ScreenTransition> 164 147 <View style={[a.gap_md]}> 165 - {state.serviceUrl === DEFAULT_SERVICE && ( 166 - <View style={[a.gap_xl]}> 167 - <Text style={[a.gap_md, a.leading_normal]}> 168 - <Trans> 169 - blacksky.community is part of the{' '} 170 - { 171 - <InlineLinkText 172 - label={_(msg`ATmosphere`)} 173 - to="https://atproto.com/"> 174 - <Trans>ATmosphere</Trans> 175 - </InlineLinkText> 176 - } 177 - —the network of apps, services, and accounts built on the AT 178 - Protocol. 179 - </Trans> 180 - </Text> 181 - <Text style={[a.gap_md, a.leading_normal]}> 182 - <Trans> 183 - If you have one, sign in with an existing Bluesky account. 184 - </Trans> 185 - </Text> 186 - <View style={isWeb && [a.flex_row, a.justify_center]}> 187 - <Button 188 - testID="signInButton" 189 - onPress={onPressSignIn} 190 - label={_(msg`Sign in with ATmosphere`)} 191 - accessibilityHint={_( 192 - msg`Opens flow to sign in to your existing ATmosphere account`, 193 - )} 194 - size="large" 195 - variant="solid" 196 - color="primary"> 197 - <ButtonText> 198 - <Trans>Sign in with ATmosphere</Trans> 199 - </ButtonText> 200 - </Button> 201 - </View> 202 - <Divider style={[a.mb_xl]} /> 203 - </View> 204 - )} 205 148 <FormError error={state.error} /> 206 149 <HostingProvider 150 + minimal 207 151 serviceUrl={state.serviceUrl} 208 152 onSelectServiceUrl={v => dispatch({type: 'setServiceUrl', value: v})} 209 153 /> 210 - {state.serviceUrl === DEFAULT_SERVICE && ( 211 - <Text style={[a.gap_md, a.leading_normal, a.mt_md]}> 212 - <Trans> 213 - Don't have an account provider or an existing Bluesky account? To 214 - create a new account on a Bluesky-hosted PDS, sign up through{' '} 215 - { 216 - <InlineLinkText label={_(msg`bsky.app`)} to="https://bsky.app"> 217 - <Trans>bsky.app</Trans> 218 - </InlineLinkText> 219 - }{' '} 220 - first, then return to blacksky.community and log in with the 221 - account you created. 222 - </Trans> 223 - </Text> 224 - )} 225 154 {state.isLoading || isLoadingStarterPack ? ( 226 155 <View style={[a.align_center]}> 227 156 <Loader size="xl" /> 228 157 </View> 229 - ) : state.serviceDescription && state.serviceUrl !== DEFAULT_SERVICE ? ( 158 + ) : state.serviceDescription ? ( 230 159 <> 231 160 {state.serviceDescription.inviteCodeRequired && ( 232 161 <View> ··· 351 280 ) : undefined} 352 281 </View> 353 282 <BackNextButtons 354 - hideNext={ 355 - !is13(state.dateOfBirth) || state.serviceUrl === DEFAULT_SERVICE 356 - } 283 + hideNext={!is13(state.dateOfBirth)} 357 284 showRetry={isServerError} 358 285 isLoading={state.isLoading} 359 286 onBackPress={onPressBack}
+4 -11
src/screens/Signup/index.tsx
··· 32 32 import {GCP_PROJECT_ID} from '#/env' 33 33 import * as bsky from '#/types/bsky' 34 34 35 - export function Signup({ 36 - onPressBack, 37 - onPressSignIn, 38 - }: { 39 - onPressBack: () => void 40 - onPressSignIn: () => void 41 - }) { 35 + export function Signup({onPressBack}: {onPressBack: () => void}) { 42 36 const {_} = useLingui() 43 37 const t = useTheme() 44 38 const [state, dispatch] = useReducer(reducer, initialState) ··· 126 120 <LoggedOutLayout 127 121 leadin="" 128 122 title={_(msg`Create Account`)} 129 - description={_(msg`Welcome to the ATmosphere!`)} 123 + description={_(msg`Welcome to the cookout!`)} 130 124 scrollable> 131 125 <View testID="createAccount" style={a.flex_1}> 132 126 {showStarterPackCard && ··· 176 170 </Text> 177 171 <Text style={[a.text_3xl, a.font_heavy]}> 178 172 {state.activeStep === SignupStep.INFO ? ( 179 - <Trans>The ATmosphere ✨</Trans> 173 + <Trans>Your account</Trans> 180 174 ) : state.activeStep === SignupStep.HANDLE ? ( 181 175 <Trans>Choose your username</Trans> 182 176 ) : ( ··· 189 183 {state.activeStep === SignupStep.INFO ? ( 190 184 <StepInfo 191 185 onPressBack={onPressBack} 192 - onPressSignIn={onPressSignIn} 193 186 isLoadingStarterPack={ 194 187 isFetchingStarterPack && !isErrorStarterPack 195 188 } ··· 219 212 label={_(msg`Contact support`)} 220 213 to={FEEDBACK_FORM_URL({email: state.email})} 221 214 style={[!gtMobile && a.text_md]}> 222 - <Trans>Open a Github Issue</Trans> 215 + <Trans>Contact support</Trans> 223 216 </InlineLinkText> 224 217 </Text> 225 218 </View>
+7 -5
src/view/com/auth/server-input/index.tsx
··· 133 133 label="Preferences" 134 134 values={[fixedOption]} 135 135 onChange={values => setFixedOption(values[0])}> 136 - <ToggleButton.Button name={BSKY_SERVICE} label={_(msg`Bluesky`)}> 137 - <ToggleButton.ButtonText>{_(msg`Bluesky`)}</ToggleButton.ButtonText> 136 + <ToggleButton.Button name={BSKY_SERVICE} label={_(msg`Blacksky`)}> 137 + <ToggleButton.ButtonText> 138 + {_(msg`Blacksky`)} 139 + </ToggleButton.ButtonText> 138 140 </ToggleButton.Button> 139 141 <ToggleButton.Button 140 142 testID="customSelectBtn" ··· 147 149 {fixedOption === BSKY_SERVICE && isFirstTimeUser && ( 148 150 <Admonition type="tip"> 149 151 <Trans> 150 - Bluesky is an open network where you can choose your own provider. 151 - If you're new here, we recommend sticking with the default Bluesky 152 - Social option. 152 + Blacksky is an open network where you can choose your own 153 + provider. If you're new here, we recommend sticking with the 154 + default Blacksky Algorithms option. 153 155 </Trans> 154 156 </Admonition> 155 157 )}