diff --git a/.github/workflows/deploy.preview.yml b/.github/workflows/deploy.preview.yml new file mode 100644 index 0000000..640953b --- /dev/null +++ b/.github/workflows/deploy.preview.yml @@ -0,0 +1,76 @@ +name: Deploy SMSWithoutBorders Blog on Server (preview) + +on: + push: + branches: + - preview + +permissions: + contents: read + +concurrency: + group: preview-deploy + cancel-in-progress: true + +jobs: + deploy: + name: Build and Deploy + runs-on: ubuntu-latest + environment: + name: preview + url: https://preview-6.relaysms.afkanerd.de + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Set up Node.js + uses: actions/setup-node@v6 + with: + node-version: 22 + + - name: Enable Corepack and activate pnpm + run: | + corepack enable + corepack prepare pnpm --activate + + - name: Install dependencies + run: pnpm install --no-lockfile + + - name: Build application + env: + BASE_URL: ${{ vars.BASE_URL }} + run: pnpm build + + - name: Clean remote target directory + uses: appleboy/ssh-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USER }} + key: ${{ secrets.SSH_KEY }} + script: | + set -e + find "${{ secrets.BUILD_PATH }}" -mindepth 1 -delete + + - name: Copy build artifacts to server + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USER }} + key: ${{ secrets.SSH_KEY }} + source: "./out/*" + target: ${{ secrets.BUILD_PATH }} + strip_components: 1 + rm: false + + - name: Run remote deploy script + uses: appleboy/ssh-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USER }} + key: ${{ secrets.SSH_KEY }} + script: | + set -e + echo "::group::Deploying preview build" + ${{ secrets.BUILD_CMD }} + echo "Deploy command finished successfully." + echo "::endgroup::" diff --git a/.github/workflows/deploy.production.yml b/.github/workflows/deploy.production.yml new file mode 100644 index 0000000..bc20161 --- /dev/null +++ b/.github/workflows/deploy.production.yml @@ -0,0 +1,76 @@ +name: Deploy SMSWithoutBorders Blog on Server (production) + +on: + push: + branches: + - main + +permissions: + contents: read + +concurrency: + group: production-deploy + cancel-in-progress: false + +jobs: + deploy: + name: Build and Deploy + runs-on: ubuntu-latest + environment: + name: production + url: https://blog.smswithoutborders.com + steps: + - name: Checkout repository + uses: actions/checkout@v7 + + - name: Set up Node.js + uses: actions/setup-node@v6 + with: + node-version: 22 + + - name: Enable Corepack and activate pnpm + run: | + corepack enable + corepack prepare pnpm --activate + + - name: Install dependencies + run: pnpm install --no-lockfile + + - name: Build application + env: + BASE_URL: ${{ vars.BASE_URL }} + run: pnpm build + + - name: Clean remote target directory + uses: appleboy/ssh-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USER }} + key: ${{ secrets.SSH_KEY }} + script: | + set -e + find "${{ secrets.BUILD_PATH }}" -mindepth 1 -delete + + - name: Copy build artifacts to server + uses: appleboy/scp-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USER }} + key: ${{ secrets.SSH_KEY }} + source: "./out/*" + target: ${{ secrets.BUILD_PATH }} + strip_components: 1 + rm: false + + - name: Run remote deploy script + uses: appleboy/ssh-action@v1 + with: + host: ${{ secrets.HOST }} + username: ${{ secrets.USER }} + key: ${{ secrets.SSH_KEY }} + script: | + set -e + echo "::group::Deploying production build" + ${{ secrets.BUILD_CMD }} + echo "Deploy command finished successfully." + echo "::endgroup::" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 1ead656..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Code Quality and Formatting Check - -on: - push: - branches: - - staging - pull_request: - branches: - - staging - -jobs: - check-code-quality: - name: Check Code Quality - runs-on: ubuntu-latest - - steps: - - name: Check out Git repository - uses: actions/checkout@v4 - - - name: Set up Node.js - uses: actions/setup-node@v4 - with: - node-version: 18 - - - name: Install Node.js dependencies - run: yarn install - - - name: Run ESLint - run: yarn eslint . - - - name: Run Prettier - run: yarn prettier --check . \ No newline at end of file diff --git a/.github/workflows/prod-deploy.yml b/.github/workflows/prod-deploy.yml deleted file mode 100644 index a847727..0000000 --- a/.github/workflows/prod-deploy.yml +++ /dev/null @@ -1,62 +0,0 @@ -name: Deploy SMSWithoutBorders Blog on Server (production) -on: - push: - branches: - - main -jobs: - deploy: - name: Execute Deployment Script on Server - runs-on: ubuntu-latest - environment: - name: production - url: https://blog.smswithoutborders.com - steps: - - name: Checkout Git Repository - uses: actions/checkout@v4 - - - name: Setup NodeJs - uses: actions/setup-node@v4 - with: - node-version: 20 - - - name: Create .env.local file - run: echo "BASE_URL=${{ secrets.BASE_URL }}" > .env.local - - - name: Install Dependencies - run: | - npm install -g pnpm - pnpm install --no-lockfile - - - name: Build Application - run: pnpm build - - - name: Securely Copy Artifacts to Server - uses: appleboy/scp-action@master - with: - host: ${{ secrets.HOST }} - username: ${{ secrets.USERNAME }} - key: ${{ secrets.KEY }} - source: "./out/*" - target: ${{ secrets.BUILD_PATH }} - strip_components: 1 - rm: true - - - name: Execute Remote SSH Commands - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.HOST }} - username: ${{ secrets.USERNAME }} - key: ${{ secrets.KEY }} - script: | - set -e - - echo "============================" - echo "Deploy Project ..." - echo "============================" - if ! ${{secrets.BUILD_CMD}}; then - echo "❌ Error deploying project!" - exit 1 - fi - echo "===============================" - echo "✅ Deployment complete" - echo "===============================" diff --git a/.github/workflows/staging-deploy.yml b/.github/workflows/staging-deploy.yml deleted file mode 100644 index b8edecc..0000000 --- a/.github/workflows/staging-deploy.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Deploy SMSWithoutBorders Blog on Server (staging) -on: - push: - branches: - - staging -jobs: - deploy: - name: Execute Deployment Script on Server - runs-on: ubuntu-latest - environment: - name: staging - url: https://staging.smswithoutborders.com:18000 - steps: - - name: Execute Remote SSH Commands - uses: appleboy/ssh-action@master - with: - host: ${{ secrets.HOST }} - username: ${{ secrets.USERNAME }} - key: ${{ secrets.KEY }} - script: | - set -e - - echo "============================" - echo "Updating repository ..." - echo "============================" - cd ${{ secrets.PROJECT_PATH }} - if ! git pull; then - echo "❌ Error updating repository!" - exit 1 - fi - echo "===============================" - echo "✅ Repository update complete" - echo "===============================" - - echo "=========================" - echo "Building project ..." - echo "=========================" - if ! ${{ secrets.BUILD_CMD }}; then - echo "❌ Error building project!" - exit 1 - fi - echo "===========================" - echo "✅ Project build complete" - echo "===========================" - if ! ${{ secrets.CLEANUP_CMD }}; then - echo "❌ Error cleaning up builds!" - exit 1 - fi - echo "=============================" - echo "✅ Cleanup complete" - echo "=============================" diff --git a/.husky/.gitignore b/.husky/.gitignore deleted file mode 100644 index 31354ec..0000000 --- a/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 36af219..0000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx lint-staged diff --git a/_posts/Bridges.md b/_posts/Bridges.md index 77f89cc..f3ac7b6 100644 --- a/_posts/Bridges.md +++ b/_posts/Bridges.md @@ -1,7 +1,6 @@ --- title: "RelaySMS Bridges" excerpt: "Before now RelaySMS required online setup processes, including account creation and saving platforms. RelaySMS Bridges breaks these barriers." -coverImage: "/icon.png" date: "2024-11-14" author: name: "Aysha Musa" diff --git a/_posts/Local-Storage-for-Your-Access-Tokens.md b/_posts/Local-Storage-for-Your-Access-Tokens.md index 9b8f633..7e2beaf 100644 --- a/_posts/Local-Storage-for-Your-Access-Tokens.md +++ b/_posts/Local-Storage-for-Your-Access-Tokens.md @@ -1,7 +1,6 @@ --- title: "Local Storage for Your Access Tokens" excerpt: "Storing your tokens locally means reducing your reliance on our servers and giving you total control of your stored tokens. This is especially valuable for users who value privacy and control over their data." -coverImage: "/icon.png" date: "2025-06-05" author: name: "Aysha Musa" diff --git a/_posts/New-Features-on-RelaySMS.md b/_posts/New-Features-on-RelaySMS.md index 2371033..6949de1 100644 --- a/_posts/New-Features-on-RelaySMS.md +++ b/_posts/New-Features-on-RelaySMS.md @@ -1,7 +1,6 @@ --- title: "New Features on RelaySMS" excerpt: "At SMSWithoutBorders, we're constantly working to improve how users stay connected even without internet access." -coverImage: "/icon.png" date: "2025-03-14" author: name: "Aysha Musa" diff --git a/_posts/RelaySMSDesktop.md b/_posts/RelaySMSDesktop.md index 7a84dcb..984e2c7 100644 --- a/_posts/RelaySMSDesktop.md +++ b/_posts/RelaySMSDesktop.md @@ -1,7 +1,6 @@ --- title: "Introducing the RelaySMS Desktop Application" excerpt: "We’re excited to announce the launch of the RelaySMS Desktop Application, a standalone app designed to bring offline to online messaging to your desktop." -coverImage: "/icon.png" date: "2024-12-10" author: name: "Aysha Musa" diff --git a/_posts/audit-blog-post.md b/_posts/audit-blog-post.md index cc7cb4d..20793ad 100644 --- a/_posts/audit-blog-post.md +++ b/_posts/audit-blog-post.md @@ -1,7 +1,6 @@ --- title: "SMSWithoutBorders: Keeping You Secure - Results of a Penetration Test" excerpt: "We're committed to keeping your communications safe. That's why we had a rigorous penetration test conducted by Radically Open Security (ROS). While we found and fixed a few vulnerabilities, the good news is that your data is secure with RelaySMS" -coverImage: "/icon.png" date: "2024-07-31" author: name: "Aysha Musa" diff --git a/_posts/default-app.md b/_posts/default-app.md index f499eee..0cc3781 100644 --- a/_posts/default-app.md +++ b/_posts/default-app.md @@ -1,7 +1,6 @@ --- title: "RelaySMS Can Now Be Your Default SMS App" excerpt: "When you set RelaySMS as your default SMS app, all your regular SMS messages move right into your RelaySMS app. You’ll see every text, every conversation, all inside one familiar inbox." -coverImage: "/icon.png" date: "2025-10-30" author: name: "Vanessa Christopher" diff --git a/_posts/no-accounts.md b/_posts/no-accounts.md new file mode 100644 index 0000000..5656db5 --- /dev/null +++ b/_posts/no-accounts.md @@ -0,0 +1,53 @@ +--- +title: "RelaySMS just got an upgrade : here's what's new" +excerpt: "We've been working on some changes to RelaySMS and we're excited to finally share them with you. If you've used RelaySMS before, you know the drill internet goes down, you still need to get a message out. That's what we built this for. This update just makes it a lot smoother to do that." +coverImage: "/posts/post.png" +date: "2026-08-07" +author: + - name: "Aysha Musa" + picture: "/anon-avatar.svg" + - name: "Vanessa Christopher" + picture: "/anon-avatar.svg" +ogImage: + url: "/posts/post.png" +--- + + + +We are releasing a newer version of RelaySMS with some major updates. The most prominent of which is no more accounts and logins. This release rolled for Android by the time you are reading this. Here are the new introductions; + + +#### No more accounts + +In previous releases of RelaySMS, the usage flow included: Log into/Create an account, save tokens and send messages. The first step required the user to take some privacy measures; in cases where they do not want to link their accounts to their identity. We made the decision of removing that step as it does not provide inherent benefits for the users. This means the server has no way of knowing which user has what token all together. + +Rather the user can now save whatever account they want to publish from during a shutdown. That account is referenced with a unique token stored on the user’s device and references to the cloud. The token is tied to the user’s security keys stored on device and also on the server; so losing this token makes publishing impossible. + +In case the user wants to change their device, they can now [backup and restore](https://docs.smswithoutborders.com/docs/Android%20Tutorial/Step-4-Back-Up-and-Restore) their stored tokens and keys on the new device. + + + +#### Shorter messages, lower SMS costs +We have made the messages RelaySMS sends significantly shorter. We accomplished this with a ground-up rebuild of our [messaging protocols](https://smswithoutborders.com/research/relaysms-payload-specs) +This moves us closer to solving one of the biggest issues with using SMS as a transport for publishing online; the cost of sending an SMS message. + + +#### Save your platforms and restore them anytime + +You can now connect your platforms; Gmail, Bluesky, Telegram, or RelaySMS Mail and back them up so you never lose them. + +Here's why that matters: +Let's say you delete your saved platforms or something happens to your app. In the past that could mean losing everything and having to start over. Now you can back up your saved platforms, keep the restore key somewhere safe, and pick up right where you left off whenever you need to. +It takes about a minute to restore. So even if you haven't touched the app in months, you can come back during a shutdown and be ready to send straight away. + +#### A cleaner, easier interface + +Alongside the bigger changes, we have made a number of subtle UI improvements to make the app easier to navigate. + +That is the update. Simple, but we think it makes a real difference especially for the people using RelaySMS in situations where every detail counts. This update is available on android only for now and will be coming to the iOS soon. + +Need a hand? Visit our [tutorials](https://docs.smswithoutborders.com/) for guides on setting up and using RelaySMS. + +Download the latest version here: [Play Store](https://play.google.com/store/apps/details?id=com.afkanerd.sw0b) + +As always, if you have feedback or run into anything — we're listening. Find us on [Telegram](https://t.me/+IPYp6q06dWsyZjY0), [X](https://x.com/RelaySMS), or [GitHub](https://github.com/smswithoutborders). diff --git a/_posts/rebranding.md b/_posts/rebranding.md index 503ddd9..17fc8c9 100644 --- a/_posts/rebranding.md +++ b/_posts/rebranding.md @@ -1,7 +1,6 @@ --- title: "Rebranding" excerpt: "SMSWithoutBorders itself is becoming the umbrella project encompassing RelaySMS and other messaging tools. The core functionality remains the same, but users can expect a new name, enhanced security features, and a focus on future growth under the SMSWithoutBorders project." -coverImage: "/icon.png" date: "2024-06-27" author: name: "Aysha Musa" diff --git a/_posts/relaysms-expands-user-control-with-device-id-registration.md b/_posts/relaysms-expands-user-control-with-device-id-registration.md index 3695eeb..8bb380f 100644 --- a/_posts/relaysms-expands-user-control-with-device-id-registration.md +++ b/_posts/relaysms-expands-user-control-with-device-id-registration.md @@ -1,7 +1,6 @@ --- title: "RelaySMS Expands User Control with Device ID Registration" excerpt: "RelaySMS (swob app) introduces a powerful new feature: Device ID Registration with RelaySMS Vault! This innovative approach gives you more control over your offline messaging experience." -coverImage: "/icon.png" date: "2024-07-01" author: name: "Aysha Musa" diff --git a/_posts/reliability-of-gateway-clients-in-smswithoutborders.md b/_posts/reliability-of-gateway-clients-in-smswithoutborders.md index 4cda171..48ee8d6 100644 --- a/_posts/reliability-of-gateway-clients-in-smswithoutborders.md +++ b/_posts/reliability-of-gateway-clients-in-smswithoutborders.md @@ -1,7 +1,6 @@ --- title: "Reliability Of Gateway Clients In Smswithoutborders" excerpt: "SMSWithoutBorders is a free mobile app that lets you send secure SMS messages to online platforms like Gmail, Telegram, and X (Twitter) without needing the internet. This blog will explain how SMSWithoutBorders does this using tools like SMSWithoutBorders Gateway Clients." -coverImage: "/icon.png" date: "2024-04-05" author: name: "Aysha Musa" diff --git a/_posts/resilience-of-gateway-clients-in-smswithoutborders.md b/_posts/resilience-of-gateway-clients-in-smswithoutborders.md index e4d3f8c..d61b98a 100644 --- a/_posts/resilience-of-gateway-clients-in-smswithoutborders.md +++ b/_posts/resilience-of-gateway-clients-in-smswithoutborders.md @@ -1,7 +1,6 @@ --- title: "Resilience Of Gateway Clients In SMSWithoutBorders" excerpt: "SMSWithoutBorders is pleased to announce a significant advancement in message-forwarding functionalities for its gateway clients" -coverImage: "/icon.png" date: "2024-04-16" author: name: "Aysha Musa" diff --git a/_posts/sending-images-with-relay.md b/_posts/sending-images-with-relay.md index a105776..876e73f 100644 --- a/_posts/sending-images-with-relay.md +++ b/_posts/sending-images-with-relay.md @@ -1,7 +1,6 @@ --- title: "Sending Images Without Internet? Yeah, That’s a Thing Now." excerpt: "Internet down? Doesn’t matter. RelaySMS just leveled up. You can now send images over SMS fully encrypted, no Wi-Fi, no internet connection necessary" -coverImage: "/icon.png" date: "2025-10-31" author: name: "Aysha Musa" diff --git a/_posts/smswithoutborders-telemetry-dashboard.md b/_posts/smswithoutborders-telemetry-dashboard.md index d88f1a2..2406711 100644 --- a/_posts/smswithoutborders-telemetry-dashboard.md +++ b/_posts/smswithoutborders-telemetry-dashboard.md @@ -1,7 +1,6 @@ --- title: "SMSWithoutborders Telemetry Dashboard" excerpt: "The SMSwithoutBorders Telemetry Dashboard sheds light on user behavior through key metrics like sign-ups, active users, and user location. This data empowers the team to optimize the app, ensuring a secure and seamless messaging experience for a global audience." -coverImage: "/icon.png" date: "2024-04-26" author: name: "Aysha Musa" diff --git a/_releases/vault-0-1-0.md b/_releases/vault-0-1-0.md index 625b26b..038660b 100644 --- a/_releases/vault-0-1-0.md +++ b/_releases/vault-0-1-0.md @@ -1,7 +1,6 @@ --- title: "New Alpha Release: Vault 0.1.0" excerpt: "SMSWithoutBorders Vault 0.1.0 is Now Available in Alpha Release! The Vault is a technology developed by the SMSWithoutBorders team to secure users' access tokens and facilitate the secure usage of these tokens for publishing users' messages." -coverImage: "/icon.png" date: "2024-06-28" author: name: "Promise Fru" diff --git a/package.json b/package.json index aad5a88..807c9a7 100644 --- a/package.json +++ b/package.json @@ -9,42 +9,43 @@ "prepare": "husky" }, "dependencies": { - "@ant-design/icons": "~5.6.1", + "@ant-design/icons": "~6.3.2", "classnames": "^2.5.1", - "date-fns": "^3.6.0", + "date-fns": "^4.4.0", "gray-matter": "^4.0.3", - "next": "16.2.11", + "next": "16.3.1", "next-nprogress-bar": "^2.4.7", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-icons": "^5.5.0", - "react-markdown": "^9.1.0", + "react": "^19.2.8", + "react-dom": "^19.2.8", + "react-icons": "^5.7.0", + "react-markdown": "^10.1.0", "remark": "^15.0.1", "remark-html": "^16.0.1" }, "devDependencies": { - "@next/eslint-plugin-next": "^14.2.33", - "@types/node": "^20.19.24", - "@types/react": "^18.3.26", - "@types/react-dom": "^18.3.7", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", - "autoprefixer": "^10.4.21", - "eslint": "^8.57.1", - "eslint-config-prettier": "^9.1.2", - "eslint-formatter-summary": "^1.1.0", - "eslint-plugin-json": "^3.1.0", - "eslint-plugin-prettier": "^5.5.4", + "@next/eslint-plugin-next": "^16.3.1", + "@types/node": "^26.2.0", + "@types/react": "^19.2.18", + "@types/react-dom": "^19.2.4", + "@typescript-eslint/eslint-plugin": "^8.67.0", + "@typescript-eslint/parser": "^8.67.0", + "autoprefixer": "^10.5.4", + "eslint": "^10.8.1", + "eslint-config-prettier": "^10.1.8", + "eslint-formatter-summary": "^2.0.2", + "eslint-plugin-json": "^5.0.0", + "eslint-plugin-prettier": "^5.5.6", "eslint-plugin-react": "^7.37.5", "husky": "^9.1.7", - "lint-staged": "^15.5.2", - "postcss": "^8.5.6", - "prettier": "^3.6.2", + "lint-staged": "^17.3.0", + "postcss": "^8.5.26", + "prettier": "^3.9.6", "tailwindcss": "^3.4.18", - "typescript": "^5.9.3" + "typescript": "^7.0.2" }, "lint-staged": { "*.js,jsx,ts,tsx": "eslint --cache --fix", "*.{js,jsx,ts,tsx,json,css,md}": "prettier --cache -w" - } + }, + "packageManager": "pnpm@10.20.0+sha512.cf9998222162dd85864d0a8102e7892e7ba4ceadebbf5a31f9c2fce48dfce317a9c53b9f6464d1ef9042cba2e02ae02a9f7c143a2b438cd93c91840f0192b9dd" } diff --git a/public/icon-dark.png b/public/icon-dark.png new file mode 100644 index 0000000..d1a02b1 Binary files /dev/null and b/public/icon-dark.png differ diff --git a/public/posts/post.png b/public/posts/post.png new file mode 100644 index 0000000..4f3243b Binary files /dev/null and b/public/posts/post.png differ diff --git a/src/app/_components/avatar.tsx b/src/app/_components/avatar.tsx index 1babc38..497387e 100644 --- a/src/app/_components/avatar.tsx +++ b/src/app/_components/avatar.tsx @@ -1,28 +1,59 @@ +import { type AuthorLike } from "@/interfaces/author"; import Image from "next/image"; type Props = { - name: string; - picture: string; + author: AuthorLike; }; -const Avatar = ({ name, picture }: Props) => { +function formatAuthors(author: AuthorLike) { + if (Array.isArray(author)) { + if (author.length === 0) { + return ""; + } + if (author.length === 1) { + return author[0].name; + } + if (author.length === 2) { + return `${author[0].name} and ${author[1].name}`; + } + return `${author + .slice(0, -1) + .map((item) => item.name) + .join(", ")} and ${author[author.length - 1].name}`; + } + + return author.name; +} + +const Avatar = ({ author }: Props) => { + const authors = Array.isArray(author) ? author : [author]; + const displayName = formatAuthors(author); + const primaryAuthor = authors[0]; + return (
{excerpt}
-{excerpt}
{excerpt}
+ SMSWithoutBorders Newsletter +
*/} +