From 88ca675d42ebcc9dec3b3be9bdbccda545fa9e61 Mon Sep 17 00:00:00 2001 From: Owais Jamil Date: Sun, 3 May 2026 16:11:11 -0500 Subject: [PATCH] docs: update static site --- .../devtools/cubit/dev_tools_cubit.dart | 10 +- .../devtools/cubit/dev_tools_cubit_test.dart | 56 +-- www/csae-policy.html | 335 ++++++++++++++++++ www/index.html | 7 +- www/privacy.html | 310 ++++++++++++++++ www/{image.png => static/desktop-deck.png} | Bin www/terms.html | 334 +++++++++++++++++ 7 files changed, 1020 insertions(+), 32 deletions(-) create mode 100644 www/csae-policy.html create mode 100644 www/privacy.html rename www/{image.png => static/desktop-deck.png} (100%) create mode 100644 www/terms.html diff --git a/lib/features/devtools/cubit/dev_tools_cubit.dart b/lib/features/devtools/cubit/dev_tools_cubit.dart index 7203f09..c10c4ff 100644 --- a/lib/features/devtools/cubit/dev_tools_cubit.dart +++ b/lib/features/devtools/cubit/dev_tools_cubit.dart @@ -19,7 +19,7 @@ part 'dev_tools_state.dart'; abstract interface class DevToolsRepository { Future resolveHandle({required String handle}); - Future describeRepo({required String repo}); + Future describeRepo({required String repo, String? serviceHost}); Future> searchActorsTypeahead({required String query, int limit = 8}); @@ -54,8 +54,8 @@ final class AtprotoDevToolsRepository implements DevToolsRepository { } @override - Future describeRepo({required String repo}) async { - final response = await _atproto.repo.describeRepo(repo: repo); + Future describeRepo({required String repo, String? serviceHost}) async { + final response = await _atproto.repo.describeRepo(repo: repo, $service: serviceHost); return response.data; } @@ -149,7 +149,7 @@ class DevToolsCubit extends Cubit { return; } - final repo = await _repository.describeRepo(repo: identity.did); + final repo = await _repository.describeRepo(repo: identity.did, serviceHost: identity.pdsHost); if (!_isActiveResolveRequest(resolveRequestId)) { return; } @@ -415,7 +415,7 @@ class DevToolsCubit extends Cubit { return; } - final repo = await _repository.describeRepo(repo: identity.did); + final repo = await _repository.describeRepo(repo: identity.did, serviceHost: identity.pdsHost); if (!_isActiveResolveRequest(resolveRequestId)) { return; } diff --git a/test/features/devtools/cubit/dev_tools_cubit_test.dart b/test/features/devtools/cubit/dev_tools_cubit_test.dart index 9429541..b93fb4f 100644 --- a/test/features/devtools/cubit/dev_tools_cubit_test.dart +++ b/test/features/devtools/cubit/dev_tools_cubit_test.dart @@ -18,7 +18,7 @@ class FakeDevToolsRepository implements DevToolsRepository { }); Future Function({required String handle})? resolveHandleHandler; - Future Function({required String repo})? describeRepoHandler; + Future Function({required String repo, String? serviceHost})? describeRepoHandler; Future> Function({required String query, int limit})? searchActorsTypeaheadHandler; Future Function({ required String repo, @@ -38,8 +38,8 @@ class FakeDevToolsRepository implements DevToolsRepository { getRecordHandler; @override - Future describeRepo({required String repo}) { - return describeRepoHandler!.call(repo: repo); + Future describeRepo({required String repo, String? serviceHost}) { + return describeRepoHandler!.call(repo: repo, serviceHost: serviceHost); } @override @@ -148,17 +148,20 @@ void main() { expect(handle, 'alice.bsky.social'); return const IdentityResolveHandleOutput(did: 'did:plc:alice'); }, - describeRepoHandler: ({required String repo}) async => const RepoDescribeRepoOutput( - handle: 'alice.bsky.social', - did: 'did:plc:alice', - didDoc: { - 'service': [ - {'id': '#atproto_pds', 'type': 'AtprotoPersonalDataServer', 'serviceEndpoint': 'https://alice.host'}, - ], - }, - collections: ['app.bsky.feed.post'], - handleIsCorrect: true, - ), + describeRepoHandler: ({required String repo, String? serviceHost}) async { + expect(serviceHost, 'alice.host'); + return const RepoDescribeRepoOutput( + handle: 'alice.bsky.social', + did: 'did:plc:alice', + didDoc: { + 'service': [ + {'id': '#atproto_pds', 'type': 'AtprotoPersonalDataServer', 'serviceEndpoint': 'https://alice.host'}, + ], + }, + collections: ['app.bsky.feed.post'], + handleIsCorrect: true, + ); + }, listRecordsHandler: ({ required String repo, @@ -210,17 +213,20 @@ void main() { final repository = FakeDevToolsRepository( resolveHandleHandler: ({required String handle}) async => const IdentityResolveHandleOutput(did: 'did:plc:alice'), - describeRepoHandler: ({required String repo}) async => const RepoDescribeRepoOutput( - handle: 'alice.bsky.social', - did: 'did:plc:alice', - didDoc: { - 'service': [ - {'id': '#atproto_pds', 'type': 'AtprotoPersonalDataServer', 'serviceEndpoint': 'https://alice.host'}, - ], - }, - collections: ['app.bsky.feed.post'], - handleIsCorrect: true, - ), + describeRepoHandler: ({required String repo, String? serviceHost}) async { + expect(serviceHost, 'alice.host'); + return const RepoDescribeRepoOutput( + handle: 'alice.bsky.social', + did: 'did:plc:alice', + didDoc: { + 'service': [ + {'id': '#atproto_pds', 'type': 'AtprotoPersonalDataServer', 'serviceEndpoint': 'https://alice.host'}, + ], + }, + collections: ['app.bsky.feed.post'], + handleIsCorrect: true, + ); + }, listRecordsHandler: ({ required String repo, diff --git a/www/csae-policy.html b/www/csae-policy.html new file mode 100644 index 0000000..1da724d --- /dev/null +++ b/www/csae-policy.html @@ -0,0 +1,335 @@ + + + + + + + + Lazurite CSAE Policy + + + + + + + +
+ + +
+

Child Safety Standards (CSAE)

+

Effective May 3, 2026

+

+ This page describes the child safety standards for Lazurite by Stormlight Labs, including + our policies against child sexual abuse and exploitation (CSAE), child sexual abuse + material (CSAM), and related harmful behavior. +

+

+ Zero tolerance: content or behavior involving child sexual abuse, exploitation, or + endangerment is prohibited. +

+ +
+

1) Prohibited content and conduct

+

Lazurite standards prohibit, at minimum:

+
    +
  • Creation, sharing, solicitation, or promotion of CSAM.
  • +
  • Grooming behavior targeting minors.
  • +
  • Sextortion involving minors.
  • +
  • Trafficking, solicitation, or sexual exploitation of children.
  • +
  • Any use of Lazurite to endanger children.
  • +
+
+ +
+

2) In-app reporting and user feedback

+

+ Lazurite provides in-app pathways for users to report content, accounts, and behavior + that may violate safety standards, including CSAE concerns. +

+

+ Reports are reviewed as a priority category and escalated when they indicate possible + child endangerment or CSAM. +

+
+ +
+

3) Response to potential CSAM

+

+ Upon obtaining actual knowledge of potential CSAM, we take appropriate action under our + policies and applicable law. Actions may include: +

+
    +
  • Removing or restricting access to violative content.
  • +
  • Restricting or suspending access to violating accounts and features.
  • +
  • Preserving records necessary for legal reporting and safety investigations.
  • +
+
+ +
+

4) Legal compliance and external reporting

+

+ We maintain procedures to comply with applicable child safety laws and regulations, + including reporting confirmed CSAM to the National Center for Missing and Exploited + Children (NCMEC) or the relevant regional authority as required by law. +

+

+ If you believe a child is in immediate danger, contact local law enforcement + immediately. +

+
+ +
+

5) Child safety point of contact

+

+ Child safety contact for Lazurite / Stormlight Labs: + info@stormlightlabs.org +

+

+ This contact is designated to receive and coordinate potential notifications related to + CSAE and CSAM concerns. +

+
+ +
+

6) Policy updates

+

+ We may update these standards as laws, platform requirements, and enforcement practices + evolve. Material updates will be reflected by an updated effective date. +

+
+ + +
+
+ + + diff --git a/www/index.html b/www/index.html index 88c7675..fb85cd2 100644 --- a/www/index.html +++ b/www/index.html @@ -570,7 +570,7 @@
Lazurite desktop workspace screenshot
@@ -644,7 +644,7 @@
Desktop multi-column layout
Multi-column workspace with search
@@ -750,6 +750,9 @@ at Stormlight Labs · Powered by the AT Protocol + · Child Safety Standards + · Privacy Policy + · Terms of Service

diff --git a/www/privacy.html b/www/privacy.html new file mode 100644 index 0000000..687a1ee --- /dev/null +++ b/www/privacy.html @@ -0,0 +1,310 @@ + + + + + + + + Lazurite Privacy Policy + + + + + + + +
+ + +
+

Privacy Policy

+

Effective April 15, 2026

+

+ Lazurite is a client for Bluesky. Core app behavior runs from your device, and we do not + operate a developer backend for normal use. +

+ +
+

What the app stores on your device

+

+ Lazurite stores account session data, settings, cached content, and other app data + locally so the app can work quickly and reliably. +

+

+ This local data can include profile metadata, viewed posts, follows, lists, likes, + drafts, and media caches. +

+
+ +
+

How your data is used

+

+ Local data is used to keep you signed in, remember your preferences, improve loading + performance, and support offline-friendly behavior. +

+

Lazurite does not sell your personal information.

+
+ +
+

Network requests and third parties

+

+ When you use Lazurite, requests are sent directly from your device to Bluesky and + related infrastructure. +

+

+ Your use of Bluesky remains subject to Bluesky policies, terms, and moderation systems. +

+
+ +
+

Permissions

+

+ If you choose to save media, Lazurite requests photo or storage permissions required by + your platform. +

+

Permissions are used only for the feature you invoke.

+
+ +
+

Diagnostics and logs

+

+ Lazurite keeps local app logs to help troubleshoot issues. These logs stay on your + device unless you choose to share them. +

+

Lazurite does not include ad tracking SDKs.

+
+ +
+

Data retention and control

+

+ Data remains on your device until you remove it by signing out, clearing app storage, + or uninstalling the app. +

+

+ Because Lazurite does not run a central app backend for normal use, most data-control + actions happen on your device or through Bluesky account settings. +

+
+ +
+

Children

+

+ Lazurite is not directed to children under 13, or under the minimum age required in + your jurisdiction. +

+
+ +
+

Policy updates

+

+ We may revise this policy from time to time. Material updates will be reflected by a + new effective date and app release notes when appropriate. +

+
+ + +
+
+ + + diff --git a/www/image.png b/www/static/desktop-deck.png similarity index 100% rename from www/image.png rename to www/static/desktop-deck.png diff --git a/www/terms.html b/www/terms.html new file mode 100644 index 0000000..915bcc5 --- /dev/null +++ b/www/terms.html @@ -0,0 +1,334 @@ + + + + + + + + Lazurite Terms of Service + + + + + + + +
+ + +
+

Terms of Service

+

Effective April 15, 2026

+

+ These Terms govern your use of Lazurite, a Bluesky client built by Stormlight Labs. By + installing or using Lazurite, you agree to these Terms. +

+ +
+

What Lazurite is

+

Lazurite is client software that helps you access Bluesky from your device.

+

Lazurite does not provide the Bluesky network itself.

+
+ +
+

Eligibility

+

+ You must be legally able to agree to these Terms and meet the minimum age requirement + in your jurisdiction. +

+
+ +
+

License

+

+ We grant you a limited, non-exclusive, non-transferable, revocable license to use + Lazurite on devices you control. +

+

+ You may not misuse the app, break applicable law, or attempt unauthorized access to + systems or accounts. +

+
+ +
+

Bluesky terms and policies

+

+ Lazurite depends on Bluesky services, and your use of Bluesky is governed by Bluesky's + own legal terms. +

+
+ +
+

Your account and activity

+

+ You are responsible for your Bluesky account, credentials, and activity taken through + Lazurite. +

+

+ You retain rights to your content, subject to Bluesky policies and any third-party + rights. +

+
+ +
+

Acceptable use

+

+ Do not use Lazurite to harass others, violate rights, distribute unlawful content, or + abuse platform infrastructure. +

+

You are responsible for complying with Bluesky rules and applicable law.

+
+ +
+

Third-party dependencies

+

Lazurite depends on Bluesky and related third-party services.

+

+ If those services change, restrict, or discontinue access, features may degrade or stop + working. +

+
+ +
+

No warranty

+

+ Lazurite is provided "as is" and "as available." We do not guarantee uninterrupted, + secure, or error-free operation. +

+
+ +
+

Liability

+

+ To the maximum extent permitted by law, Stormlight Labs is not liable for indirect, + incidental, or consequential damages arising from your use of Lazurite. +

+
+ +
+

Changes and termination

+

We may update, suspend, or discontinue parts of Lazurite.

+

+ We may update these Terms. Continued use after updates means you accept the revised + Terms. +

+
+ + +
+
+ + + -- 2.51.2