\documentclass[11pt, a4paper]{article} % --- UNIVERSAL PREAMBLE BLOCK --- \usepackage[a4paper, top=2.2cm, bottom=2.2cm, left=1.8cm, right=1.8cm]{geometry} \usepackage{fontspec} \usepackage[english]{babel} % Set default/Latin font to Sans Serif (Noto Sans) \babelfont{rm}{Noto Sans} % --- ADDITIONAL PACKAGES & DESIGN TOKENS --- \usepackage{xcolor} \usepackage{tcolorbox} \tcbuselibrary{skins, breakable} \usepackage{array} \usepackage{colortbl} \usepackage{multicol} \usepackage{enumitem} \usepackage{microtype} % Color Palette (derived from the modern dashboard) \definecolor{accent1}{HTML}{5B21B6} % Indigo/Deep Purple (adjusted for print contrast) \definecolor{accent2}{HTML}{BE185D} % Deep Rose \definecolor{accent3}{HTML}{0F766E} % Deep Teal \definecolor{accent4}{HTML}{B45309} % Amber/Gold \definecolor{bglight}{HTML}{F8FAFC} % Light background for cards \definecolor{bordercolor}{HTML}{E2E8F0} \definecolor{textdark}{HTML}{0F172A} \definecolor{textmuted}{HTML}{475569} % Global Paragraph Adjustments \setlength{\parindent}{0pt} \setlength{\parskip}{8pt} % Custom Styled Command for Progress/Activity Bars \newcommand{\drawbar}[2]{% \begingroup% \color{#1}\rule{#2\linewidth}{6pt}% \endgroup% } % Card Styles \newtcolorbox{statcard}[1]{ colback=bglight, colframe=bordercolor, arc=8pt, boxrule=1pt, valign=center, halign=center, width=\dimexpr0.25\textwidth-12pt\relax, nobeforeafter, boxsep=2pt, top=12pt, bottom=12pt, borderline north={2pt}{0pt}{#1} } \newtcolorbox{insightcard}[2]{ colback=bglight, colframe=bordercolor, arc=6pt, boxrule=0.8pt, top=12pt, bottom=12pt, left=12pt, right=12pt, fonttitle=\bfseries\color{textdark}, title={#1}, borderline west={3pt}{0pt}{#2} } % Hyperref - MUST be the last package \usepackage[colorlinks=true, linkcolor=accent1, urlcolor=accent1]{hyperref} \begin{document} % --- HEADER SECTION --- \begin{center} \begingroup \color{accent3} \bfseries \fontsize{9}{11}\selectfont \rule[3pt]{20pt}{1pt}\quad CHATGPT EXPORT ANALYSIS \quad\rule[3pt]{20pt}{1pt} \endgroup \vspace{8pt} {\fontsize{28}{34}\bfseries\color{textdark} Your AI Conversation Report} \vspace{4pt} {\textcolor{textmuted}{\fontsize{11}{14}\selectfont Dec 2025 --- Apr 2026 \quad\textbullet\quad Full Export Analysis}} \vspace{12pt} % Profile Badge \begin{tcolorbox}[ colback=bglight, colframe=bordercolor, arc=15pt, boxrule=1pt, width=0.75\textwidth, halign=center, top=6pt, bottom=6pt ] \fontsize{10}{12}\selectfont \textcolor{accent1}{\textbf{S}} \quad\textbullet\quad \textcolor{textdark}{User born \textbf{2006}} \quad\textbullet\quad Free Plan \quad\textbullet\quad \textcolor{textdark}{\texttt{syamaeib@gmail.com}} \end{tcolorbox} \end{center} \vspace{16pt} % --- KEY STATS --- \begin{center} \begin{statcard}{accent1} {\textbf{\textcolor{accent1}{\fontsize{20}{24}\selectfont 166}}}\\[4pt] \fontsize{8}{10}\selectfont\color{textmuted}\MakeUppercase{Conversations} \end{statcard}\hfill \begin{statcard}{accent2} {\textbf{\textcolor{accent2}{\fontsize{20}{24}\selectfont 1,902}}}\\[4pt] \fontsize{8}{10}\selectfont\color{textmuted}\MakeUppercase{Your Messages} \end{statcard}\hfill \begin{statcard}{accent3} {\textbf{\textcolor{accent3}{\fontsize{20}{24}\selectfont 2,363}}}\\[4pt] \fontsize{8}{10}\selectfont\color{textmuted}\MakeUppercase{AI Replies} \end{statcard}\hfill \begin{statcard}{accent4} {\textbf{\textcolor{accent4}{\fontsize{20}{24}\selectfont 142}}}\\[4pt] \fontsize{8}{10}\selectfont\color{textmuted}\MakeUppercase{Days Active} \end{statcard} \end{center} \vspace{18pt} % --- SECTION: MONTHLY ACTIVITY --- \begingroup \color{accent1}\fontsize{10}{12}\bfseries\MakeUppercase{Monthly Activity} \endgroup \hrule height 0.5pt\relax \vspace{8pt} \begin{tcolorbox}[colback=bglight, colframe=bordercolor, arc=8pt, boxrule=1pt, top=16pt, bottom=16pt] \begin{tabular}{m{2.5cm} m{8.5cm} r} \textbf{\small DEC '25} & \drawbar{accent1}{0.52} & \textbf{21} \\ \textbf{\small JAN '26} & \drawbar{accent2}{0.98} & \textbf{39} \\ \textbf{\small FEB '26} & \drawbar{accent3}{0.70} & \textbf{28} \\ \textbf{\small MAR '26} & \drawbar{accent4}{0.95} & \textbf{38} \\ \textbf{\small APR '26} & \drawbar{accent1}{1.00} & \textbf{40} \\ \end{tabular} \end{tcolorbox} \vspace{18pt} % --- SECTION: TOPIC BREAKDOWN --- \begingroup \color{accent1}\fontsize{10}{12}\bfseries\MakeUppercase{Topic Breakdown} \endgroup \hrule height 0.5pt\relax \vspace{8pt} \begin{tcolorbox}[colback=bglight, colframe=bordercolor, arc=8pt, boxrule=1pt, top=12pt, bottom=12pt] \fontsize{10}{14}\selectfont \begin{tabular}{m{4.5cm} m{8.5cm} r} \textbf{Nutrition \& Diet} & \drawbar{accent3}{0.72} & \textcolor{accent3}{\textbf{$\approx$ 62}} \\ \textbf{Health \& Medical} & \drawbar{accent2}{0.30} & \textcolor{accent2}{\textbf{$\approx$ 22}} \\ \textbf{Fitness \& Gym} & \drawbar{accent1}{0.25} & \textcolor{accent1}{\textbf{$\approx$ 20}} \\ \textbf{Education \& College} & \drawbar{accent4}{0.18} & \textcolor{accent4}{\textbf{$\approx$ 15}} \\ \textbf{Anime \& Entertainment} & \drawbar{accent2}{0.15} & \textcolor{accent2}{\textbf{$\approx$ 12}} \\ \textbf{Tech \& Gaming} & \drawbar{accent1}{0.14} & \textcolor{accent1}{\textbf{$\approx$ 12}} \\ \textbf{Supplements} & \drawbar{accent3}{0.12} & \textcolor{accent3}{\textbf{$\approx$ 10}} \\ \textbf{Coding \& Math} & \drawbar{accent1}{0.09} & \textcolor{accent1}{\textbf{$\approx$ 8}} \\ \textbf{Personal / Lifestyle} & \drawbar{accent4}{0.09} & \textcolor{accent4}{\textbf{$\approx$ 5}} \\ \end{tabular} \end{tcolorbox} \newpage % --- SECTION: MOST ACTIVE CONVERSATIONS --- \begingroup \color{accent1}\fontsize{10}{12}\bfseries\MakeUppercase{Most Active Conversations} \endgroup \hrule height 0.5pt\relax \vspace{8pt} \begin{tcolorbox}[colback=bglight, colframe=bordercolor, arc=8pt, boxrule=1pt, top=8pt, bottom=8pt, left=12pt, right=12pt] \fontsize{10}{13}\selectfont \begin{tabular}{c m{10cm} r} \textbf{\color{accent1}01} & \textbf{Body Fat Percentage Estimate} \newline \textcolor{textmuted}{1,473 messages \quad\textbullet\quad Health} & \colorbox{accent2!15}{\textcolor{accent2}{\textbf{\fontsize{8}{10}\selectfont EPIC}}} \\ \hline \textbf{\color{accent1}02} & \textbf{Gym Tips for Beginners} \newline \textcolor{textmuted}{645 messages \quad\textbullet\quad Fitness} & \colorbox{accent1!15}{\textcolor{accent1}{\textbf{\fontsize{8}{10}\selectfont LONG}}} \\ \hline \textbf{\color{accent1}03} & \textbf{Lab Report Summary} \newline \textcolor{textmuted}{394 messages \quad\textbullet\quad Medical} & \colorbox{accent3!15}{\textcolor{accent3}{\textbf{\fontsize{8}{10}\selectfont DEEP}}} \\ \hline \textbf{\color{accent1}04} & \textbf{Blood Sugar Post-Meal} \newline \textcolor{textmuted}{84 messages \quad\textbullet\quad Nutrition} & \colorbox{accent4!15}{\textcolor{accent4}{\textbf{\fontsize{8}{10}\selectfont ACTIVE}}} \\ \hline \textbf{\color{accent1}05} & \textbf{Dying Light Steam Price} \newline \textcolor{textmuted}{77 messages \quad\textbullet\quad Gaming} & \colorbox{accent3!15}{\textcolor{accent3}{\textbf{\fontsize{8}{10}\selectfont ACTIVE}}} \\ \end{tabular} \end{tcolorbox} \vspace{18pt} % --- SECTION: KEY INSIGHTS --- \begingroup \color{accent1}\fontsize{10}{12}\bfseries\MakeUppercase{Key Insights} \endgroup \hrule height 0.5pt\relax \vspace{8pt} \begin{multicols}{2} \begin{insightcard}{Managing a Health Condition}{accent2} \fontsize{9.5}{13.5}\selectfont\color{textmuted} You have many conversations about prediabetes, blood sugar, metformin, and lab reports --- suggesting you're actively monitoring and managing a health condition. You asked very detailed, specific questions about glucose, insulin, and organ effects. \end{insightcard} \begin{insightcard}{Serious About Fitness}{accent1} \fontsize{9.5}{13.5}\selectfont\color{textmuted} Gym tips, workout splits, body fat \%, incline walking, creatine, whey protein --- you're deeply invested in fitness and bodybuilding. Your longest single conversation (1,473 msgs!) was about body fat estimation. \end{insightcard} \begin{insightcard}{Making a Big Life Decision}{accent4} \fontsize{9.5}{13.5}\selectfont\color{textmuted} Multiple conversations about Aakash, Physics Wallah, Narayana PU College, PCMC/PCMB switch, and Presidency College exams show you're in the middle of choosing your academic path --- likely preparing for competitive entrance exams. \end{insightcard} \begin{insightcard}{Passionate Anime Fan}{accent2} \fontsize{9.5}{13.5}\selectfont\color{textmuted} You debated Naruto vs AOT vs One Piece multiple times, discussed Gojo vs Yuji, and Minato's absence. One Piece vs Naruto appeared 3 separate times --- clearly a topic you're very passionate about! \end{insightcard} \begin{insightcard}{Tech-Savvy Gamer}{accent3} \fontsize{9.5}{13.5}\selectfont\color{textmuted} You researched KLIM laptops, Lenovo LOQ, DX11 vs DX12, Dying Light pricing, and game difficulty tips (Hunter Build, Master Mode). You compare specs carefully before buying. \end{insightcard} \begin{insightcard}{Nutrition Obsessed}{accent3} \fontsize{9.5}{13.5}\selectfont\color{textmuted} Rice, tofu, soya chunks, sweet potato, stevia, chicken liver --- you asked about almost every food category. You're carefully tracking macros, GI index, and cooking methods, likely tied to managing your health condition. \end{insightcard} \begin{insightcard}{Sleep Struggles}{accent4} \fontsize{9.5}{13.5}\selectfont\color{textmuted} Multiple chats about trouble sleeping, sleep timing impact, sleep rebound effects, nap impact, and sleep duration calculation. Sleep quality is a recurring concern for you. \end{insightcard} \begin{insightcard}{Growing Usage Over Time}{accent1} \fontsize{9.5}{13.5}\selectfont\color{textmuted} You started with 21 conversations in Dec 2025 and peaked at 40 in April 2026 --- nearly doubling your usage. You're relying on ChatGPT more and more each month. \end{insightcard} \end{multicols} \newpage % --- SECTION: FUN FACTS --- \begingroup \color{accent1}\fontsize{10}{12}\bfseries\MakeUppercase{Fun Facts} \endgroup \hrule height 0.5pt\relax \vspace{8pt} \begin{multicols}{2} \begin{insightcard}{Most Debated Topic}{accent2} \fontsize{9.5}{13.5}\selectfont\color{textmuted} \textbf{Naruto vs One Piece} --- you started this debate at least \textcolor{accent2}{\textbf{4 separate times}}! You clearly can't make up your mind. \end{insightcard} \begin{insightcard}{Most Focused Topic}{accent3} \fontsize{9.5}{13.5}\selectfont\color{textmuted} \textbf{Nutrition} makes up over \textcolor{accent3}{\textbf{37\%}} of all your conversations --- you're practically a food scientist at this point! \end{insightcard} \begin{insightcard}{Deepest Dive}{accent1} \fontsize{9.5}{13.5}\selectfont\color{textmuted} The ``Body Fat Percentage Estimate'' conversation had \textcolor{accent1}{\textbf{1,473 messages}} --- that's almost a full book's worth of conversation in one thread! \end{insightcard} \begin{insightcard}{Young \& Curious}{accent4} \fontsize{9.5}{13.5}\selectfont\color{textmuted} Born in \textcolor{accent4}{\textbf{2006}}, you're around 19 years old and using AI to navigate everything from college choices to health and gaming. That's impressive! \end{insightcard} \end{multicols} \vfill % --- FOOTER --- \begin{center} \fontsize{8}{10}\selectfont\color{textmuted}\MakeUppercase{Generated from ChatGPT Export Analysis \quad\textbullet\quad July 2026} \end{center} \end{document}
ls /home/daytona/workspace/ 2>/dev/null && which xelatex && fc-list | grep -i "Noto Sans" | head -5
which pdflatex; which lualatex; which latex; ls /usr/bin/*latex* 2>/dev/null; ls /usr/local/bin/*latex* 2>/dev/null; apt list --installed 2>/dev/null | grep -i texlive | head -10
python3 -c "import reportlab; print(reportlab.Version)"
mkdir -p /home/daytona/workspace/chatgpt-report
~/chatgpt-report/build_report.py
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm, pt
from reportlab.lib import colors
from reportlab.lib.colors import HexColor
from reportlab.pdfgen import canvas
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, KeepTogether, PageBreak
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.platypus.flowables import Flowable
import textwrap
# ── Color Palette ──────────────────────────────────────────────
C_ACCENT1 = HexColor('#5B21B6') # Indigo
C_ACCENT2 = HexColor('#BE185D') # Deep Rose
C_ACCENT3 = HexColor('#0F766E') # Teal
C_ACCENT4 = HexColor('#B45309') # Amber
C_BGLIGHT = HexColor('#F8FAFC')
C_BORDER = HexColor('#E2E8F0')
C_TEXTDARK = HexColor('#0F172A')
C_TEXTMUTED = HexColor('#475569')
C_WHITE = colors.white
PAGE_W, PAGE_H = A4
MARGIN_L = 18*mm
MARGIN_R = 18*mm
MARGIN_T = 22*mm
MARGIN_B = 22*mm
CONTENT_W = PAGE_W - MARGIN_L - MARGIN_R
# ── Helper Flowables ───────────────────────────────────────────
class RoundedCard(Flowable):
"""A rounded rectangle card with optional top or left accent stripe."""
def __init__(self, width, height, content_fn, radius=6,
bg=C_BGLIGHT, border=C_BORDER, accent_color=None,
accent_side='top', accent_w=2.5):
super().__init__()
self.card_w = width
self.card_h = height
self.content_fn = content_fn
self.radius = radius
self.bg = bg
self.border = border
self.accent_color = accent_color
self.accent_side = accent_side
self.accent_w = accent_w
self.width = width
self.height = height
def draw(self):
c = self.canv
r = self.radius
w, h = self.card_w, self.card_h
# Shadow-like background
c.setFillColor(self.bg)
c.setStrokeColor(self.border)
c.setLineWidth(0.8)
c.roundRect(0, 0, w, h, r, stroke=1, fill=1)
# Accent stripe
if self.accent_color:
c.setFillColor(self.accent_color)
if self.accent_side == 'top':
# top rounded stripe
c.setStrokeColor(self.accent_color)
c.setLineWidth(0)
c.roundRect(0, h - self.accent_w, w, self.accent_w, r, stroke=0, fill=1)
c.rect(0, h - self.accent_w - r, w, r + 1, stroke=0, fill=1)
elif self.accent_side == 'left':
c.setStrokeColor(self.accent_color)
c.setLineWidth(0)
c.roundRect(0, 0, self.accent_w, h, min(r, self.accent_w//2+1), stroke=0, fill=1)
c.rect(r, 0, self.accent_w - r + 1, h, stroke=0, fill=1)
# Call content drawing function
self.content_fn(c, w, h)
class ProgressBar(Flowable):
def __init__(self, width, height, fraction, color, label_left, label_right, font_size=9):
super().__init__()
self.bar_w = width
self.bar_h = height
self.fraction = fraction
self.color = color
self.label_left = label_left
self.label_right = label_right
self.font_size = font_size
self.width = width
self.height = height + 18
def draw(self):
c = self.canv
y_bar = 2
label_h = 14
# Labels
c.setFont('Helvetica-Bold', self.font_size)
c.setFillColor(C_TEXTDARK)
c.drawString(0, y_bar + self.bar_h + 4, self.label_left)
c.setFillColor(self.color)
c.drawRightString(self.bar_w, y_bar + self.bar_h + 4, self.label_right)
# Track
c.setFillColor(C_BORDER)
c.roundRect(0, y_bar, self.bar_w, self.bar_h, self.bar_h/2, stroke=0, fill=1)
# Fill
fill_w = max(self.bar_w * self.fraction, self.bar_h)
c.setFillColor(self.color)
c.roundRect(0, y_bar, fill_w, self.bar_h, self.bar_h/2, stroke=0, fill=1)
class SectionHeader(Flowable):
def __init__(self, title, color=C_ACCENT1, width=CONTENT_W):
super().__init__()
self.title = title
self.color = color
self.width = width
self.height = 22
def draw(self):
c = self.canv
c.setFont('Helvetica-Bold', 9.5)
c.setFillColor(self.color)
c.drawString(0, 9, self.title.upper())
c.setStrokeColor(C_BORDER)
c.setLineWidth(0.5)
c.line(0, 3, self.width, 3)
# ── Build PDF ─────────────────────────────────────────────────
def build():
out = '/home/daytona/workspace/chatgpt-report/ChatGPT_Report.pdf'
doc = SimpleDocTemplate(
out,
pagesize=A4,
leftMargin=MARGIN_L,
rightMargin=MARGIN_R,
topMargin=MARGIN_T,
bottomMargin=MARGIN_B,
)
story = []
W = CONTENT_W
# ── HEADER ────────────────────────────────────────────────
# Decorative subtitle line
story.append(Paragraph(
'<font color="#0F766E"><b>─── CHATGPT EXPORT ANALYSIS ───</b></font>',
ParagraphStyle('sub', fontName='Helvetica-Bold', fontSize=8.5,
textColor=C_ACCENT3, alignment=TA_CENTER, spaceAfter=6)
))
story.append(Paragraph(
'<font color="#0F172A"><b>Your AI Conversation Report</b></font>',
ParagraphStyle('h1', fontName='Helvetica-Bold', fontSize=26,
textColor=C_TEXTDARK, alignment=TA_CENTER, spaceAfter=4)
))
story.append(Paragraph(
'<font color="#475569">Dec 2025 – Apr 2026 • Full Export Analysis</font>',
ParagraphStyle('sub2', fontName='Helvetica', fontSize=10,
textColor=C_TEXTMUTED, alignment=TA_CENTER, spaceAfter=10)
))
# Profile badge
badge_data = [[
Paragraph(
'<font color="#5B21B6"><b>S</b></font>'
' <font color="#475569">•</font> '
'<font color="#0F172A">User born <b>2006</b></font>'
' <font color="#475569">•</font> '
'<font color="#475569">Free Plan</font>'
' <font color="#475569">•</font> '
'<font color="#0F172A"><b>syamaeib@gmail.com</b></font>',
ParagraphStyle('badge', fontName='Helvetica', fontSize=9.5,
alignment=TA_CENTER, textColor=C_TEXTDARK)
)
]]
badge_w = W * 0.72
badge_table = Table(badge_data, colWidths=[badge_w])
badge_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_BGLIGHT),
('BOX', (0,0), (-1,-1), 0.8, C_BORDER),
('ROUNDEDCORNERS', [12]),
('TOPPADDING', (0,0), (-1,-1), 8),
('BOTTOMPADDING', (0,0), (-1,-1), 8),
('LEFTPADDING', (0,0), (-1,-1), 16),
('RIGHTPADDING', (0,0), (-1,-1), 16),
]))
# Center the badge
badge_outer = Table([[badge_table]], colWidths=[W])
badge_outer.setStyle(TableStyle([
('ALIGN', (0,0), (-1,-1), 'CENTER'),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
]))
story.append(badge_outer)
story.append(Spacer(1, 16))
# ── KEY STATS (4 cards) ────────────────────────────────────
def make_stat_cell(value, label, accent):
return Paragraph(
f'<font color="{accent.hexval()}"><b><font size="22">{value}</font></b></font>'
f'<br/><font color="#475569" size="7.5">{label.upper()}</font>',
ParagraphStyle('sc', fontName='Helvetica', fontSize=9,
alignment=TA_CENTER, leading=18)
)
stat_data = [[
make_stat_cell('166', 'Conversations', C_ACCENT1),
make_stat_cell('1,902', 'Your Messages', C_ACCENT2),
make_stat_cell('2,363', 'AI Replies', C_ACCENT3),
make_stat_cell('142', 'Days Active', C_ACCENT4),
]]
cw = (W - 3*6) / 4
stat_table = Table(stat_data, colWidths=[cw]*4, hAlign='LEFT')
stat_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_BGLIGHT),
('BOX', (0,0), (0,0), 0.8, C_BORDER),
('BOX', (1,0), (1,0), 0.8, C_BORDER),
('BOX', (2,0), (2,0), 0.8, C_BORDER),
('BOX', (3,0), (3,0), 0.8, C_BORDER),
('LINEABOVE', (0,0), (0,0), 2.5, C_ACCENT1),
('LINEABOVE', (1,0), (1,0), 2.5, C_ACCENT2),
('LINEABOVE', (2,0), (2,0), 2.5, C_ACCENT3),
('LINEABOVE', (3,0), (3,0), 2.5, C_ACCENT4),
('TOPPADDING', (0,0), (-1,-1), 14),
('BOTTOMPADDING', (0,0), (-1,-1), 14),
('ALIGN', (0,0), (-1,-1), 'CENTER'),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('ROUNDEDCORNERS', [6]),
]))
story.append(stat_table)
story.append(Spacer(1, 18))
# ── MONTHLY ACTIVITY ──────────────────────────────────────
story.append(SectionHeader('Monthly Activity'))
story.append(Spacer(1, 6))
months = [
("DEC '25", C_ACCENT1, 0.52, '21'),
("JAN '26", C_ACCENT2, 0.98, '39'),
("FEB '26", C_ACCENT3, 0.70, '28'),
("MAR '26", C_ACCENT4, 0.95, '38'),
("APR '26", C_ACCENT1, 1.00, '40'),
]
BAR_H = 9
bar_col_w = W - 60 - 30 - 8 # label col + count col + padding
def month_rows():
rows = []
for label, color, frac, count in months:
lbl = Paragraph(f'<b><font size="9">{label}</font></b>',
ParagraphStyle('ml', fontName='Helvetica-Bold',
fontSize=9, textColor=C_TEXTDARK,
alignment=TA_LEFT))
# bar as a colored rectangle in a nested table
track_w = bar_col_w
bar_fill_w = max(track_w * frac, BAR_H)
class InlineBar(Flowable):
def __init__(self, fill, total, clr, bh=BAR_H):
super().__init__()
self.fill = fill
self.total = total
self.clr = clr
self.bh = bh
self.width = total
self.height = bh + 4
def draw(self):
cv = self.canv
cv.setFillColor(C_BORDER)
cv.roundRect(0, 2, self.total, self.bh, self.bh/2, stroke=0, fill=1)
cv.setFillColor(self.clr)
cv.roundRect(0, 2, max(self.fill, self.bh), self.bh, self.bh/2, stroke=0, fill=1)
bar_flow = InlineBar(bar_fill_w, track_w, color)
cnt = Paragraph(f'<b><font size="10">{count}</font></b>',
ParagraphStyle('mc', fontName='Helvetica-Bold',
fontSize=10, textColor=C_TEXTDARK,
alignment=TA_RIGHT))
rows.append([lbl, bar_flow, cnt])
return rows
month_table = Table(month_rows(), colWidths=[60, bar_col_w, 30],
hAlign='LEFT', rowHeights=22)
month_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_BGLIGHT),
('BOX', (0,0), (-1,-1), 0.8, C_BORDER),
('TOPPADDING', (0,0), (-1,-1), 5),
('BOTTOMPADDING', (0,0), (-1,-1), 5),
('LEFTPADDING', (0,0), (-1,-1), 12),
('RIGHTPADDING', (-1,0), (-1,-1), 12),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('ROUNDEDCORNERS', [6]),
]))
story.append(month_table)
story.append(Spacer(1, 18))
# ── TOPIC BREAKDOWN ───────────────────────────────────────
story.append(SectionHeader('Topic Breakdown'))
story.append(Spacer(1, 6))
topics = [
('Nutrition & Diet', C_ACCENT3, 0.72, '≈ 62'),
('Health & Medical', C_ACCENT2, 0.30, '≈ 22'),
('Fitness & Gym', C_ACCENT1, 0.25, '≈ 20'),
('Education & College', C_ACCENT4, 0.18, '≈ 15'),
('Anime & Entertainment', C_ACCENT2, 0.15, '≈ 12'),
('Tech & Gaming', C_ACCENT1, 0.14, '≈ 12'),
('Supplements', C_ACCENT3, 0.12, '≈ 10'),
('Coding & Math', C_ACCENT1, 0.09, '≈ 8'),
('Personal / Lifestyle', C_ACCENT4, 0.09, '≈ 5'),
]
topic_label_w = 110
topic_bar_w = W - topic_label_w - 40 - 8
topic_count_w = 40
def topic_rows():
rows = []
for label, color, frac, count in topics:
lbl = Paragraph(f'<b><font size="9">{label}</font></b>',
ParagraphStyle('tl', fontName='Helvetica-Bold',
fontSize=9, textColor=C_TEXTDARK,
alignment=TA_LEFT))
class TBar(Flowable):
def __init__(self, fill_f, total, clr, bh=8):
super().__init__()
self.fill_f = fill_f
self.total = total
self.clr = clr
self.bh = bh
self.width = total
self.height = bh + 4
def draw(self):
cv = self.canv
cv.setFillColor(C_BORDER)
cv.roundRect(0, 2, self.total, self.bh, self.bh/2, stroke=0, fill=1)
cv.setFillColor(self.clr)
fill_px = max(self.total * self.fill_f, self.bh)
cv.roundRect(0, 2, fill_px, self.bh, self.bh/2, stroke=0, fill=1)
bar_flow = TBar(frac, topic_bar_w, color)
cnt = Paragraph(
f'<font color="{color.hexval()}"><b><font size="9">{count}</font></b></font>',
ParagraphStyle('tc', fontName='Helvetica-Bold', fontSize=9,
alignment=TA_RIGHT))
rows.append([lbl, bar_flow, cnt])
return rows
topic_table = Table(topic_rows(),
colWidths=[topic_label_w, topic_bar_w, topic_count_w],
hAlign='LEFT', rowHeights=21)
topic_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_BGLIGHT),
('BOX', (0,0), (-1,-1), 0.8, C_BORDER),
('TOPPADDING', (0,0), (-1,-1), 4),
('BOTTOMPADDING', (0,0), (-1,-1), 4),
('LEFTPADDING', (0,0), (-1,-1), 12),
('RIGHTPADDING', (-1,0), (-1,-1), 12),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('ROWBACKGROUNDS',(0,0), (-1,-1), [C_BGLIGHT, HexColor('#F1F5F9')]),
('ROUNDEDCORNERS', [6]),
]))
story.append(topic_table)
# ── PAGE 2 ────────────────────────────────────────────────
story.append(PageBreak())
# ── MOST ACTIVE CONVERSATIONS ─────────────────────────────
story.append(SectionHeader('Most Active Conversations'))
story.append(Spacer(1, 6))
convos = [
('01', 'Body Fat Percentage Estimate', '1,473 messages • Health', 'EPIC', C_ACCENT2),
('02', 'Gym Tips for Beginners', '645 messages • Fitness', 'LONG', C_ACCENT1),
('03', 'Lab Report Summary', '394 messages • Medical', 'DEEP', C_ACCENT3),
('04', 'Blood Sugar Post-Meal', '84 messages • Nutrition', 'ACTIVE', C_ACCENT4),
('05', 'Dying Light Steam Price', '77 messages • Gaming', 'ACTIVE', C_ACCENT3),
]
def convo_rows():
rows = []
for num, title, meta, badge_text, badge_color in convos:
num_p = Paragraph(
f'<font color="{C_ACCENT1.hexval()}"><b>{num}</b></font>',
ParagraphStyle('cn', fontName='Helvetica-Bold', fontSize=11,
alignment=TA_CENTER, textColor=C_ACCENT1))
detail_p = Paragraph(
f'<b><font size="10">{title}</font></b><br/>'
f'<font color="#475569" size="8">{meta}</font>',
ParagraphStyle('cd', fontName='Helvetica', fontSize=9,
leading=14, textColor=C_TEXTDARK))
# Badge pill
r, g, b = badge_color.red, badge_color.green, badge_color.blue
badge_bg = HexColor('#{:02X}{:02X}{:02X}'.format(
int(r*255*0.15 + 255*0.85),
int(g*255*0.15 + 255*0.85),
int(b*255*0.15 + 255*0.85)
))
badge_p = Paragraph(
f'<font color="{badge_color.hexval()}"><b><font size="7.5">{badge_text}</font></b></font>',
ParagraphStyle('cb', fontName='Helvetica-Bold', fontSize=7.5,
alignment=TA_CENTER))
badge_cell = Table([[badge_p]], colWidths=[46])
badge_cell.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), badge_bg),
('TOPPADDING', (0,0), (-1,-1), 3),
('BOTTOMPADDING', (0,0), (-1,-1), 3),
('LEFTPADDING', (0,0), (-1,-1), 5),
('RIGHTPADDING', (0,0), (-1,-1), 5),
('ROUNDEDCORNERS', [4]),
]))
rows.append([num_p, detail_p, badge_cell])
return rows
convo_table = Table(convo_rows(), colWidths=[30, W-30-60, 60],
hAlign='LEFT')
line_cmds = []
for i in range(1, len(convos)):
line_cmds.append(('LINEABOVE', (0,i), (-1,i), 0.5, C_BORDER))
convo_table.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_BGLIGHT),
('BOX', (0,0), (-1,-1), 0.8, C_BORDER),
('TOPPADDING', (0,0), (-1,-1), 10),
('BOTTOMPADDING', (0,0), (-1,-1), 10),
('LEFTPADDING', (0,0), (-1,-1), 12),
('RIGHTPADDING', (-1,0), (-1,-1), 12),
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('ALIGN', (0,0), (0,-1), 'CENTER'),
('ALIGN', (2,0), (2,-1), 'CENTER'),
('ROUNDEDCORNERS', [6]),
] + line_cmds))
story.append(convo_table)
story.append(Spacer(1, 18))
# ── KEY INSIGHTS ──────────────────────────────────────────
story.append(SectionHeader('Key Insights'))
story.append(Spacer(1, 6))
insights = [
('Managing a Health Condition', C_ACCENT2,
'You have many conversations about prediabetes, blood sugar, metformin, and lab reports - '
"suggesting you're actively monitoring and managing a health condition. You asked very "
'detailed, specific questions about glucose, insulin, and organ effects.'),
('Serious About Fitness', C_ACCENT1,
'Gym tips, workout splits, body fat %, incline walking, creatine, whey protein - '
"you're deeply invested in fitness and bodybuilding. Your longest single conversation "
'(1,473 msgs!) was about body fat estimation.'),
('Making a Big Life Decision', C_ACCENT4,
'Multiple conversations about Aakash, Physics Wallah, Narayana PU College, PCMC/PCMB '
"switch, and Presidency College exams show you're in the middle of choosing your academic "
'path - likely preparing for competitive entrance exams.'),
('Passionate Anime Fan', C_ACCENT2,
'You debated Naruto vs AOT vs One Piece multiple times, discussed Gojo vs Yuji, and '
"Minato's absence. One Piece vs Naruto appeared 3 separate times - clearly a topic "
"you're very passionate about!"),
("Tech-Savvy Gamer", C_ACCENT3,
'You researched KLIM laptops, Lenovo LOQ, DX11 vs DX12, Dying Light pricing, and game '
'difficulty tips (Hunter Build, Master Mode). You compare specs carefully before buying.'),
('Nutrition Obsessed', C_ACCENT3,
'Rice, tofu, soya chunks, sweet potato, stevia, chicken liver - you asked about almost '
"every food category. You're carefully tracking macros, GI index, and cooking methods, "
'likely tied to managing your health condition.'),
('Sleep Struggles', C_ACCENT4,
'Multiple chats about trouble sleeping, sleep timing impact, sleep rebound effects, nap '
'impact, and sleep duration calculation. Sleep quality is a recurring concern for you.'),
('Growing Usage Over Time', C_ACCENT1,
'You started with 21 conversations in Dec 2025 and peaked at 40 in April 2026 - nearly '
"doubling your usage. You're relying on ChatGPT more and more each month."),
]
def insight_cell(title, accent, text):
inner = Table([
[Paragraph(f'<b><font size="9.5" color="#0F172A">{title}</font></b>',
ParagraphStyle('it', fontName='Helvetica-Bold', fontSize=9.5,
textColor=C_TEXTDARK))],
[Paragraph(f'<font color="#475569" size="9">{text}</font>',
ParagraphStyle('ib', fontName='Helvetica', fontSize=9,
textColor=C_TEXTMUTED, leading=13))],
], colWidths=[W/2 - 24 - 5])
inner.setStyle(TableStyle([
('TOPPADDING', (0,0), (-1,-1), 2),
('BOTTOMPADDING', (0,0), (-1,-1), 2),
('LEFTPADDING', (0,0), (-1,-1), 0),
('RIGHTPADDING', (0,0), (-1,-1), 0),
]))
outer = Table([[inner]], colWidths=[W/2 - 10])
outer.setStyle(TableStyle([
('BACKGROUND', (0,0), (-1,-1), C_BGLIGHT),
('BOX', (0,0), (-1,-1), 0.8, C_BORDER),
('LINEBEFORE', (0,0), (0,-1), 3, accent),
('TOPPADDING', (0,0), (-1,-1), 10),
('BOTTOMPADDING', (0,0), (-1,-1), 10),
('LEFTPADDING', (0,0), (-1,-1), 10),
('RIGHTPADDING', (0,0), (-1,-1), 10),
('ROUNDEDCORNERS', [4]),
]))
return outer
# 2-column grid
for i in range(0, len(insights), 2):
left = insight_cell(*insights[i])
right = insight_cell(*insights[i+1]) if i+1 < len(insights) else ''
row = Table([[left, right]], colWidths=[W/2 - 5, W/2 - 5],
hAlign='LEFT')
row.setStyle(TableStyle([
('LEFTPADDING', (0,0), (-1,-1), 0),
('RIGHTPADDING', (0,0), (-1,-1), 0),
('TOPPADDING', (0,0), (-1,-1), 0),
('BOTTOMPADDING', (0,0), (-1,-1), 0),
('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(row)
story.append(Spacer(1, 7))
# ── PAGE 3 ────────────────────────────────────────────────
story.append(PageBreak())
# ── FUN FACTS ─────────────────────────────────────────────
story.append(SectionHeader('Fun Facts'))
story.append(Spacer(1, 6))
fun_facts = [
('Most Debated Topic', C_ACCENT2,
'Naruto vs One Piece - you started this debate at least '
'<font color="#BE185D"><b>4 separate times</b></font>! '
"You clearly can't make up your mind."),
('Most Focused Topic', C_ACCENT3,
'Nutrition makes up over <font color="#0F766E"><b>37%</b></font> of all your '
"conversations - you're practically a food scientist at this point!"),
('Deepest Dive', C_ACCENT1,
'The "Body Fat Percentage Estimate" conversation had '
'<font color="#5B21B6"><b>1,473 messages</b></font> - '
"that's almost a full book's worth of conversation in one thread!"),
('Young & Curious', C_ACCENT4,
'Born in <font color="#B45309"><b>2006</b></font>, '
"you're around 19 years old and using AI to navigate everything from college choices "
'to health and gaming. That\'s impressive!'),
]
for i in range(0, len(fun_facts), 2):
left = insight_cell(fun_facts[i][0], fun_facts[i][1], fun_facts[i][2])
right = insight_cell(fun_facts[i+1][0], fun_facts[i+1][1], fun_facts[i+1][2]) if i+1 < len(fun_facts) else ''
row = Table([[left, right]], colWidths=[W/2 - 5, W/2 - 5], hAlign='LEFT')
row.setStyle(TableStyle([
('LEFTPADDING', (0,0), (-1,-1), 0),
('RIGHTPADDING', (0,0), (-1,-1), 0),
('TOPPADDING', (0,0), (-1,-1), 0),
('BOTTOMPADDING', (0,0), (-1,-1), 0),
('VALIGN', (0,0), (-1,-1), 'TOP'),
]))
story.append(row)
story.append(Spacer(1, 7))
# ── FOOTER (via onLaterPages / custom) ────────────────────
story.append(Spacer(1, 40))
story.append(Paragraph(
'<font color="#475569" size="8">GENERATED FROM CHATGPT EXPORT ANALYSIS • JULY 2026</font>',
ParagraphStyle('footer', fontName='Helvetica', fontSize=8,
textColor=C_TEXTMUTED, alignment=TA_CENTER)
))
doc.build(story)
print(f'PDF saved to {out}')
build()
cd /home/daytona/workspace/chatgpt-report && python3 build_report.py 2>&1
~/chatgpt-report/build_report.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/chatgpt-report/build_report.py'
cd /home/daytona/workspace/chatgpt-report && python3 build_report.py 2>&1
ls -lh /home/daytona/workspace/chatgpt-report/ChatGPT_Report.pdf
cd /home/daytona/workspace/chatgpt-report && python3 -c " from reportlab.lib.pagesizes import A4 from pypdf import PdfReader r = PdfReader('ChatGPT_Report.pdf') print('Pages:', len(r.pages)) for i, p in enumerate(r.pages): t = p.extract_text() print(f'--- Page {i+1} ({len(t)} chars) ---') print(t[:300]) " 2>&1
ChatGPT Report
PDF Document · PDF
.tex source#5B21B6, accent2 rose, accent3 teal, accent4 amber), progress bars are proportional to your original fractions, and the left-stripe / top-stripe card styles mirror the insightcard / statcard tcolorbox designs from your source.<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>ChatGPT Conversation Analysis</title> <link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=DM+Mono:wght@300;400;500&display=swap" rel="stylesheet"> <style> :root { --bg: #0a0a0f; --surface: #12121a; --card: #1a1a26; --border: #2a2a40; --accent1: #7c6af7; --accent2: #f76a8c; --accent3: #6af7c2; --accent4: #f7c26a; --text: #e8e8f0; --muted: #8888aa; } * { margin: 0; padding: 0; box-sizing: border-box; } body { background: var(--bg); color: var(--text); font-family: 'DM Mono', monospace; min-height: 100vh; overflow-x: hidden; } /* Animated background */ body::before { content: ''; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: radial-gradient(ellipse 600px 400px at 10% 20%, rgba(124,106,247,0.08) 0%, transparent 70%), radial-gradient(ellipse 500px 300px at 90% 80%, rgba(247,106,140,0.06) 0%, transparent 70%), radial-gradient(ellipse 400px 400px at 50% 50%, rgba(106,247,194,0.04) 0%, transparent 70%); pointer-events: none; z-index: 0; } .container { max-width: 900px; margin: 0 auto; padding: 40px 20px; position: relative; z-index: 1; } /* Header */ .header { text-align: center; margin-bottom: 60px; animation: fadeDown 0.8s ease both; } .header .tag { display: inline-block; font-size: 10px; letter-spacing: 4px; text-transform: uppercase; color: var(--accent3); border: 1px solid rgba(106,247,194,0.3); padding: 6px 16px; border-radius: 2px; margin-bottom: 20px; } .header h1 { font-family: 'Syne', sans-serif; font-size: clamp(32px, 6vw, 56px); font-weight: 800; line-height: 1.1; background: linear-gradient(135deg, var(--text) 0%, var(--accent1) 50%, var(--accent2) 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; margin-bottom: 12px; } .header p { color: var(--muted); font-size: 13px; letter-spacing: 1px; } /* Stats grid */ .stats-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; margin-bottom: 40px; animation: fadeUp 0.8s 0.2s ease both; } @media (min-width: 600px) { .stats-grid { grid-template-columns: repeat(4, 1fr); } } .stat-card { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 20px 16px; text-align: center; position: relative; overflow: hidden; transition: transform 0.2s, border-color 0.2s; } .stat-card:hover { transform: translateY(-3px); border-color: var(--accent1); } .stat-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 2px; } .stat-card:nth-child(1)::before { background: var(--accent1); } .stat-card:nth-child(2)::before { background: var(--accent2); } .stat-card:nth-child(3)::before { background: var(--accent3); } .stat-card:nth-child(4)::before { background: var(--accent4); } .stat-number { font-family: 'Syne', sans-serif; font-size: 30px; font-weight: 800; line-height: 1; margin-bottom: 6px; } .stat-card:nth-child(1) .stat-number { color: var(--accent1); } .stat-card:nth-child(2) .stat-number { color: var(--accent2); } .stat-card:nth-child(3) .stat-number { color: var(--accent3); } .stat-card:nth-child(4) .stat-number { color: var(--accent4); } .stat-label { font-size: 10px; color: var(--muted); letter-spacing: 2px; text-transform: uppercase; } /* Section */ .section { margin-bottom: 40px; animation: fadeUp 0.8s 0.4s ease both; } .section-title { font-family: 'Syne', sans-serif; font-size: 11px; font-weight: 700; letter-spacing: 4px; text-transform: uppercase; color: var(--accent1); margin-bottom: 20px; display: flex; align-items: center; gap: 12px; } .section-title::after { content: ''; flex: 1; height: 1px; background: var(--border); } /* Category bars */ .category-list { display: flex; flex-direction: column; gap: 12px; } .cat-item { background: var(--card); border: 1px solid var(--border); border-radius: 10px; padding: 14px 16px; display: grid; grid-template-columns: 160px 1fr 40px; align-items: center; gap: 16px; transition: border-color 0.2s; } .cat-item:hover { border-color: var(--accent1); } .cat-name { font-size: 12px; color: var(--text); white-space: nowrap; } .cat-bar-bg { height: 6px; background: var(--border); border-radius: 3px; overflow: hidden; } .cat-bar { height: 100%; border-radius: 3px; transition: width 1.2s cubic-bezier(0.16, 1, 0.3, 1); animation: barGrow 1.5s cubic-bezier(0.16, 1, 0.3, 1) both; } @keyframes barGrow { from { width: 0% !important; } } .cat-count { font-family: 'Syne', sans-serif; font-size: 14px; font-weight: 700; text-align: right; } /* Monthly chart */ .monthly-chart { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 24px; } .chart-bars { display: flex; align-items: flex-end; gap: 16px; height: 120px; margin-bottom: 12px; } .chart-bar-wrap { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 6px; height: 100%; justify-content: flex-end; } .chart-bar-value { font-size: 11px; color: var(--muted); font-family: 'Syne', sans-serif; font-weight: 700; } .chart-bar-inner { width: 100%; border-radius: 6px 6px 0 0; animation: barUp 1.2s cubic-bezier(0.16,1,0.3,1) both; min-height: 4px; } @keyframes barUp { from { height: 0 !important; } } .chart-labels { display: flex; gap: 16px; } .chart-label { flex: 1; text-align: center; font-size: 10px; color: var(--muted); letter-spacing: 1px; } /* Top conversations */ .top-list { display: flex; flex-direction: column; gap: 8px; } .top-item { background: var(--card); border: 1px solid var(--border); border-radius: 10px; padding: 14px 18px; display: flex; align-items: center; gap: 14px; transition: transform 0.2s, border-color 0.2s; } .top-item:hover { transform: translateX(4px); border-color: var(--accent2); } .top-rank { font-family: 'Syne', sans-serif; font-size: 20px; font-weight: 800; color: var(--border); min-width: 28px; } .top-info { flex: 1; } .top-title { font-size: 13px; color: var(--text); margin-bottom: 3px; } .top-msgs { font-size: 11px; color: var(--muted); } .top-badge { font-size: 10px; padding: 4px 10px; border-radius: 20px; letter-spacing: 1px; } /* Insights */ .insights-grid { display: grid; grid-template-columns: 1fr; gap: 12px; } @media (min-width: 600px) { .insights-grid { grid-template-columns: 1fr 1fr; } } .insight-card { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 20px; transition: border-color 0.2s; } .insight-card:hover { border-color: var(--accent3); } .insight-icon { font-size: 24px; margin-bottom: 10px; } .insight-title { font-family: 'Syne', sans-serif; font-size: 13px; font-weight: 700; color: var(--text); margin-bottom: 8px; } .insight-text { font-size: 12px; color: var(--muted); line-height: 1.8; } /* Footer */ .footer { text-align: center; padding: 40px 0 20px; color: var(--muted); font-size: 11px; letter-spacing: 2px; animation: fadeUp 0.8s 1s ease both; } /* Animations */ @keyframes fadeDown { from { opacity: 0; transform: translateY(-20px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .delay-1 { animation-delay: 0.1s; } .delay-2 { animation-delay: 0.3s; } .delay-3 { animation-delay: 0.5s; } .delay-4 { animation-delay: 0.7s; } .delay-5 { animation-delay: 0.9s; } /* Profile chip */ .profile-chip { display: inline-flex; align-items: center; gap: 10px; background: var(--card); border: 1px solid var(--border); border-radius: 100px; padding: 8px 20px 8px 8px; margin-bottom: 30px; } .profile-avatar { width: 32px; height: 32px; background: linear-gradient(135deg, var(--accent1), var(--accent2)); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-family: 'Syne', sans-serif; font-weight: 800; font-size: 14px; color: white; } .profile-text { font-size: 12px; color: var(--muted); } .profile-text span { color: var(--text); } </style> </head> <body> <div class="container"> <!-- Header --> <div class="header"> <div class="tag">ChatGPT Export Analysis</div> <h1>Your AI Conversation<br>Report</h1> <p>Dec 2025 — Apr 2026 · Full Export Analysis</p> <br> <div class="profile-chip"> <div class="profile-avatar">S</div> <div class="profile-text">User born <span>2006</span> · Free Plan · <span>syamaeib@gmail.com</span></div> </div> </div> <!-- Key Stats --> <div class="stats-grid"> <div class="stat-card"> <div class="stat-number">166</div> <div class="stat-label">Conversations</div> </div> <div class="stat-card"> <div class="stat-number">1,902</div> <div class="stat-label">Your Messages</div> </div> <div class="stat-card"> <div class="stat-number">2,363</div> <div class="stat-label">AI Replies</div> </div> <div class="stat-card"> <div class="stat-number">142</div> <div class="stat-label">Days Active</div> </div> </div> <!-- Monthly Activity --> <div class="section delay-2"> <div class="section-title">Monthly Activity</div> <div class="monthly-chart"> <div class="chart-bars"> <!-- Dec 2025: 21 --> <div class="chart-bar-wrap"> <div class="chart-bar-value">21</div> <div class="chart-bar-inner" style="height:52px; background: linear-gradient(180deg, var(--accent1), rgba(124,106,247,0.5));"></div> </div> <!-- Jan 2026: 39 --> <div class="chart-bar-wrap"> <div class="chart-bar-value">39</div> <div class="chart-bar-inner" style="height:98px; background: linear-gradient(180deg, var(--accent2), rgba(247,106,140,0.5));"></div> </div> <!-- Feb 2026: 28 --> <div class="chart-bar-wrap"> <div class="chart-bar-value">28</div> <div class="chart-bar-inner" style="height:70px; background: linear-gradient(180deg, var(--accent3), rgba(106,247,194,0.5));"></div> </div> <!-- Mar 2026: 38 --> <div class="chart-bar-wrap"> <div class="chart-bar-value">38</div> <div class="chart-bar-inner" style="height:95px; background: linear-gradient(180deg, var(--accent4), rgba(247,194,106,0.5));"></div> </div> <!-- Apr 2026: 40 --> <div class="chart-bar-wrap"> <div class="chart-bar-value">40</div> <div class="chart-bar-inner" style="height:100px; background: linear-gradient(180deg, var(--accent1), rgba(124,106,247,0.5));"></div> </div> </div> <div class="chart-labels"> <div class="chart-label">DEC '25</div> <div class="chart-label">JAN '26</div> <div class="chart-label">FEB '26</div> <div class="chart-label">MAR '26</div> <div class="chart-label">APR '26</div> </div> </div> </div> <!-- Topic Breakdown --> <div class="section delay-3"> <div class="section-title">Topic Breakdown</div> <div class="category-list"> <div class="cat-item"> <div class="cat-name">🥗 Nutrition & Diet</div> <div class="cat-bar-bg"><div class="cat-bar" style="width:72%; background: linear-gradient(90deg, var(--accent3), rgba(106,247,194,0.5));"></div></div> <div class="cat-count" style="color:var(--accent3)">~62</div> </div> <div class="cat-item"> <div class="cat-name">🩺 Health & Medical</div> <div class="cat-bar-bg"><div class="cat-bar" style="width:30%; background: linear-gradient(90deg, var(--accent2), rgba(247,106,140,0.5));"></div></div> <div class="cat-count" style="color:var(--accent2)">~22</div> </div> <div class="cat-item"> <div class="cat-name">💪 Fitness & Gym</div> <div class="cat-bar-bg"><div class="cat-bar" style="width:25%; background: linear-gradient(90deg, var(--accent1), rgba(124,106,247,0.5));"></div></div> <div class="cat-count" style="color:var(--accent1)">~20</div> </div> <div class="cat-item"> <div class="cat-name">🎓 Education & College</div> <div class="cat-bar-bg"><div class="cat-bar" style="width:18%; background: linear-gradient(90deg, var(--accent4), rgba(247,194,106,0.5));"></div></div> <div class="cat-count" style="color:var(--accent4)">~15</div> </div> <div class="cat-item"> <div class="cat-name">🎌 Anime & Entertainment</div> <div class="cat-bar-bg"><div class="cat-bar" style="width:15%; background: linear-gradient(90deg, #f76af0, rgba(247,106,240,0.5));"></div></div> <div class="cat-count" style="color:#f76af0">~12</div> </div> <div class="cat-item"> <div class="cat-name">🖥️ Tech & Gaming</div> <div class="cat-bar-bg"><div class="cat-bar" style="width:14%; background: linear-gradient(90deg, #6ab4f7, rgba(106,180,247,0.5));"></div></div> <div class="cat-count" style="color:#6ab4f7">~12</div> </div> <div class="cat-item"> <div class="cat-name">🧬 Supplements</div> <div class="cat-bar-bg"><div class="cat-bar" style="width:12%; background: linear-gradient(90deg, var(--accent3), rgba(106,247,194,0.3));"></div></div> <div class="cat-count" style="color:var(--accent3)">~10</div> </div> <div class="cat-item"> <div class="cat-name">🧮 Coding & Math</div> <div class="cat-bar-bg"><div class="cat-bar" style="width:9%; background: linear-gradient(90deg, var(--accent1), rgba(124,106,247,0.3));"></div></div> <div class="cat-count" style="color:var(--accent1)">~8</div> </div> <div class="cat-item"> <div class="cat-name">🙋 Personal / Lifestyle</div> <div class="cat-bar-bg"><div class="cat-bar" style="width:9%; background: linear-gradient(90deg, var(--accent4), rgba(247,194,106,0.3));"></div></div> <div class="cat-count" style="color:var(--accent4)">~5</div> </div> </div> </div> <!-- Top Conversations --> <div class="section delay-4"> <div class="section-title">Most Active Conversations</div> <div class="top-list"> <div class="top-item"> <div class="top-rank">01</div> <div class="top-info"> <div class="top-title">Body Fat Percentage Estimate</div> <div class="top-msgs">1,473 messages · Health</div> </div> <div class="top-badge" style="background:rgba(247,106,140,0.15);color:var(--accent2)">EPIC</div> </div> <div class="top-item"> <div class="top-rank">02</div> <div class="top-info"> <div class="top-title">Gym Tips for Beginners</div> <div class="top-msgs">645 messages · Fitness</div> </div> <div class="top-badge" style="background:rgba(124,106,247,0.15);color:var(--accent1)">LONG</div> </div> <div class="top-item"> <div class="top-rank">03</div> <div class="top-info"> <div class="top-title">Lab Report Summary</div> <div class="top-msgs">394 messages · Medical</div> </div> <div class="top-badge" style="background:rgba(106,247,194,0.15);color:var(--accent3)">DEEP</div> </div> <div class="top-item"> <div class="top-rank">04</div> <div class="top-info"> <div class="top-title">Blood Sugar Post-Meal</div> <div class="top-msgs">84 messages · Nutrition</div> </div> <div class="top-badge" style="background:rgba(247,194,106,0.15);color:var(--accent4)">ACTIVE</div> </div> <div class="top-item"> <div class="top-rank">05</div> <div class="top-info"> <div class="top-title">Dying Light Steam Price</div> <div class="top-msgs">77 messages · Gaming</div> </div> <div class="top-badge" style="background:rgba(106,180,247,0.15);color:#6ab4f7">ACTIVE</div> </div> </div> </div> <!-- Insights --> <div class="section delay-5"> <div class="section-title">Key Insights</div> <div class="insights-grid"> <div class="insight-card"> <div class="insight-icon">🩸</div> <div class="insight-title">Managing a Health Condition</div> <div class="insight-text">You have many conversations about prediabetes, blood sugar, metformin, and lab reports — suggesting you're actively monitoring and managing a health condition. You asked very detailed, specific questions about glucose, insulin, and organ effects.</div> </div> <div class="insight-card"> <div class="insight-icon">💪</div> <div class="insight-title">Serious About Fitness</div> <div class="insight-text">Gym tips, workout splits, body fat %, incline walking, creatine, whey protein — you're deeply invested in fitness and bodybuilding. Your longest single conversation (1,473 msgs!) was about body fat estimation.</div> </div> <div class="insight-card"> <div class="insight-icon">🎓</div> <div class="insight-title">Making a Big Life Decision</div> <div class="insight-text">Multiple conversations about Aakash, Physics Wallah, Narayana PU College, PCMC/PCMB switch, and Presidency College exams show you're in the middle of choosing your academic path — likely preparing for competitive entrance exams.</div> </div> <div class="insight-card"> <div class="insight-icon">🎌</div> <div class="insight-title">Passionate Anime Fan</div> <div class="insight-text">You debated Naruto vs AOT vs One Piece multiple times, discussed Gojo vs Yuji, and Minato's absence. One Piece vs Naruto appeared 3 separate times — clearly a topic you're very passionate about!</div> </div> <div class="insight-card"> <div class="insight-icon">🖥️</div> <div class="insight-title">Tech-Savvy Gamer</div> <div class="insight-text">You researched KLIM laptops, Lenovo LOQ, DX11 vs DX12, Dying Light pricing, and game difficulty tips (Hunter Build, Master Mode). You compare specs carefully before buying.</div> </div> <div class="insight-card"> <div class="insight-icon">🥗</div> <div class="insight-title">Nutrition Obsessed</div> <div class="insight-text">Rice, tofu, soya chunks, sweet potato, stevia, chicken liver — you asked about almost every food category. You're carefully tracking macros, GI index, and cooking methods, likely tied to managing your health condition.</div> </div> <div class="insight-card"> <div class="insight-icon">😴</div> <div class="insight-title">Sleep Struggles</div> <div class="insight-text">Multiple chats about trouble sleeping, sleep timing impact, sleep rebound effects, nap impact, and sleep duration calc
~/chatgpt-report/report.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ChatGPT Conversation Analysis</title>
<link href="https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=DM+Mono:wght@300;400;500&display=swap" rel="stylesheet">
<style>
:root {
--bg: #0a0a0f;
--surface: #12121a;
--card: #1a1a26;
--border: #2a2a40;
--accent1: #7c6af7;
--accent2: #f76a8c;
--accent3: #6af7c2;
--accent4: #f7c26a;
--text: #e8e8f0;
--muted: #8888aa;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: var(--bg);
color: var(--text);
font-family: 'DM Mono', monospace;
min-height: 100vh;
overflow-x: hidden;
}
body::before {
content: '';
position: fixed;
top: 0; left: 0; right: 0; bottom: 0;
background:
radial-gradient(ellipse 600px 400px at 10% 20%, rgba(124,106,247,0.08) 0%, transparent 70%),
radial-gradient(ellipse 500px 300px at 90% 80%, rgba(247,106,140,0.06) 0%, transparent 70%),
radial-gradient(ellipse 400px 400px at 50% 50%, rgba(106,247,194,0.04) 0%, transparent 70%);
pointer-events: none;
z-index: 0;
}
.container {
max-width: 900px;
margin: 0 auto;
padding: 40px 20px;
position: relative;
z-index: 1;
}
/* Header */
.header {
text-align: center;
margin-bottom: 60px;
animation: fadeDown 0.8s ease both;
}
.header .tag {
display: inline-block;
font-size: 10px;
letter-spacing: 4px;
text-transform: uppercase;
color: var(--accent3);
border: 1px solid rgba(106,247,194,0.3);
padding: 6px 16px;
border-radius: 2px;
margin-bottom: 20px;
}
.header h1 {
font-family: 'Syne', sans-serif;
font-size: clamp(32px, 6vw, 56px);
font-weight: 800;
line-height: 1.1;
background: linear-gradient(135deg, var(--text) 0%, var(--accent1) 50%, var(--accent2) 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
margin-bottom: 12px;
}
.header p {
color: var(--muted);
font-size: 13px;
letter-spacing: 1px;
}
/* Stats grid */
.stats-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 16px;
margin-bottom: 40px;
animation: fadeUp 0.8s 0.2s ease both;
}
@media (min-width: 600px) {
.stats-grid { grid-template-columns: repeat(4, 1fr); }
}
.stat-card {
background: var(--card);
border: 1px solid var(--border);
border-radius: 12px;
padding: 20px 16px;
text-align: center;
position: relative;
overflow: hidden;
transition: transform 0.2s, border-color 0.2s;
}
.stat-card:hover {
transform: translateY(-3px);
border-color: var(--accent1);
}
.stat-card::before {
content: '';
position: absolute;
top: 0; left: 0; right: 0;
height: 2px;
}
.stat-card:nth-child(1)::before { background: var(--accent1); }
.stat-card:nth-child(2)::before { background: var(--accent2); }
.stat-card:nth-child(3)::before { background: var(--accent3); }
.stat-card:nth-child(4)::before { background: var(--accent4); }
.stat-number {
font-family: 'Syne', sans-serif;
font-size: 30px;
font-weight: 800;
line-height: 1;
margin-bottom: 6px;
}
.stat-card:nth-child(1) .stat-number { color: var(--accent1); }
.stat-card:nth-child(2) .stat-number { color: var(--accent2); }
.stat-card:nth-child(3) .stat-number { color: var(--accent3); }
.stat-card:nth-child(4) .stat-number { color: var(--accent4); }
.stat-label {
font-size: 10px;
color: var(--muted);
letter-spacing: 2px;
text-transform: uppercase;
}
/* Section */
.section {
margin-bottom: 40px;
animation: fadeUp 0.8s 0.4s ease both;
}
.section-title {
font-family: 'Syne', sans-serif;
font-size: 11px;
font-weight: 700;
letter-spacing: 4px;
text-transform: uppercase;
color: var(--accent1);
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 12px;
}
.section-title::after {
content: '';
flex: 1;
height: 1px;
background: var(--border);
}
/* Category bars */
.category-list { display: flex; flex-direction: column; gap: 12px; }
.cat-item {
background: var(--card);
border: 1px solid var(--border);
border-radius: 10px;
padding: 14px 16px;
display: grid;
grid-template-columns: 180px 1fr 44px;
align-items: center;
gap: 16px;
transition: border-color 0.2s;
}
.cat-item:hover { border-color: var(--accent1); }
.cat-name {
font-size: 12px;
color: var(--text);
white-space: nowrap;
}
.cat-bar-bg {
height: 6px;
background: var(--border);
border-radius: 3px;
overflow: hidden;
}
.cat-bar {
height: 100%;
border-radius: 3px;
transition: width 1.2s cubic-bezier(0.16, 1, 0.3, 1);
animation: barGrow 1.5s cubic-bezier(0.16, 1, 0.3, 1) both;
}
@keyframes barGrow {
from { width: 0% !important; }
}
.cat-count {
font-family: 'Syne', sans-serif;
font-size: 14px;
font-weight: 700;
text-align: right;
}
/* Monthly chart */
.monthly-chart {
background: var(--card);
border: 1px solid var(--border);
border-radius: 12px;
padding: 24px;
}
.chart-bars {
display: flex;
align-items: flex-end;
gap: 16px;
height: 120px;
margin-bottom: 12px;
}
.chart-bar-wrap {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
height: 100%;
justify-content: flex-end;
}
.chart-bar-value {
font-size: 11px;
color: var(--muted);
font-family: 'Syne', sans-serif;
font-weight: 700;
}
.chart-bar-inner {
width: 100%;
border-radius: 6px 6px 0 0;
animation: barUp 1.2s cubic-bezier(0.16,1,0.3,1) both;
min-height: 4px;
}
@keyframes barUp {
from { height: 0 !important; }
}
.chart-labels {
display: flex;
gap: 16px;
}
.chart-label {
flex: 1;
text-align: center;
font-size: 10px;
color: var(--muted);
letter-spacing: 1px;
}
/* Top conversations */
.top-list { display: flex; flex-direction: column; gap: 8px; }
.top-item {
background: var(--card);
border: 1px solid var(--border);
border-radius: 10px;
padding: 14px 18px;
display: flex;
align-items: center;
gap: 14px;
transition: transform 0.2s, border-color 0.2s;
}
.top-item:hover {
transform: translateX(4px);
border-color: var(--accent2);
}
.top-rank {
font-family: 'Syne', sans-serif;
font-size: 20px;
font-weight: 800;
color: var(--border);
min-width: 28px;
}
.top-info { flex: 1; }
.top-title {
font-size: 13px;
color: var(--text);
margin-bottom: 3px;
}
.top-msgs {
font-size: 11px;
color: var(--muted);
}
.top-badge {
font-size: 10px;
padding: 4px 10px;
border-radius: 20px;
letter-spacing: 1px;
}
/* Insights */
.insights-grid {
display: grid;
grid-template-columns: 1fr;
gap: 12px;
}
@media (min-width: 600px) {
.insights-grid { grid-template-columns: 1fr 1fr; }
}
.insight-card {
background: var(--card);
border: 1px solid var(--border);
border-radius: 12px;
padding: 20px;
transition: border-color 0.2s;
}
.insight-card:hover { border-color: var(--accent3); }
.insight-icon {
font-size: 24px;
margin-bottom: 10px;
}
.insight-title {
font-family: 'Syne', sans-serif;
font-size: 13px;
font-weight: 700;
color: var(--text);
margin-bottom: 8px;
}
.insight-text {
font-size: 12px;
color: var(--muted);
line-height: 1.8;
}
/* Fun Facts */
.funfacts-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
}
@media (max-width: 599px) {
.funfacts-grid { grid-template-columns: 1fr; }
}
.funfact-card {
background: var(--card);
border: 1px solid var(--border);
border-radius: 12px;
padding: 20px;
transition: border-color 0.2s;
}
.funfact-card:hover { border-color: var(--accent4); }
.funfact-icon {
font-size: 28px;
margin-bottom: 10px;
}
.funfact-title {
font-family: 'Syne', sans-serif;
font-size: 13px;
font-weight: 700;
color: var(--text);
margin-bottom: 8px;
}
.funfact-text {
font-size: 12px;
color: var(--muted);
line-height: 1.8;
}
.highlight-accent2 { color: var(--accent2); font-weight: 700; }
.highlight-accent3 { color: var(--accent3); font-weight: 700; }
.highlight-accent1 { color: var(--accent1); font-weight: 700; }
.highlight-accent4 { color: var(--accent4); font-weight: 700; }
/* Footer */
.footer {
text-align: center;
padding: 40px 0 20px;
color: var(--muted);
font-size: 11px;
letter-spacing: 2px;
animation: fadeUp 0.8s 1s ease both;
}
/* Animations */
@keyframes fadeDown {
from { opacity: 0; transform: translateY(-20px); }
to { opacity: 1; transform: translateY(0); }
}
@keyframes fadeUp {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.delay-1 { animation-delay: 0.1s; }
.delay-2 { animation-delay: 0.3s; }
.delay-3 { animation-delay: 0.5s; }
.delay-4 { animation-delay: 0.7s; }
.delay-5 { animation-delay: 0.9s; }
/* Profile chip */
.profile-chip {
display: inline-flex;
align-items: center;
gap: 10px;
background: var(--card);
border: 1px solid var(--border);
border-radius: 100px;
padding: 8px 20px 8px 8px;
margin-bottom: 30px;
}
.profile-avatar {
width: 32px;
height: 32px;
background: linear-gradient(135deg, var(--accent1), var(--accent2));
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-family: 'Syne', sans-serif;
font-weight: 800;
font-size: 14px;
color: white;
}
.profile-text { font-size: 12px; color: var(--muted); }
.profile-text span { color: var(--text); }
</style>
</head>
<body>
<div class="container">
<!-- Header -->
<div class="header">
<div class="tag">ChatGPT Export Analysis</div>
<h1>Your AI Conversation<br>Report</h1>
<p>Dec 2025 · Apr 2026 · Full Export Analysis</p>
<br>
<div class="profile-chip">
<div class="profile-avatar">S</div>
<div class="profile-text">User born <span>2006</span> · Free Plan · <span>syamaeib@gmail.com</span></div>
</div>
</div>
<!-- Key Stats -->
<div class="stats-grid">
<div class="stat-card">
<div class="stat-number">166</div>
<div class="stat-label">Conversations</div>
</div>
<div class="stat-card">
<div class="stat-number">1,902</div>
<div class="stat-label">Your Messages</div>
</div>
<div class="stat-card">
<div class="stat-number">2,363</div>
<div class="stat-label">AI Replies</div>
</div>
<div class="stat-card">
<div class="stat-number">142</div>
<div class="stat-label">Days Active</div>
</div>
</div>
<!-- Monthly Activity -->
<div class="section delay-2">
<div class="section-title">Monthly Activity</div>
<div class="monthly-chart">
<div class="chart-bars">
<div class="chart-bar-wrap">
<div class="chart-bar-value">21</div>
<div class="chart-bar-inner" style="height:52px; background: linear-gradient(180deg, var(--accent1), rgba(124,106,247,0.5));"></div>
</div>
<div class="chart-bar-wrap">
<div class="chart-bar-value">39</div>
<div class="chart-bar-inner" style="height:98px; background: linear-gradient(180deg, var(--accent2), rgba(247,106,140,0.5));"></div>
</div>
<div class="chart-bar-wrap">
<div class="chart-bar-value">28</div>
<div class="chart-bar-inner" style="height:70px; background: linear-gradient(180deg, var(--accent3), rgba(106,247,194,0.5));"></div>
</div>
<div class="chart-bar-wrap">
<div class="chart-bar-value">38</div>
<div class="chart-bar-inner" style="height:95px; background: linear-gradient(180deg, var(--accent4), rgba(247,194,106,0.5));"></div>
</div>
<div class="chart-bar-wrap">
<div class="chart-bar-value">40</div>
<div class="chart-bar-inner" style="height:100px; background: linear-gradient(180deg, var(--accent1), rgba(124,106,247,0.5));"></div>
</div>
</div>
<div class="chart-labels">
<div class="chart-label">DEC '25</div>
<div class="chart-label">JAN '26</div>
<div class="chart-label">FEB '26</div>
<div class="chart-label">MAR '26</div>
<div class="chart-label">APR '26</div>
</div>
</div>
</div>
<!-- Topic Breakdown -->
<div class="section delay-3">
<div class="section-title">Topic Breakdown</div>
<div class="category-list">
<div class="cat-item">
<div class="cat-name">🥗 Nutrition & Diet</div>
<div class="cat-bar-bg"><div class="cat-bar" style="width:72%; background: linear-gradient(90deg, var(--accent3), rgba(106,247,194,0.5));"></div></div>
<div class="cat-count" style="color:var(--accent3)">~62</div>
</div>
<div class="cat-item">
<div class="cat-name">🩺 Health & Medical</div>
<div class="cat-bar-bg"><div class="cat-bar" style="width:30%; background: linear-gradient(90deg, var(--accent2), rgba(247,106,140,0.5));"></div></div>
<div class="cat-count" style="color:var(--accent2)">~22</div>
</div>
<div class="cat-item">
<div class="cat-name">💪 Fitness & Gym</div>
<div class="cat-bar-bg"><div class="cat-bar" style="width:25%; background: linear-gradient(90deg, var(--accent1), rgba(124,106,247,0.5));"></div></div>
<div class="cat-count" style="color:var(--accent1)">~20</div>
</div>
<div class="cat-item">
<div class="cat-name">🎓 Education & College</div>
<div class="cat-bar-bg"><div class="cat-bar" style="width:18%; background: linear-gradient(90deg, var(--accent4), rgba(247,194,106,0.5));"></div></div>
<div class="cat-count" style="color:var(--accent4)">~15</div>
</div>
<div class="cat-item">
<div class="cat-name">🎌 Anime & Entertainment</div>
<div class="cat-bar-bg"><div class="cat-bar" style="width:15%; background: linear-gradient(90deg, #f76af0, rgba(247,106,240,0.5));"></div></div>
<div class="cat-count" style="color:#f76af0">~12</div>
</div>
<div class="cat-item">
<div class="cat-name">🖥️ Tech & Gaming</div>
<div class="cat-bar-bg"><div class="cat-bar" style="width:14%; background: linear-gradient(90deg, #6ab4f7, rgba(106,180,247,0.5));"></div></div>
<div class="cat-count" style="color:#6ab4f7">~12</div>
</div>
<div class="cat-item">
<div class="cat-name">🧬 Supplements</div>
<div class="cat-bar-bg"><div class="cat-bar" style="width:12%; background: linear-gradient(90deg, var(--accent3), rgba(106,247,194,0.3));"></div></div>
<div class="cat-count" style="color:var(--accent3)">~10</div>
</div>
<div class="cat-item">
<div class="cat-name">🧮 Coding & Math</div>
<div class="cat-bar-bg"><div class="cat-bar" style="width:9%; background: linear-gradient(90deg, var(--accent1), rgba(124,106,247,0.3));"></div></div>
<div class="cat-count" style="color:var(--accent1)">~8</div>
</div>
<div class="cat-item">
<div class="cat-name">🙋 Personal / Lifestyle</div>
<div class="cat-bar-bg"><div class="cat-bar" style="width:9%; background: linear-gradient(90deg, var(--accent4), rgba(247,194,106,0.3));"></div></div>
<div class="cat-count" style="color:var(--accent4)">~5</div>
</div>
</div>
</div>
<!-- Top Conversations -->
<div class="section delay-4">
<div class="section-title">Most Active Conversations</div>
<div class="top-list">
<div class="top-item">
<div class="top-rank">01</div>
<div class="top-info">
<div class="top-title">Body Fat Percentage Estimate</div>
<div class="top-msgs">1,473 messages · Health</div>
</div>
<div class="top-badge" style="background:rgba(247,106,140,0.15);color:var(--accent2)">EPIC</div>
</div>
<div class="top-item">
<div class="top-rank">02</div>
<div class="top-info">
<div class="top-title">Gym Tips for Beginners</div>
<div class="top-msgs">645 messages · Fitness</div>
</div>
<div class="top-badge" style="background:rgba(124,106,247,0.15);color:var(--accent1)">LONG</div>
</div>
<div class="top-item">
<div class="top-rank">03</div>
<div class="top-info">
<div class="top-title">Lab Report Summary</div>
<div class="top-msgs">394 messages · Medical</div>
</div>
<div class="top-badge" style="background:rgba(106,247,194,0.15);color:var(--accent3)">DEEP</div>
</div>
<div class="top-item">
<div class="top-rank">04</div>
<div class="top-info">
<div class="top-title">Blood Sugar Post-Meal</div>
<div class="top-msgs">84 messages · Nutrition</div>
</div>
<div class="top-badge" style="background:rgba(247,194,106,0.15);color:var(--accent4)">ACTIVE</div>
</div>
<div class="top-item">
<div class="top-rank">05</div>
<div class="top-info">
<div class="top-title">Dying Light Steam Price</div>
<div class="top-msgs">77 messages · Gaming</div>
</div>
<div class="top-badge" style="background:rgba(106,180,247,0.15);color:#6ab4f7">ACTIVE</div>
</div>
</div>
</div>
<!-- Key Insights -->
<div class="section delay-5">
<div class="section-title">Key Insights</div>
<div class="insights-grid">
<div class="insight-card">
<div class="insight-icon">🩸</div>
<div class="insight-title">Managing a Health Condition</div>
<div class="insight-text">You have many conversations about prediabetes, blood sugar, metformin, and lab reports — suggesting you're actively monitoring and managing a health condition. You asked very detailed, specific questions about glucose, insulin, and organ effects.</div>
</div>
<div class="insight-card">
<div class="insight-icon">💪</div>
<div class="insight-title">Serious About Fitness</div>
<div class="insight-text">Gym tips, workout splits, body fat %, incline walking, creatine, whey protein — you're deeply invested in fitness and bodybuilding. Your longest single conversation (1,473 msgs!) was about body fat estimation.</div>
</div>
<div class="insight-card">
<div class="insight-icon">🎓</div>
<div class="insight-title">Making a Big Life Decision</div>
<div class="insight-text">Multiple conversations about Aakash, Physics Wallah, Narayana PU College, PCMC/PCMB switch, and Presidency College exams show you're in the middle of choosing your academic path — likely preparing for competitive entrance exams.</div>
</div>
<div class="insight-card">
<div class="insight-icon">🎌</div>
<div class="insight-title">Passionate Anime Fan</div>
<div class="insight-text">You debated Naruto vs AOT vs One Piece multiple times, discussed Gojo vs Yuji, and Minato's absence. One Piece vs Naruto appeared 3 separate times — clearly a topic you're very passionate about!</div>
</div>
<div class="insight-card">
<div class="insight-icon">🖥️</div>
<div class="insight-title">Tech-Savvy Gamer</div>
<div class="insight-text">You researched KLIM laptops, Lenovo LOQ, DX11 vs DX12, Dying Light pricing, and game difficulty tips (Hunter Build, Master Mode). You compare specs carefully before buying.</div>
</div>
<div class="insight-card">
<div class="insight-icon">🥗</div>
<div class="insight-title">Nutrition Obsessed</div>
<div class="insight-text">Rice, tofu, soya chunks, sweet potato, stevia, chicken liver — you asked about almost every food category. You're carefully tracking macros, GI index, and cooking methods, likely tied to managing your health condition.</div>
</div>
<div class="insight-card">
<div class="insight-icon">😴</div>
<div class="insight-title">Sleep Struggles</div>
<div class="insight-text">Multiple chats about trouble sleeping, sleep timing impact, sleep rebound effects, nap impact, and sleep duration calculation. Sleep quality is a recurring concern for you.</div>
</div>
<div class="insight-card">
<div class="insight-icon">📈</div>
<div class="insight-title">Growing Usage Over Time</div>
<div class="insight-text">You started with 21 conversations in Dec 2025 and peaked at 40 in April 2026 — nearly doubling your usage. You're relying on ChatGPT more and more each month.</div>
</div>
</div>
</div>
<!-- Fun Facts -->
<div class="section delay-5">
<div class="section-title">Fun Facts</div>
<div class="funfacts-grid">
<div class="funfact-card">
<div class="funfact-icon">⚔️</div>
<div class="funfact-title">Most Debated Topic</div>
<div class="funfact-text"><span class="highlight-accent2">Naruto vs One Piece</span> — you started this debate at least <span class="highlight-accent2">4 separate times</span>! You clearly can't make up your mind.</div>
</div>
<div class="funfact-card">
<div class="funfact-icon">🔬</div>
<div class="funfact-title">Most Focused Topic</div>
<div class="funfact-text"><span class="highlight-accent3">Nutrition</span> makes up over <span class="highlight-accent3">37%</span> of all your conversations — you're practically a food scientist at this point!</div>
</div>
<div class="funfact-card">
<div class="funfact-icon">📚</div>
<div class="funfact-title">Deepest Dive</div>
<div class="funfact-text">The "Body Fat Percentage Estimate" conversation had <span class="highlight-accent1">1,473 messages</span> — that's almost a full book's worth of conversation in one thread!</div>
</div>
<div class="funfact-card">
<div class="funfact-icon">🌟</div>
<div class="funfact-title">Young & Curious</div>
<div class="funfact-text">Born in <span class="highlight-accent4">2006</span>, you're around 19 years old and using AI to navigate everything from college choices to health and gaming. That's impressive!</div>
</div>
</div>
</div>
<!-- Footer -->
<div class="footer">
GENERATED FROM CHATGPT EXPORT ANALYSIS · JULY 2026
</div>
</div>
</body>
</html>
which chromium-browser; which chromium; which google-chrome; which google-chrome-stable; which wkhtmltopdf; which puppeteer; node -e "require('puppeteer')" 2>/dev/null && echo "puppeteer ok"; node -e "require('playwright')" 2>/dev/null && echo "playwright ok"
/usr/bin/chromium --headless --no-sandbox --disable-gpu \ --print-to-pdf=/home/daytona/workspace/chatgpt-report/ChatGPT_Report_Web.pdf \ --print-to-pdf-no-header \ --no-pdf-header-footer \ --run-all-compositor-stages-before-draw \ --virtual-time-budget=3000 \ "file:///home/daytona/workspace/chatgpt-report/report.html" 2>&1
python3 -c " from pypdf import PdfReader r = PdfReader('/home/daytona/workspace/chatgpt-report/ChatGPT_Report_Web.pdf') print('Pages:', len(r.pages)) for i, p in enumerate(r.pages): print(f'Page {i+1}: {len(p.extract_text())} chars') "
ChatGPT Report Web
PDF Document · PDF
report
HTML File · HTML
#0a0a0f), gradient bars, colored stat numbers, badge pills, and the Syne/DM Mono font stack.& characters in topic names (Nutrition & Diet, etc.) were properly HTML-escaped to prevent rendering issues.Analyze it for me
| Metric | Value | What it means |
|---|---|---|
| 166 conversations | ~1.17/day | You open a new chat almost every single day |
| 1,902 user messages | ~11.5/convo avg | You're not browsing — you're having real back-and-forth sessions |
| 2,363 AI replies | 1.24 AI replies per your message | Healthy ratio — you're asking follow-ups, not just one-shots |
| 142 active days out of ~150 | 94.7% day coverage | You barely missed a day across 5 months |
Dec ████████░░░░░░░░░░░░ 21
Jan ████████████████████ 39 (+86% from Dec)
Feb ██████████████░░░░░░ 28 (-28% dip)
Mar ███████████████████░ 38 (+36% recovery)
Apr ████████████████████ 40 (new peak)
You will be my new guide
Heath i heard you are best at this