Skip to content

Commit 4150e15

Browse files
author
safenestdev
committed
Rebrand SafeNest to Tuteliq
- Update domain from safenest.dev to tuteliq.ai - Update API endpoint to api.tuteliq.ai - Update docs URL to ai.tuteliq.ai/docs - Rename all class names, constants, and references - Add mission statement to README - Update logo
1 parent fbeaf48 commit 4150e15

12 files changed

Lines changed: 617 additions & 86 deletions

File tree

.github/ISSUE_TEMPLATE/bug_report.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
name: Bug Report
3-
about: Report a bug in the SafeNest Python SDK
3+
about: Report a bug in the Tuteliq Python SDK
44
title: "[Bug] "
55
labels: bug
66
assignees: ""

.github/workflows/ci.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ jobs:
2828
pip install -e ".[dev]"
2929
3030
- name: Run type checker
31-
run: mypy safenest
31+
run: mypy tuteliq
3232

3333
- name: Run linter
34-
run: ruff check safenest tests
34+
run: ruff check tuteliq tests
3535

3636
- name: Run tests
3737
run: pytest tests/ -v

LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2025 SafeNest
3+
Copyright (c) 2025 Tuteliq
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.md

Lines changed: 56 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
<p align="center">
2-
<img src="./assets/logo.png" alt="SafeNest" width="200" />
2+
<img src="./assets/logo.png" alt="Tuteliq" width="200" />
33
</p>
44

5-
<h1 align="center">SafeNest Python SDK</h1>
5+
<h1 align="center">Tuteliq Python SDK</h1>
66

77
<p align="center">
8-
<strong>Official Python SDK for the SafeNest API</strong><br>
8+
<strong>Official Python SDK for the Tuteliq API</strong><br>
99
AI-powered child safety analysis
1010
</p>
1111

1212
<p align="center">
13-
<a href="https://pypi.org/project/safenest/"><img src="https://img.shields.io/pypi/v/safenest.svg" alt="PyPI version"></a>
14-
<a href="https://pypi.org/project/safenest/"><img src="https://img.shields.io/pypi/pyversions/safenest.svg" alt="Python versions"></a>
15-
<a href="https://github.com/SafeNestSDK/python/actions"><img src="https://img.shields.io/github/actions/workflow/status/SafeNestSDK/python/ci.yml" alt="build status"></a>
16-
<a href="https://github.com/SafeNestSDK/python/blob/main/LICENSE"><img src="https://img.shields.io/github/license/SafeNestSDK/python.svg" alt="license"></a>
13+
<a href="https://pypi.org/project/tuteliq/"><img src="https://img.shields.io/pypi/v/tuteliq.svg" alt="PyPI version"></a>
14+
<a href="https://pypi.org/project/tuteliq/"><img src="https://img.shields.io/pypi/pyversions/tuteliq.svg" alt="Python versions"></a>
15+
<a href="https://github.com/Tuteliq/python/actions"><img src="https://img.shields.io/github/actions/workflow/status/Tuteliq/python/ci.yml" alt="build status"></a>
16+
<a href="https://github.com/Tuteliq/python/blob/main/LICENSE"><img src="https://img.shields.io/github/license/Tuteliq/python.svg" alt="license"></a>
1717
</p>
1818

1919
<p align="center">
20-
<a href="https://api.safenest.dev/docs">API Docs</a> •
21-
<a href="https://safenest.app">Dashboard</a> •
20+
<a href="https://api.tuteliq.ai/docs">API Docs</a> •
21+
<a href="https://tuteliq.app">Dashboard</a> •
2222
<a href="https://discord.gg/7kbTeRYRXD">Discord</a>
2323
</p>
2424

@@ -27,7 +27,7 @@
2727
## Installation
2828

2929
```bash
30-
pip install safenest
30+
pip install tuteliq
3131
```
3232

3333
### Requirements
@@ -40,10 +40,10 @@ pip install safenest
4040

4141
```python
4242
import asyncio
43-
from safenest import SafeNest
43+
from tuteliq import Tuteliq
4444

4545
async def main():
46-
client = SafeNest(api_key="your-api-key")
46+
client = Tuteliq(api_key="your-api-key")
4747

4848
# Quick safety analysis
4949
result = await client.analyze("Message to check")
@@ -60,7 +60,7 @@ asyncio.run(main())
6060
Or use as a context manager:
6161

6262
```python
63-
async with SafeNest(api_key="your-api-key") as client:
63+
async with Tuteliq(api_key="your-api-key") as client:
6464
result = await client.analyze("Message to check")
6565
```
6666

@@ -71,13 +71,13 @@ async with SafeNest(api_key="your-api-key") as client:
7171
### Initialization
7272

7373
```python
74-
from safenest import SafeNest
74+
from tuteliq import Tuteliq
7575

7676
# Simple
77-
client = SafeNest(api_key="your-api-key")
77+
client = Tuteliq(api_key="your-api-key")
7878

7979
# With options
80-
client = SafeNest(
80+
client = Tuteliq(
8181
api_key="your-api-key",
8282
timeout=30.0, # Request timeout in seconds
8383
max_retries=3, # Retry attempts
@@ -100,7 +100,7 @@ if result.is_bullying:
100100
### Grooming Detection
101101

102102
```python
103-
from safenest import DetectGroomingInput, GroomingMessage, MessageRole
103+
from tuteliq import DetectGroomingInput, GroomingMessage, MessageRole
104104

105105
result = await client.detect_grooming(
106106
DetectGroomingInput(
@@ -152,7 +152,7 @@ print(f"Followup: {result.recommended_followup}")
152152
### Action Plan
153153

154154
```python
155-
from safenest import GetActionPlanInput, Audience, Severity
155+
from tuteliq import GetActionPlanInput, Audience, Severity
156156

157157
plan = await client.get_action_plan(
158158
GetActionPlanInput(
@@ -170,7 +170,7 @@ print(f"Tone: {plan.tone}")
170170
### Incident Report
171171

172172
```python
173-
from safenest import GenerateReportInput, ReportMessage
173+
from tuteliq import GenerateReportInput, ReportMessage
174174

175175
report = await client.generate_report(
176176
GenerateReportInput(
@@ -227,9 +227,9 @@ print(f"Request ID: {client.last_request_id}")
227227
## Error Handling
228228

229229
```python
230-
from safenest import (
231-
SafeNest,
232-
SafeNestError,
230+
from tuteliq import (
231+
Tuteliq,
232+
TuteliqError,
233233
AuthenticationError,
234234
RateLimitError,
235235
ValidationError,
@@ -253,7 +253,7 @@ except TimeoutError as e:
253253
print(f"Timeout: {e.message}")
254254
except NetworkError as e:
255255
print(f"Network error: {e.message}")
256-
except SafeNestError as e:
256+
except TuteliqError as e:
257257
print(f"Error: {e.message}")
258258
```
259259

@@ -264,7 +264,7 @@ except SafeNestError as e:
264264
The SDK is fully typed. All models are dataclasses with type hints:
265265

266266
```python
267-
from safenest import (
267+
from tuteliq import (
268268
# Enums
269269
Severity,
270270
GroomingRisk,
@@ -303,10 +303,10 @@ from safenest import (
303303

304304
```python
305305
from fastapi import FastAPI, HTTPException
306-
from safenest import SafeNest, RateLimitError
306+
from tuteliq import Tuteliq, RateLimitError
307307

308308
app = FastAPI()
309-
client = SafeNest(api_key="your-api-key")
309+
client = Tuteliq(api_key="your-api-key")
310310

311311
@app.post("/check-message")
312312
async def check_message(message: str):
@@ -347,16 +347,16 @@ The **grooming** method already accepts a `messages` list and analyzes the full
347347

348348
### PII Redaction
349349

350-
Enable `PII_REDACTION_ENABLED=true` on your SafeNest API to automatically strip emails, phone numbers, URLs, social handles, IPs, and other PII from detection summaries and webhook payloads. The original text is still analyzed in full — only stored outputs are scrubbed.
350+
Enable `PII_REDACTION_ENABLED=true` on your Tuteliq API to automatically strip emails, phone numbers, URLs, social handles, IPs, and other PII from detection summaries and webhook payloads. The original text is still analyzed in full — only stored outputs are scrubbed.
351351

352352
---
353353

354354
## Support
355355

356-
- **API Docs**: [api.safenest.dev/docs](https://api.safenest.dev/docs)
356+
- **API Docs**: [api.tuteliq.ai/docs](https://api.tuteliq.ai/docs)
357357
- **Discord**: [discord.gg/7kbTeRYRXD](https://discord.gg/7kbTeRYRXD)
358-
- **Email**: support@safenest.dev
359-
- **Issues**: [GitHub Issues](https://github.com/SafeNestSDK/python/issues)
358+
- **Email**: support@tuteliq.ai
359+
- **Issues**: [GitHub Issues](https://github.com/Tuteliq/python/issues)
360360

361361
---
362362

@@ -366,6 +366,31 @@ MIT License - see [LICENSE](LICENSE) for details.
366366

367367
---
368368

369+
## The Mission: Why This Matters
370+
371+
Before you decide to contribute or sponsor, read these numbers. They are not projections. They are not estimates from a pitch deck. They are verified statistics from the University of Edinburgh, UNICEF, NCMEC, and Interpol.
372+
373+
- **302 million** children are victims of online sexual exploitation and abuse every year. That is **10 children every second**. *(Childlight / University of Edinburgh, 2024)*
374+
- **1 in 8** children globally have been victims of non-consensual sexual imagery in the past year. *(Childlight, 2024)*
375+
- **370 million** girls and women alive today experienced rape or sexual assault in childhood. An estimated **240–310 million** boys and men experienced the same. *(UNICEF, 2024)*
376+
- **29.2 million** incidents of suspected child sexual exploitation were reported to NCMEC's CyberTipline in 2024 alone — containing **62.9 million files** (images, videos). *(NCMEC, 2025)*
377+
- **546,000** reports of online enticement (adults grooming children) in 2024 — a **192% increase** from the year before. *(NCMEC, 2025)*
378+
- **1,325% increase** in AI-generated child sexual abuse material reports between 2023 and 2024. The technology that should protect children is being weaponized against them. *(NCMEC, 2025)*
379+
- **100 sextortion reports per day** to NCMEC. Since 2021, at least **36 teenage boys** have taken their own lives because they were victimized by sextortion. *(NCMEC, 2025)*
380+
- **84%** of reports resolve outside the United States. This is not an American problem. This is a **global emergency**. *(NCMEC, 2025)*
381+
382+
End-to-end encryption is making platforms blind. In 2024, platforms reported **7 million fewer incidents** than the year before — not because abuse stopped, but because they can no longer see it. The tools that catch known images are failing. The systems that rely on human moderators are overwhelmed. The technology to detect behavior — grooming patterns, escalation, manipulation — in real-time text conversations **exists right now**. It is running at [api.tuteliq.ai](https://api.tuteliq.ai).
383+
384+
The question is not whether this technology is possible. The question is whether we build the company to put it everywhere it needs to be.
385+
386+
**Every second we wait, another child is harmed.**
387+
388+
We have the technology. We need the support.
389+
390+
If this mission matters to you, consider [sponsoring our open-source work](https://github.com/sponsors/Tuteliq) so we can keep building the tools that protect children — and keep them free and accessible for everyone.
391+
392+
---
393+
369394
<p align="center">
370-
<sub>Built with care for child safety by the <a href="https://safenest.dev">SafeNest</a> team</sub>
395+
<sub>Built with care for child safety by the <a href="https://tuteliq.ai">Tuteliq</a> team</sub>
371396
</p>

assets/logo.png

-316 KB
Loading

pyproject.toml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@ requires = ["hatchling"]
33
build-backend = "hatchling.build"
44

55
[project]
6-
name = "safenest"
7-
version = "1.1.0"
8-
description = "Official Python SDK for SafeNest - AI-powered child safety API"
6+
name = "tuteliq"
7+
version = "1.2.0"
8+
description = "Official Python SDK for Tuteliq - AI-powered child safety API"
99
readme = "README.md"
1010
license = "MIT"
1111
requires-python = ">=3.9"
1212
authors = [
13-
{ name = "SafeNest", email = "sales@safenest.dev" }
13+
{ name = "Tuteliq", email = "sales@tuteliq.ai" }
1414
]
1515
keywords = [
16-
"safenest",
16+
"tuteliq",
1717
"child-safety",
1818
"content-moderation",
1919
"bullying-detection",
@@ -50,13 +50,13 @@ dev = [
5050
]
5151

5252
[project.urls]
53-
Homepage = "https://safenest.dev"
54-
Documentation = "https://api.safenest.dev/docs"
55-
Repository = "https://github.com/SafeNestSDK/python"
56-
Issues = "https://github.com/SafeNestSDK/python/issues"
53+
Homepage = "https://tuteliq.ai"
54+
Documentation = "https://api.tuteliq.ai/docs"
55+
Repository = "https://github.com/Tuteliq/python"
56+
Issues = "https://github.com/Tuteliq/python/issues"
5757

5858
[tool.hatch.build.targets.wheel]
59-
packages = ["safenest"]
59+
packages = ["tuteliq"]
6060

6161
[tool.pytest.ini_options]
6262
asyncio_mode = "auto"

tests/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
"""Tests for SafeNest SDK."""
1+
"""Tests for Tuteliq SDK."""

tests/test_client.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
"""Tests for SafeNest client."""
1+
"""Tests for Tuteliq client."""
22

33
import pytest
4-
from safenest import (
5-
SafeNest,
4+
from tuteliq import (
5+
Tuteliq,
66
Severity,
77
GroomingRisk,
88
RiskLevel,
@@ -21,12 +21,12 @@ class TestClientInitialization:
2121

2222
def test_client_creation(self) -> None:
2323
"""Test basic client creation."""
24-
client = SafeNest(api_key="test-api-key-12345")
24+
client = Tuteliq(api_key="test-api-key-12345")
2525
assert client is not None
2626

2727
def test_client_with_options(self) -> None:
2828
"""Test client creation with options."""
29-
client = SafeNest(
29+
client = Tuteliq(
3030
api_key="test-api-key-12345",
3131
timeout=60.0,
3232
max_retries=5,
@@ -37,12 +37,12 @@ def test_client_with_options(self) -> None:
3737
def test_client_requires_api_key(self) -> None:
3838
"""Test that client requires API key."""
3939
with pytest.raises(ValueError, match="API key is required"):
40-
SafeNest(api_key="")
40+
Tuteliq(api_key="")
4141

4242
def test_client_validates_api_key_length(self) -> None:
4343
"""Test that client validates API key length."""
4444
with pytest.raises(ValueError, match="appears to be invalid"):
45-
SafeNest(api_key="short")
45+
Tuteliq(api_key="short")
4646

4747

4848
class TestEnums:

0 commit comments

Comments
 (0)