Skip to content
Open
Show file tree
Hide file tree
Changes from 10 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
name: Damus CI

on:
push:
branches: [ "master", "main" ]
pull_request:
branches: [ "master", "main" ]

jobs:
build:
name: Build and Test
runs-on: macos-14

steps:
- name: Checkout
uses: actions/checkout@v4

- name: Setup Xcode
uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '15.0'

- name: Build Damus
run: |
xcodebuild build \
-project damus.xcodeproj \
-scheme damus \
-destination 'platform=iOS Simulator,name=iPhone 15,OS=latest' \
-configuration Debug \
CODE_SIGN_IDENTITY="" \
CODE_SIGNING_REQUIRED=NO \
CODE_SIGNING_ALLOWED=NO
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,5 @@ TODO.bak
tags
build-git-hash.txt
.build
build/
.swiftpm/
15 changes: 15 additions & 0 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

56 changes: 35 additions & 21 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@

The social network you control

A twitter-like [nostr][nostr] client for iPhone, iPad and MacOS.
A twitter-like [nostr][nostr] client for iPhone, iPad and macOS.

[![License: GPL-3.0](https://img.shields.io/github/license/damus-io/damus?labelColor=27303D&color=0877d2)](/LICENSE)
[![Damus CI](https://github.com/damus-io/damus/actions/workflows/ci.yml/badge.svg)](https://github.com/damus-io/damus/actions/workflows/ci.yml)

## Download and Install

Expand All @@ -25,6 +26,7 @@ iOS 16.0+ • macOS 13.0+
[nostr]: https://github.com/fiatjaf/nostr

## How is Damus better than X/Twitter?

There are no toxic algorithms.\
You can send or receive zaps (satoshis) without asking for permission.\
[There is no central database](https://fiatjaf.com/nostr.html). Therefore, Damus is censorship resistant.\
Expand All @@ -36,7 +38,8 @@ Damus is free and open source software. \
There is no Big Tech moat. Therefore, seamless interoperability with thousands or millions of other nostr apps is possible, and is how [Damus and nostr win](https://www.youtube.com/watch?v=qTixqS-W1yo).

## If there are no ads, how is Damus funded?
Damus offers a paid subscription 🟣 purple 🟣 https://damus.io/purple/. \

Damus offers a paid subscription 🟣 purple 🟣 [damus.io/purple](https://damus.io/purple/). \
Initial benefits include a unique subscriber number, subscriber badge, and auto-translate powered by DeepL.

Damus has also graciously received donations or grants from hundreds of Damus users, [Opensats](https://opensats.org/), and the [Human Rights Foundation](https://hrf.org/).
Expand Down Expand Up @@ -68,26 +71,32 @@ damus implements the following [Nostr Implementation Possibilities][nips]
[nip42]: https://github.com/nostr-protocol/nips/blob/master/42.md
[nip56]: https://github.com/nostr-protocol/nips/blob/master/56.md


## Getting Started on Damus
## Getting Started on Damus

### Damus iOS
1) Get the Damus app on the iOS App Store: https://apps.apple.com/ca/app/damus/id1628663131

1. Get the Damus app on the iOS App Store: [apps.apple.com/ca/app/damus/id1628663131](https://apps.apple.com/ca/app/damus/id1628663131)

#### ⚙️ Settings (gear icon, top right)
- Relays: You can add more relays to send your notes to by tapping the "+".
- Find more relays to add: https://nostr.info/relays/

- Relays: You can add more relays to send your notes to by tapping the "+".
- Find more relays to add: [nostr.info/relays](https://nostr.info/relays/)
- Low Data Mode: Toggle this to save data by blocking automatic media loading.
- When enabled, images and banners will be replaced with placeholders.
- You can tap individual placeholders to load specific images.
- Public Key (pubkey): Your public, personal address and how people can find and tag you
- Secret Key: Your *private* key unique to you. Never share your private key publicly and share with other clients at your own risk!
- Save your keys somewhere safe
- Log out
- Secret Key: Your _private_ key unique to you. Never share your private key publicly and share with other clients at your own risk!
- Save your keys somewhere safe
- Log out

#### 🏠 Personal Feed (home icon, bottom navigation)

- Feed from everyone you follow
- Can post notes by tapping the blue + button

#### Notes (under 🏠 Personal Feed)
- Sending a Note is easy and it goes to both your 🏠 Personal and 🔍 Global Feeds

- Sending a Note is easy and it goes to both your 🏠 Personal and 🔍 Global Feeds
- To tag a user you must grab their pubkey:
1. Search their username in the search bar at the top of the 🔍 Global Feed and click their profile
2. Tap the 🔑 icon which will copy their pubkey to your clipboard
Expand All @@ -101,42 +110,47 @@ damus implements the following [Nostr Implementation Possibilities][nips]
- ♺ Reposts: Tap the repost icon which will show up in your 🏠 Personal and 🔍 Global Feeds
- ♡ Likes: Tap the heart icon. Users will not get a notification, and cannot see who liked their note (currently, web clients can see your pfp only)


#### 💬 Encrypted DMs (chat app, bottom navigation)

- Tap the chat icon and you'll notice there's nothing to see at first. Go to a user profile and tap the 💬 chat icon next to the follow button to begin a DM

#### 🔍 Global Feed (magnify glass, bottom navigation)

- View the Global Feed from all the relays you've added in ⚙️ Settings. Currently you can only search hashtags and user names and pubkeys

#### 🔔 Notifications

- All your notifications except 💬 DMs

#### 👤 Change Your Profile (PFP) and Bio

1. Go to your Profile Page on Damus app
2. Tap on Edit button at the top
3. You will see text fields to update your information and bio
4. For PFP, insert a URL containing your image (support video: https://cdn.jb55.com/vid/pfp-editor.mp4)
4. For PFP, insert a URL containing your image (support video: [cdn.jb55.com/vid/pfp-editor.mp4](https://cdn.jb55.com/vid/pfp-editor.mp4))
5. Save

#### ⚡️ Request Sats

#### ⚡️ Request Sats
Paste an invoice from your favorite LN wallet.
(Sats or Satoshis are the smallest denomination of bitcoin)

**Alby (browser extension)**
(Sats or Satoshis are the smallest denomination of bitcoin)

##### Alby (browser extension)

- Get the [Alby](https://getalby.com/) browser extension and create your Alby address [yourname]@getalby.com or connect your existing Lightning wallet
- Convert your Damus secret key from nsec to hex at https://damus.io/key then go to Settings in Alby and under the Nostr section at the bottom of the page add your private hex key. You can also generate new address in the extension
- Convert your Damus secret key from nsec to hex at [damus.io/key](https://damus.io/key) then go to Settings in Alby and under the Nostr section at the bottom of the page add your private hex key. You can also generate new address in the extension
- Click the Alby extension > click Receive > enter the amount of Sats > click Get Invoice > click Copy > then paste into Damus
- Note: On Damus Web it will appear as a string of characters but on Damus iOS it will appear as a clickable image

**Zeus (mobile app)**
##### Zeus (mobile app)

- Download [Zeus](https://zeusln.app/) app (iOS, Google, APK)
- Tap Get Started button > tap Connect a node > click on + sign (top right) > select Indhub > press Scan Lndhub QR > (from the Alby browser extension… click your account on the top left > click Manage Accounts > click 3-dot menu to right of your account and click Export Account to get a QR code then go back to Zeus app) > scan the QR Code and tap Save Node Config button
- To create an invoice tap Lightning > tap Receive > type in amount > tap Create Invoice > tap Copy Invoice > paste into a new Damus note

## Contributing

Contributors welcome! Start by examining known issues: https://github.com/damus-io/damus/issues.
Contributors welcome! Start by examining known issues: [github.com/damus-io/damus/issues](https://github.com/damus-io/damus/issues).

### Mailing lists

Expand All @@ -157,6 +171,7 @@ We have a few mailing lists that anyone can join to get involved in damus develo
Before starting to work on any contributions, please read [docs/CONTRIBUTING.md](./docs/CONTRIBUTING.md).

### Privacy

Your internet protocol (IP) address is exposed to the relays you connect to, and third party media hosters (e.g. nostr.build, imgur.com, giphy.com, youtube.com etc.) that render on Damus. If you want to improve your privacy, consider utilizing a service that masks your IP address (e.g. a VPN) from trackers online.

The relay also learns which public keys you are requesting, meaning your public key will be tied to your IP address.
Expand All @@ -176,7 +191,6 @@ All user-facing strings must have a comment in order to provide context to trans
Damus lead dev and founder Will awards developers with satoshis!
There may be nostr badges awarded for contributors in the future... :)


First contributors:

1. @randymcmillan
Expand Down
10 changes: 10 additions & 0 deletions damus.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1698,6 +1698,10 @@
D77135D42E7B766B00E7639F /* DataExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77135D22E7B766300E7639F /* DataExtensions.swift */; };
D77135D52E7B766B00E7639F /* DataExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77135D22E7B766300E7639F /* DataExtensions.swift */; };
D77135D62E7B78D700E7639F /* DataExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77135D22E7B766300E7639F /* DataExtensions.swift */; };
C38AA7263C1D4183950F64CC /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C90CAF3490482DA896A0D7 /* NetworkMonitor.swift */; };
32D0BA479EA9496DB7D2F0E6 /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C90CAF3490482DA896A0D7 /* NetworkMonitor.swift */; };
D8D1A2B505A749BBA45E4E6F /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C90CAF3490482DA896A0D7 /* NetworkMonitor.swift */; };
90A1B72145AF4E4AB11129F0 /* NetworkMonitor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43C90CAF3490482DA896A0D7 /* NetworkMonitor.swift */; };
D773BC5F2C6D538500349F0A /* CommentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D773BC5E2C6D538500349F0A /* CommentItem.swift */; };
D773BC602C6D538500349F0A /* CommentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = D773BC5E2C6D538500349F0A /* CommentItem.swift */; };
D77BFA0B2AE3051200621634 /* ProfileActionSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D77BFA0A2AE3051200621634 /* ProfileActionSheetView.swift */; };
Expand Down Expand Up @@ -2804,6 +2808,7 @@
D76874F22AE3632B00FB0F68 /* ProfileZapLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileZapLinkView.swift; sourceTree = "<group>"; };
D76BE18B2E0CF3D5004AD0C6 /* Interests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Interests.swift; sourceTree = "<group>"; };
D77135D22E7B766300E7639F /* DataExtensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataExtensions.swift; sourceTree = "<group>"; };
43C90CAF3490482DA896A0D7 /* NetworkMonitor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkMonitor.swift; sourceTree = "<group>"; };
D773BC5E2C6D538500349F0A /* CommentItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommentItem.swift; sourceTree = "<group>"; };
D77BFA0A2AE3051200621634 /* ProfileActionSheetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProfileActionSheetView.swift; sourceTree = "<group>"; };
D783A63E2AD4E53D00658DDA /* SuggestedHashtagsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SuggestedHashtagsView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -4847,6 +4852,7 @@
5C78A7B82E3047DE00CF177D /* Utilities */ = {
isa = PBXGroup;
children = (
43C90CAF3490482DA896A0D7 /* NetworkMonitor.swift */,
D7E5B2D22EA0187B00CF47AC /* StreamPipelineDiagnostics.swift */,
D77135D22E7B766300E7639F /* DataExtensions.swift */,
4CF0ABEA29844B2F00D66079 /* AnyCodable */,
Expand Down Expand Up @@ -6276,6 +6282,7 @@
D733F9E82D92C76100317B11 /* UnownedNdbNote.swift in Sources */,
5CB6459C2EA31D8E0018BD91 /* LabsIntroduction.swift in Sources */,
D77135D42E7B766B00E7639F /* DataExtensions.swift in Sources */,
32D0BA479EA9496DB7D2F0E6 /* NetworkMonitor.swift in Sources */,
D74EA0902D2E271E002290DD /* ErrorView.swift in Sources */,
4CE4F0F429D779B5005914DB /* PostBox.swift in Sources */,
BA37598E2ABCCE500018D73B /* VideoCaptureProcessor.swift in Sources */,
Expand Down Expand Up @@ -6373,6 +6380,7 @@
4C36246E2D5EA10400DD066E /* hash_u5.c in Sources */,
4C36246C2D5EA0E500DD066E /* bolt11.c in Sources */,
D77135D52E7B766B00E7639F /* DataExtensions.swift in Sources */,
D8D1A2B505A749BBA45E4E6F /* NetworkMonitor.swift in Sources */,
4C36246B2D5EA0D700DD066E /* invoice.c in Sources */,
4C36246A2D5EA0CB00DD066E /* content_parser.c in Sources */,
4C3624692D5EA0C200DD066E /* list.c in Sources */,
Expand Down Expand Up @@ -6985,6 +6993,7 @@
D73E5E502C6A97F4007EB227 /* Highlight.swift in Sources */,
D73E5E512C6A97F4007EB227 /* CustomPicker.swift in Sources */,
D77135D32E7B766B00E7639F /* DataExtensions.swift in Sources */,
C38AA7263C1D4183950F64CC /* NetworkMonitor.swift in Sources */,
D73E5E522C6A97F4007EB227 /* UserView.swift in Sources */,
D73E5E532C6A97F4007EB227 /* ZoomableScrollView.swift in Sources */,
D73E5E542C6A97F4007EB227 /* NoteZapButton.swift in Sources */,
Expand Down Expand Up @@ -7612,6 +7621,7 @@
D798D22E2B086E4800234419 /* NostrResponse.swift in Sources */,
D7EDED162B1177840018B19C /* LNUrls.swift in Sources */,
D77135D62E7B78D700E7639F /* DataExtensions.swift in Sources */,
90A1B72145AF4E4AB11129F0 /* NetworkMonitor.swift in Sources */,
D7CCFC132B05887C00323D86 /* ProofOfWork.swift in Sources */,
D7CE1B392B0BE719002EDAD4 /* Table.swift in Sources */,
D7CE1B452B0BE719002EDAD4 /* Root.swift in Sources */,
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
askForAppToLaunch = "Yes"
launchAutomaticallySubstyle = "2">
<BuildableProductRunnable
runnableDebuggingMode = "0">
Expand Down
Loading