What FTW asked for
Keep the target and the command result visible. Core checks each command against the current site and equipment limits.
diff --git a/README.md b/README.md index afcf955..c1cc0a8 100644 --- a/README.md +++ b/README.md @@ -17,13 +17,21 @@ complete. Use [FTW's vision](https://github.com/srcfl/ftw/blob/master/VISION.md) and [roadmap](https://github.com/srcfl/ftw/blob/master/docs/roadmap.md) when writing product copy. -Explain mixed-equipment coordination, simple defaults, local control and -visible outcomes. Clearly distinguish implemented capabilities from goals -such as cloud MCP. Do not publish predicted savings as measured results. +Explain FTW as a fast local energy core for people, agents and other software. +Show the current iPhone beta, webapp, Home Assistant app and ChatGPT integration. +Keep preview integrations and planned features distinct from public releases. +Do not publish predicted savings as measured results. -Product screenshots come from the public FTW webapp demo. Label them as -simulated data. They show the interface, not measured savings or a worker -benchmark. Keep their dimensions in HTML in step with the image files. +Product screenshots show the complete app viewport, without cropping or +changing the interface. Use the public webapp demo and the iOS app's built-in +demo. Label simulated homes. These show the interface, not measured savings +or a worker benchmark. Keep HTML dimensions in step with the image files. + +Current images: `assets/ftw-webapp-now.webp` comes from the public demo at +430 × 932 CSS pixels; `assets/ftw-ios-now.webp` comes from the iPhone 17 Pro +simulator, built from `srcfl/ftw-app` commit `4448968`. Both use simulated data. +`home.css` holds homepage styles; the shared stylesheet also serves the +support, privacy and ChatGPT pages. Sourceful maintains the product; Fredrik owns its direction. PRs are welcome, preferably based on [issues](https://github.com/srcfl/ftw-web/issues). Share a @@ -44,6 +52,14 @@ physical SD-card swap before install commands. Present same-host Docker as a separate option for people who can manage its services, not the next step after a failed native install. +## Public entry points + +- iPhone beta: https://testflight.apple.com/join/E4Japad7 +- Webapp and interactive demo: https://app.ftw.energy/ +- Home Assistant app: https://github.com/srcfl/ftw/blob/master/docs/home-assistant-app.md +- ChatGPT integration and its availability: `/chatgpt` +- Anonymous project statistics: https://stats.ftw.energy/ + ## Local dev ```bash diff --git a/assets/ftw-ios-now.webp b/assets/ftw-ios-now.webp new file mode 100644 index 0000000..1ce7004 Binary files /dev/null and b/assets/ftw-ios-now.webp differ diff --git a/assets/ftw-webapp-now.webp b/assets/ftw-webapp-now.webp new file mode 100644 index 0000000..727a0f3 Binary files /dev/null and b/assets/ftw-webapp-now.webp differ diff --git a/home.css b/home.css new file mode 100644 index 0000000..e07162e --- /dev/null +++ b/home.css @@ -0,0 +1,152 @@ +.home { --max: 1280px; } +.home section[id], .home article[id] { scroll-margin-top: 88px; } +.home h1 { font-size: clamp(3.3rem, 5.3vw, 5.4rem); line-height: 1.02; letter-spacing: -.045em; } +.home h2 { font-size: clamp(2.5rem, 4.5vw, 4.5rem); line-height: 1.06; letter-spacing: -.035em; } +.home h3 { letter-spacing: -.02em; } +.home .section-kicker, .home .cap-number { font-size: 11px; } +.home .hero-layout { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 64px; min-height: auto; padding-block: 76px 52px; } +.home .hero-lede { max-width: 500px; font-size: 20px; line-height: 1.55; } +.home .project-state { font-size: 11px; letter-spacing: .1em; } +.hero-footnote { margin: 24px 0 0; color: var(--muted); font-size: 14px; } +.hero-footnote a { color: var(--ink); text-underline-offset: 4px; text-decoration-color: var(--signal); } +.hero-facts { display: flex; flex-wrap: wrap; gap: 12px 20px; margin-top: 36px; padding-top: 20px; border-top: 1px solid var(--line); color: var(--muted); font-size: 12px; } +.app-pair { display: grid; grid-template-columns: 1fr 1fr; align-items: start; gap: 20px; max-width: 510px; justify-self: end; } +.app-pair figure { margin: 0; min-width: 0; } +.app-pair figure:nth-child(2) { padding-top: 42px; } +.app-pair figure > a { display: block; } +.app-pair img { display: block; width: 100%; height: auto; border: 1px solid var(--line); border-radius: 18px; background: var(--ink); } +.app-pair figcaption { padding-top: 16px; color: var(--muted); font-size: 13px; } +.app-pair figcaption span { display: block; margin-bottom: 4px; color: var(--ink); font: 10px 'JetBrains Mono', monospace; letter-spacing: .06em; } +.image-note { grid-column: 1 / -1; margin: 0; color: var(--muted); font-size: 11px; } +.product-routes { display: grid; grid-template-columns: repeat(4, 1fr); border-top: 1px solid var(--line); } +.product-routes a { position: relative; padding: 24px 32px 26px 0; text-decoration: none; font-size: 14px; } +.product-routes a + a { padding-left: 24px; border-left: 1px solid var(--line); } +.product-routes a:hover { color: var(--signal); } +.product-routes span { display: block; margin-bottom: 6px; color: var(--muted); font: 10px 'JetBrains Mono', monospace; letter-spacing: .08em; text-transform: uppercase; } +.product-routes b { position: absolute; right: 20px; top: 45px; color: var(--signal); font-weight: 400; } +.story-heading { display: grid; grid-template-columns: 1fr 2fr; gap: 64px; margin-bottom: 56px; } +.story-heading .section-kicker { margin-top: 12px; } +.story-heading h2 { margin-bottom: 28px; } +.story-heading .section-intro { max-width: 660px; margin-bottom: 0; } +.core-steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 40px; } +.core-steps article { padding-top: 24px; border-top: 1px solid var(--line); } +.core-steps h3 { margin: 24px 0 14px; font-size: 24px; font-weight: 500; } +.core-steps p { margin-bottom: 0; color: var(--muted); } +.core-links { display: flex; flex-wrap: wrap; gap: 16px 32px; padding-top: 36px; } +.core-links a, .agent-contract a { text-decoration-color: var(--signal); text-underline-offset: 5px; font-size: 14px; } +.ai-story { background: var(--ink); color: var(--cream); } +.ai-layout { display: grid; grid-template-columns: 1fr 1fr; gap: 100px; } +.ai-story h2 { color: var(--cream); } +.ai-layout > div > p:not(.section-kicker):not(.availability) { max-width: 540px; color: rgba(245,242,225,.74); } +.ai-lede { font-size: 20px; line-height: 1.55; } +.ai-story .btn { margin-top: 16px; } +.availability { margin: 18px 0 0; color: rgba(245,242,225,.56); font-size: 12px; } +.agent-examples { padding-top: 6px; } +.example-label { margin-bottom: 24px; color: rgba(245,242,225,.5); font: 11px 'JetBrains Mono', monospace; letter-spacing: .1em; } +.agent-examples ul { padding: 0; margin: 0; list-style: none; } +.agent-examples li { padding: 21px 0; border-top: 1px solid var(--line-dark); font-size: clamp(19px, 1.8vw, 25px); font-weight: 400; line-height: 1.4; } +.agent-examples li:last-child { border-bottom: 1px solid var(--line-dark); } +.agent-contract { padding-top: 32px; } +.agent-contract h3 { margin-bottom: 12px; color: var(--cream); font-size: 22px; font-weight: 500; } +.agent-contract p { color: rgba(245,242,225,.64); } +.ai-privacy { display: flex; flex-wrap: wrap; gap: 8px 20px; margin-top: 48px; padding-top: 20px; border-top: 1px solid var(--line-dark); color: rgba(245,242,225,.56); font-size: 12px; } +.ai-privacy a { text-underline-offset: 4px; } +.app-details { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; } +.app-details article { padding-top: 24px; border-top: 1px solid var(--line); } +.app-details h3 { margin: 24px 0 16px; font-size: 28px; line-height: 1.2; font-weight: 500; } +.app-details p:not(.cap-number):not(.small-note) { max-width: 510px; color: var(--muted); } +.small-note { color: var(--muted); font-size: 13px; } +.app-details .small-note { margin: 22px 0 0; } +.home .text-link { white-space: normal; } +.plan-story { background: var(--cream); } +.plan-layout { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: start; gap: 100px; } +.plan-layout h2 { margin-bottom: 28px; } +.plan-layout .check-list { margin-top: 28px; } +.plan-layout .product-note { font-size: 14px; } +.install-options { display: grid; grid-template-columns: 1fr 1fr; border-top: 1px solid var(--line); } +.install-options article { padding: 36px 48px 24px 0; } +.install-options article + article { padding-left: 48px; border-left: 1px solid var(--line); } +.install-options h3 { margin: 28px 0 18px; font-size: 30px; font-weight: 500; } +.install-options article > p:not(.small-note) { max-width: 480px; color: var(--muted); } +.install-options .btn { margin-top: 12px; } +.install-options .small-note { margin: 18px 0 0; } +.install-notes { margin-top: 32px; padding-top: 20px; border-top: 1px solid var(--line); color: var(--muted); font-size: 14px; } +.install-notes a { text-decoration-color: var(--signal); text-underline-offset: 4px; } +.install-notes summary { cursor: pointer; color: var(--ink); } +.install-notes details p { max-width: 800px; margin-top: 16px; } +.community-story { background: var(--cream); } +.community-row { display: grid; grid-template-columns: 1fr 1fr; gap: 100px; } +.community-row h2 { margin-bottom: 0; } +.community-row > div:last-child > p:first-child { color: var(--muted); font-size: 18px; } +.community-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 22px; margin: 30px 0; } +.community-actions > a:not(.btn) { font-size: 14px; text-decoration-color: var(--signal); text-underline-offset: 4px; } +.community-row .small-note { line-height: 1.65; margin-bottom: 0; } +.home .footer-main { grid-template-columns: 1fr 1.6fr; gap: 64px; } +.home .footer-links { gap: 32px; } +.home .footer-links a { min-height: 32px; } + +@media (max-width: 1100px) { + .home .hero-layout { gap: 36px; } + .home h1 { font-size: clamp(3.1rem, 5.3vw, 4.4rem); } + .home .hero-lede { font-size: 18px; } + .app-pair { gap: 14px; } + .story-heading { gap: 40px; } + .ai-layout, .plan-layout, .community-row { gap: 56px; } +} +@media (max-width: 860px) { + .home .hero-layout { display: grid; grid-template-columns: 1fr; padding-block: 52px 36px; gap: 44px; } + .home h1 { max-width: 700px; font-size: clamp(3.5rem, 9vw, 5.2rem); } + .home .hero-lede { max-width: 600px; } + .hero-facts { margin-top: 28px; } + .app-pair { max-width: 500px; justify-self: center; gap: 20px; } + .product-routes { grid-template-columns: 1fr 1fr; } + .product-routes a { border-bottom: 1px solid var(--line); } + .product-routes a:nth-child(3) { padding-left: 0; border-left: 0; } + .story-heading { grid-template-columns: 1fr; gap: 8px; margin-bottom: 40px; } + .story-heading .section-kicker { margin-top: 0; } + .core-steps { gap: 24px; } + .core-steps h3 { font-size: 21px; } + .ai-layout { grid-template-columns: 1fr; gap: 48px; } + .ai-layout > div > p:not(.section-kicker):not(.availability) { max-width: 650px; } + .agent-examples { padding-top: 0; } + .app-details { gap: 32px; } + .plan-layout { grid-template-columns: 1fr 1fr; gap: 36px; } + .plan-layout h2 { font-size: 2.8rem; } + .install-options article { padding-right: 28px; } + .install-options article + article { padding-left: 28px; } + .install-options h3 { font-size: 25px; } + .community-row, .home .footer-main { grid-template-columns: 1fr; gap: 40px; } +} +@media (max-width: 600px) { + .home .hero-layout { padding-top: 42px; } + .home h1 { font-size: clamp(2.95rem, 11.8vw, 4.1rem); } + .home h2 { font-size: clamp(2.3rem, 9vw, 3.2rem); } + .home .hero-actions .btn { flex: 0 1 auto; } + .hero-footnote { line-height: 1.7; } + .hero-footnote a { display: inline; } + .hero-facts { font-size: 11px; gap: 10px 14px; } + .app-pair { gap: 12px; width: 100%; } + .app-pair figure:nth-child(2) { padding-top: 28px; } + .app-pair img { border-radius: 10px; } + .app-pair figcaption { font-size: 11px; line-height: 1.5; padding-top: 12px; } + .app-pair figcaption span { font-size: 9px; } + .image-note { font-size: 10px; } + .product-routes a { padding-block: 20px; font-size: 12px; } + .product-routes a + a { padding-left: 16px; } + .product-routes a:nth-child(3) { padding-left: 0; } + .product-routes b { right: 10px; top: 42px; } + .product-routes span { font-size: 9px; } + .core-steps, .app-details, .plan-layout, .install-options { grid-template-columns: 1fr; } + .core-steps { gap: 28px; } + .core-steps h3 { margin-top: 18px; font-size: 23px; } + .ai-lede { font-size: 18px; } + .ai-privacy { margin-top: 32px; } + .app-details { gap: 40px; } + .app-details h3 { font-size: 25px; } + .plan-layout { gap: 40px; } + .install-options article, .install-options article + article { padding: 28px 0; border-left: 0; } + .install-options article + article { border-top: 1px solid var(--line); } + .install-options h3 { margin-top: 22px; } + .community-actions { gap: 20px; } + .home .footer-links { grid-template-columns: 1fr 1fr; gap: 36px 20px; } +} diff --git a/index.html b/index.html index 7bc4600..e7ce1a8 100644 --- a/index.html +++ b/index.html @@ -3,28 +3,29 @@
-Current beta · Your hardware · Sourceful maintained
-Make supported solar, batteries and car charging from different brands work together. FTW plans ahead, controls locally and shows what the equipment actually does.
+FTW · Public beta
+A fast, local core for your home's energy. FTW brings solar, batteries and car charging together. Use it from your iPhone, the web, Home Assistant or an AI assistant.
-
- Energyplan
-When should the battery charge? What energy does the car need before departure? Energyplan weighs these needs together with electricity prices, tariffs, solar and household forecasts, battery state and efficiency.
-Energyplan runs as a compiled local worker. It proposes a plan; FTW Core checks every proposal and keeps its own fallback. The worker never sends commands to hardware.
- How planning and Core work together -
- Are we in control?
-A command reply does not prove that power changed. The current beta shows whether a controlled device follows FTW, is waiting, is limited or needs attention.
-Keep the target and the command result visible. Core checks each command against the current site and equipment limits.
Fresh readings show whether the device follows. Old or missing readings stay distinct from a measured response.
When independent measurements support it, Core confirms the physical change. The available proof depends on the device and its readings.
Core keeps safety and control on the box. Stale required site-meter data stops dispatch; an unavailable planner leaves Core's local fallback.
- What changed in the beta +Have an iPhone? Join the iOS beta on TestFlight
+Your equipment
-Check your model, firmware and the functions that have been verified. A catalog entry alone does not prove that FTW can control a device.
+01 / The energy core
+Your meter, solar, battery and charger each report their own readings. FTW reads them together, plans ahead and controls on the equipment's own network. The core runs on your hardware and keeps working when an app or assistant disconnects.
Lua drivers connect supported meters, inverters and batteries. Each device keeps its own limits and capabilities.
Check the device catalogActive control needs a working site meter and a confirmed main fuse rating. FTW checks those limits against current measurements.
Prepare your setupUse charging goals and Charge now. OCPP 1.6J and 2.0.1 chargers connect to FTW's built-in server without a Lua driver. Verify the functions your charger supports.
OCPP charger setupLive power, stored energy and device health. Fresh readings, estimates and missing data stay distinct.
Energyplan combines prices, solar, household forecasts and charging needs into one local plan.
Core checks commands against site and equipment limits, then checks the readings for the response.
Get running
-2.x and 3.x will receive no further updates. Switch to the new 0.x line for current fixes and features. Do not install 3.x beta.
-Old FTW on a Raspberry Pi? Use a second SD card. Keep the old card. Prepare the new one and swap cards before running install commands. Guided transfer of old settings and history is not ready.
-Choose one path below. A refused native install is a stop point; do not try Docker next. Same-host Docker needs a planned switch with old Core stopped and MQTT preserved.
-Apps and access
-Use the web app on a phone or computer. Keep control at home and choose whether a readable copy of your home's data leaves the box.
-Open the local web app at home or pair the installable web client for remote access. The relay carries encrypted traffic and cannot read your home's data. Try the public demo with simulated equipment.
Try the web appThe latest beta adds FTW Cloud support. When the owner turns it on, the box sends a signed, readable copy for phone access and alerts. Cloud reads that data and never controls equipment. This differs from the blind relay; local operation remains the default.
Read the Cloud designSeparate iPhone and Android apps use the same pairing and encrypted protocol. They are still in development. Store releases and the web app's full set of features are not available yet.
Follow native app developmentArchitecture
-FTW Core owns measurements, state, safety and device commands. Energyplan supplies forecasts and proposed plans through a defined contract. Both run on your own host. The implementation uses Go, Lua drivers and compiled Energyplan workers.
-Signals in
-Coordinated out
-Site convention Above the driver boundary, positive power means energy flowing into the site. Every device speaks the same language.
- Read the architecture -Daily use
-Use Home Assistant through MQTT, the local API or the Modbus TCP proxy. When an external system takes write ownership of a configured endpoint, FTW stops sending competing commands there.
-Open drivers connect supported equipment. MQTT discovery connects Home Assistant. Local APIs and the Modbus proxy give other systems a defined way to read and control.
Read the integration guidesNative installations can check for a new beta, show download progress and confirm the running version after restart. The update checks installation readiness and stored-data compatibility before it proceeds.
How updates workChoose how the household uses solar and stored energy, set a charging goal and departure time, and inspect the plan. The beta shows planning errors and warns when saved charging steps exceed the charger's limit.
Explore the demo planBuild with it
-FTW drivers are plain Lua files with capability-scoped access to Modbus, MQTT, HTTP, WebSocket and TCP. Edit a driver on the Pi and reload it without rebuilding the Go runtime.
-02 / An energy primitive for AI
+Ask why the battery is charging. Understand tonight's plan. Get help connecting your equipment. FTW gives an authorized assistant the context to answer.
+The FTW plugin brings that access to ChatGPT. MCP gives agents a structured way to work with the core. You choose who gets access and can revoke it. Core checks every request and keeps control at home.
+ Explore FTW for ChatGPT +ChatGPT plugin preview · Public directory listing pending
+A FEW THINGS TO ASK
+function driver_init(config)
- host.set_make("My Inverter")
- host.mqtt_subscribe(config.topic)
-end
-
-function driver_poll()
- local watts = read_power()
- host.emit("battery", {
- power_w = watts,
- soc = read_soc()
- })
- return 1000
-end
-
+ State, history, goals and plans through APIs and MCP. Connect your own agent or automation, with scoped access and Core's validation.
Agent-led setup and accessThe community edition
-Run FTW at home, study it and modify it. FTW's open-source code uses AGPLv3 with a narrow Energyplan exception. Share covered source when the license requires it. The proprietary Energyplan worker permits unmodified use with FTW only for your own private household. Free, noncommercial redistribution with FTW is allowed only for that household use, with its license and notices. Other use or distribution, including commercial use and operation for others, requires a separate written Sourceful license. Sourceful Energy develops and maintains FTW. Contributions are welcome: start with an issue, share a short Markdown proposal or send a focused PR with relevant test evidence.
- -FTW Community comes without official support, warranty, response times or service-level commitments. Help is best-effort from other users and maintainers.
- -Report a need, share a Markdown proposal or send a tested fix. Prefer an issue as the starting point. Our agentic-first approach uses clear problems and reproducible results that people and agents can review. Hardware claims need hardware evidence.
- -03 / Built to feel immediate
+The apps show saved readings straight away, then catch up with the box. Every reading keeps its age. Watch the flow, change a charging goal and see what FTW does next.
FTW FOR iPHONE · iOS 26+
Live energy, car charging and electricity prices. Check the plan, set a charging goal or choose Charge now. Keep prices close with widgets.
Get the iOS beta on TestFlightIncludes a simulated home to explore before you connect a box.
FTW WEBAPP · PHONE + COMPUTER
Live flow, plans, history and access to your box. Install the webapp on your home screen and open it like an app. Pair it with FTW to use your own home's data.
Open the webapp and try the demoThe public demo uses simulated equipment. No box needed.
04 / Planning that stays local
For organizations
-AGPLv3 permits commercial use of the covered FTW code under its source-sharing terms. Commercial Energyplan use, OEM bundles and paid services involving the worker require a separate Sourceful license. Sourceful also offers deployment, maintenance and support.
- Talk to Sourceful -Supported deploymentsArchitecture, commissioning, upgrades and operational handover.
Integrations + OEMCustom hardware, certification, white-label and product delivery.
Fleet operationsProvisioning, observability and managed multi-site boundaries.
Long-term supportDefined maintenance, security handling, response times and SLA.
Prices change. The car plugs in. The forecast changes. FTW updates the plan around your goals and the energy available.
+Energyplan runs locally. Core checks each proposed plan before it reaches a device. Site limits and fresh meter readings govern control.
+ Check your equipment in the device catalogFTW Connect · In development
Sourceful is developing remote help and system maintenance for FTW households: understand system health, investigate faults and manage approved updates. Connect has no running service or public subscription yet. Pricing, support and maintenance scope remain open.
Follow Sourceful services05 / Try the beta
Explore a demo, run FTW inside Home Assistant or install it on your own Linux host. Then connect the apps and assistants you want to use.
Already running FTW? Follow the switch or update guide. The retired 2.x and 3.x lines receive no more updates.
Keep a full backup and your old data. On a Raspberry Pi, keep the old SD card and use a second card. Guided transfer of old settings and history is not ready. Stop old Core and its autostart before another Core controls the same equipment. If an install refuses the old layout, follow the guide before trying another path.
FTW Community
-Run it. Explore it. Tell us what would make it better.
-Open code · Sourceful maintained
FTW is open-source software. Connect your own software, adapt Lua drivers and contribute a tested fix. Sourceful develops and maintains the project with the community.
FTW code uses AGPLv3 with the Energyplan permission. The separate Energyplan worker is licensed for private household use. Commercial worker use needs a Sourceful license. Licensing · Community and commercial support