- Terms of Service
- Effective date: 2025-10-18
+
+ Terms of Service
+
- These Terms govern your access to and use of the AeThex Services. By using the Services,
- you agree to these Terms.
+ Effective date: 2025-10-18
+
+
+ These Terms govern your access to and use of the AeThex Services.
+ By using the Services, you agree to these Terms.
Accounts & Eligibility
- You must be at least 13 years old (or the age required by your jurisdiction). You are
- responsible for maintaining the confidentiality of your credentials and for all activity
- under your account.
+ You must be at least 13 years old (or the age required by your
+ jurisdiction). You are responsible for maintaining the
+ confidentiality of your credentials and for all activity under
+ your account.
User Content & License
- You retain ownership of content you submit. You grant AeThex a worldwide, non-exclusive,
- royalty-free license to host, store, reproduce, and display your content solely to operate
- and improve the Services. You represent you have the rights to submit such content.
+ You retain ownership of content you submit. You grant AeThex a
+ worldwide, non-exclusive, royalty-free license to host, store,
+ reproduce, and display your content solely to operate and improve
+ the Services. You represent you have the rights to submit such
+ content.
@@ -38,31 +45,37 @@ export default function Terms() {
No unlawful, infringing, or deceptive activity.
No harassment, hate, or exploitation.
No malware, spam, scraping, or abuse of API limits.
-
No attempts to access others’ accounts or data without permission.
+
+ No attempts to access others’ accounts or data without
+ permission.
+
Projects, Teams, and Matching
- Collaboration features (projects, teams, tasks, endorsements) are provided as-is. Team owners
- and project owners are responsible for membership, roles, and shared materials.
+ Collaboration features (projects, teams, tasks, endorsements) are
+ provided as-is. Team owners and project owners are responsible for
+ membership, roles, and shared materials.
Third-Party Services
- We may integrate third-party services (e.g., Supabase, Resend, hosting/CDN). Your use of
- those services is subject to their terms and policies.
+ We may integrate third-party services (e.g., Supabase, Resend,
+ hosting/CDN). Your use of those services is subject to their terms
+ and policies.
Intellectual Property
- AeThex and its licensors retain all rights to the platform, branding, and software. You may
- not copy, modify, or distribute platform code or assets except as permitted by law or written
+ AeThex and its licensors retain all rights to the platform,
+ branding, and software. You may not copy, modify, or distribute
+ platform code or assets except as permitted by law or written
authorization.
@@ -70,16 +83,19 @@ export default function Terms() {
Termination
- We may suspend or terminate your access for violations or risk to the platform. You may
- discontinue use at any time.
+ We may suspend or terminate your access for violations or risk to
+ the platform. You may discontinue use at any time.
- Disclaimers & Limitation of Liability
+
+ Disclaimers & Limitation of Liability
+
- The Services are provided “as-is” without warranties. To the maximum extent permitted by law,
- AeThex will not be liable for indirect, incidental, or consequential damages arising from or
+ The Services are provided “as-is” without warranties. To the
+ maximum extent permitted by law, AeThex will not be liable for
+ indirect, incidental, or consequential damages arising from or
related to your use of the Services.
@@ -87,24 +103,25 @@ export default function Terms() {
Indemnification
- You agree to indemnify and hold AeThex harmless from claims arising out of your content or
- misuse of the Services.
+ You agree to indemnify and hold AeThex harmless from claims
+ arising out of your content or misuse of the Services.
Changes to Terms
- We may update these Terms. Material changes will be announced via the app or email. Your
- continued use constitutes acceptance of updated Terms.
+ We may update these Terms. Material changes will be announced via
+ the app or email. Your continued use constitutes acceptance of
+ updated Terms.
Governing Law & Contact
- These Terms are governed by applicable laws of the United States. For questions, contact
- legal@aethex.biz.
+ These Terms are governed by applicable laws of the United States.
+ For questions, contact legal@aethex.biz.
diff --git a/server/index.ts b/server/index.ts
index 4136e3bf..97be9657 100644
--- a/server/index.ts
+++ b/server/index.ts
@@ -720,7 +720,9 @@ export function createServer() {
}
}
- await accrue(inviter_id, "loyalty", 5, "invite_sent", { invitee: email });
+ await accrue(inviter_id, "loyalty", 5, "invite_sent", {
+ invitee: email,
+ });
try {
await adminSupabase.from("notifications").insert({
user_id: inviter_id,
@@ -799,7 +801,9 @@ export function createServer() {
if (inviterId) {
await accrue(inviterId, "xp", 100, "invite_accepted", { token });
await accrue(inviterId, "loyalty", 50, "invite_accepted", { token });
- await accrue(inviterId, "reputation", 2, "invite_accepted", { token });
+ await accrue(inviterId, "reputation", 2, "invite_accepted", {
+ token,
+ });
try {
await adminSupabase.from("notifications").insert({
user_id: inviterId,
@@ -810,7 +814,9 @@ export function createServer() {
} catch {}
}
await accrue(acceptor_id, "xp", 50, "invite_accepted", { token });
- await accrue(acceptor_id, "reputation", 1, "invite_accepted", { token });
+ await accrue(acceptor_id, "reputation", 1, "invite_accepted", {
+ token,
+ });
try {
await adminSupabase.from("notifications").insert({
user_id: acceptor_id,
@@ -828,20 +834,32 @@ export function createServer() {
// Follow/unfollow with notifications
app.post("/api/social/follow", async (req, res) => {
- const { follower_id, following_id } = (req.body || {}) as { follower_id?: string; following_id?: string };
+ const { follower_id, following_id } = (req.body || {}) as {
+ follower_id?: string;
+ following_id?: string;
+ };
if (!follower_id || !following_id)
- return res.status(400).json({ error: "follower_id and following_id required" });
+ return res
+ .status(400)
+ .json({ error: "follower_id and following_id required" });
try {
await adminSupabase
.from("user_follows")
- .upsert({ follower_id, following_id } as any, { onConflict: "follower_id,following_id" as any });
- await accrue(follower_id, "loyalty", 5, "follow_user", { following_id });
+ .upsert({ follower_id, following_id } as any, {
+ onConflict: "follower_id,following_id" as any,
+ });
+ await accrue(follower_id, "loyalty", 5, "follow_user", {
+ following_id,
+ });
const { data: follower } = await adminSupabase
.from("user_profiles")
.select("full_name, username")
.eq("id", follower_id)
.maybeSingle();
- const followerName = (follower as any)?.full_name || (follower as any)?.username || "Someone";
+ const followerName =
+ (follower as any)?.full_name ||
+ (follower as any)?.username ||
+ "Someone";
await adminSupabase.from("notifications").insert({
user_id: following_id,
type: "info",
@@ -855,9 +873,14 @@ export function createServer() {
});
app.post("/api/social/unfollow", async (req, res) => {
- const { follower_id, following_id } = (req.body || {}) as { follower_id?: string; following_id?: string };
+ const { follower_id, following_id } = (req.body || {}) as {
+ follower_id?: string;
+ following_id?: string;
+ };
if (!follower_id || !following_id)
- return res.status(400).json({ error: "follower_id and following_id required" });
+ return res
+ .status(400)
+ .json({ error: "follower_id and following_id required" });
try {
await adminSupabase
.from("user_follows")
@@ -872,18 +895,32 @@ export function createServer() {
// Endorse with notification
app.post("/api/social/endorse", async (req, res) => {
- const { endorser_id, endorsed_id, skill } = (req.body || {}) as { endorser_id?: string; endorsed_id?: string; skill?: string };
+ const { endorser_id, endorsed_id, skill } = (req.body || {}) as {
+ endorser_id?: string;
+ endorsed_id?: string;
+ skill?: string;
+ };
if (!endorser_id || !endorsed_id || !skill)
- return res.status(400).json({ error: "endorser_id, endorsed_id, skill required" });
+ return res
+ .status(400)
+ .json({ error: "endorser_id, endorsed_id, skill required" });
try {
- await adminSupabase.from("endorsements").insert({ endorser_id, endorsed_id, skill } as any);
- await accrue(endorsed_id, "reputation", 2, "endorsement_received", { skill, from: endorser_id });
+ await adminSupabase
+ .from("endorsements")
+ .insert({ endorser_id, endorsed_id, skill } as any);
+ await accrue(endorsed_id, "reputation", 2, "endorsement_received", {
+ skill,
+ from: endorser_id,
+ });
const { data: endorser } = await adminSupabase
.from("user_profiles")
.select("full_name, username")
.eq("id", endorser_id)
.maybeSingle();
- const endorserName = (endorser as any)?.full_name || (endorser as any)?.username || "Someone";
+ const endorserName =
+ (endorser as any)?.full_name ||
+ (endorser as any)?.username ||
+ "Someone";
await adminSupabase.from("notifications").insert({
user_id: endorsed_id,
type: "success",
@@ -909,24 +946,48 @@ export function createServer() {
metadata,
} = (req.body || {}) as any;
if (!actor_id || !verb || !object_type) {
- return res.status(400).json({ error: "actor_id, verb, object_type required" });
+ return res
+ .status(400)
+ .json({ error: "actor_id, verb, object_type required" });
}
try {
const { data: eventRow, error: evErr } = await adminSupabase
.from("activity_events")
- .insert({ actor_id, verb, object_type, object_id: object_id || null, target_id: target_team_id || target_project_id || null, metadata: metadata || null } as any)
+ .insert({
+ actor_id,
+ verb,
+ object_type,
+ object_id: object_id || null,
+ target_id: target_team_id || target_project_id || null,
+ metadata: metadata || null,
+ } as any)
.select()
.single();
if (evErr) return res.status(500).json({ error: evErr.message });
- const notify = async (userId: string, title: string, message?: string) => {
- await adminSupabase.from("notifications").insert({ user_id: userId, type: "info", title, message: message || null });
+ const notify = async (
+ userId: string,
+ title: string,
+ message?: string,
+ ) => {
+ await adminSupabase
+ .from("notifications")
+ .insert({
+ user_id: userId,
+ type: "info",
+ title,
+ message: message || null,
+ });
};
// Notify explicit targets
if (Array.isArray(target_user_ids) && target_user_ids.length) {
for (const uid of target_user_ids) {
- await notify(uid, `${verb} · ${object_type}`, (metadata && metadata.summary) || null);
+ await notify(
+ uid,
+ `${verb} · ${object_type}`,
+ (metadata && metadata.summary) || null,
+ );
}
}
@@ -936,8 +997,12 @@ export function createServer() {
.from("team_memberships")
.select("user_id")
.eq("team_id", target_team_id);
- for (const m of (members || [])) {
- await notify((m as any).user_id, `${verb} · ${object_type}`, (metadata && metadata.summary) || null);
+ for (const m of members || []) {
+ await notify(
+ (m as any).user_id,
+ `${verb} · ${object_type}`,
+ (metadata && metadata.summary) || null,
+ );
}
}
@@ -947,8 +1012,12 @@ export function createServer() {
.from("project_members")
.select("user_id")
.eq("project_id", target_project_id);
- for (const m of (members || [])) {
- await notify((m as any).user_id, `${verb} · ${object_type}`, (metadata && metadata.summary) || null);
+ for (const m of members || []) {
+ await notify(
+ (m as any).user_id,
+ `${verb} · ${object_type}`,
+ (metadata && metadata.summary) || null,
+ );
}
}