Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
2 changes: 1 addition & 1 deletion _posts/Bridges.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2024-11-14"
author:
name: "Aysha Musa"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---
Expand Down
2 changes: 1 addition & 1 deletion _posts/Local-Storage-for-Your-Access-Tokens.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2025-06-05"
author:
name: "Aysha Musa"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---
Expand Down
2 changes: 1 addition & 1 deletion _posts/New-Features-on-RelaySMS.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2025-03-14"
author:
name: "Aysha Musa"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---
Expand Down
2 changes: 1 addition & 1 deletion _posts/RelaySMSDesktop.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2024-12-10"
author:
name: "Aysha Musa"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---
Expand Down
2 changes: 1 addition & 1 deletion _posts/audit-blog-post.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2024-07-31"
author:
name: "Aysha Musa"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---
Expand Down
29 changes: 29 additions & 0 deletions _posts/default-app.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
---
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"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---

We’ve been quietly building something we have all wanted since day one, and it’s finally here! You can now make RelaySMS your _default SMS app_.

If you’ve been using RelaySMS, you already know how it helps you send messages online during internet shutdowns, throttling, or just bad network connections, and until now, you still had to switch between your phone’s SMS app and RelaySMS, but that wasn’t ideal or too smooth. So…we fixed it!

#### Now, everything happens in one place.

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.

And when you’re offline or facing a shutdown, you can still send your messages online straight from the same app (doesn’t that sound great?!).

RelaySMS was built to help people stay connected even when access is taken away. Making it the _default SMS app_ brings us closer to that goal: one cool app that keeps your messages moving, whether you are online or offline.

No switching. No copying encrypted messages. Just one smooth experience.

We’re really proud of this update, and we’d love for you to try it and let us know what you think.

[Update](https://play.google.com/store/apps/details?id=com.afkanerd.sw0b) RelaySMS today and make it your default SMS app.
2 changes: 1 addition & 1 deletion _posts/rebranding.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2024-06-27"
author:
name: "Aysha Musa"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2024-07-01"
author:
name: "Aysha Musa"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2024-04-05"
author:
name: "Aysha Musa"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2024-04-16"
author:
name: "Aysha Musa"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---
Expand Down
37 changes: 37 additions & 0 deletions _posts/sending-images-with-relay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
---
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"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---

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.

This update is a big deal for people who work or live where the internet isn’t always guaranteed, including journalists and digital rights defenders. Basically, anyone who still needs to show what’s happening when everything else goes dark.
RelaySMS now lets you share visuals that speak louder than words, even when you’re completely offline.

#### How it works technically

So SMS, as we know it wasn’t built for this. A single text only carries 160 bytes, and that’s nothing compared to even a tiny image. So our team rebuilt how SMS handles big data.
Now, when you send a photo:

RelaySMS compresses and resizes it, keeping it clear enough to see but light enough to move.

Splits the image into encrypted chunks, sends them one by one, and reassembles them perfectly on the other side.

If your phone is interrupted or restarts mid-send, the app just keeps going where it left off.

And because it’s using Signal’s Double Ratchet encryption, your data stays locked tight the whole way through.

All of this works when you set RelaySMS as your default SMS app (also a thing now!), turning your phone into an all-in-one offline communication machine.

The feature is live for Android right now on the [Play Store](https://play.google.com/store/apps/details?id=com.afkanerd.sw0b)

We’ve also open-sourced the RelaySMS Image SDK available on [GitHub](https://github.com/smswithoutborders) so other developers can build on this tech for their own offline apps.
Enjoy!
2 changes: 1 addition & 1 deletion _posts/smswithoutborders-telemetry-dashboard.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2024-04-26"
author:
name: "Aysha Musa"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
draft: true
Expand Down
2 changes: 1 addition & 1 deletion _releases/vault-0-1-0.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ coverImage: "/icon.png"
date: "2024-06-28"
author:
name: "Promise Fru"
picture: "/anon-avatar.jpeg"
picture: "/anon-avatar.svg"
ogImage:
url: "/icon.png"
---
Expand Down
35 changes: 18 additions & 17 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,38 +9,39 @@
"prepare": "husky"
},
"dependencies": {
"@ant-design/icons": "~5.6.1",
"classnames": "^2.5.1",
"date-fns": "^3.6.0",
"gray-matter": "^4.0.3",
"next": "14.1.0",
"next-nprogress-bar": "^2.3.15",
"next-nprogress-bar": "^2.4.7",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-icons": "^5.3.0",
"react-markdown": "^9.0.1",
"react-icons": "^5.5.0",
"react-markdown": "^9.1.0",
"remark": "^15.0.1",
"remark-html": "^16.0.1"
},
"devDependencies": {
"@next/eslint-plugin-next": "^14.2.18",
"@types/node": "^20.17.6",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@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.20",
"autoprefixer": "^10.4.21",
"eslint": "^8.57.1",
"eslint-config-prettier": "^9.1.0",
"eslint-config-prettier": "^9.1.2",
"eslint-formatter-summary": "^1.1.0",
"eslint-plugin-json": "^3.1.0",
"eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.37.2",
"husky": "^9.1.6",
"lint-staged": "^15.2.10",
"postcss": "^8.4.49",
"prettier": "^3.3.3",
"tailwindcss": "^3.4.14",
"typescript": "^5.6.3"
"eslint-plugin-prettier": "^5.5.4",
"eslint-plugin-react": "^7.37.5",
"husky": "^9.1.7",
"lint-staged": "^15.5.2",
"postcss": "^8.5.6",
"prettier": "^3.6.2",
"tailwindcss": "^3.4.18",
"typescript": "^5.9.3"
},
"lint-staged": {
"*.js,jsx,ts,tsx": "eslint --cache --fix",
Expand Down
Binary file removed public/anon-avatar.jpeg
Binary file not shown.
1 change: 1 addition & 0 deletions public/anon-avatar.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/favicon/favicon.ico
Binary file not shown.
Binary file modified public/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/posts/default-app.jpeg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
17 changes: 14 additions & 3 deletions src/app/_components/avatar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,21 @@ type Props = {
const Avatar = ({ name, picture }: Props) => {
return (
<div className="flex items-center">
<div className="h-12 w-12 rounded-full mr-4">
<Image src={picture} alt={name} width={60} height={60} className="rounded-full" />
<div className="h-12 w-12 rounded-full mr-4 bg-gray-200 align-center">
<Image
src={picture}
alt={name}
width={20}
height={20}
style={{
margin: "auto",
marginTop: 12,
opacity: "40%"
}}
className="rounded-full"
/>
</div>
<div className="text-sm text-gray-700 font-bold">{name}</div>
<h6 className="text-sm text-gray-700 font-bold">{name}</h6>
</div>
);
};
Expand Down
2 changes: 1 addition & 1 deletion src/app/_components/footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export function Footer() {
const currentYear = new Date().getFullYear();

return (
<footer className="border-t text-white border-neutral-200 bg-indigo-950 justify-between items-center py-5">
<footer className="border-t text-white border-neutral-200 bg-gray-900 justify-between items-center py-5">
<Container>
<div className="flex flex-col md:flex-row justify-between items-center md:px-4">
<Logo src="/icon.png" alt="SMSWithoutBorders Logo" name="SMSWithoutBorders" url="/" />
Expand Down
2 changes: 1 addition & 1 deletion src/app/_components/hero-post.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export function HeroPost({ title, date, excerpt, author, slug }: Props) {
<section>
<div className="md:grid md:grid-cols-2 md:gap-x-16 lg:gap-x-8 mb-20 md:mb-28">
<div>
<h3 className="mb-4 text-4xl lg:text-5xl leading-tight">
<h3 className="mb-4 text-3xl lg:text-4xl leading-tight">
<Link as={`/posts/${slug}`} href="/posts/[slug]" className="hover:underline">
{title}
</Link>
Expand Down
5 changes: 2 additions & 3 deletions src/app/_components/navbar.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
"use client";
import { useState } from "react";
import Container from "@/app/_components/container";
import Logo from "./logo";
import { FACEBOOK_URL, GITHUB_URL, X_URL, LINKEDIN_URL } from "@/lib/constants";
import { FaFacebook, FaXTwitter, FaGithub, FaLinkedin, FaEnvelope } from "react-icons/fa6";
Expand All @@ -15,7 +14,7 @@ export function Navbar() {

return (
<div className="border-b text-black border-neutral-300 bg-white w-full z-10 py-4 fixed top-0">
<Container>
<div className="px-5">
<div className="flex justify-between items-center">
<Logo
src="/icon.png"
Expand Down Expand Up @@ -85,7 +84,7 @@ export function Navbar() {
</a>
</div>
</div>
</Container>
</div>
<div
className={`md:hidden ${isMenuOpen ? "block" : "hidden"} mt-5 px-4 py-2 rounded-lg shadow-md`}
>
Expand Down
4 changes: 2 additions & 2 deletions src/app/_components/post-preview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,11 @@ type Props = {
export function PostPreview({ title, date, excerpt, author, slug, content }: Props) {
return (
<div className="border border-neutral-300 rounded-lg bg-white py-20 px-5 md:px-24 gap-y-5 mb-20">
<h1 className="text-2xl md:text-3xl mb-3 mx-4 text-center">
<h3 className="text-2xl md:text-2xl mb-3 mx-4 text-center">
<Link as={`/posts/${slug}`} href="/posts/[slug]" className="hover:underline font-semibold">
{title}
</Link>
</h1>
</h3>
<div className="text-base text-gray-700 text-center mb-4">
<DateFormatter dateString={date} />
</div>
Expand Down
15 changes: 15 additions & 0 deletions src/app/globals.css
Original file line number Diff line number Diff line change
@@ -1,3 +1,18 @@
@import url("https://fonts.googleapis.com/css2?family=Ubuntu:wght@300&family=Unbounded:wght@400&display=swap");
@tailwind base;
@tailwind components;
@tailwind utilities;

@layer base {
h1,
h2,
h3,
h4,
h5,
h6 {
font-family: Unbounded, sans-serif;
}
p {
font-family: Ubuntu, sans-serif;
}
}
8 changes: 6 additions & 2 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import Footer from "@/app/_components/footer";
import { HOME_OG_IMAGE_URL } from "@/lib/constants";
import type { Metadata } from "next";
import { Inter } from "next/font/google";
import { Inter, Unbounded } from "next/font/google";
import Navbar from "@/app/_components/navbar";
import Providers from "./_components/ProgressBarProvider";

import "./globals.css";

const inter = Inter({ subsets: ["latin"] });
const unbounded = Unbounded({
subsets: ["latin"],
variable: "--font-unbounded"
});

const baseURL = process.env.BASE_URL || "http://localhost:3000";

Expand Down Expand Up @@ -41,7 +45,7 @@ export default function RootLayout({
<meta name="theme-color" content="#000" />
<link rel="alternate" type="application/rss+xml" href="/feed.xml" />
</head>
<body className={inter.className}>
<body className={`${inter.className} ${unbounded.variable}`}>
<Providers>
<Navbar />
<div className="min-h-screen bg-neutral-100">{children}</div>
Expand Down
3 changes: 3 additions & 0 deletions tailwind.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ const config: Config = {
],
theme: {
extend: {
fontFamily: {
unbounded: ["var(--font-unbounded)", "sans-serif"]
},
backgroundImage: {
"gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
"gradient-conic": "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))"
Expand Down
Loading