@@ -641,22 +696,31 @@
}
];
- /* Top 5 most important needs */
+ /* Top 5 needs — 2 done after Oliver's last update */
const NEEDS = [
{ id: "n1", text: "Business emails for top 20 YouTube creators — blocking cold email outreach", done: false },
- { id: "n2", text: "Influencer partnership budget (free plans? cash? affiliate %?)", done: false },
+ { id: "n2", text: "Coupon codes ready: creator950 ($9.50), friends950 ($9.50) — unlimited, includes OpenRouter credits", done: true },
{ id: "n3", text: "Product demo video (3 min screen recording)", done: false },
{ id: "n4", text: "Social media account access (X/Twitter + LinkedIn posting)", done: false },
- { id: "n5", text: "'Why I built Derez.ai' notes for blog post", done: false },
+ { id: "n5", text: "'Why I built Derez.ai' story — available on homepage", done: true },
];
- /* Filtered comms — spam/sales/ads/work-for-you removed */
+ /* ── Infos (answers Oliver asked for, stored here not chat) ── */
+ const infos = [
+ { label: 'Coupon Codes', value: 'creator950 ($9.50 off), friends950 ($9.50 off) — unlimited use, OpenRouter credits still apply' },
+ { label: 'Cold Email', value: 'Signed as Mark — Customer Success Agent. Templates reviewed via Telegram before send.' },
+ { label: 'Influencer Offer', value: 'Free 3-month agent + 10% recurring affiliate commission. Pitch: "Deploy AI agents in 5 min — no DevOps."' },
+ { label: 'Site Status', value: 'derez.ai live. Prelaunch. 89 CRM contacts (59 YT creators on Hold).' },
+ { label: 'Timezone', value: 'America/Asuncion (PYST, UTC-3/UTC-4). Daily brief 09:00.' },
+ ];
+
+ /* ── Filtered comms — spam/sales/ads/work-for-you removed ── */
function isSpam(email) {
const lower = (email.subj + ' ' + email.from + ' ' + (email.detail || '')).toLowerCase();
const spamPatterns = [
'spam', 'advertisement', 'advert', 'work for you', 'work from home',
'make money', 'earn', 'investment opportunity', 'click here',
- 'buy now', 'limited offer', 'discount', 'free money', 'congratulations',
+ 'buy now', 'limited offer', 'free money', 'congratulations',
'you\'ve won', 'marketing offer', 'promotion', 'partner offer',
'guest post', 'seo services', 'link building', 'content writing services',
];
@@ -664,10 +728,10 @@
}
const rawInbox = [
- { id: 'i1', time: 'Jun 09 14:44', from: 'Mail Delivery System', subj: 'Undelivered — the@123.de', detail: '421 Downstream server error — cold email bounced', alert: true, spam: false },
- { id: 'i2', time: 'Jun 08 21:04', from: 'Mail Delivery System', subj: 'Undelivered — the@123.de', detail: '421 Downstream server error', alert: false, spam: false },
- { id: 'i3', time: 'Jun 10 08:12', from: 'seo@boostmyrank.xyz', subj: 'Guest post opportunity for your site', detail: 'Wants to publish sponsored content', spam: true },
- { id: 'i4', time: 'Jun 09 19:33', from: 'hannah@freelance.io', subj: 'I can help with your content marketing', detail: 'Offering writing services', spam: true },
+ { id: 'i1', time: '14:44', from: 'Mail Delivery System', subj: 'Undelivered — the@123.de', detail: '421 Downstream server error — cold email bounced', alert: true, spam: false },
+ { id: 'i2', time: '21:04', from: 'Mail Delivery System', subj: 'Undelivered — the@123.de', detail: '421 Downstream server error', alert: false, spam: false },
+ { id: 'i3', time: '08:12', from: 'seo@boostmyrank.xyz', subj: 'Guest post opportunity for your site', detail: 'Wants to publish sponsored content', spam: true },
+ { id: 'i4', time: '19:33', from: 'hannah@freelance.io', subj: 'I can help with your content marketing', detail: 'Offering writing services', spam: true },
];
const rawSent = [
@@ -675,29 +739,6 @@
{ time: 'Jun 08', to: 'oliver@odoo4projects.com', subj: 'managing your agents without SSH', spam: false },
];
- const strategyCards = [
- {
- icon: '📢', title: 'Influencer Outreach',
- body: 'Target 60 YouTube creators in AI/ML/DevOps. Offer free 3-month agent + 10% recurring affiliate commission. Pitch: "Deploy AI agents in 5 minutes — no DevOps needed."',
- goal: 'Goal: 20 onboarded, 3+ social mentions'
- },
- {
- icon: '👨👩👧👦', title: 'Cold Email',
- body: 'Templates & coupons ready (friends950, creator950). Signed as Mark. All drafts reviewed via Telegram before sending.',
- goal: 'Goal: 100 sent, 10+ replies'
- },
- {
- icon: '🔗', title: 'LinkedIn Presence',
- body: 'Zero presence. Need page, connections, and content strategy before outreach.',
- goal: 'Goal: Page live, 100 connections'
- },
- {
- icon: '📈', title: 'SEO & Analytics',
- body: 'Plausible analytics live with 7 custom events. Weekly cron monitors insights. Need Search Console + directory listings.',
- goal: 'Goal: 10K visitors/mo, top 5 for "AI agent hosting"'
- }
- ];
-
const comms = {
inbox: {
total: rawInbox.filter(i => !i.spam).length,
@@ -713,16 +754,23 @@
};
/* ════════ RENDER ════════ */
- function fmtDate() {
- return new Date().toLocaleDateString('en-US', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' });
+ function fmtTimestamp(date) {
+ const d = date || new Date();
+ const y = d.getFullYear();
+ const mo = String(d.getMonth() + 1).padStart(2, '0');
+ const day = String(d.getDate()).padStart(2, '0');
+ const h = String(d.getHours()).padStart(2, '0');
+ const mi = String(d.getMinutes()).padStart(2, '0');
+ return `${y}-${mo}-${day} ${h}:${mi}`;
}
+
function pct(cur, target) { return target > 0 ? Math.min(100, Math.round(cur / target * 100)) : 0; }
function barClass(p) { return p >= 80 ? 'green' : p >= 40 ? 'blue' : p >= 20 ? 'yellow' : 'red'; }
function toggleSection(id, header) {
const el = document.getElementById(id);
const toggle = header.querySelector('.section-toggle');
- el.classList.toggle('hidden');
+ el.classList.toggle('open');
toggle.classList.toggle('collapsed');
}
@@ -752,7 +800,7 @@
}).join('');
}
- /* ── Interactive checkboxes ── */
+ /* ── Needs (checkboxes) ── */
function getNeeds() {
try {
const saved = localStorage.getItem("derez-needs");
@@ -823,6 +871,12 @@
`;
}
+ function renderInfos() {
+ document.getElementById('infos-list').innerHTML = infos.map(i =>
+ `
${i.label}${i.value}`
+ ).join('');
+ }
+
async function fetchLiveData() {
try {
const res = await fetch('data/operations.json?t=' + Date.now());
@@ -836,11 +890,12 @@
}
/* ── Init ── */
- document.getElementById('brief-date').textContent = fmtDate();
+ document.getElementById('brief-date').textContent = fmtTimestamp();
renderGoals();
renderCampaigns();
renderNeeds(getNeeds());
renderCommunications();
+ renderInfos();
fetchLiveData();