Is this normal in had only 2 to 3 baby movements since morning to afternoon yesterday night I had motions and vomitings so I went to hospital
| Finding | Your Result | What it means |
|---|---|---|
| Baseline fetal heart rate | 110-160 bpm | Normal range |
| Variability (VAR) | Moderate (6-25 bpm) | Normal - baby's nervous system is active and well-oxygenated |
| Decelerations (DEC) | Absent | Good - no worrying dips in heart rate |
| Sinusoidal pattern | Absent | Good - sinusoidal = abnormal, absent = normal |
| Category | Normal | The overall assessment is normal |
Create a fetal kick count tracking sheet I can use daily
mkdir -p /tmp/workspace/kick-count && ls /tmp/workspace/kick-count/
~/kick-count/generate_kick_count.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import cm
from reportlab.platypus import (
SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer, HRFlowable
)
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.platypus import KeepTogether
OUTPUT = "/tmp/workspace/kick-count/Fetal_Kick_Count_Tracker.pdf"
doc = SimpleDocTemplate(
OUTPUT,
pagesize=A4,
rightMargin=1.5 * cm,
leftMargin=1.5 * cm,
topMargin=1.5 * cm,
bottomMargin=1.5 * cm,
)
styles = getSampleStyleSheet()
# Custom styles
title_style = ParagraphStyle(
"Title2",
parent=styles["Title"],
fontSize=20,
textColor=colors.HexColor("#1a5276"),
spaceAfter=4,
alignment=TA_CENTER,
fontName="Helvetica-Bold",
)
subtitle_style = ParagraphStyle(
"Subtitle",
parent=styles["Normal"],
fontSize=11,
textColor=colors.HexColor("#5d6d7e"),
spaceAfter=6,
alignment=TA_CENTER,
fontName="Helvetica",
)
section_head = ParagraphStyle(
"SecHead",
parent=styles["Normal"],
fontSize=11,
textColor=colors.white,
fontName="Helvetica-Bold",
alignment=TA_LEFT,
leftIndent=6,
)
body_style = ParagraphStyle(
"Body2",
parent=styles["Normal"],
fontSize=9,
leading=13,
textColor=colors.HexColor("#2c3e50"),
)
note_style = ParagraphStyle(
"Note",
parent=styles["Normal"],
fontSize=8,
leading=11,
textColor=colors.HexColor("#922b21"),
fontName="Helvetica-Bold",
)
small_style = ParagraphStyle(
"Small",
parent=styles["Normal"],
fontSize=8,
leading=10,
textColor=colors.HexColor("#555555"),
)
PINK = colors.HexColor("#fce4ec")
PINK_DARK = colors.HexColor("#e91e8c")
BLUE_DARK = colors.HexColor("#1a5276")
BLUE_MID = colors.HexColor("#2980b9")
TEAL = colors.HexColor("#117a65")
ORANGE = colors.HexColor("#f39c12")
RED = colors.HexColor("#c0392b")
LIGHT_GREY= colors.HexColor("#f2f3f4")
WHITE = colors.white
elements = []
# ─────────────────────────────────────────
# HEADER
# ─────────────────────────────────────────
elements.append(Paragraph("Baby Kick Count Tracker", title_style))
elements.append(Paragraph("Daily Fetal Movement Record | Cardiff Count-to-Ten Method", subtitle_style))
elements.append(HRFlowable(width="100%", thickness=2, color=BLUE_DARK, spaceAfter=8))
# ─────────────────────────────────────────
# PATIENT DETAILS BOX
# ─────────────────────────────────────────
patient_data = [
[
Paragraph("<b>Mother's Name:</b> ___________________________", body_style),
Paragraph("<b>EDD / Due Date:</b> ___________________________", body_style),
],
[
Paragraph("<b>Doctor's Name:</b> ___________________________", body_style),
Paragraph("<b>Weeks Pregnant:</b> __________________________", body_style),
],
[
Paragraph("<b>Hospital / Clinic:</b> _________________________", body_style),
Paragraph("<b>Emergency No.:</b> ___________________________", body_style),
],
]
patient_table = Table(patient_data, colWidths=[9 * cm, 9 * cm])
patient_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), LIGHT_GREY),
("BOX", (0, 0), (-1, -1), 1.2, BLUE_DARK),
("INNERGRID", (0, 0), (-1, -1), 0.5, colors.HexColor("#bfc9ca")),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
("LEFTPADDING", (0, 0), (-1, -1), 8),
]))
elements.append(patient_table)
elements.append(Spacer(1, 10))
# ─────────────────────────────────────────
# HOW TO USE - instructions box
# ─────────────────────────────────────────
instructions_header = Table(
[[Paragraph("How to Use This Chart", section_head)]],
colWidths=[18 * cm],
)
instructions_header.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), BLUE_DARK),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
]))
elements.append(instructions_header)
steps = [
["1.", "Choose a time each day — preferably after a meal or in the evening when baby is most active."],
["2.", "Lie on your left side or sit comfortably. Place your hand on your belly."],
["3.", "Count every movement you feel — kicks, rolls, punches, swishes. Each one counts as 1."],
["4.", "Fill in the START TIME when you begin counting."],
["5.", "Each time you feel a movement, color in or tick one baby footprint box (1 to 10)."],
["6.", "When you reach 10 movements, record the FINISH TIME and calculate how long it took."],
["7.", "10 movements in under 2 hours = REASSURING (Normal)."],
]
step_table = Table(steps, colWidths=[0.7 * cm, 17.3 * cm])
step_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), PINK),
("FONTNAME", (0, 0), (0, -1), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, -1), 9),
("VALIGN", (0, 0), (-1, -1), "TOP"),
("TOPPADDING", (0, 0), (-1, -1), 3),
("BOTTOMPADDING", (0, 0), (-1, -1), 3),
("LEFTPADDING", (0, 0), (-1, -1), 6),
("TEXTCOLOR", (0, 0), (-1, -1), colors.HexColor("#2c3e50")),
("BOX", (0, 0), (-1, -1), 0.8, BLUE_DARK),
]))
elements.append(step_table)
alert_text = (
"WHEN TO CALL YOUR DOCTOR IMMEDIATELY: "
"If you count fewer than 10 movements in 2 hours, "
"if movements stop completely, or if there is a sudden big change from your baby's usual pattern — "
"go to hospital right away. Do not wait until the next day."
)
alert_table = Table(
[[Paragraph(alert_text, note_style)]],
colWidths=[18 * cm],
)
alert_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), colors.HexColor("#fadbd8")),
("BOX", (0, 0), (-1, -1), 1.5, RED),
("TOPPADDING", (0, 0), (-1, -1), 6),
("BOTTOMPADDING", (0, 0), (-1, -1), 6),
("LEFTPADDING", (0, 0), (-1, -1), 8),
]))
elements.append(alert_table)
elements.append(Spacer(1, 8))
# ─────────────────────────────────────────
# DAILY TRACKING TABLE — 14 days
# ─────────────────────────────────────────
tracking_header = Table(
[[Paragraph("14-Day Daily Kick Count Log", section_head)]],
colWidths=[18 * cm],
)
tracking_header.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), TEAL),
("TOPPADDING", (0, 0), (-1, -1), 5),
("BOTTOMPADDING", (0, 0), (-1, -1), 5),
]))
elements.append(tracking_header)
# Column headers
col_header = [
Paragraph("<b>Day</b>", small_style),
Paragraph("<b>Date</b>", small_style),
Paragraph("<b>Start\nTime</b>", small_style),
Paragraph("<b>1</b>", small_style),
Paragraph("<b>2</b>", small_style),
Paragraph("<b>3</b>", small_style),
Paragraph("<b>4</b>", small_style),
Paragraph("<b>5</b>", small_style),
Paragraph("<b>6</b>", small_style),
Paragraph("<b>7</b>", small_style),
Paragraph("<b>8</b>", small_style),
Paragraph("<b>9</b>", small_style),
Paragraph("<b>10</b>", small_style),
Paragraph("<b>Finish\nTime</b>", small_style),
Paragraph("<b>Duration\n(mins)</b>", small_style),
Paragraph("<b>Result</b>", small_style),
]
col_widths = [0.8*cm, 1.7*cm, 1.4*cm] + [0.9*cm]*10 + [1.4*cm, 1.5*cm, 2.0*cm]
rows = [col_header]
day_colors = [LIGHT_GREY, WHITE]
for i in range(1, 15):
row = [
Paragraph(f"<b>{i}</b>", small_style), # Day
Paragraph("__ /__ /__", small_style), # Date
Paragraph("__:__", small_style), # Start time
] + [Paragraph("", small_style)] * 10 + [ # 10 kick boxes
Paragraph("__:__", small_style), # Finish time
Paragraph("", small_style), # Duration
Paragraph("", small_style), # Result
]
rows.append(row)
track_table = Table(rows, colWidths=col_widths, rowHeights=[1.0*cm] + [1.1*cm]*14)
ts = TableStyle([
# Header row
("BACKGROUND", (0, 0), (-1, 0), BLUE_MID),
("TEXTCOLOR", (0, 0), (-1, 0), WHITE),
("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
("FONTSIZE", (0, 0), (-1, 0), 8),
("ALIGN", (0, 0), (-1, 0), "CENTER"),
("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
# Alternate row shading
*[("BACKGROUND", (0, r), (-1, r), (LIGHT_GREY if r % 2 == 1 else WHITE))
for r in range(1, 15)],
# Kick boxes (columns 3-12) - give them a circle-like look with teal outline
("BOX", (3, 1), (12, -1), 0.8, TEAL),
("INNERGRID", (3, 1), (12, -1), 0.5, colors.HexColor("#abebc6")),
# Outer borders
("BOX", (0, 0), (-1, -1), 1.5, BLUE_DARK),
("INNERGRID", (0, 0), (-1, -1), 0.4, colors.HexColor("#bfc9ca")),
# Text alignment
("ALIGN", (0, 1), (2, -1), "CENTER"),
("ALIGN", (3, 1), (12, -1), "CENTER"),
("ALIGN", (13, 1), (15, -1), "CENTER"),
# Result column slightly wider padding
("LEFTPADDING", (15, 1), (15, -1), 4),
("FONTSIZE", (0, 1), (-1, -1), 8),
("TOPPADDING", (0, 0), (-1, -1), 3),
("BOTTOMPADDING",(0, 0), (-1, -1), 3),
])
track_table.setStyle(ts)
elements.append(track_table)
elements.append(Spacer(1, 6))
# ─────────────────────────────────────────
# RESULT KEY
# ─────────────────────────────────────────
key_data = [
[
Paragraph(
"<b>Result Key:</b> "
"<font color='#117a65'>✓ Normal</font> = 10 kicks in under 2 hours | "
"<font color='#f39c12'>⚠ Slow</font> = 10 kicks took 2-4 hours (call your doctor) | "
"<font color='#c0392b'>✗ Alert</font> = fewer than 10 kicks OR took over 4 hours — GO TO HOSPITAL",
small_style
)
]
]
key_table = Table(key_data, colWidths=[18 * cm])
key_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), colors.HexColor("#eafaf1")),
("BOX", (0, 0), (-1, -1), 1.0, TEAL),
("TOPPADDING", (0, 0), (-1, -1), 6),
("BOTTOMPADDING", (0, 0), (-1, -1), 6),
("LEFTPADDING", (0, 0), (-1, -1), 8),
]))
elements.append(key_table)
elements.append(Spacer(1, 8))
# ─────────────────────────────────────────
# TIPS BOX
# ─────────────────────────────────────────
tips_header = Table(
[[Paragraph("Helpful Tips", section_head)]],
colWidths=[18 * cm],
)
tips_header.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), colors.HexColor("#6c3483")),
("TOPPADDING", (0, 0), (-1, -1), 4),
("BOTTOMPADDING", (0, 0), (-1, -1), 4),
]))
elements.append(tips_header)
tips = [
["•", "Count at the same time each day so you learn your baby's normal pattern."],
["•", "Baby is usually most active 1-2 hours after a meal. Have a snack before counting."],
["•", "Lying on your left side improves blood flow to the baby and makes movements easier to feel."],
["•", "A cold drink or gentle belly rub can sometimes encourage baby to move."],
["•", "Bring this chart to every antenatal visit so your doctor can check the trend."],
["•", "It is normal for movement type to change as your baby grows — rolls replace kicks. All count."],
["•", "If you are worried at ANY time, trust your instincts and contact your doctor or hospital."],
]
tips_table = Table(tips, colWidths=[0.5 * cm, 17.5 * cm])
tips_table.setStyle(TableStyle([
("BACKGROUND", (0, 0), (-1, -1), colors.HexColor("#f5eef8")),
("FONTSIZE", (0, 0), (-1, -1), 9),
("FONTNAME", (0, 0), (0, -1), "Helvetica-Bold"),
("VALIGN", (0, 0), (-1, -1), "TOP"),
("TOPPADDING", (0, 0), (-1, -1), 3),
("BOTTOMPADDING", (0, 0), (-1, -1), 3),
("LEFTPADDING", (0, 0), (-1, -1), 6),
("TEXTCOLOR", (0, 0), (-1, -1), colors.HexColor("#2c3e50")),
("BOX", (0, 0), (-1, -1), 0.8, colors.HexColor("#6c3483")),
]))
elements.append(tips_table)
# ─────────────────────────────────────────
# FOOTER
# ─────────────────────────────────────────
elements.append(Spacer(1, 10))
elements.append(HRFlowable(width="100%", thickness=1, color=colors.HexColor("#bfc9ca"), spaceAfter=4))
footer_text = (
"This tracker uses the Cardiff Count-to-Ten method. Always follow your doctor's specific advice. "
"This sheet is not a substitute for professional medical care."
)
elements.append(Paragraph(footer_text, small_style))
# ─────────────────────────────────────────
# BUILD
# ─────────────────────────────────────────
doc.build(elements)
print("PDF created successfully:", OUTPUT)
cd /tmp/workspace/kick-count && python generate_kick_count.py
Fetal Kick Count Tracker
PDF Document · PDF
My doc gave me dfmc chart in that I have to write kicks after breakfast lunch and dinner so that means after meal kicks I have to write or between breakfast and lunch kicks I have to write
| Meal | When to start counting |
|---|---|
| Breakfast | Start counting after you finish breakfast |
| Lunch | Start counting after you finish lunch |
| Dinner | Start counting after you finish dinner |
Why there is result unsatisfied and intermediate is that concerning
| Classification | Meaning |
|---|---|
| Reactive / Satisfied | 2+ clear accelerations in 20-30 mins = very reassuring |
| Intermediate / Unsatisfied | Fewer than 2 clear accelerations, but everything else normal |
| Non-reactive | No accelerations + other concerns = needs further testing |
A spell-checker might flag a sentence as wrong - but a human reader can see the sentence is perfectly fine.
| Finding | Concerning? |
|---|---|
| "Unsatisfied" checkbox | No - machine auto-stamp, baby was likely in sleep cycle |
| "Intermediate" accelerations | Mildly noted, but expected after your illness |
| Moderate variability | Excellent - most reassuring sign |
| No decelerations | Very good |
| Doctor's category: Normal | This is the final word - baby is fine |