docs: add landing page assets and polish landing CSS
Add landing page .docx export, HTML mockup, docx generator script, and refine landing page CSS formatting/spacing. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
BIN
docs/ResolutionFlow-Landing-Page.docx
Normal file
BIN
docs/ResolutionFlow-Landing-Page.docx
Normal file
Binary file not shown.
BIN
docs/ResolutionFlow_Script_Generator_Plan.docx
Normal file
BIN
docs/ResolutionFlow_Script_Generator_Plan.docx
Normal file
Binary file not shown.
228
docs/generate_landing_docx.py
Normal file
228
docs/generate_landing_docx.py
Normal file
@@ -0,0 +1,228 @@
|
||||
"""Generate a .docx version of the ResolutionFlow landing page content."""
|
||||
from docx import Document
|
||||
from docx.shared import Pt, RGBColor
|
||||
from docx.enum.text import WD_ALIGN_PARAGRAPH
|
||||
import os
|
||||
|
||||
doc = Document()
|
||||
|
||||
style = doc.styles['Normal']
|
||||
style.font.name = 'Calibri'
|
||||
style.font.size = Pt(11)
|
||||
style.font.color.rgb = RGBColor(0x33, 0x33, 0x33)
|
||||
|
||||
for level in range(1, 4):
|
||||
hs = doc.styles[f'Heading {level}']
|
||||
hs.font.color.rgb = RGBColor(0x10, 0x11, 0x14)
|
||||
|
||||
# ── Title ──
|
||||
title = doc.add_heading('ResolutionFlow', level=0)
|
||||
title.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
subtitle = doc.add_paragraph('From Issue to Resolution, Documented')
|
||||
subtitle.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
subtitle.runs[0].font.size = Pt(14)
|
||||
subtitle.runs[0].font.color.rgb = RGBColor(0x06, 0xB6, 0xD4)
|
||||
|
||||
doc.add_paragraph('AI-guided decision trees that walk your engineers through troubleshooting and automatically document every step.').alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
doc.add_paragraph('')
|
||||
|
||||
# ── Hero ──
|
||||
doc.add_heading('Stop writing ticket notes. Start generating them.', level=1)
|
||||
doc.add_paragraph(
|
||||
'AI-guided decision trees that walk your engineers through troubleshooting — '
|
||||
'and automatically document every step, ready for your PSA ticket.'
|
||||
)
|
||||
|
||||
# ── Social Proof ──
|
||||
doc.add_paragraph('')
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run('Built by MSP engineers, for MSP engineers')
|
||||
run.bold = True
|
||||
run.font.size = Pt(12)
|
||||
|
||||
stats = doc.add_table(rows=1, cols=3)
|
||||
stats.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
for i, (num, label) in enumerate([
|
||||
('15+', 'Years MSP Experience'),
|
||||
('70%', 'Less Time on Documentation'),
|
||||
('0', 'Ticket Notes Written by Hand'),
|
||||
]):
|
||||
cell = stats.cell(0, i)
|
||||
p = cell.paragraphs[0]
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run(num)
|
||||
run.bold = True
|
||||
run.font.size = Pt(16)
|
||||
run.font.color.rgb = RGBColor(0x06, 0xB6, 0xD4)
|
||||
p.add_run('\n' + label).font.size = Pt(9)
|
||||
|
||||
doc.add_paragraph('')
|
||||
|
||||
# ── The Problem ──
|
||||
doc.add_heading('The Problem', level=1)
|
||||
doc.add_paragraph('Documentation is broken. Everyone knows it.')
|
||||
doc.add_paragraph(
|
||||
"Engineers don't want to write it. Managers hate chasing it. "
|
||||
"Clients never see it. The same issues get solved from scratch every time."
|
||||
)
|
||||
|
||||
problems = [
|
||||
('15-25 min lost per ticket',
|
||||
'Engineers spend more time documenting what they did than actually doing it. '
|
||||
'After a complex issue, writing notes is the last thing anyone wants to do.'),
|
||||
('Vague, useless notes',
|
||||
'"Fixed Outlook" tells you nothing. Documentation written under pressure tends '
|
||||
'toward generalities that help nobody the second time around.'),
|
||||
('Knowledge walks out the door',
|
||||
'When a senior engineer leaves, years of tribal knowledge disappear overnight. '
|
||||
'New hires spend months building up what was never captured.'),
|
||||
('Context switching kills speed',
|
||||
'Jumping between the issue, documentation tools, PSA tickets, and knowledge bases '
|
||||
'fragments focus and slows resolution.'),
|
||||
]
|
||||
for title_text, desc in problems:
|
||||
p = doc.add_paragraph()
|
||||
run = p.add_run(title_text)
|
||||
run.bold = True
|
||||
p.add_run(f' -- {desc}')
|
||||
|
||||
doc.add_paragraph('')
|
||||
|
||||
# ── The Answer ──
|
||||
doc.add_heading('The Answer', level=1)
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run('Resolution + Documentation - Time = ResolutionFlow')
|
||||
run.bold = True
|
||||
run.font.size = Pt(14)
|
||||
run.font.color.rgb = RGBColor(0x06, 0xB6, 0xD4)
|
||||
|
||||
doc.add_paragraph(
|
||||
'What if documentation was a byproduct of solving the issue -- not a separate task? '
|
||||
'What if your engineers never had to write another ticket note?'
|
||||
)
|
||||
|
||||
doc.add_paragraph('')
|
||||
|
||||
# ── How It Works ──
|
||||
doc.add_heading('How It Works', level=1)
|
||||
doc.add_paragraph('Three steps. Zero note-writing.')
|
||||
doc.add_paragraph('Build once, run forever. Every session generates documentation automatically.')
|
||||
|
||||
steps = [
|
||||
('1. Build a Flow',
|
||||
'Use the visual Flow Editor to create branching decision trees for any troubleshooting scenario. '
|
||||
'Drag, connect, and enrich steps with commands, notes, and AI suggestions.'),
|
||||
('2. Run a Session',
|
||||
'An engineer launches the flow on a live ticket. FlowPilot -- your AI copilot -- acts as a virtual '
|
||||
'senior engineer, guiding decisions and capturing every action in real time.'),
|
||||
('3. Export to Ticket',
|
||||
'When the session ends, full documentation is generated -- formatted for your PSA. Paste it directly '
|
||||
'into ConnectWise, Atera, or Syncro. Done.'),
|
||||
]
|
||||
for step_title, step_desc in steps:
|
||||
doc.add_heading(step_title, level=2)
|
||||
doc.add_paragraph(step_desc)
|
||||
|
||||
doc.add_paragraph('')
|
||||
|
||||
# ── Features ──
|
||||
doc.add_heading('Features', level=1)
|
||||
doc.add_paragraph('Everything your team needs to resolve faster and document better.')
|
||||
|
||||
features = [
|
||||
('FlowPilot -- Your AI Copilot',
|
||||
'Like having a senior engineer on every call. FlowPilot suggests next steps, provides context-aware '
|
||||
'guidance, and automatically captures documentation as a byproduct of the troubleshooting session.'),
|
||||
('Visual Flow Editor',
|
||||
'Build branching decision trees with a drag-and-drop canvas. Add steps, conditions, commands, and notes -- no code required.'),
|
||||
('Auto-Documentation',
|
||||
'Every session generates timestamped, detailed notes -- formatted for your PSA. Engineers never write another ticket note.'),
|
||||
('Team Knowledge Sharing',
|
||||
'Share flows across your team. When one engineer solves a new problem, the whole team benefits from that path -- instantly.'),
|
||||
('Session History & Analytics',
|
||||
'Track which flows are used most, identify bottlenecks, and see how your team resolves issues over time.'),
|
||||
('PSA Integration',
|
||||
'Connect directly to ConnectWise, Atera, and Syncro. Export session docs straight to tickets -- no copy-paste needed.'),
|
||||
]
|
||||
for feat_title, feat_desc in features:
|
||||
p = doc.add_paragraph()
|
||||
run = p.add_run(feat_title)
|
||||
run.bold = True
|
||||
p.add_run(f' -- {feat_desc}')
|
||||
|
||||
doc.add_paragraph('')
|
||||
|
||||
# ── Pricing ──
|
||||
doc.add_heading('Pricing', level=1)
|
||||
doc.add_paragraph('Simple pricing. No surprises. Start free. Upgrade when your team is ready.')
|
||||
|
||||
pricing_table = doc.add_table(rows=9, cols=4)
|
||||
pricing_table.style = 'Light Grid Accent 1'
|
||||
|
||||
headers = ['', 'Free', 'Pro', 'Team']
|
||||
for i, h in enumerate(headers):
|
||||
cell = pricing_table.cell(0, i)
|
||||
cell.text = h
|
||||
for run in cell.paragraphs[0].runs:
|
||||
run.bold = True
|
||||
|
||||
rows_data = [
|
||||
['Target', 'Individual techs evaluating', 'Small MSPs (1-5 techs)', 'Growing MSPs (5-25 techs)'],
|
||||
['Price', '$0 -- Free forever', '$15/user/mo', '$25/user/mo'],
|
||||
['Decision Trees', '3', 'Unlimited', 'Unlimited'],
|
||||
['Sessions', '20/month', 'Unlimited', 'Unlimited'],
|
||||
['FlowPilot AI', '--', 'Included', 'Included'],
|
||||
['Exports', 'MD, TXT', 'All formats', 'All formats'],
|
||||
['PSA Integration', '--', '--', 'ConnectWise, Atera, Syncro'],
|
||||
['Support', 'Community', 'Priority', 'Dedicated'],
|
||||
]
|
||||
for row_idx, row_data in enumerate(rows_data):
|
||||
for col_idx, val in enumerate(row_data):
|
||||
pricing_table.cell(row_idx + 1, col_idx).text = val
|
||||
|
||||
doc.add_paragraph('')
|
||||
p = doc.add_paragraph('Need Enterprise (25+ techs, SSO, custom branding)? Contact us at ')
|
||||
run = p.add_run('hello@resolutionflow.com')
|
||||
run.font.color.rgb = RGBColor(0x06, 0xB6, 0xD4)
|
||||
|
||||
doc.add_paragraph('')
|
||||
|
||||
# ── Testimonial ──
|
||||
doc.add_heading('What People Are Saying', level=1)
|
||||
p = doc.add_paragraph()
|
||||
run = p.add_run(
|
||||
'"We used to spend more time writing ticket notes than solving the actual issue. '
|
||||
'Now it just... happens. The documentation writes itself while we work."'
|
||||
)
|
||||
run.italic = True
|
||||
run.font.size = Pt(12)
|
||||
doc.add_paragraph('-- Beta Tester, MSP Engineer, Southeast US')
|
||||
|
||||
doc.add_paragraph('')
|
||||
|
||||
# ── CTA ──
|
||||
doc.add_heading('Ready to stop writing ticket notes?', level=1)
|
||||
doc.add_paragraph(
|
||||
'Join the beta and see what happens when documentation becomes automatic.\n'
|
||||
'Free to start. No credit card required.'
|
||||
)
|
||||
p = doc.add_paragraph()
|
||||
run = p.add_run('Sign up at resolutionflow.com')
|
||||
run.bold = True
|
||||
run.font.color.rgb = RGBColor(0x06, 0xB6, 0xD4)
|
||||
|
||||
doc.add_paragraph('')
|
||||
|
||||
# ── Footer ──
|
||||
p = doc.add_paragraph()
|
||||
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
|
||||
run = p.add_run('\u00a9 2026 ResolutionFlow. All rights reserved.')
|
||||
run.font.size = Pt(9)
|
||||
run.font.color.rgb = RGBColor(0x88, 0x91, 0xA0)
|
||||
|
||||
# Save
|
||||
out_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'ResolutionFlow-Landing-Page.docx')
|
||||
doc.save(out_path)
|
||||
print(f'Saved to {out_path}')
|
||||
1639
docs/resolutionflow-landing-page-mockup.html
Normal file
1639
docs/resolutionflow-landing-page-mockup.html
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user