8 Commits

12 changed files with 1176 additions and 41 deletions

View File

@@ -4,14 +4,14 @@
<meta charset="UTF-8" /> <meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Rosetta - Secure & Private Messaging | End-to-End Encrypted Chat</title> <title>Rosetta - Secure & Private Messaging | End-to-End Encrypted Chat</title>
<meta name="description" content="Rosetta is a secure, fast, and private messaging app with military-grade end-to-end encryption. Download for macOS, Windows, and Linux. No phone number required." /> <meta name="description" content="Rosetta is a secure, fast, and private messaging app with military-grade end-to-end encryption. Download for Windows, Linux, and Android. No phone number required." />
<meta name="keywords" content="secure messaging, encrypted chat, private messenger, end-to-end encryption, secure communication" /> <meta name="keywords" content="secure messaging, encrypted chat, private messenger, end-to-end encryption, secure communication" />
<meta name="author" content="Rosetta Team" /> <meta name="author" content="Rosetta Team" />
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" /> <meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:url" content="https://rosetta.im/" /> <meta property="og:url" content="https://rosetta.im/" />
<meta property="og:title" content="Rosetta - Secure Messaging for Everyone" /> <meta property="og:title" content="Rosetta - Secure Messaging for Everyone" />
<meta property="og:description" content="End-to-end encrypted messaging app with zero-knowledge architecture. Download for macOS, Windows, Linux." /> <meta property="og:description" content="End-to-end encrypted messaging app with zero-knowledge architecture. Download for Windows, Linux, and Android." />
<meta property="og:image" content="/og-image.png" /> <meta property="og:image" content="/og-image.png" />
<meta property="og:site_name" content="Rosetta" /> <meta property="og:site_name" content="Rosetta" />
<meta property="og:locale" content="en_US" /> <meta property="og:locale" content="en_US" />
@@ -34,7 +34,7 @@
"description": "Secure end-to-end encrypted messaging application", "description": "Secure end-to-end encrypted messaging application",
"url": "https://rosetta.im", "url": "https://rosetta.im",
"applicationCategory": "CommunicationApplication", "applicationCategory": "CommunicationApplication",
"operatingSystem": ["Windows", "macOS", "Linux", "Android"], "operatingSystem": ["Windows", "Linux", "Android"],
"offers": { "offers": {
"@type": "Offer", "@type": "Offer",
"price": "0", "price": "0",

231
public/privacy/index.html Normal file
View File

@@ -0,0 +1,231 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Privacy Policy for Rosetta</title>
<meta
name="description"
content="Privacy Policy for Rosetta by ROSETTA CLOUD SERVICES LIMITED: how data is handled in the end-to-end encrypted messenger."
/>
<link rel="canonical" href="https://rosetta.im/privacy/" />
<style>
:root {
color-scheme: light dark;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
line-height: 1.6;
color: #1f2937;
background: #ffffff;
}
body {
margin: 0;
background: linear-gradient(180deg, rgba(0, 102, 255, 0.04), rgba(255, 255, 255, 0));
}
main {
width: min(880px, calc(100% - 40px));
margin: 0 auto;
padding: 56px 0 72px;
}
a {
color: #0066ff;
}
h1 {
margin: 0 0 8px;
font-size: clamp(32px, 5vw, 48px);
line-height: 1.1;
}
h2 {
margin-top: 36px;
font-size: 22px;
line-height: 1.25;
}
p,
li {
font-size: 16px;
}
.muted {
color: #6b7280;
}
.back {
display: inline-block;
margin-bottom: 28px;
text-decoration: none;
}
.address {
white-space: pre-line;
}
@media (prefers-color-scheme: dark) {
:root {
color: #f3f4f6;
background: #101113;
}
body {
background: linear-gradient(180deg, rgba(0, 102, 255, 0.12), rgba(16, 17, 19, 0));
}
.muted {
color: #a1a1aa;
}
}
</style>
</head>
<body>
<main>
<a class="back" href="/">Back to home</a>
<h1>Privacy Policy for Rosetta</h1>
<p class="muted">Last updated: May 22, 2026</p>
<p>
Rosetta IM is operated by ROSETTA CLOUD SERVICES LIMITED ("Rosetta",
"we", "us", or "our"). This Privacy Policy explains how we handle
information when you use Rosetta, our end-to-end encrypted messaging
application, and our website at https://rosetta.im.
</p>
<h2>1. Information We Collect</h2>
<p>
Rosetta is designed to minimize data collection. Registration does not
require a phone number, email address, or real name. The app uses
cryptographic keys and technical identifiers needed to operate the
service.
</p>
<ul>
<li>
Account and cryptographic data: public keys, account identifiers, and
related technical data needed to identify users and deliver encrypted
messages. Private keys are intended to remain on your device.
</li>
<li>
Encrypted messages and media in transit: message text, files, and
media are encrypted before they are sent. Our servers are designed to
relay encrypted payloads and encrypted message keys, not to read
message contents.
</li>
<li>
Device and app data: app version, operating system, platform,
architecture, update request data, IP address, timestamps, and server
logs needed for security, reliability, abuse prevention, and update
delivery.
</li>
<li>
Support communications: if you contact us, we may process your email
address, message content, and any information you choose to provide.
</li>
</ul>
<h2>2. Information We Do Not Collect for Advertising</h2>
<p>
We do not use third-party advertising SDKs, advertising trackers, or
cross-app tracking. We do not sell your personal information.
</p>
<h2>3. How We Use Information</h2>
<p>We use information only to:</p>
<ul>
<li>provide, maintain, and secure Rosetta;</li>
<li>route encrypted messages between users;</li>
<li>deliver app updates and downloads;</li>
<li>detect abuse, prevent fraud, and protect service integrity;</li>
<li>respond to support requests;</li>
<li>comply with legal obligations.</li>
</ul>
<h2>4. End-to-End Encryption</h2>
<p>
Rosetta is designed so that message content is encrypted before it
reaches our servers. Our servers are not intended to have access to
decrypted message contents or decrypted media. Messages are stored on
users' devices rather than as readable message history on our servers.
</p>
<h2>5. Sharing of Information</h2>
<p>We may share limited information only with:</p>
<ul>
<li>infrastructure and hosting providers that help us operate Rosetta;</li>
<li>professional advisers, if necessary;</li>
<li>
authorities or other parties when required by law or to protect rights,
safety, and security.
</li>
</ul>
<p>
Any service provider that processes user data for us must protect it
consistently with this Privacy Policy.
</p>
<h2>6. Retention</h2>
<p>
Encrypted message data in transit is processed only as needed to deliver
the service. Technical logs and support communications are retained only
for as long as reasonably necessary for security, reliability, support,
legal, and operational purposes.
</p>
<h2>7. Your Choices and Rights</h2>
<p>
Depending on where you live, you may have rights to access, correct,
delete, or object to certain processing of your personal information. To
make a request, contact us at
<a href="mailto:admin@rosetta.im">admin@rosetta.im</a>.
</p>
<p>
Because Rosetta minimizes account data and uses cryptographic
identifiers, some requests may require you to provide information that
helps us verify control of the relevant account or keys.
</p>
<h2>8. Children</h2>
<p>
Rosetta is not directed to children under 13, or the minimum age required
in your jurisdiction. If we learn that we have collected personal
information from a child without required consent, we will take
appropriate steps to delete it.
</p>
<h2>9. International Transfers</h2>
<p>
ROSETTA CLOUD SERVICES LIMITED may process information in countries other
than where you live. Where required, we use appropriate safeguards for
international transfers.
</p>
<h2>10. Security</h2>
<p>
We use technical and organizational measures designed to protect
information. No system is perfectly secure, and users are responsible for
protecting their devices, private keys, and account access.
</p>
<h2>11. Changes to This Policy</h2>
<p>
We may update this Privacy Policy from time to time. If we make material
changes, we will update the "Last updated" date and, where appropriate,
provide additional notice.
</p>
<h2>12. Contact</h2>
<p class="address">ROSETTA CLOUD SERVICES LIMITED
Registered address:
UNIT 704C 7/F BLK 3 NAN FUNG IND CITY
18 TIN HAU RD
TUEN MUN
HONG KONG</p>
<p>
Email: <a href="mailto:admin@rosetta.im">admin@rosetta.im</a><br />
Support: <a href="/support/">https://rosetta.im/support/</a>
</p>
<p>Phone: <a href="tel:+85228910030">+852 2891 0030</a></p>
</main>
</body>
</html>

BIN
public/rosetta-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -8,8 +8,26 @@
xmlns:video="http://www.google.com/schemas/sitemap-video/1.1"> xmlns:video="http://www.google.com/schemas/sitemap-video/1.1">
<url> <url>
<loc>https://rosetta.im/</loc> <loc>https://rosetta.im/</loc>
<lastmod>2026-02-16</lastmod> <lastmod>2026-07-11</lastmod>
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>1.0</priority> <priority>1.0</priority>
</url> </url>
<url>
<loc>https://rosetta.im/support/</loc>
<lastmod>2026-07-11</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://rosetta.im/privacy/</loc>
<lastmod>2026-07-11</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
<url>
<loc>https://rosetta.im/terms/</loc>
<lastmod>2026-07-11</lastmod>
<changefreq>yearly</changefreq>
<priority>0.5</priority>
</url>
</urlset> </urlset>

599
public/support/index.html Normal file
View File

@@ -0,0 +1,599 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Rosetta Support</title>
<meta
name="description"
content="Contact Rosetta Support for help with account access, recovery phrases, messaging, media, privacy, and security."
/>
<link rel="canonical" href="https://rosetta.im/support/" />
<meta name="robots" content="index, follow" />
<meta name="theme-color" content="#0a67ff" />
<style>
:root {
color-scheme: light dark;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
color: #172033;
background: #f6f8fc;
line-height: 1.5;
}
* {
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
margin: 0;
background: #f6f8fc;
}
a {
color: #075ed3;
}
a:focus-visible {
outline: 3px solid #8dc0ff;
outline-offset: 3px;
}
.page {
width: min(1120px, calc(100% - 40px));
margin: 0 auto;
padding: 24px 0 64px;
}
.topbar {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
}
.brand {
display: inline-flex;
align-items: center;
gap: 10px;
color: inherit;
font-size: 18px;
font-weight: 760;
letter-spacing: 0;
text-decoration: none;
}
.brand-mark {
width: 34px;
height: 34px;
border-radius: 8px;
overflow: hidden;
}
.brand-mark img {
display: block;
width: 100%;
height: 100%;
}
.home-link {
color: #334155;
font-size: 15px;
font-weight: 600;
text-decoration: none;
}
.hero {
max-width: 760px;
padding: 88px 0 58px;
}
.eyebrow {
margin: 0 0 12px;
color: #075ed3;
font-size: 14px;
font-weight: 750;
text-transform: uppercase;
}
h1,
h2,
h3,
p {
margin-top: 0;
}
h1 {
max-width: 650px;
margin-bottom: 20px;
font-size: clamp(38px, 7vw, 68px);
font-weight: 760;
letter-spacing: 0;
line-height: 1.04;
}
.intro {
max-width: 620px;
margin-bottom: 28px;
color: #4b5568;
font-size: clamp(18px, 2.2vw, 21px);
line-height: 1.5;
}
.contact-button {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 50px;
padding: 12px 18px;
border-radius: 8px;
background: #0a67ff;
color: #ffffff;
font-size: 16px;
font-weight: 720;
text-decoration: none;
}
.contact-button:hover {
background: #0055ca;
}
.quick-links {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 14px;
margin-bottom: 72px;
}
.quick-link {
display: block;
min-height: 138px;
padding: 22px;
border: 1px solid #dbe2ee;
border-radius: 8px;
background: #ffffff;
color: inherit;
text-decoration: none;
}
.quick-link:hover {
border-color: #a7c9ff;
box-shadow: 0 10px 24px rgba(26, 61, 110, 0.08);
}
.quick-link strong {
display: block;
margin-bottom: 8px;
font-size: 17px;
}
.quick-link span {
color: #64748b;
font-size: 15px;
line-height: 1.4;
}
.section {
padding: 52px 0;
border-top: 1px solid #dbe2ee;
}
.section-heading {
display: grid;
grid-template-columns: minmax(0, 0.8fr) minmax(0, 1.2fr);
gap: 32px;
align-items: start;
margin-bottom: 28px;
}
h2 {
margin-bottom: 0;
font-size: clamp(28px, 4vw, 38px);
letter-spacing: 0;
line-height: 1.12;
}
.section-copy {
margin-bottom: 0;
color: #526176;
font-size: 17px;
}
.faq {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;
}
details {
display: grid;
grid-template-rows: auto 0fr;
padding: 19px 20px;
border: 1px solid #dbe2ee;
border-radius: 8px;
background: #ffffff;
overflow: hidden;
transition: grid-template-rows 260ms cubic-bezier(0.2, 0.8, 0.2, 1), border-color 180ms ease;
}
details[open] {
grid-template-rows: auto 1fr;
}
summary {
display: grid;
grid-template-columns: minmax(0, 1fr) 28px;
gap: 12px;
align-items: center;
min-height: 28px;
cursor: pointer;
color: #1d293d;
font-size: 17px;
font-weight: 710;
list-style: none;
}
summary::-webkit-details-marker {
display: none;
}
summary::marker {
content: "";
}
summary::after {
display: grid;
width: 28px;
height: 28px;
place-items: center;
color: #075ed3;
content: "+";
font-size: 26px;
font-weight: 500;
line-height: 1;
transform: rotate(0deg);
transition: transform 220ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
details[open] summary::after {
transform: rotate(45deg);
}
details > p {
display: block;
min-height: 0;
margin: 0;
overflow: hidden;
color: #526176;
font-size: 15px;
opacity: 0;
transform: translateY(-4px);
transition: opacity 140ms ease, transform 180ms ease, margin 260ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
details[open] > p {
margin: 14px 0 0;
opacity: 1;
transform: translateY(0);
transition-delay: 70ms;
}
@media (prefers-reduced-motion: reduce) {
details,
summary::after,
details > p {
transition: none;
}
}
.contact-panel {
display: grid;
grid-template-columns: minmax(0, 1.1fr) minmax(240px, 0.9fr);
gap: 28px;
padding: 32px;
border-radius: 8px;
background: #0e1e39;
color: #ffffff;
}
.contact-panel h2 {
margin-bottom: 12px;
}
.contact-panel p {
max-width: 580px;
margin-bottom: 0;
color: #cbd7ed;
font-size: 17px;
}
.contact-details {
align-self: center;
padding: 20px;
border: 1px solid rgba(255, 255, 255, 0.18);
border-radius: 8px;
background: rgba(255, 255, 255, 0.07);
}
.contact-details strong,
.contact-details a {
display: block;
}
.contact-details strong {
margin-bottom: 6px;
font-size: 15px;
}
.contact-details a {
color: #ffffff;
font-size: 18px;
font-weight: 700;
overflow-wrap: anywhere;
}
.legal-links {
display: flex;
flex-wrap: wrap;
gap: 18px;
padding-top: 32px;
}
.legal-links a {
color: #526176;
font-size: 15px;
}
@media (max-width: 720px) {
.page {
width: min(100% - 32px, 1120px);
padding-top: 16px;
}
.hero {
padding: 64px 0 42px;
}
.quick-links,
.faq,
.section-heading,
.contact-panel {
grid-template-columns: 1fr;
}
.quick-links {
margin-bottom: 52px;
}
.section {
padding: 40px 0;
}
.contact-panel {
gap: 20px;
padding: 24px;
}
}
@media (prefers-color-scheme: dark) {
:root {
color: #eff4ff;
background: #0c111a;
}
body {
background: #0c111a;
}
a,
.eyebrow {
color: #72afff;
}
.home-link,
.quick-link,
summary {
color: #eef4ff;
}
.intro,
.section-copy,
.quick-link span,
details p,
.legal-links a {
color: #aab8cf;
}
.quick-link,
details {
border-color: #29354a;
background: #141c29;
}
.quick-link:hover {
border-color: #427fc7;
box-shadow: 0 10px 24px rgba(0, 0, 0, 0.2);
}
.section {
border-color: #29354a;
}
.contact-button {
background: #3986ff;
}
.contact-button:hover {
background: #5b9bff;
}
}
</style>
</head>
<body>
<main class="page">
<header class="topbar">
<a class="brand" href="/" aria-label="Rosetta home">
<span class="brand-mark"><img src="/rosetta-logo.png" alt="" /></span>
Rosetta
</a>
<a class="home-link" href="/">Back to home</a>
</header>
<section class="hero" aria-labelledby="support-title">
<p class="eyebrow">Rosetta Support</p>
<h1 id="support-title">Help with your Rosetta account and messages.</h1>
<p class="intro">
Find answers about account access, recovery phrases, private messaging,
shared media, and privacy. For anything else, contact our support team.
</p>
<a class="contact-button" href="mailto:admin@rosetta.im?subject=Rosetta%20Support%20Request">
Email Rosetta Support
</a>
</section>
<nav class="quick-links" aria-label="Support topics">
<a class="quick-link" href="#account">
<strong>Account and access</strong>
<span>Recovery phrases, device access, and account security.</span>
</a>
<a class="quick-link" href="#messaging">
<strong>Messaging and media</strong>
<span>Messages, photos, videos, files, voice messages, and groups.</span>
</a>
<a class="quick-link" href="#privacy">
<strong>Privacy and safety</strong>
<span>Security questions, privacy information, and abuse reports.</span>
</a>
</nav>
<section class="section" id="account" aria-labelledby="account-heading">
<div class="section-heading">
<h2 id="account-heading">Account and access</h2>
<p class="section-copy">
Rosetta accounts are accessed with a recovery phrase instead of a phone number.
Keep your phrase private and stored somewhere safe.
</p>
</div>
<div class="faq">
<details>
<summary>How do I access my account on a new device?</summary>
<p>
Install Rosetta and enter your recovery phrase in the exact order it was created.
Rosetta may ask you to confirm a new device to protect your account.
</p>
</details>
<details>
<summary>I lost my recovery phrase. Can it be restored?</summary>
<p>
No. Your recovery phrase is the key to your account. Rosetta cannot recover it
for you, so keep it private and backed up before you need it.
</p>
</details>
<details>
<summary>Why am I asked to confirm a new device?</summary>
<p>
New-device confirmation helps prevent someone who has obtained a recovery phrase
from silently accessing your account on another device.
</p>
</details>
<details>
<summary>How do I report an account-access problem?</summary>
<p>
Email us with the device model, Rosetta version, and a short description of what
happened. Do not include your recovery phrase or private keys.
</p>
</details>
</div>
</section>
<section class="section" id="messaging" aria-labelledby="messaging-heading">
<div class="section-heading">
<h2 id="messaging-heading">Messaging and media</h2>
<p class="section-copy">
Rosetta supports private chats, groups, photos, videos, files, and voice messages.
Attachment choices can vary depending on your device permissions and the selected item.
</p>
</div>
<div class="faq">
<details>
<summary>How do I send a photo, video, or file?</summary>
<p>
Open a chat, tap the attachment button next to the message field, choose the item
you want to share, then send it. Allow Photos or Files access when iOS asks for it.
</p>
</details>
<details>
<summary>Why is an attachment still sending?</summary>
<p>
Media uploads depend on the file size and your connection. Keep Rosetta open and
connected until the send indicator completes. You can retry a message that failed.
</p>
</details>
<details>
<summary>How do I send a voice message?</summary>
<p>
In a chat, press and hold the microphone control to record, then release it to send.
Microphone permission is required the first time you record.
</p>
</details>
<details>
<summary>How do I get help with a group?</summary>
<p>
Contact us with the group name and a description of the issue. Do not send private
recovery phrases, message contents, or encryption keys.
</p>
</details>
</div>
</section>
<section class="section" id="privacy" aria-labelledby="privacy-heading">
<div class="section-heading">
<h2 id="privacy-heading">Privacy and safety</h2>
<p class="section-copy">
Rosetta is designed for private communication. If you have a security concern or a
question about data handling, contact us directly.
</p>
</div>
<div class="faq">
<details>
<summary>How is message content protected?</summary>
<p>
Rosetta is designed to encrypt message content before it is sent. For details about
how we handle data, read the Rosetta Privacy Policy.
</p>
</details>
<details>
<summary>How do I report abuse or a security issue?</summary>
<p>
Email <a href="mailto:admin@rosetta.im?subject=Rosetta%20Security%20Report">admin@rosetta.im</a>
with a description of the concern. Do not include recovery phrases or private keys.
</p>
</details>
</div>
</section>
<section class="contact-panel" aria-labelledby="contact-heading">
<div>
<h2 id="contact-heading">Need more help?</h2>
<p>
Send us a message with your device model, app version, and a short explanation of the
issue. Never send a recovery phrase, private key, or private message content.
</p>
</div>
<div class="contact-details">
<strong>Rosetta Support</strong>
<a href="mailto:admin@rosetta.im?subject=Rosetta%20Support%20Request">admin@rosetta.im</a>
</div>
</section>
<footer class="legal-links">
<a href="/">Rosetta home</a>
<a href="/privacy/">Privacy Policy</a>
<a href="/terms/">Terms of Use</a>
</footer>
</main>
</body>
</html>

260
public/terms/index.html Normal file
View File

@@ -0,0 +1,260 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Terms of Use for Rosetta</title>
<meta
name="description"
content="Terms of Use and End User License Agreement for Rosetta by ROSETTA CLOUD SERVICES LIMITED."
/>
<link rel="canonical" href="https://rosetta.im/terms/" />
<style>
:root {
color-scheme: light dark;
font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
line-height: 1.6;
color: #1f2937;
background: #ffffff;
}
body {
margin: 0;
background: linear-gradient(180deg, rgba(0, 102, 255, 0.04), rgba(255, 255, 255, 0));
}
main {
width: min(880px, calc(100% - 40px));
margin: 0 auto;
padding: 56px 0 72px;
}
a {
color: #0066ff;
}
h1 {
margin: 0 0 8px;
font-size: clamp(32px, 5vw, 48px);
line-height: 1.1;
}
h2 {
margin-top: 36px;
font-size: 22px;
line-height: 1.25;
}
p,
li {
font-size: 16px;
}
.muted {
color: #6b7280;
}
.back {
display: inline-block;
margin-bottom: 28px;
text-decoration: none;
}
.address {
white-space: pre-line;
}
@media (prefers-color-scheme: dark) {
:root {
color: #f3f4f6;
background: #101113;
}
body {
background: linear-gradient(180deg, rgba(0, 102, 255, 0.12), rgba(16, 17, 19, 0));
}
.muted {
color: #a1a1aa;
}
}
</style>
</head>
<body>
<main>
<a class="back" href="/">Back to home</a>
<h1>Terms of Use for Rosetta</h1>
<p class="muted">Last updated: May 22, 2026</p>
<p>
These Terms of Use and End User License Agreement ("Terms") govern your
use of Rosetta, an end-to-end encrypted messaging application operated by
ROSETTA CLOUD SERVICES LIMITED ("Rosetta", "we", "us", or "our").
</p>
<p>
By downloading, installing, or using Rosetta, you agree to these Terms.
</p>
<h2>1. Agreement Between You and Rosetta</h2>
<p>
These Terms are concluded between you and ROSETTA CLOUD SERVICES LIMITED
only, and not with Apple. We, not Apple, are solely responsible for
Rosetta and its content.
</p>
<h2>2. License</h2>
<p>
We grant you a limited, non-exclusive, non-transferable, revocable
license to use Rosetta for personal or lawful business communication on
Apple-branded products that you own or control, as permitted by the Apple
Media Services Terms and Conditions, including applicable Family Sharing,
volume purchasing, or Legacy Contacts rules.
</p>
<p>
You may not copy, modify, reverse engineer, decompile, resell,
sublicense, rent, lease, or distribute Rosetta except as permitted by
applicable law.
</p>
<h2>3. Privacy</h2>
<p>
Your use of Rosetta is also governed by our Privacy Policy, available at
<a href="/privacy/">https://rosetta.im/privacy/</a>.
</p>
<h2>4. Encrypted Messaging</h2>
<p>
Rosetta is designed for end-to-end encrypted communication. You are
responsible for protecting your device, private keys, and access
credentials. If you lose access to your device or keys, we may not be
able to restore your messages or account data.
</p>
<h2>5. Acceptable Use</h2>
<p>You agree not to use Rosetta to:</p>
<ul>
<li>violate any law or regulation;</li>
<li>infringe the rights of others;</li>
<li>send spam, malware, scams, threats, harassment, or unlawful content;</li>
<li>
attempt to disrupt, overload, reverse engineer, or compromise Rosetta
or its infrastructure;
</li>
<li>impersonate another person or misrepresent your identity;</li>
<li>use Rosetta for any prohibited or sanctioned activity.</li>
</ul>
<h2>6. No Emergency Use</h2>
<p>
Rosetta is not designed for emergency calls, emergency messaging, or
communications where failure or delay could cause death, personal injury,
or serious damage. Use official emergency channels when needed.
</p>
<h2>7. User Content</h2>
<p>
You retain ownership of the content you create or send through Rosetta.
You grant us the limited rights necessary to operate the service, such as
routing encrypted messages and maintaining service security. We do not
claim ownership of your messages or files.
</p>
<h2>8. Updates and Availability</h2>
<p>
We may update, modify, suspend, or discontinue Rosetta or parts of the
service at any time. Some features may require an internet connection or
a compatible device and operating system.
</p>
<h2>9. Fees</h2>
<p>
Rosetta is currently offered as a free application unless stated
otherwise. If paid features, subscriptions, or in-app purchases are
introduced through Apple, Apple's payment and subscription terms will
apply.
</p>
<h2>10. Maintenance and Support</h2>
<p>
ROSETTA CLOUD SERVICES LIMITED is solely responsible for providing
maintenance and support for Rosetta. Apple has no obligation to provide
maintenance or support services for Rosetta.
</p>
<p>
Support contact: <a href="mailto:admin@rosetta.im">admin@rosetta.im</a><br />
Support centre: <a href="/support/">https://rosetta.im/support/</a>
</p>
<h2>11. Warranty</h2>
<p>
Rosetta is provided "as is" and "as available" to the maximum extent
permitted by law. If Rosetta fails to conform to any applicable warranty,
you may notify Apple, and Apple may refund the purchase price, if any,
for the app. To the maximum extent permitted by law, Apple has no other
warranty obligation for Rosetta.
</p>
<h2>12. Product Claims</h2>
<p>
ROSETTA CLOUD SERVICES LIMITED, not Apple, is responsible for addressing
any claims relating to Rosetta, including product liability claims, legal
or regulatory claims, and claims under consumer protection or similar
laws.
</p>
<h2>13. Intellectual Property Claims</h2>
<p>
If a third party claims that Rosetta or your use of Rosetta infringes
intellectual property rights, ROSETTA CLOUD SERVICES LIMITED, not Apple,
is responsible for the investigation, defense, settlement, and discharge
of that claim.
</p>
<h2>14. Legal Compliance</h2>
<p>
You represent that you are not located in a country subject to a U.S.
Government embargo or designated by the U.S. Government as a "terrorist
supporting" country, and that you are not listed on any U.S. Government
list of prohibited or restricted parties.
</p>
<h2>15. Third-Party Beneficiary</h2>
<p>
Apple and Apple's subsidiaries are third-party beneficiaries of these
Terms. Upon your acceptance of these Terms, Apple has the right to
enforce these Terms against you as a third-party beneficiary.
</p>
<h2>16. Termination</h2>
<p>
We may suspend or terminate access to Rosetta if you violate these Terms,
create risk for other users, or use the service unlawfully. You may stop
using Rosetta at any time.
</p>
<h2>17. Limitation of Liability</h2>
<p>
To the maximum extent permitted by law, ROSETTA CLOUD SERVICES LIMITED
will not be liable for indirect, incidental, special, consequential, or
punitive damages, or for loss of data, profits, goodwill, or business
opportunities arising from your use of Rosetta.
</p>
<h2>18. Governing Law</h2>
<p>
These Terms are governed by the laws of Hong Kong, unless local consumer
protection law requires otherwise.
</p>
<h2>19. Contact</h2>
<p class="address">ROSETTA CLOUD SERVICES LIMITED
Registered address:
UNIT 704C 7/F BLK 3 NAN FUNG IND CITY
18 TIN HAU RD
TUEN MUN
HONG KONG</p>
<p>Email: <a href="mailto:admin@rosetta.im">admin@rosetta.im</a></p>
<p>Phone: <a href="tel:+85228910030">+852 2891 0030</a></p>
</main>
</body>
</html>

View File

@@ -7,6 +7,7 @@ import { FeaturesGrid } from './components/FeaturesGrid/FeaturesGrid';
import { SEO } from './components/SEO/SEO'; import { SEO } from './components/SEO/SEO';
import './style.css' import './style.css'
import { MessageSteps } from './components/MessageSteps/MessageSteps'; import { MessageSteps } from './components/MessageSteps/MessageSteps';
import { Footer } from './components/Footer/Footer';
export default function App() { export default function App() {
@@ -17,6 +18,7 @@ export default function App() {
<FeaturesGrid></FeaturesGrid> <FeaturesGrid></FeaturesGrid>
<MessageSteps></MessageSteps> <MessageSteps></MessageSteps>
<DownloadCenter></DownloadCenter> <DownloadCenter></DownloadCenter>
<Footer></Footer>
</MantineProvider> </MantineProvider>
) )
} }

View File

@@ -5,13 +5,12 @@ import {
Flex, Flex,
Text, Text,
Title, Title,
useComputedColorScheme,
useMantineTheme, useMantineTheme,
} from '@mantine/core'; } from '@mantine/core';
import classes from './DownloadCenter.module.css'; import classes from './DownloadCenter.module.css';
import { RosettaLogo } from '../RosettaLogo/RosettaLogo'; import { RosettaLogo } from '../RosettaLogo/RosettaLogo';
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { FaApple, FaWindows } from 'react-icons/fa'; import { FaWindows } from 'react-icons/fa';
import { FcAndroidOs, FcLinux } from 'react-icons/fc'; import { FcAndroidOs, FcLinux } from 'react-icons/fc';
import { Switch } from '../Switch/Switch'; import { Switch } from '../Switch/Switch';
import { IconDownload } from '@tabler/icons-react'; import { IconDownload } from '@tabler/icons-react';
@@ -33,15 +32,15 @@ interface UpdateItem {
const fetchUpdates = async (): Promise<DownloadFeature[]> => { const fetchUpdates = async (): Promise<DownloadFeature[]> => {
try { try {
const response = await fetch('https://sdu.rosetta.im/updates/all'); const response = await fetch('https://sdu.rosetta.im/updates/all');
const data = await response.json(); const data = (await response.json()) as { items?: UpdateItem[] };
return (data.items || []).map((item: UpdateItem) => ({ return (data.items || []).map((item) => ({
platform: item.platform, platform: item.platform,
arch: item.arch, arch: item.arch,
version: item.version, version: item.version,
link: new URL(item.downloadUrl, 'https://sdu.rosetta.im').toString(), link: new URL(item.downloadUrl, 'https://sdu.rosetta.im').toString(),
})).sort((a : any, b : any) => { })).sort((a, b) => {
const platformOrder = ['darwin', 'linux', 'win32', 'android']; const platformOrder = ['linux', 'win32', 'android'];
const archOrder = ['arm64', 'x64', 'universal'] const archOrder = ['arm64', 'x64', 'universal']
const platformComparison = platformOrder.indexOf(a.platform) - platformOrder.indexOf(b.platform); const platformComparison = platformOrder.indexOf(a.platform) - platformOrder.indexOf(b.platform);
if (platformComparison !== 0) { if (platformComparison !== 0) {
@@ -57,9 +56,8 @@ const fetchUpdates = async (): Promise<DownloadFeature[]> => {
export function DownloadCenter() { export function DownloadCenter() {
const theme = useMantineTheme(); const theme = useMantineTheme();
const colorScheme = useComputedColorScheme();
const [kernels, setKernels] = useState<DownloadFeature[]>([]); const [kernels, setKernels] = useState<DownloadFeature[]>([]);
const [targetPlatforms, setTargetPlatforms] = useState<string[]>(['darwin', 'linux', 'win32', 'android']); const [targetPlatforms, setTargetPlatforms] = useState<string[]>(['linux', 'win32', 'android']);
useEffect(() => { useEffect(() => {
fetchUpdates().then(setKernels); fetchUpdates().then(setKernels);
@@ -69,14 +67,11 @@ export function DownloadCenter() {
let targetPlatforms: string[] = []; let targetPlatforms: string[] = [];
switch(value){ switch(value){
case 'All': case 'All':
targetPlatforms = ['darwin', 'linux', 'win32', 'android']; targetPlatforms = ['linux', 'win32', 'android'];
break; break;
case 'Windows': case 'Windows':
targetPlatforms = ['win32']; targetPlatforms = ['win32'];
break; break;
case 'macOS':
targetPlatforms = ['darwin'];
break;
case 'Android': case 'Android':
targetPlatforms = ['android']; targetPlatforms = ['android'];
break; break;
@@ -89,8 +84,6 @@ export function DownloadCenter() {
const translatePlatformToOsName = (platform: string) => { const translatePlatformToOsName = (platform: string) => {
switch(platform){ switch(platform){
case 'darwin':
return 'macOS';
case 'linux': case 'linux':
return 'Linux'; return 'Linux';
case 'win32': case 'win32':
@@ -104,8 +97,6 @@ export function DownloadCenter() {
const translatePlatformAndArchToCpuName = (platform : string, arch: string) => { const translatePlatformAndArchToCpuName = (platform : string, arch: string) => {
switch(platform){ switch(platform){
case 'darwin':
return arch === 'arm64' ? 'Apple Silicon' : 'Intel';
case 'linux': case 'linux':
return arch === 'arm64' ? 'ARM64' : 'x64'; return arch === 'arm64' ? 'ARM64' : 'x64';
case 'win32': case 'win32':
@@ -121,9 +112,6 @@ export function DownloadCenter() {
const features = kernels.filter((v) => targetPlatforms.includes(v.platform)).map((feature) => ( const features = kernels.filter((v) => targetPlatforms.includes(v.platform)).map((feature) => (
<Card key={feature.link} radius="md" className={classes.card} padding="xl"> <Card key={feature.link} radius="md" className={classes.card} padding="xl">
<Flex direction={'column'} align="center" justify={'center'}> <Flex direction={'column'} align="center" justify={'center'}>
{feature.platform === 'darwin' && <FaApple size={50} color={
colorScheme == 'dark' ? 'white' : 'black'
} />}
{feature.platform === 'linux' && <FcLinux size={50} />} {feature.platform === 'linux' && <FcLinux size={50} />}
{feature.platform === 'win32' && <FaWindows size={50} color={theme.colors.blue[6]} />} {feature.platform === 'win32' && <FaWindows size={50} color={theme.colors.blue[6]} />}
{feature.platform === 'android' && <FcAndroidOs size={50} />} {feature.platform === 'android' && <FcAndroidOs size={50} />}
@@ -131,14 +119,6 @@ export function DownloadCenter() {
{translatePlatformToOsName(feature.platform)} - {translatePlatformAndArchToCpuName(feature.platform, feature.arch)} {translatePlatformToOsName(feature.platform)} - {translatePlatformAndArchToCpuName(feature.platform, feature.arch)}
</Text> </Text>
<Text c="dimmed" fz="sm" ta={'center'} mt="xs"> <Text c="dimmed" fz="sm" ta={'center'} mt="xs">
{feature.platform == 'darwin' && <>
{feature.arch == 'arm64' && <>
Download this version if you have a Mac with Apple Silicon (M1, M2 chips).
</>}
{feature.arch == 'x64' && <>
Download this version if you have a Mac with an Intel processor, which was most likely manufactured before 2020.
</>}
</>}
{feature.platform == 'linux' && <>This version is for Linux and comes as an AppImage for the GUI versions.</>} {feature.platform == 'linux' && <>This version is for Linux and comes as an AppImage for the GUI versions.</>}
{feature.platform == 'win32' && <>Download this version of you have computer on Windows 10 or later.</>} {feature.platform == 'win32' && <>Download this version of you have computer on Windows 10 or later.</>}
{feature.platform == 'android' && <>This version is for Android devices and all architectures.</>} {feature.platform == 'android' && <>This version is for Android devices and all architectures.</>}
@@ -165,7 +145,7 @@ export function DownloadCenter() {
</Text> </Text>
<Flex justify={'center'} mt={'lg'}> <Flex justify={'center'} mt={'lg'}>
<Switch onChange={switchTarget} data={['All', 'Windows', 'macOS', 'Linux', 'Android']}></Switch> <Switch onChange={switchTarget} data={['All', 'Windows', 'Linux', 'Android']}></Switch>
</Flex> </Flex>
<Flex gap="xl" justify={'center'} wrap={'wrap'} align={'center'} mt={50}> <Flex gap="xl" justify={'center'} wrap={'wrap'} align={'center'} mt={50}>
@@ -174,4 +154,4 @@ export function DownloadCenter() {
</Container> </Container>
</div> </div>
); );
} }

View File

@@ -1,9 +1,10 @@
import { IconGauge, IconLock, IconMessage2, IconServer, IconUser, IconUsersGroup } from '@tabler/icons-react'; import { IconGauge, IconLock, IconMessage2, IconServer, IconUser, IconUsersGroup, type TablerIcon } from '@tabler/icons-react';
import { Container, Flex, SimpleGrid, Text, ThemeIcon, Title } from '@mantine/core'; import { Container, Flex, SimpleGrid, Text, ThemeIcon, Title } from '@mantine/core';
import type { ReactNode } from 'react';
import classes from './FeaturesGrid.module.css'; import classes from './FeaturesGrid.module.css';
import { RosettaLogo } from '../RosettaLogo/RosettaLogo'; import { RosettaLogo } from '../RosettaLogo/RosettaLogo';
export const MOCKDATA = [ const MOCKDATA = [
{ {
icon: IconGauge, icon: IconGauge,
title: 'Performance', title: 'Performance',
@@ -43,9 +44,9 @@ export const MOCKDATA = [
]; ];
interface FeatureProps { interface FeatureProps {
icon: React.FC<any>; icon: TablerIcon;
title: React.ReactNode; title: ReactNode;
description: React.ReactNode; description: ReactNode;
} }
export function Feature({ icon: Icon, title, description }: FeatureProps) { export function Feature({ icon: Icon, title, description }: FeatureProps) {
@@ -94,4 +95,4 @@ export function FeaturesGrid() {
</Container> </Container>
</div> </div>
); );
} }

View File

@@ -0,0 +1,17 @@
.footer {
padding: var(--mantine-spacing-xl) var(--mantine-spacing-md);
border-top: 1px solid light-dark(var(--mantine-color-gray-2), var(--mantine-color-dark-5));
}
.legal {
max-width: 720px;
margin: 0 auto;
}
.links {
display: flex;
justify-content: center;
gap: var(--mantine-spacing-md);
flex-wrap: wrap;
margin-top: var(--mantine-spacing-xs);
}

View File

@@ -0,0 +1,27 @@
import { Anchor, Text } from '@mantine/core';
import classes from './Footer.module.css';
const LEGAL_NAME = 'ROSETTA CLOUD SERVICES LIMITED';
export function Footer() {
const currentYear = new Date().getFullYear();
return (
<footer className={classes.footer}>
<Text c="dimmed" fz="sm" ta="center" className={classes.legal}>
&copy; {currentYear} {LEGAL_NAME}. All rights reserved.
</Text>
<nav className={classes.links} aria-label="Legal information">
<Anchor href="/support/" size="sm" c="dimmed">
Support
</Anchor>
<Anchor href="/privacy/" size="sm" c="dimmed">
Privacy Policy
</Anchor>
<Anchor href="/terms/" size="sm" c="dimmed">
Terms of Use
</Anchor>
</nav>
</footer>
);
}

View File

@@ -9,7 +9,7 @@ interface SEOProps {
export function SEO({ export function SEO({
title = 'Rosetta - Secure Messaging for Everyone', title = 'Rosetta - Secure Messaging for Everyone',
description = 'End-to-end encrypted messaging app with military-grade security. Download for macOS, Windows, Linux.', description = 'End-to-end encrypted messaging app with military-grade security. Download for Windows, Linux, and Android.',
ogImage = '/og-image.png', ogImage = '/og-image.png',
keywords = 'secure messaging, encrypted chat, private messenger' keywords = 'secure messaging, encrypted chat, private messenger'
}: SEOProps) { }: SEOProps) {