An ATproto social media client -- with an independent Appview.

feat: insert branding

+4 -4
README.md
··· 1 - # Catsky Social App 2 3 - Welcome friends! This is the codebase for the Catsky Social app. 4 5 Get the app itself: 6 7 - **Web: social.shatteredsky.net** 8 9 - <a href="https://apps.obtainium.imranr.dev/redirect?r=obtainium://add/https://github.com/NekoDrone/catsky-social"> 10 <img src="https://github.com/ImranR98/Obtainium/blob/main/assets/graphics/badge_obtainium.png?raw=true" 11 alt="Get it on Obtainium" align="center" height="54" /></a> 12 ··· 27 28 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.*`. 29 30 - Catsky social is a soft fork of Bluesky social, and thus will also use those lexicons. 31 32 ## Contributions 33
··· 1 + # Shattered Sky Social App 2 3 + This is the codebase for the Shattered Sky Social app. 4 5 Get the app itself: 6 7 - **Web: social.shatteredsky.net** 8 9 + <a href="https://apps.obtainium.imranr.dev/redirect?r=obtainium://add/https://github.com/Teqed/social-app"> 10 <img src="https://github.com/ImranR98/Obtainium/blob/main/assets/graphics/badge_obtainium.png?raw=true" 11 alt="Get it on Obtainium" align="center" height="54" /></a> 12 ··· 27 28 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.*`. 29 30 + Shattered Sky social is a soft fork of Bluesky social, and thus will also use those lexicons. 31 32 ## Contributions 33
+8 -4
__tests__/lib/string.test.ts
··· 267 }) 268 269 describe('toShareUrl', () => { 270 - const inputs = ['https://catsky.social', '/3jk7x4irgv52r', 'item/test/123'] 271 const outputs = [ 272 - 'https://catsky.social', 273 - 'https://catsky.social/3jk7x4irgv52r', 274 - 'https://catsky.social/item/test/123', 275 ] 276 277 it('appends https, when not present', () => {
··· 267 }) 268 269 describe('toShareUrl', () => { 270 + const inputs = [ 271 + 'https://social.shatteredsky.net', 272 + '/3jk7x4irgv52r', 273 + 'item/test/123', 274 + ] 275 const outputs = [ 276 + 'https://social.shatteredsky.net', 277 + 'https://social.shatteredsky.net/3jk7x4irgv52r', 278 + 'https://social.shatteredsky.net/item/test/123', 279 ] 280 281 it('appends https, when not present', () => {
+6 -6
app.config.js
··· 34 return { 35 expo: { 36 version: VERSION, 37 - name: 'Catsky', 38 - slug: 'catsky', 39 - scheme: 'catsky', 40 - owner: 'catskysocial', 41 runtimeVersion: { 42 policy: 'appVersion', 43 }, ··· 152 backgroundColor: '#1185FE', 153 }, 154 googleServicesFile: './google-services.json', 155 - package: 'social.catsky', 156 intentFilters: [ 157 { 158 action: 'VIEW', ··· 200 USE_SENTRY && [ 201 '@sentry/react-native/expo', 202 { 203 - organization: 'catskysocial', 204 project: 'app', 205 url: 'https://sentry.io', 206 },
··· 34 return { 35 expo: { 36 version: VERSION, 37 + name: 'Shattered Sky', 38 + slug: 'shatteredsky', 39 + scheme: 'shatteredsky', 40 + owner: 'teq', 41 runtimeVersion: { 42 policy: 'appVersion', 43 }, ··· 152 backgroundColor: '#1185FE', 153 }, 154 googleServicesFile: './google-services.json', 155 + package: 'net.shatteredsky.social', 156 intentFilters: [ 157 { 158 action: 'VIEW', ··· 200 USE_SENTRY && [ 201 '@sentry/react-native/expo', 202 { 203 + organization: 'Teqed', 204 project: 'app', 205 url: 'https://sentry.io', 206 },
+4 -4
bskyweb/templates/base.html
··· 9 --> 10 <link rel="preconnect" href="https://bsky.social"> 11 <link rel="preconnect" href="https://go.bsky.app"> 12 - <title>{%- block head_title -%}Catsky{%- endblock -%}</title> 13 14 <!-- Hello Humans! API docs at https://atproto.com --> 15 ··· 92 <link rel="icon" type="image/png" sizes="16x16" href="{{ staticCDNHost }}/static/favicon-16x16.png"> 93 <link rel="mask-icon" href="{{ staticCDNHost }}/static/safari-pinned-tab.svg" color="#1185fe"> 94 <meta name="theme-color"> 95 - <meta name="application-name" content="Catsky"> 96 <meta name="generator" content="bskyweb"> 97 - <meta property="og:site_name" content="Catsky Social"> 98 <meta property="og:logo" content="{{ favicon }}"> 99 <meta name="twitter:site" content="@bluesky" /> 100 <link type="application/activity+json" href="" /> ··· 113 <noscript> 114 <h1 lang="en">JavaScript Required</h1> 115 <p lang="en">This is a heavily interactive web application, and JavaScript is required. Simple HTML interfaces are possible, but that is not what this is. 116 - <p lang="en">Learn more about Bluesky at <a href="https://bsky.social">bsky.social</a>, <a href="https://atproto.com">atproto.com</a>, and this fork of Bluesky (Catsky) at <a href="https://github.com/NekoDrone/catsky-social/">GitHub</a>. 117 {% block noscript_extra %}{% endblock %} 118 </noscript> 119 {% endblock -%}
··· 9 --> 10 <link rel="preconnect" href="https://bsky.social"> 11 <link rel="preconnect" href="https://go.bsky.app"> 12 + <title>{%- block head_title -%}Shattered Sky{%- endblock -%}</title> 13 14 <!-- Hello Humans! API docs at https://atproto.com --> 15 ··· 92 <link rel="icon" type="image/png" sizes="16x16" href="{{ staticCDNHost }}/static/favicon-16x16.png"> 93 <link rel="mask-icon" href="{{ staticCDNHost }}/static/safari-pinned-tab.svg" color="#1185fe"> 94 <meta name="theme-color"> 95 + <meta name="application-name" content="Shattered Sky"> 96 <meta name="generator" content="bskyweb"> 97 + <meta property="og:site_name" content="Shattered Sky"> 98 <meta property="og:logo" content="{{ favicon }}"> 99 <meta name="twitter:site" content="@bluesky" /> 100 <link type="application/activity+json" href="" /> ··· 113 <noscript> 114 <h1 lang="en">JavaScript Required</h1> 115 <p lang="en">This is a heavily interactive web application, and JavaScript is required. Simple HTML interfaces are possible, but that is not what this is. 116 + <p lang="en">Learn more about Bluesky at <a href="https://bsky.social">bsky.social</a>, <a href="https://atproto.com">atproto.com</a>, and this fork of Bluesky (Shattered Sky) at <a href="https://github.com/Teqed/social-app/">GitHub</a>. 117 {% block noscript_extra %}{% endblock %} 118 </noscript> 119 {% endblock -%}
+1 -1
bskyweb/templates/error.html
··· 1 {% extends "base.html" %} 2 3 - {% block head_title %}Error {{ statusCode }} - Catsky{% endblock %} 4 5 {% block noscript_extra %} 6 {%- if statusCode == 404 %}
··· 1 {% extends "base.html" %} 2 3 + {% block head_title %}Error {{ statusCode }} - Shattered Sky{% endblock %} 4 5 {% block noscript_extra %} 6 {%- if statusCode == 404 %}
+3 -3
bskyweb/templates/feed.html
··· 2 3 {% block head_title %} 4 {%- if feedView -%} 5 - {{ feedView.DisplayName }} by @{{ feedView.Creator.Handle }} | Catsky Feed 6 {%- else -%} 7 - Catsky 8 {%- endif -%} 9 {% endblock %} 10 11 {% block html_head_extra -%} 12 {%- if feedView -%} 13 - <meta property="og:site_name" content="Catsky Social"> 14 <meta property="og:type" content="website"> 15 {%- if requestURI %} 16 <meta property="og:url" content="{{ requestURI }}">
··· 2 3 {% block head_title %} 4 {%- if feedView -%} 5 + {{ feedView.DisplayName }} by @{{ feedView.Creator.Handle }} | Shattered Sky Feed 6 {%- else -%} 7 + Shattered Sky 8 {%- endif -%} 9 {% endblock %} 10 11 {% block html_head_extra -%} 12 {%- if feedView -%} 13 + <meta property="og:site_name" content="Shattered Sky"> 14 <meta property="og:type" content="website"> 15 {%- if requestURI %} 16 <meta property="og:url" content="{{ requestURI }}">
+7 -7
bskyweb/templates/home.html
··· 1 {% extends "base.html" %} 2 3 - {% block head_title %}Catsky{% endblock %} 4 5 {% block html_head_extra -%} 6 - <meta property="og:title" content="Catsky" /> 7 - <meta name="twitter:title" content="Catsky" /> 8 9 - <meta name="description" content="mrrp mrrowww media as it should be. find your meowmunity among hundreds of cats, unleash your meows, and have some fun again :3" /> 10 <meta name="og:description" content="mrrp mrrowww media as it should be. find your meowmunity among hundreds of cats, unleash your meows, and have some fun again :3" /> 11 <meta name="twitter:description" content="mrrp mrrowww media as it should be. find your meowmunity among hundreds of cats, unleash your meows, and have some fun again :3" /> 12 13 - <meta property="og:url" content="https://catsky.social" /> 14 - <meta name="twitter:url" content="https://catsky.social" /> 15 - <link rel="canonical" href="https://catsky.social" /> 16 17 <meta property="og:image" content="https://pds.tgirl.cloud/xrpc/com.atproto.sync.getBlob?did=did:plc:ctg5hooybw3rquejsfebsegs&cid=bafkreianap3iqgxlifqssuhut2ggiuitpmltw3lfvzq7tnzbsv26npzfxq" /> 18 <meta property="twitter:image" content="https://pds.tgirl.cloud/xrpc/com.atproto.sync.getBlob?did=did:plc:ctg5hooybw3rquejsfebsegs&cid=bafkreianap3iqgxlifqssuhut2ggiuitpmltw3lfvzq7tnzbsv26npzfxq" />
··· 1 {% extends "base.html" %} 2 3 + {% block head_title %}Shattered Sky{% endblock %} 4 5 {% block html_head_extra -%} 6 + <meta property="og:title" content="Shattered Sky" /> 7 + <meta name="twitter:title" content="Shattered Sky" /> 8 9 + <meta name="description" content="what's it all for..?" /> 10 <meta name="og:description" content="mrrp mrrowww media as it should be. find your meowmunity among hundreds of cats, unleash your meows, and have some fun again :3" /> 11 <meta name="twitter:description" content="mrrp mrrowww media as it should be. find your meowmunity among hundreds of cats, unleash your meows, and have some fun again :3" /> 12 13 + <meta property="og:url" content="https://social.shatteredsky.net" /> 14 + <meta name="twitter:url" content="https://social.shatteredsky.net" /> 15 + <link rel="canonical" href="https://social.shatteredsky.net" /> 16 17 <meta property="og:image" content="https://pds.tgirl.cloud/xrpc/com.atproto.sync.getBlob?did=did:plc:ctg5hooybw3rquejsfebsegs&cid=bafkreianap3iqgxlifqssuhut2ggiuitpmltw3lfvzq7tnzbsv26npzfxq" /> 18 <meta property="twitter:image" content="https://pds.tgirl.cloud/xrpc/com.atproto.sync.getBlob?did=did:plc:ctg5hooybw3rquejsfebsegs&cid=bafkreianap3iqgxlifqssuhut2ggiuitpmltw3lfvzq7tnzbsv26npzfxq" />
+3 -3
bskyweb/templates/post.html
··· 2 3 {% block head_title %} 4 {%- if postView -%} 5 - @{{ postView.Author.Handle }} on Catsky 6 {%- elif requiresAuth and profileHandle -%} 7 - @{{ profileHandle }} on Catsky 8 {%- else -%} 9 - Catsky 10 {%- endif -%} 11 {% endblock %} 12
··· 2 3 {% block head_title %} 4 {%- if postView -%} 5 + @{{ postView.Author.Handle }} on Shattered Sky 6 {%- elif requiresAuth and profileHandle -%} 7 + @{{ profileHandle }} on Shattered Sky 8 {%- else -%} 9 + Shattered Sky 10 {%- endif -%} 11 {% endblock %} 12
+4 -4
bskyweb/templates/profile.html
··· 2 3 {% block head_title %} 4 {%- if profileView -%} 5 - @{{ profileView.Handle }} on Catsky 6 {%- else -%} 7 - Catsky 8 {%- endif -%} 9 {% endblock %} 10 11 {% block html_head_extra -%} 12 - <meta property="og:site_name" content="Catsky Social"> 13 <meta property="og:type" content="profile"> 14 {%- if requestURI %} 15 <meta property="og:url" content="{{ requestURI }}"> ··· 51 <meta property="og:description" content="This profile requires authentication to view."> 52 <meta property="twitter:description" content="This profile requires authentication to view."> 53 {% endif %} 54 - 55 <script type="application/ld+json"> 56 { 57 "@context": "https://schema.org",
··· 2 3 {% block head_title %} 4 {%- if profileView -%} 5 + @{{ profileView.Handle }} on Shattered Sky 6 {%- else -%} 7 + Shattered Sky 8 {%- endif -%} 9 {% endblock %} 10 11 {% block html_head_extra -%} 12 + <meta property="og:site_name" content="Shattered Sky"> 13 <meta property="og:type" content="profile"> 14 {%- if requestURI %} 15 <meta property="og:url" content="{{ requestURI }}"> ··· 51 <meta property="og:description" content="This profile requires authentication to view."> 52 <meta property="twitter:description" content="This profile requires authentication to view."> 53 {% endif %} 54 + 55 <script type="application/ld+json"> 56 { 57 "@context": "https://schema.org",
+3 -3
default.nix
··· 2 { lib, buildNpmPackage }: 3 4 buildNpmPackage { 5 - pname = "catsky-social"; 6 version = "0.1.0"; 7 8 src = ./.; ··· 10 npmDepsHash = lib.fakeHash; 11 12 meta = { 13 - description = "soft social-app fork with niche toggles stolen from deer/zepplin and catppuccin'd "; 14 - homepage = "https://github.com/NekoDrone/catsky-social"; 15 license = lib.licenses.mit; 16 maintainers = with lib.maintainers; [ ]; 17 mainProgram = "example";
··· 2 { lib, buildNpmPackage }: 3 4 buildNpmPackage { 5 + pname = "shatteredsky-social"; 6 version = "0.1.0"; 7 8 src = ./.; ··· 10 npmDepsHash = lib.fakeHash; 11 12 meta = { 13 + description = "social-app fork with alternative appview; toggles from deer/zepplin; catppuccin'd "; 14 + homepage = "https://github.com/Teqed/social-app"; 15 license = lib.licenses.mit; 16 maintainers = with lib.maintainers; [ ]; 17 mainProgram = "example";
+2 -2
docs/android-builds.md
··· 2 3 Android builds are done via CI to avoid EAS (expo) and are published via releases to avoid artifact expiry and allow [obtainium](https://obtainium.imranr.dev/) to download and auto-update the app. 4 5 - - "Catsky build" is for testing/etc NOT for release as these artifacts will expiry and won't be pushed out to obtainium users 6 - - "Catsky release" is for production and will be pushed out to obtainium users and artifacts won't expire
··· 2 3 Android builds are done via CI to avoid EAS (expo) and are published via releases to avoid artifact expiry and allow [obtainium](https://obtainium.imranr.dev/) to download and auto-update the app. 4 5 + - "shatteredsky build" is for testing/etc NOT for release as these artifacts will expiry and won't be pushed out to obtainium users 6 + - "shatteredsky release" is for production and will be pushed out to obtainium users and artifacts won't expire
+1 -1
flake.nix
··· 1 # stolen from https://github.com/tgirlcloud/nix-templates/blob/main/node/flake.nix 2 { 3 - description = "catsky social dev flake"; 4 5 inputs = { 6 nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
··· 1 # stolen from https://github.com/tgirlcloud/nix-templates/blob/main/node/flake.nix 2 { 3 + description = "shatteredsky social dev flake"; 4 5 inputs = { 6 nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
+1 -1
google-services.json.example
··· 9 "client_info": { 10 "mobilesdk_app_id": "1:123456789000:android:f1bf012572b04063", 11 "android_client_info": { 12 - "package_name": "social.catsky" 13 } 14 }, 15 "oauth_client": [
··· 9 "client_info": { 10 "mobilesdk_app_id": "1:123456789000:android:f1bf012572b04063", 11 "android_client_info": { 12 + "package_name": "social.shatteredsky" 13 } 14 }, 15 "oauth_client": [
+4 -4
justfile
··· 36 postbuild-web: 37 # after doing the expo web build, we compress the bskyweb folder and send it to vps. 38 # no need to build the go binary as we'll do that on vps. 39 - tar -czf catskyweb.tar.gz bskyweb/ 40 - rsync -avz -e "ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no" catskyweb.tar.gz ci@${VPS_IP}:/tmp/catsky/ 41 - rsync -avz -e "ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no" scripts/seraphDeploy.sh ci@${VPS_IP}:/tmp/catsky/ 42 - 43 [group('dev')] 44 dev-android-setup: prebuild-android 45 yarn android
··· 36 postbuild-web: 37 # after doing the expo web build, we compress the bskyweb folder and send it to vps. 38 # no need to build the go binary as we'll do that on vps. 39 + tar -czf shatteredskyweb.tar.gz bskyweb/ 40 + rsync -avz -e "ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no" shatteredskyweb.tar.gz ci@${VPS_IP}:/tmp/shatteredsky-social/ 41 + rsync -avz -e "ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no" scripts/seraphDeploy.sh ci@${VPS_IP}:/tmp/shatteredsky-social/ 42 + 43 [group('dev')] 44 dev-android-setup: prebuild-android 45 yarn android
+2 -2
scripts/seraphDeploy.sh
··· 1 #!/usr/bin/env nix-shell 2 #!nix-shell -i bash -p go 3 4 - tar -xzf "/tmp/catsky/catskyweb.tar.gz" -C "/opt/catsky/" --strip-components=1 --overwrite 5 - sudo systemctl restart catsky.service
··· 1 #!/usr/bin/env nix-shell 2 #!nix-shell -i bash -p go 3 4 + tar -xzf "/tmp/shatteredsky-social/shatteredskyweb.tar.gz" -C "/opt/shatteredsky-social/" --strip-components=1 --overwrite 5 + sudo systemctl restart shatteredsky-social.service
+1 -1
src/lib/constants.ts
··· 11 export const BSKY_SERVICE_DID = 'did:web:bsky.social' 12 export const PUBLIC_BSKY_SERVICE = 'https://api.shatteredsky.net' 13 export const DEFAULT_SERVICE = BSKY_SERVICE 14 - export const HELP_DESK_URL = `https://github.com/NekoDrone/catsky-social/issues/new/choose` 15 export const EMBED_SERVICE = 'https://embed.bsky.app' 16 export const EMBED_SCRIPT = `${EMBED_SERVICE}/static/embed.js` 17 export const BSKY_DOWNLOAD_URL = 'https://social.shatteredsky.net/download'
··· 11 export const BSKY_SERVICE_DID = 'did:web:bsky.social' 12 export const PUBLIC_BSKY_SERVICE = 'https://api.shatteredsky.net' 13 export const DEFAULT_SERVICE = BSKY_SERVICE 14 + export const HELP_DESK_URL = `https://github.com/Teqed/social-app/issues/new/choose` 15 export const EMBED_SERVICE = 'https://embed.bsky.app' 16 export const EMBED_SCRIPT = `${EMBED_SERVICE}/static/embed.js` 17 export const BSKY_DOWNLOAD_URL = 'https://social.shatteredsky.net/download'
+1 -1
src/lib/strings/headings.ts
··· 1 export function bskyTitle(page: string, unreadCountLabel?: string) { 2 const unreadPrefix = unreadCountLabel ? `(${unreadCountLabel}) ` : '' 3 - return `${unreadPrefix}${page} — Catsky` 4 }
··· 1 export function bskyTitle(page: string, unreadCountLabel?: string) { 2 const unreadPrefix = unreadCountLabel ? `(${unreadCountLabel}) ` : '' 3 + return `${unreadPrefix}${page} — Shattered Sky` 4 }
+1 -1
src/lib/strings/url-helpers.ts
··· 81 82 export function toShareUrl(url: string): string { 83 if (!url.startsWith('https')) { 84 - const urlp = new URL('https://catsky.social') 85 urlp.pathname = url 86 url = urlp.toString() 87 }
··· 81 82 export function toShareUrl(url: string): string { 83 if (!url.startsWith('https')) { 84 + const urlp = new URL('https://social.shatteredsky.net') 85 urlp.pathname = url 86 url = urlp.toString() 87 }