mirror of
https://github.com/Litlyx/litlyx
synced 2025-12-10 15:58:38 +01:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ab95772dd4 | ||
|
|
0d5dbc69ad | ||
|
|
8a359936d1 | ||
|
|
ffd2e96138 | ||
|
|
b8e434be9a |
@@ -108,12 +108,9 @@ curl -X POST "https://broker.litlyx.com/event" \
|
||||
|
||||
To self-host the Litlyx dashboard, first **fork** this repository.
|
||||
|
||||
Then run the following command:
|
||||
```bash
|
||||
docker-compose build
|
||||
```
|
||||
You can find our Docker images on DockerHub for more.
|
||||
|
||||
after the build finishes, run:
|
||||
Then run the following command:
|
||||
```bash
|
||||
docker-compose up
|
||||
```
|
||||
|
||||
@@ -23,7 +23,7 @@ const { data: chatsRemaining, refresh: reloadChatsRemaining } = useFetch(`/api/a
|
||||
|
||||
const currentText = ref<string>("");
|
||||
const loading = ref<boolean>(false);
|
||||
const canSend = ref<boolean>(false);
|
||||
const canSend = ref<boolean>(true);
|
||||
|
||||
const currentChatId = ref<string>("");
|
||||
const currentChatMessages = ref<{ role: string, content: string, charts?: any[], tool_calls?: any }[]>([]);
|
||||
@@ -75,6 +75,8 @@ async function pollSendMessageStatus(chat_id: string, times: number, updateStatu
|
||||
setTimeout(() => pollSendMessageStatus(chat_id, times + 1, updateStatus), (times > 10 ? 2000 : 1000));
|
||||
} else {
|
||||
|
||||
canSend.value = true;
|
||||
|
||||
typer.stop();
|
||||
|
||||
const messages = await $fetch(`/api/ai/${chat_id}/get_messages`, {
|
||||
@@ -84,12 +86,14 @@ async function pollSendMessageStatus(chat_id: string, times: number, updateStatu
|
||||
|
||||
currentChatMessages.value = messages.map(e => ({ ...e, charts: e.charts.map(k => JSON.parse(k)) })) as any;
|
||||
currentChatMessageDelta.value = '';
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
async function sendMessage() {
|
||||
|
||||
if (canSend.value === false) return;
|
||||
|
||||
if (loading.value) return;
|
||||
if (!project.value) return;
|
||||
@@ -128,25 +132,25 @@ async function sendMessage() {
|
||||
currentChatMessageDelta.value = status;
|
||||
});
|
||||
|
||||
canSend.value = true;
|
||||
|
||||
|
||||
} catch (ex: any) {
|
||||
|
||||
if (ex.message.includes('CHAT_LIMIT_REACHED')) {
|
||||
currentChatMessages.value.push({
|
||||
role: 'assistant',
|
||||
content: 'You have reached your current tier chat limit.\n Upgrade to an higher tier. <a style="color: blue; text-decoration: underline;" href="/plans"> Upgrade now. </a>',
|
||||
content: `Chat limit reached.
|
||||
Upgrade your plan to continue chatting.`
|
||||
});
|
||||
}
|
||||
|
||||
if (ex.message.includes('Unauthorized')) {
|
||||
} else if (ex.message.includes('Unauthorized')) {
|
||||
currentChatMessages.value.push({
|
||||
role: 'assistant',
|
||||
content: 'To use AI you need to provide AI_ORG, AI_PROJECT and AI_KEY in docker compose',
|
||||
});
|
||||
} else {
|
||||
currentChatMessages.value.push({ role: 'assistant', content: ex.message, });
|
||||
}
|
||||
|
||||
currentChatMessages.value.push({ role: 'assistant', content: ex.message, });
|
||||
loading.value = false;
|
||||
|
||||
canSend.value = true;
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ services:
|
||||
command: redis-server --save 20 1 --loglevel warning --requirepass litlyx
|
||||
|
||||
producer:
|
||||
image: litlyx-producer
|
||||
image: litlyx/litlyx-producer
|
||||
restart: always
|
||||
ports:
|
||||
- "3099:3099"
|
||||
@@ -37,7 +37,7 @@ services:
|
||||
dockerfile: ./producer/Dockerfile
|
||||
|
||||
consumer:
|
||||
image: litlyx-consumer
|
||||
image: litlyx/litlyx-consumer
|
||||
restart: always
|
||||
ports:
|
||||
- "3011:3031"
|
||||
@@ -58,7 +58,7 @@ services:
|
||||
dockerfile: ./consumer/Dockerfile
|
||||
|
||||
dashboard:
|
||||
image: litlyx-dashboard
|
||||
image: litlyx/litlyx-dashboard
|
||||
restart: always
|
||||
ports:
|
||||
- "3000:3000"
|
||||
|
||||
@@ -13,8 +13,5 @@
|
||||
"dayjs": "^1.11.13",
|
||||
"mongoose": "^8.3.2",
|
||||
"redis": "^4.7.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"globs": "^0.1.4"
|
||||
}
|
||||
}
|
||||
|
||||
51
pnpm-lock.yaml
generated
51
pnpm-lock.yaml
generated
@@ -166,6 +166,12 @@ importers:
|
||||
specifier: ^5.4.5
|
||||
version: 5.6.3
|
||||
|
||||
scripts:
|
||||
devDependencies:
|
||||
glob:
|
||||
specifier: ^11.0.0
|
||||
version: 11.0.0
|
||||
|
||||
security:
|
||||
devDependencies:
|
||||
'@types/node':
|
||||
@@ -2519,6 +2525,11 @@ packages:
|
||||
resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
|
||||
hasBin: true
|
||||
|
||||
glob@11.0.0:
|
||||
resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==}
|
||||
engines: {node: 20 || >=22}
|
||||
hasBin: true
|
||||
|
||||
glob@7.2.3:
|
||||
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
|
||||
deprecated: Glob versions prior to v9 are no longer supported
|
||||
@@ -2908,6 +2919,10 @@ packages:
|
||||
jackspeak@3.4.3:
|
||||
resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
|
||||
|
||||
jackspeak@4.0.2:
|
||||
resolution: {integrity: sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==}
|
||||
engines: {node: 20 || >=22}
|
||||
|
||||
jiti@1.21.6:
|
||||
resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==}
|
||||
hasBin: true
|
||||
@@ -3135,6 +3150,10 @@ packages:
|
||||
lru-cache@10.4.3:
|
||||
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
|
||||
|
||||
lru-cache@11.0.2:
|
||||
resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==}
|
||||
engines: {node: 20 || >=22}
|
||||
|
||||
lru-cache@5.1.1:
|
||||
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
|
||||
|
||||
@@ -3224,6 +3243,10 @@ packages:
|
||||
resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
|
||||
hasBin: true
|
||||
|
||||
minimatch@10.0.1:
|
||||
resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==}
|
||||
engines: {node: 20 || >=22}
|
||||
|
||||
minimatch@3.1.2:
|
||||
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
|
||||
|
||||
@@ -3586,6 +3609,10 @@ packages:
|
||||
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
|
||||
engines: {node: '>=16 || 14 >=14.18'}
|
||||
|
||||
path-scurry@2.0.0:
|
||||
resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
|
||||
engines: {node: 20 || >=22}
|
||||
|
||||
path-to-regexp@0.1.10:
|
||||
resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==}
|
||||
|
||||
@@ -7560,6 +7587,15 @@ snapshots:
|
||||
package-json-from-dist: 1.0.1
|
||||
path-scurry: 1.11.1
|
||||
|
||||
glob@11.0.0:
|
||||
dependencies:
|
||||
foreground-child: 3.3.0
|
||||
jackspeak: 4.0.2
|
||||
minimatch: 10.0.1
|
||||
minipass: 7.1.2
|
||||
package-json-from-dist: 1.0.1
|
||||
path-scurry: 2.0.0
|
||||
|
||||
glob@7.2.3:
|
||||
dependencies:
|
||||
fs.realpath: 1.0.0
|
||||
@@ -7966,6 +8002,10 @@ snapshots:
|
||||
optionalDependencies:
|
||||
'@pkgjs/parseargs': 0.11.0
|
||||
|
||||
jackspeak@4.0.2:
|
||||
dependencies:
|
||||
'@isaacs/cliui': 8.0.2
|
||||
|
||||
jiti@1.21.6: {}
|
||||
|
||||
jiti@2.4.0: {}
|
||||
@@ -8226,6 +8266,8 @@ snapshots:
|
||||
|
||||
lru-cache@10.4.3: {}
|
||||
|
||||
lru-cache@11.0.2: {}
|
||||
|
||||
lru-cache@5.1.1:
|
||||
dependencies:
|
||||
yallist: 3.1.1
|
||||
@@ -8297,6 +8339,10 @@ snapshots:
|
||||
|
||||
mini-svg-data-uri@1.4.4: {}
|
||||
|
||||
minimatch@10.0.1:
|
||||
dependencies:
|
||||
brace-expansion: 2.0.1
|
||||
|
||||
minimatch@3.1.2:
|
||||
dependencies:
|
||||
brace-expansion: 1.1.11
|
||||
@@ -8826,6 +8872,11 @@ snapshots:
|
||||
lru-cache: 10.4.3
|
||||
minipass: 7.1.2
|
||||
|
||||
path-scurry@2.0.0:
|
||||
dependencies:
|
||||
lru-cache: 11.0.2
|
||||
minipass: 7.1.2
|
||||
|
||||
path-to-regexp@0.1.10: {}
|
||||
|
||||
path-to-regexp@6.3.0: {}
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
"dev": "node scripts/start_dev.js",
|
||||
"compile": "tsc",
|
||||
"build_project": "node ../scripts/build.js",
|
||||
"build": "npm run compile && npm run build"
|
||||
"build": "npm run compile && npm run build_project"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "Emily",
|
||||
|
||||
@@ -2,9 +2,11 @@ import DateService, { Slice } from '@services/DateService';
|
||||
import { Model, Types } from "mongoose";
|
||||
|
||||
|
||||
export async function getAggregation(model: Model<any>, pid: Types.ObjectId, from: number, to: number, slice: Slice) {
|
||||
export async function getDayAggregation(model: Model<any>, pid: Types.ObjectId, from: number, to: number) {
|
||||
|
||||
const { group, sort, fromParts } = DateService.getQueryDateRange(slice);
|
||||
const sort = { created_at: 1 };
|
||||
const group = { $dateToString: { format: "%Y-%m-%d", date: "$created_at" } };
|
||||
const fromParts = { year: { $year: "$created_at" }, month: { $month: "$created_at" }, day: { $dayOfMonth: "$created_at" } };
|
||||
|
||||
const result = model.aggregate([
|
||||
{
|
||||
@@ -16,7 +18,7 @@ export async function getAggregation(model: Model<any>, pid: Types.ObjectId, fro
|
||||
{ $group: { _id: group, count: { $sum: 1 } } },
|
||||
{ $sort: sort },
|
||||
{ $project: { _id: { $dateFromParts: fromParts }, count: "$count" } }
|
||||
]);
|
||||
] as any);
|
||||
|
||||
return result;
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import { VisitModel } from '@schema/metrics/VisitSchema'
|
||||
|
||||
import * as url from 'url';
|
||||
import { ProjectModel } from "@schema/project/ProjectSchema";
|
||||
import { getAggregation } from "./Aggregations";
|
||||
import { getDayAggregation } from "./Aggregations";
|
||||
|
||||
type TAvgInput = { _id: string, count: number }
|
||||
|
||||
@@ -75,9 +75,9 @@ export async function findAnomalies(project_id: string, callback: AnomalyCallbac
|
||||
const from = Date.now() - 1000 * 60 * 60 * 24 * 30;
|
||||
const to = Date.now() - 1000 * 60 * 60 * 24;
|
||||
|
||||
const visitsTimelineData = await getAggregation(VisitModel, pid, from, to, 'day');
|
||||
const visitsTimelineData = await getDayAggregation(VisitModel, pid, from, to);
|
||||
|
||||
const eventsTimelineData = await getAggregation(EventModel, pid, from, to, 'day');
|
||||
const eventsTimelineData = await getDayAggregation(EventModel, pid, from, to);
|
||||
|
||||
|
||||
const websites: { _id: string, count: number }[] = await VisitModel.aggregate([
|
||||
|
||||
@@ -19,7 +19,7 @@ class EmailService {
|
||||
async sendLimitEmail50(target: string, projectName: string) {
|
||||
try {
|
||||
const sendSmtpEmail = new SendSmtpEmail();
|
||||
sendSmtpEmail.subject = "You've reached 50% limit on Litlyx";
|
||||
sendSmtpEmail.subject = "⚡ You've reached 50% limit on Litlyx";
|
||||
sendSmtpEmail.sender = { "name": "Litlyx", "email": "help@litlyx.com" };
|
||||
sendSmtpEmail.to = [{ "email": target }];
|
||||
|
||||
@@ -38,7 +38,7 @@ class EmailService {
|
||||
async sendLimitEmail90(target: string, projectName: string) {
|
||||
try {
|
||||
const sendSmtpEmail = new SendSmtpEmail();
|
||||
sendSmtpEmail.subject = "You've reached 90% limit on Litlyx";
|
||||
sendSmtpEmail.subject = "⚡ You've reached 90% limit on Litlyx";
|
||||
sendSmtpEmail.sender = { "name": "Litlyx", "email": "help@litlyx.com" };
|
||||
sendSmtpEmail.to = [{ "email": target }];
|
||||
sendSmtpEmail.htmlContent = LIMIT_90_EMAIL
|
||||
@@ -55,7 +55,7 @@ class EmailService {
|
||||
async sendLimitEmailMax(target: string, projectName: string) {
|
||||
try {
|
||||
const sendSmtpEmail = new SendSmtpEmail();
|
||||
sendSmtpEmail.subject = "You've reached your limit on Litlyx!";
|
||||
sendSmtpEmail.subject = "🚨 You've reached your limit on Litlyx!";
|
||||
sendSmtpEmail.sender = { "name": "Litlyx", "email": "help@litlyx.com" };
|
||||
sendSmtpEmail.to = [{ "email": target }];
|
||||
sendSmtpEmail.htmlContent = LIMIT_MAX_EMAIL
|
||||
@@ -108,17 +108,17 @@ class EmailService {
|
||||
}) {
|
||||
try {
|
||||
const sendSmtpEmail = new SendSmtpEmail();
|
||||
sendSmtpEmail.subject = "🚨 Unexpected Activity Detected by our AI";
|
||||
sendSmtpEmail.subject = "🔍 Unexpected Activity Detected by our AI";
|
||||
sendSmtpEmail.sender = { "name": "Litlyx", "email": "help@litlyx.com" };
|
||||
sendSmtpEmail.to = [{ "email": target }];
|
||||
sendSmtpEmail.htmlContent = ANOMALY_VISITS_EVENTS_EMAIL
|
||||
.replace(/\[Project Name\]/, projectName)
|
||||
.replace(/\[ENTRIES\]/,
|
||||
[
|
||||
...data.visits.map(e => (`<li> Visits in date ${e._id} [ ${e.count} ] </li>`)),
|
||||
...data.events.map(e => (`<li> Events in date ${e._id} [ ${e.count} ] </li>`))
|
||||
...data.visits.map(e => (`<li> Visits in date ${new Date(e._id).toLocaleDateString('en-EN')} [ ${e.count} ] </li>`)),
|
||||
...data.events.map(e => (`<li> Events in date ${new Date(e._id).toLocaleDateString('en-EN')} [ ${e.count} ] </li>`))
|
||||
]
|
||||
.join('<br>')
|
||||
.join('')
|
||||
)
|
||||
.toString();
|
||||
await this.apiInstance.sendTransacEmail(sendSmtpEmail);
|
||||
@@ -132,15 +132,15 @@ class EmailService {
|
||||
async sendAnomalyDomainEmail(target: string, projectName: string, domains: string[]) {
|
||||
try {
|
||||
const sendSmtpEmail = new SendSmtpEmail();
|
||||
sendSmtpEmail.subject = "🚨 Anomaly detected by our AI";
|
||||
sendSmtpEmail.subject = "🔍 Suspicious dns detected by our AI";
|
||||
sendSmtpEmail.sender = { "name": "Litlyx", "email": "help@litlyx.com" };
|
||||
sendSmtpEmail.to = [{ "email": target }];
|
||||
sendSmtpEmail.htmlContent = ANOMALY_DOMAIN_EMAIL
|
||||
.replace(/\[Project Name\]/, projectName)
|
||||
.replace(/\[CURRENT_DATE\]/, new Date().toLocaleDateString('en-EN'))
|
||||
.replace(/\[DNS_ENTRIES\]/,
|
||||
domains.map(e => (`<li> ${e} </li>`)).join('<br>')
|
||||
)
|
||||
// .replace(/\[DNS_ENTRIES\]/,
|
||||
// domains.map(e => (`<li> ${e} </li>`)).join('<br>')
|
||||
.replace(/\[DNS_ENTRIES\]/, domains[0])
|
||||
.toString();
|
||||
await this.apiInstance.sendTransacEmail(sendSmtpEmail);
|
||||
return true;
|
||||
|
||||
@@ -1,55 +1,159 @@
|
||||
export const ANOMALY_DOMAIN_EMAIL = `<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
export const ANOMALY_DOMAIN_EMAIL = `<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html dir="ltr" lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>❗️ Anomaly detected by our AI</title>
|
||||
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
||||
<meta name="x-apple-disable-message-reformatting" />
|
||||
<!--$-->
|
||||
</head>
|
||||
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333;">
|
||||
|
||||
<!-- Email Content -->
|
||||
<body
|
||||
style='background-color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif'>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="max-width:37.5em">
|
||||
<tbody>
|
||||
<tr style="width:100%">
|
||||
<td>
|
||||
|
||||
<p>Dear User,</p>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="border:1px solid rgb(0,0,0, 0.1);border-radius:3px;overflow:hidden">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<img src="https://litlyx.com/images/locker2.png"
|
||||
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%"
|
||||
width="620" />
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation" style="padding:20px;padding-bottom:0">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<td data-id="__react-email-column">
|
||||
<h1 style="font-size:32px;font-weight:bold;text-align:center">
|
||||
Dear user
|
||||
</h1>
|
||||
<h2 style="font-size:26px;font-weight:bold;text-align:center">
|
||||
Our AI Agent noticed a recent Anomaly on your project on Litlyx.
|
||||
</h2>
|
||||
<p style="font-size:16px;line-height:24px;margin:16px 0">
|
||||
<b>Time: </b> [CURRENT_DATE]
|
||||
<!-- September 7, 2022 at 10:58 AM -->
|
||||
</p>
|
||||
<p
|
||||
style="font-size:16px;line-height:24px;margin:16px 0;margin-top:-5px">
|
||||
<b>Project: </b> [Project Name]
|
||||
</p>
|
||||
<p
|
||||
style="font-size:16px;line-height:24px;margin:16px 0;margin-top:-5px">
|
||||
<b>Suspicious DNS: </b> [DNS_ENTRIES]
|
||||
</p>
|
||||
<p style="font-size:16px;line-height:24px;margin:16px 0">
|
||||
If this was you, there's nothing else you
|
||||
need to do.
|
||||
</p>
|
||||
|
||||
<p>We wanted to let you know that <strong>[Project Name]</strong> on <strong>Litlyx</strong> has an anomaly that our AI agent detected.</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p> <strong>Anomaly</strong>: Suspicious DNS </p>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation" style="padding:20px;padding-top:0">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<td colspan="2" data-id="__react-email-column"
|
||||
style="display:flex;justify-content:center;width:100%">
|
||||
<a style="line-height:100%;text-decoration:none;display:inline-block;max-width:100%;mso-padding-alt:0px;background-color:#5680f8;border-radius:3px;color:#FFF;font-weight:bold;border:1px solid rgb(0,0,0, 0.1);cursor:pointer;padding:12px 30px 12px 30px"
|
||||
target="_blank" href="https://dashboard.litlyx.com"><span></span><span
|
||||
style="max-width:100%;display:inline-block;line-height:120%;mso-padding-alt:0px;mso-text-raise:9px">
|
||||
Go to Dashboard</span><span></span></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p> Message: </p>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation" style="padding:20px;padding-bottom:0">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<td data-id="__react-email-column">
|
||||
<h3>If this wasn't you..</h3>
|
||||
|
||||
<ul>
|
||||
[DNS_ENTRIES]
|
||||
</ul>
|
||||
<p>you should reach out to the webmasters of
|
||||
the websites that have duplicated your content and request them
|
||||
to remove it or give you proper attribution (if available).</p>
|
||||
|
||||
<p> Date: [CURRENT_DATE] </p>
|
||||
<p>You can also use <a href="https://www.whois.com/whois/"
|
||||
style="color: #D32F2F; text-decoration: none;">https://www.whois.com/whois/</a>
|
||||
to get the contact details of the webmaster or domain owner.</p>
|
||||
|
||||
<p> Are logging data in your project. Is that you? </p>
|
||||
<p>If webmasters don't respond or cooperate, <strong>you can file a
|
||||
DMCA complaint here:</strong> <a
|
||||
href="https://support.google.com/legal/answer/3110420?hl=en"
|
||||
style="color: #D32F2F; text-decoration: none;">https://support.google.com/legal/answer/3110420?hl=en</a>
|
||||
<strong>with Google to request the removal of the duplicate
|
||||
content from their search results.</strong></p>
|
||||
|
||||
<p>You can analyze a suspicious DNS on your Litlyx dashboard. Visit the Security tab to find out more.</p>
|
||||
<h3>Please refer to this for more information:</h3>
|
||||
|
||||
<h3>What can I do?</h3>
|
||||
<ul>
|
||||
<li><a href="https://support.google.com/legal/answer/3110420?hl=en&sjid=14235884554806745995-AP&authuser=2"
|
||||
style="color: #D32F2F; text-decoration: none;">Report
|
||||
Content for Legal Reasons</a></li>
|
||||
<li><a href="https://www.dmca.com/FAQ/How-can-I-get-a-webpage-removed-from-Google-search-results"
|
||||
style="color: #D32F2F; text-decoration: none;">How can I
|
||||
get a webpage removed from Google search results?</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>To resolve this issue, you should reach out to the webmasters of the websites that have duplicated your content and request them to remove it or give you proper attribution (if available).</p>
|
||||
<p>Your safety is our main priority.</p>
|
||||
|
||||
<p>You can also use <a href="https://www.whois.com/whois/" style="color: #D32F2F; text-decoration: none;">https://www.whois.com/whois/</a> to get the contact details of the webmaster or domain owner.</p>
|
||||
<p>Thank you for choosing Litlyx every day as your analytics tool!
|
||||
</p>
|
||||
|
||||
<p>If webmasters don't respond or cooperate, <strong>you can file a DMCA complaint here:</strong> <a href="https://support.google.com/legal/answer/3110420?hl=en" style="color: #D32F2F; text-decoration: none;">https://support.google.com/legal/answer/3110420?hl=en</a> <strong>with Google to request the removal of the duplicate content from their search results.</strong></p>
|
||||
<p>Antonio,</p>
|
||||
<p>CEO | Litlyx</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<h3>Please refer to this for more information:</h3>
|
||||
|
||||
<ul>
|
||||
<li><a href="https://support.google.com/legal/answer/3110420?hl=en&sjid=14235884554806745995-AP&authuser=2" style="color: #D32F2F; text-decoration: none;">Report Content for Legal Reasons</a></li>
|
||||
<li><a href="https://www.dmca.com/FAQ/How-can-I-get-a-webpage-removed-from-Google-search-results" style="color: #D32F2F; text-decoration: none;">How can I get a webpage removed from Google search results?</a></li>
|
||||
</ul>
|
||||
|
||||
<p>Your safety is our main priority.</p>
|
||||
|
||||
<p>Thank you for choosing Litlyx every day as your analytics tool!</p>
|
||||
|
||||
<p>Antonio,</p>
|
||||
<p>CEO | Litlyx</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="padding:45px 0 0 0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<img src="https://react-email-demo-lpdmf0ryo-resend.vercel.app/static/yelp-footer.png"
|
||||
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%"
|
||||
width="620" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="font-size:12px;line-height:24px;margin:16px 0;text-align:center;color:rgb(0,0,0, 0.7)">
|
||||
2024 © Litlyx. All rights reserved.
|
||||
<br>
|
||||
Litlyx S.R.L. - Viale Tirreno, 187 - 00141 Rome - P.IVA: 17814721001- REA: RM-1743194
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
`
|
||||
@@ -1,50 +1,152 @@
|
||||
export const ANOMALY_VISITS_EVENTS_EMAIL = `<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
export const ANOMALY_VISITS_EVENTS_EMAIL = `<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html dir="ltr" lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>🚨 Unexpected Activity Detected by our AI</title>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
||||
<meta name="x-apple-disable-message-reformatting" />
|
||||
<!--$-->
|
||||
</head>
|
||||
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333;">
|
||||
|
||||
<!-- Email Content -->
|
||||
<body
|
||||
style='background-color:#fff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif'>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="max-width:37.5em">
|
||||
<tbody>
|
||||
<tr style="width:100%">
|
||||
<td>
|
||||
|
||||
<p>Dear User,</p>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="border:1px solid rgb(0,0,0, 0.1);border-radius:3px;overflow:hidden">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<img src="https://litlyx.com/images/locker2.png"
|
||||
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%"
|
||||
width="620" />
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation" style="padding:20px;padding-bottom:0">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<td data-id="__react-email-column">
|
||||
<h1 style="font-size:32px;font-weight:bold;text-align:center">
|
||||
Dear user
|
||||
</h1>
|
||||
<h2 style="font-size:26px;font-weight:bold;text-align:center">
|
||||
Our AI Agent noticed a recent unexpected usage on your project
|
||||
on Litlyx.
|
||||
</h2>
|
||||
<p
|
||||
style="font-size:16px;line-height:24px;margin:16px 0;margin-top:-5px">
|
||||
<b>Project: </b> [Project Name]
|
||||
</p>
|
||||
<p
|
||||
style="font-size:16px;line-height:24px;margin:16px 0;margin-top:-5px">
|
||||
<b>Info: </b> [ENTRIES]
|
||||
</p>
|
||||
<p>If this spike in activity is expected, there’s no need to worry.
|
||||
However, if you believe this could be unexpected or suspicious,
|
||||
we recommend taking a closer look at your data on the
|
||||
<strong>Litlyx Dashboard</strong>. You can analyze your recent
|
||||
traffic and event logs to identify any irregularities or
|
||||
potential issues.</p>
|
||||
|
||||
<p>We wanted to let you know that <strong>[Project Name]</strong> on <strong>Litlyx</strong> is receiving an unexpected amount of visits or events. This could indicate unusual activity that might require your attention.</p>
|
||||
|
||||
<p> <strong>Anomaly</strong>: Unexpected usage </p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p> Message: </p>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation" style="padding:20px;padding-top:0">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<td colspan="2" data-id="__react-email-column"
|
||||
style="display:flex;justify-content:center;width:100%">
|
||||
<a style="line-height:100%;text-decoration:none;display:inline-block;max-width:100%;mso-padding-alt:0px;background-color:#5680f8;border-radius:3px;color:#FFF;font-weight:bold;border:1px solid rgb(0,0,0, 0.1);cursor:pointer;padding:12px 30px 12px 30px"
|
||||
target="_blank"
|
||||
href="https://dashboard.litlyx.com"><span></span><span
|
||||
style="max-width:100%;display:inline-block;line-height:120%;mso-padding-alt:0px;mso-text-raise:9px">
|
||||
Go to Dashboard</span><span></span></a>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<ul>
|
||||
[ENTRIES]
|
||||
</ul>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation" style="padding:20px;padding-bottom:0">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<td data-id="__react-email-column">
|
||||
|
||||
<h3>What can I do?</h3>
|
||||
|
||||
<p>If this spike in activity is expected, there’s no need to worry. However, if you believe this could be unexpected or suspicious, we recommend taking a closer look at your data on the <strong>Litlyx Dashboard</strong>. You can analyze your recent traffic and event logs to identify any irregularities or potential issues.</p>
|
||||
<p>To better understand the situation, you can:</p>
|
||||
|
||||
<h3>What can I do?</h3>
|
||||
<ol>
|
||||
<li>Review your traffic sources to see where the visits or
|
||||
events are coming from.</li>
|
||||
<li>Check for any unexpected patterns, such as a high number of
|
||||
visits from unknown sources or abnormal event triggers.</li>
|
||||
<li>Check your code to find bugs on a specific action that is
|
||||
triggered in loops.</li>
|
||||
</ol>
|
||||
|
||||
<p>To better understand the situation, you can:</p>
|
||||
<p>If you need help understanding this activity or have any
|
||||
concerns, feel free to reach out to our support team at <a
|
||||
href="mailto:help@litlyx.com"
|
||||
style="color: #D32F2F; text-decoration: none;"><strong>help@litlyx.com</strong></a>.
|
||||
We are here to assist you!</p>
|
||||
|
||||
<ol>
|
||||
<li>Review your traffic sources to see where the visits or events are coming from.</li>
|
||||
<li>Check for any unexpected patterns, such as a high number of visits from unknown sources or abnormal event triggers.</li>
|
||||
<li>Check your code to find bugs on a specific action that is triggered in loops.</li>
|
||||
</ol>
|
||||
<p><strong>Your safety and data integrity are our top
|
||||
priorities.</strong></p>
|
||||
|
||||
<p>If you need help understanding this activity or have any concerns, feel free to reach out to our support team at <a href="mailto:help@litlyx.com" style="color: #D32F2F; text-decoration: none;"><strong>help@litlyx.com</strong></a>. We are here to assist you!</p>
|
||||
<p>Thank you for trusting Litlyx as your analytics tool!</p>
|
||||
|
||||
<p><strong>Your safety and data integrity are our top priorities.</strong></p>
|
||||
<p>Best regards,</p>
|
||||
|
||||
<p>Thank you for trusting Litlyx as your analytics tool!</p>
|
||||
<p>Antonio,</p>
|
||||
<p>CEO | Litlyx</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p>Best regards,</p>
|
||||
|
||||
<p>Antonio,</p>
|
||||
<p>CEO | Litlyx</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="padding:45px 0 0 0">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<img src="https://react-email-demo-lpdmf0ryo-resend.vercel.app/static/yelp-footer.png"
|
||||
style="display:block;outline:none;border:none;text-decoration:none;max-width:100%"
|
||||
width="620" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<p style="font-size:12px;line-height:24px;margin:16px 0;text-align:center;color:rgb(0,0,0, 0.7)">
|
||||
2024 © Litlyx. All rights reserved.
|
||||
<br>
|
||||
Litlyx S.R.L. - Viale Tirreno, 187 - 00141 Rome - P.IVA: 17814721001- REA: RM-1743194
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
`
|
||||
@@ -1,31 +1,116 @@
|
||||
export const LIMIT_50_EMAIL = `<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
export const LIMIT_50_EMAIL = `<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html dir="ltr" lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>You’ve reached 50% limit on Litlyx</title>
|
||||
<link rel="preload" as="image" href="https://react-email-demo-lpdmf0ryo-resend.vercel.app/static/airbnb-logo.png" />
|
||||
<link rel="preload" as="image"
|
||||
href="https://react-email-demo-lpdmf0ryo-resend.vercel.app/static/airbnb-review-user.jpg" />
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
||||
<meta name="x-apple-disable-message-reformatting" />
|
||||
<!--$-->
|
||||
</head>
|
||||
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333;">
|
||||
|
||||
<p>Dear User,</p>
|
||||
<body
|
||||
style='background-color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif'>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="max-width:100%;margin:0 auto;padding:20px 0 48px;width:580px">
|
||||
<tbody>
|
||||
<tr style="width:100%">
|
||||
<td>
|
||||
|
||||
<p>We wanted to let you know that <strong>[Project Name]</strong> on <strong>Litlyx</strong> has reached 50% of its data collection limit for this month.</p>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<img alt="Founder" height="96"
|
||||
src="https://litlyx.com/images/founder.jpg"
|
||||
style="display:block;outline:none;border:none;text-decoration:none;margin:0 auto;margin-bottom:16px;border-radius:50%"
|
||||
width="96" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="padding-bottom:20px">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<p
|
||||
style="font-size:32px;line-height:1.3;margin:16px 0;font-weight:700;color:#484848">
|
||||
You’ve Reached 50% of Your Litlyx Project Limit on [Project Name]
|
||||
</p>
|
||||
<p
|
||||
style="font-size:18px;line-height:1.4;margin:16px 0;color:#484848;padding:24px;background-color:#f2f3f3;border-radius:4px">
|
||||
To avoid losing precious data, please remember to monitor your usage
|
||||
on the <strong>Litlyx Dashboard</strong>. You can find your current
|
||||
usage details under <strong>Settings > Billing Tab</strong>
|
||||
</p>
|
||||
|
||||
<p>To avoid losing precious data, please remember to monitor your usage on the <strong>Litlyx Dashboard</strong>. You can find your current usage details under <strong>Settings > Billing Tab</strong>.</p>
|
||||
<p>If you need more data collection storage, you may consider upgrading
|
||||
your plan to get additional benefits and ensure uninterrupted data
|
||||
collection.</p>
|
||||
|
||||
<p>If you need more data collection storage, you may consider upgrading your plan to get additional benefits and ensure uninterrupted data collection.</p>
|
||||
<p>Feel free to reply to this email or contact us at <a
|
||||
href="mailto:help@litlyx.com"
|
||||
style="color: #FF5733; text-decoration: none;">help@litlyx.com</a>
|
||||
if you have any questions or need assistance.</p>
|
||||
|
||||
<p>Feel free to reply to this email or contact us at <a href="mailto:help@litlyx.com" style="color: #FF5733; text-decoration: none;">help@litlyx.com</a> if you have any questions or need assistance.</p>
|
||||
<p>Thank you for choosing Litlyx every day as your analytics tool.</p>
|
||||
|
||||
<p>Thank you for choosing Litlyx every day as your analytics tool.</p>
|
||||
<p>Have a nice day!</p>
|
||||
|
||||
<p>Have a nice day!</p>
|
||||
<p>Antonio,</p>
|
||||
<p>CEO | Litlyx</p>
|
||||
|
||||
<p>Antonio,</p>
|
||||
<p>CEO | Litlyx</p>
|
||||
<a href="https://dashboard.litlyx.com/"
|
||||
style="line-height:100%;text-decoration:none;display:block;max-width:100%;mso-padding-alt:0px;background-color:#5680f8;border-radius:3px;color:#fff;font-size:18px;padding-top:19px;padding-bottom:19px;text-align:center;width:100%;padding:19px 0px 19px 0px"
|
||||
target="_blank"><span>
|
||||
|
||||
</span><span
|
||||
style="max-width:100%;display:inline-block;line-height:120%;mso-padding-alt:0px;mso-text-raise:14.25px">Go to Dashboard</span><span></span></a>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr
|
||||
style="width:100%;border:none;border-top:1px solid #eaeaea;border-color:#cccccc;margin:20px 0" />
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<p
|
||||
style="font-size:14px;line-height:24px;margin:16px 0;color:#9ca299;margin-bottom:10px">
|
||||
2024 © Litlyx. All rights reserved.
|
||||
<br>
|
||||
Litlyx S.R.L. - Viale Tirreno, 187 - 00141 Rome - P.IVA:
|
||||
17814721001- REA: RM-1743194
|
||||
</p>
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!--/$-->
|
||||
</body>
|
||||
</html>
|
||||
|
||||
</html>
|
||||
`
|
||||
|
||||
@@ -1,31 +1,117 @@
|
||||
export const LIMIT_90_EMAIL = `<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
export const LIMIT_90_EMAIL = `<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html dir="ltr" lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>You’ve reached 90% limit on Litlyx</title>
|
||||
<link rel="preload" as="image" href="https://react-email-demo-lpdmf0ryo-resend.vercel.app/static/airbnb-logo.png" />
|
||||
<link rel="preload" as="image"
|
||||
href="https://react-email-demo-lpdmf0ryo-resend.vercel.app/static/airbnb-review-user.jpg" />
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
||||
<meta name="x-apple-disable-message-reformatting" />
|
||||
<!--$-->
|
||||
</head>
|
||||
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333;">
|
||||
|
||||
<p>Dear User,</p>
|
||||
<body
|
||||
style='background-color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif'>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="max-width:100%;margin:0 auto;padding:20px 0 48px;width:580px">
|
||||
<tbody>
|
||||
<tr style="width:100%">
|
||||
<td>
|
||||
|
||||
<p>We wanted to let you know that <strong>[Project Name]</strong> on <strong>Litlyx</strong> has reached 90% of its data collection limit for this month.</p>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<img alt="Founder" height="96"
|
||||
src="https://litlyx.com/images/founder.jpg"
|
||||
style="display:block;outline:none;border:none;text-decoration:none;margin:0 auto;margin-bottom:16px;border-radius:50%"
|
||||
width="96" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="padding-bottom:20px">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<p
|
||||
style="font-size:32px;line-height:1.3;margin:16px 0;font-weight:700;color:#484848">
|
||||
You’ve Reached 90% of Your Litlyx Project Limit on [Project Name]
|
||||
</p>
|
||||
<p
|
||||
style="font-size:18px;line-height:1.4;margin:16px 0;color:#484848;padding:24px;background-color:#f2f3f3;border-radius:4px">
|
||||
To avoid losing precious data, please remember to monitor your usage
|
||||
on the <strong>Litlyx Dashboard</strong>. You can find your current
|
||||
usage details under <strong>Settings > Billing Tab</strong>
|
||||
</p>
|
||||
|
||||
<p>To avoid losing precious data, please remember to monitor your usage on the <strong>Litlyx Dashboard</strong>. You can find your current usage details under <strong>Settings > Billing Tab</strong>.</p>
|
||||
<p>If you need more data collection storage, you may consider upgrading
|
||||
your plan to get additional benefits and ensure uninterrupted data
|
||||
collection.</p>
|
||||
|
||||
<p>If you need more data collection storage, you may consider upgrading your plan to get additional benefits and ensure uninterrupted data collection.</p>
|
||||
<p>Feel free to reply to this email or contact us at <a
|
||||
href="mailto:help@litlyx.com"
|
||||
style="color: #FF5733; text-decoration: none;">help@litlyx.com</a>
|
||||
if you have any questions or need assistance.</p>
|
||||
|
||||
<p>Feel free to reply to this email or contact us at <a href="mailto:help@litlyx.com" style="color: #FF0000; text-decoration: none;">help@litlyx.com</a> if you have any questions or need assistance.</p>
|
||||
<p>Thank you for choosing Litlyx every day as your analytics tool.</p>
|
||||
|
||||
<p>Thank you for choosing Litlyx every day as your analytics tool.</p>
|
||||
<p>Have a nice day!</p>
|
||||
|
||||
<p>Have a nice day!</p>
|
||||
<p>Antonio,</p>
|
||||
<p>CEO | Litlyx</p>
|
||||
|
||||
<p>Antonio,</p>
|
||||
<p>CEO | Litlyx</p>
|
||||
<a href="https://dashboard.litlyx.com/"
|
||||
style="line-height:100%;text-decoration:none;display:block;max-width:100%;mso-padding-alt:0px;background-color:#5680f8;border-radius:3px;color:#fff;font-size:18px;padding-top:19px;padding-bottom:19px;text-align:center;width:100%;padding:19px 0px 19px 0px"
|
||||
target="_blank"><span>
|
||||
|
||||
</span><span
|
||||
style="max-width:100%;display:inline-block;line-height:120%;mso-padding-alt:0px;mso-text-raise:14.25px">Go to Dashboard</span><span></span></a>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr
|
||||
style="width:100%;border:none;border-top:1px solid #eaeaea;border-color:#cccccc;margin:20px 0" />
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<p
|
||||
style="font-size:14px;line-height:24px;margin:16px 0;color:#9ca299;margin-bottom:10px">
|
||||
2024 © Litlyx. All rights reserved.
|
||||
<br>
|
||||
Litlyx S.R.L. - Viale Tirreno, 187 - 00141 Rome - P.IVA:
|
||||
17814721001- REA: RM-1743194
|
||||
</p>
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!--/$-->
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
`
|
||||
|
||||
@@ -1,32 +1,138 @@
|
||||
export const LIMIT_MAX_EMAIL = `<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
export const LIMIT_MAX_EMAIL = `<!DOCTYPE html
|
||||
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html dir="ltr" lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>❗️ You’ve reached your limit on Litlyx!</title>
|
||||
<link rel="preload" as="image" href="https://react-email-demo-lpdmf0ryo-resend.vercel.app/static/airbnb-logo.png" />
|
||||
<link rel="preload" as="image"
|
||||
href="https://react-email-demo-lpdmf0ryo-resend.vercel.app/static/airbnb-review-user.jpg" />
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
|
||||
<meta name="x-apple-disable-message-reformatting" />
|
||||
<!--$-->
|
||||
</head>
|
||||
<body style="font-family: Arial, sans-serif; line-height: 1.6; color: #333;">
|
||||
|
||||
<p>Dear User,</p>
|
||||
<body
|
||||
style='background-color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif'>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="max-width:100%;margin:0 auto;padding:20px 0 48px;width:580px">
|
||||
<tbody>
|
||||
<tr style="width:100%">
|
||||
<td>
|
||||
|
||||
<p>We wanted to let you know that <strong>[Project Name]</strong> on <strong>Litlyx</strong> has reached the limit of your current plan.</p>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<img alt="Founder" height="96"
|
||||
src="https://litlyx.com/images/founder.jpg"
|
||||
style="display:block;outline:none;border:none;text-decoration:none;margin:0 auto;margin-bottom:16px;border-radius:50%"
|
||||
width="96" />
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation"
|
||||
style="padding-bottom:20px">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<p
|
||||
style="font-size:32px;line-height:1.3;margin:16px 0;font-weight:700;color:#484848">
|
||||
You’ve Reached Your Litlyx Project Limit on [Project Name]
|
||||
</p>
|
||||
<p
|
||||
style="font-size:18px;line-height:1.4;margin:16px 0;color:#484848;padding:24px;background-color:#ffbb03;border-radius:4px">
|
||||
We noticed that Litlyx has stopped collecting data for your project.
|
||||
</p>
|
||||
|
||||
<p>To avoid losing precious data, please remember to monitor your usage on the <strong>Litlyx Dashboard</strong>. You can find your current usage details under <strong>Settings > Billing Tab</strong>.</p>
|
||||
<p>
|
||||
To help you avoid losing valuable insights, we recommend keeping an
|
||||
eye on your usage via the Litlyx Dashboard.
|
||||
</p>
|
||||
|
||||
<p>If you need more data collection storage, you may consider upgrading your plan to get additional benefits and ensure uninterrupted data collection.</p>
|
||||
<p>
|
||||
You can view your current usage details under Settings > Billing
|
||||
Tab.
|
||||
</p>
|
||||
|
||||
<p>Feel free to reply to this email or contact us at <a href="mailto:help@litlyx.com" style="color: #D32F2F; text-decoration: none;">help@litlyx.com</a> if you have any questions or need assistance.</p>
|
||||
<p>
|
||||
If you need additional storage for data collection, consider
|
||||
upgrading your plan to unlock more benefits and ensure uninterrupted
|
||||
service.
|
||||
</p>
|
||||
<p style="font-weight: 700;">
|
||||
As a token of appreciation, we're offering you 25% off for life at
|
||||
checkout with the code LIT25.
|
||||
</p>
|
||||
Thank you for choosing Litlyx as your trusted analytics tool.
|
||||
<p></p>
|
||||
|
||||
<p>Thank you for choosing Litlyx every day as your analytics tool.</p>
|
||||
<p>
|
||||
If you have any questions or need assistance, feel free to reply to
|
||||
this email or contact us at <a href="mailto:help@litlyx.com"
|
||||
style="color: #FF5733; text-decoration: none;">help@litlyx.com</a>
|
||||
</p>
|
||||
|
||||
<p>Have a nice day!</p>
|
||||
<p>
|
||||
Have a great day!
|
||||
</p>
|
||||
|
||||
<p>Antonio,</p>
|
||||
<p>CEO | Litlyx</p>
|
||||
<p>
|
||||
Antonio
|
||||
CEO | Litlyx
|
||||
</p>
|
||||
|
||||
|
||||
<a href="https://dashboard.litlyx.com/"
|
||||
style="line-height:100%;text-decoration:none;display:block;max-width:100%;mso-padding-alt:0px;background-color:#5680f8;border-radius:3px;color:#fff;font-size:18px;padding-top:19px;padding-bottom:19px;text-align:center;width:100%;padding:19px 0px 19px 0px"
|
||||
target="_blank"><span>
|
||||
|
||||
</span><span
|
||||
style="max-width:100%;display:inline-block;line-height:120%;mso-padding-alt:0px;mso-text-raise:14.25px">Go
|
||||
to Dashboard</span><span></span></a>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<hr
|
||||
style="width:100%;border:none;border-top:1px solid #eaeaea;border-color:#cccccc;margin:20px 0" />
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0" role="presentation">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<table align="center" width="100%" border="0" cellpadding="0" cellspacing="0"
|
||||
role="presentation">
|
||||
<tbody style="width:100%">
|
||||
<tr style="width:100%">
|
||||
<p
|
||||
style="font-size:14px;line-height:24px;margin:16px 0;color:#9ca299;margin-bottom:10px">
|
||||
2024 © Litlyx. All rights reserved.
|
||||
<br>
|
||||
Litlyx S.R.L. - Viale Tirreno, 187 - 00141 Rome - P.IVA:
|
||||
17814721001- REA: RM-1743194
|
||||
</p>
|
||||
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<!--/$-->
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
`
|
||||
|
||||
Reference in New Issue
Block a user