[{"data":1,"prerenderedAt":570},["ShallowReactive",2],{"releases":3},[4,116,282,448],{"id":5,"title":6,"body":7,"date":107,"description":97,"extension":108,"meta":109,"navigation":110,"path":111,"seo":112,"stem":113,"version":114,"__hash__":115},"releases/releases/1.3.0.md","130",{"type":8,"value":9,"toc":96},"minimark",[10,15,19,23,28,63,67,87,91],[11,12,14],"h2",{"id":13},"highlights","Highlights",[16,17,18],"p",{},"The OAuth consent screen — the page you see when a service like ChatGPT asks for permission to read your solar data — now lives in the same Nuxt SPA as the rest of the app. Same amber/orange palette, same dark mode, same components. Internally it was a standalone HTML page; now it's a real page on the site.",[11,20,22],{"id":21},"whats-new","What's new",[24,25,27],"h3",{"id":26},"native-consent-screen","Native consent screen",[29,30,31,48,60],"ul",{},[32,33,34,35,39,40,43,44,47],"li",{},"New ",[36,37,38],"code",{},"/connect/authorize"," page renders inside the app shell with the same ",[36,41,42],{},"UCard"," / ",[36,45,46],{},"UButton"," / dark-mode treatment used everywhere else.",[32,49,50,51,55,56,59],{},"The page shows the requesting application's name, your account, and the permissions being granted. ",[52,53,54],"strong",{},"Authorize"," redirects back to the client with an access code; ",[52,57,58],{},"Cancel"," denies the request.",[32,61,62],{},"Approving still goes through Passport server-side — nothing about the OAuth security model changes; only the UI moved.",[24,64,66],{"id":65},"better-login-redirects","Better login redirects",[29,68,69,84],{},[32,70,71,72,75,76,79,80,83],{},"Hitting a server-rendered route (like ",[36,73,74],{},"/oauth/authorize"," or ",[36,77,78],{},"/horizon",") when you're signed out now bounces you to the Nuxt sign-in page with a ",[36,81,82],{},"?redirect_to="," parameter. After you sign in, you're sent right back to where you were going.",[32,85,86],{},"The login form validates the redirect target so only same-origin URLs are honored.",[24,88,90],{"id":89},"cleanup","Cleanup",[29,92,93],{},[32,94,95],{},"The temporary Blade fallback consent view added in v1.2.4 is gone — there's only one consent UI now, and it's part of the SPA.",{"title":97,"searchDepth":98,"depth":98,"links":99},"",2,[100,101],{"id":13,"depth":98,"text":14},{"id":21,"depth":98,"text":22,"children":102},[103,105,106],{"id":26,"depth":104,"text":27},3,{"id":65,"depth":104,"text":66},{"id":89,"depth":104,"text":90},"2026-05-20","md",{},true,"/releases/1.3.0",{"title":6,"description":97},"releases/1.3.0","1.3.0","cmAASEbdP_IT-qMwax-9qP3kbgTYax3MzL6icfUUmTA",{"id":117,"title":118,"body":119,"date":275,"description":97,"extension":108,"meta":276,"navigation":110,"path":277,"seo":278,"stem":279,"version":280,"__hash__":281},"releases/releases/1.0.0.md","100",{"type":8,"value":120,"toc":263},[121,123,126,130,134,162,166,180,184,198,202,213,217,234,238,254,258],[11,122,14],{"id":13},[16,124,125],{},"First stable release of Solar Tracking Efficiency — a website for residential and commercial solar PV owners to log monthly readings, track production efficiency, and share dashboards publicly.",[11,127,129],{"id":128},"features","Features",[24,131,133],{"id":132},"authentication-accounts","Authentication & Accounts",[29,135,136,143,150,153,156,159],{},[32,137,138,139,142],{},"Register with ",[52,140,141],{},"username"," (lowercase, no accents) and optional email",[32,144,145,146,149],{},"Login with username ",[52,147,148],{},"or"," email",[32,151,152],{},"Email verification via secure token (24 h expiry)",[32,154,155],{},"Password reset by email",[32,157,158],{},"Profile page: update name, username, email, and password",[32,160,161],{},"Avatar upload and removal",[24,163,165],{"id":164},"solar-systems","Solar Systems",[29,167,168,171,174,177],{},[32,169,170],{},"Create, edit, and delete solar systems",[32,172,173],{},"Configure system size (kWp), panel count and wattage, inverter and battery capacity, installation date",[32,175,176],{},"Set monthly projected generation (Jan–Dec) from your installer's specs",[32,178,179],{},"Sortable, paginated list of all your systems",[24,181,183],{"id":182},"monthly-readings","Monthly Readings",[29,185,186,189,192,195],{},[32,187,188],{},"Log energy generated, consumed, and exported per month",[32,190,191],{},"Automatic calculation of performance ratio, daily average, self-consumption, and grid import",[32,193,194],{},"Bulk CSV import — paste years of historical data in one shot",[32,196,197],{},"Year and month navigation with trend charts",[24,199,201],{"id":200},"public-sharing","Public Sharing",[29,203,204,207,210],{},[32,205,206],{},"Generate a private share link (token-based, no auth required for viewers)",[32,208,209],{},"Public dashboard exposes only technical and production data — no personal identifiers",[32,211,212],{},"Revoke or rotate the link at any time",[24,214,216],{"id":215},"privacy-data-portability-gdpr-lgpd","Privacy & Data Portability (GDPR / LGPD)",[29,218,219,225,231],{},[32,220,221,224],{},[52,222,223],{},"Export my data",": download a full JSON file with your profile, systems, and readings",[32,226,227,230],{},[52,228,229],{},"Delete account",": hard-delete with no soft-delete or recovery — fully GDPR/LGPD compliant",[32,232,233],{},"Privacy Policy page",[24,235,237],{"id":236},"public-pages","Public Pages",[29,239,240,243,246,248,251],{},[32,241,242],{},"Marketing landing page with prerendered SSR for SEO",[32,244,245],{},"Full Open Graph and Twitter Card meta tags for social sharing",[32,247,233],{},[32,249,250],{},"Releases page (this page)",[32,252,253],{},"XML sitemap",[24,255,257],{"id":256},"analytics","Analytics",[29,259,260],{},[32,261,262],{},"Optional self-hosted Umami integration — no cookies, no cross-site tracking, GDPR-safe",{"title":97,"searchDepth":98,"depth":98,"links":264},[265,266],{"id":13,"depth":98,"text":14},{"id":128,"depth":98,"text":129,"children":267},[268,269,270,271,272,273,274],{"id":132,"depth":104,"text":133},{"id":164,"depth":104,"text":165},{"id":182,"depth":104,"text":183},{"id":200,"depth":104,"text":201},{"id":215,"depth":104,"text":216},{"id":236,"depth":104,"text":237},{"id":256,"depth":104,"text":257},"2026-05-19",{},"/releases/1.0.0",{"title":118,"description":97},"releases/1.0.0","1.0.0","kSlPgY5Q6MB7ys_RKMlvRpwGX4CFZOPA99h-GrTtSHo",{"id":283,"title":284,"body":285,"date":275,"description":97,"extension":108,"meta":442,"navigation":110,"path":443,"seo":444,"stem":445,"version":446,"__hash__":447},"releases/releases/1.1.0.md","110",{"type":8,"value":286,"toc":432},[287,289,296,298,302,324,328,354,358,392,396,420,424],[11,288,14],{"id":13},[16,290,291,292,295],{},"Solar Tracking Efficiency now ships with an ",[52,293,294],{},"MCP (Model Context Protocol) server",", letting you connect AI clients like Claude Code, Claude Desktop, Cursor, and VS Code directly to your solar data. Ask your AI to log this month's readings, summarize the year, or import historical data — without leaving your chat window.",[11,297,129],{"id":128},[24,299,301],{"id":300},"mcp-server","MCP server",[29,303,304,311,321],{},[32,305,306,307,310],{},"Single HTTP endpoint at ",[36,308,309],{},"/mcp",", JSON-RPC 2.0, throttled to 60 requests per minute per token",[32,312,313,314,317,318],{},"Authenticates with personal access tokens carrying the abilities ",[36,315,316],{},"mcp:read"," and/or ",[36,319,320],{},"mcp:write",[32,322,323],{},"Three layers of protection on every tool call: route middleware, token ability check, and existing ownership policies — your data stays scoped to you",[24,325,327],{"id":326},"read-tools","Read tools",[29,329,330,336,342,348],{},[32,331,332,335],{},[52,333,334],{},"list_solar_systems"," — every system you own",[32,337,338,341],{},[52,339,340],{},"get_solar_system"," — full detail of a single system, including readings",[32,343,344,347],{},[52,345,346],{},"get_dashboard_summary"," — yearly totals, daily averages and performance ratio",[32,349,350,353],{},[52,351,352],{},"list_readings"," — monthly readings filtered by year and limit",[24,355,357],{"id":356},"write-tools","Write tools",[29,359,360,366,372,378],{},[32,361,362,365],{},[52,363,364],{},"create_reading"," — log a new monthly reading (period normalized to the first day of the month, duplicates rejected)",[32,367,368,371],{},[52,369,370],{},"update_reading"," — partially update any field on a reading",[32,373,374,377],{},[52,375,376],{},"delete_reading"," — permanently remove a reading",[32,379,380,383,384,387,388,391],{},[52,381,382],{},"import_readings"," — bulk-import a CSV string (Portuguese or English headers), with ",[36,385,386],{},"mode"," (upsert/skip/replace) and ",[36,389,390],{},"dry_run"," for previewing",[24,393,395],{"id":394},"personal-access-tokens","Personal access tokens",[29,397,398,408,411,414,417],{},[32,399,34,400,403,404,407],{},[52,401,402],{},"MCP Tokens"," section under your profile (",[36,405,406],{},"/profile/mcp-tokens",")",[32,409,410],{},"Create tokens with granular abilities and optional expiration",[32,412,413],{},"Plain-text token shown only once on creation, with a one-click copy",[32,415,416],{},"Revoke any token at any time — clients lose access on the next call",[32,418,419],{},"Built-in connection tutorial with copy-paste snippets for Claude Code, Claude Desktop, and Cursor / VS Code",[24,421,423],{"id":422},"documentation","Documentation",[29,425,426],{},[32,427,34,428,431],{},[36,429,430],{},"docs/mcp-server.md"," reference covering architecture, every tool's input/output, and client setup",{"title":97,"searchDepth":98,"depth":98,"links":433},[434,435],{"id":13,"depth":98,"text":14},{"id":128,"depth":98,"text":129,"children":436},[437,438,439,440,441],{"id":300,"depth":104,"text":301},{"id":326,"depth":104,"text":327},{"id":356,"depth":104,"text":357},{"id":394,"depth":104,"text":395},{"id":422,"depth":104,"text":423},{},"/releases/1.1.0",{"title":284,"description":97},"releases/1.1.0","1.1.0","9MB8YpIulTfaE2l0xZ07ary6chqIUEb0hPJPXCAXUGs",{"id":449,"title":450,"body":451,"date":275,"description":97,"extension":108,"meta":564,"navigation":110,"path":565,"seo":566,"stem":567,"version":568,"__hash__":569},"releases/releases/1.2.0.md","120",{"type":8,"value":452,"toc":555},[453,455,462,464,468,479,483,503,507,521,525],[11,454,14],{"id":13},[16,456,457,458,461],{},"You can now connect ",[52,459,460],{},"ChatGPT"," to your solar data — the MCP server now speaks OAuth 2.0 in addition to the existing personal access tokens. Same tools, same data; just a new way for clients that don't accept a static token to log in.",[11,463,129],{"id":128},[24,465,467],{"id":466},"oauth-for-ai-clients","OAuth for AI clients",[29,469,470,473,476],{},[32,471,472],{},"ChatGPT custom apps work out of the box: paste the server URL, pick OAuth, and approve the connection on the consent screen.",[32,474,475],{},"Discovery + dynamic client registration follow the public MCP / OAuth specs (RFC 8414, RFC 7591), so future MCP-aware clients should also \"just work\".",[32,477,478],{},"A branded consent screen shows you exactly which application is asking for access before any data is shared.",[24,480,482],{"id":481},"two-ways-to-authenticate-one-set-of-tools","Two ways to authenticate, one set of tools",[29,484,485,494,500],{},[32,486,487,489,490,493],{},[52,488,395],{}," (existing, unchanged) for clients that prefer pasting a token: Claude Code, Claude Desktop via ",[36,491,492],{},"mcp-remote",", Cursor, VS Code.",[32,495,496,499],{},[52,497,498],{},"OAuth"," for clients that need it: ChatGPT today, more tomorrow.",[32,501,502],{},"Both flows reach the exact same tools — list/get systems, dashboard summaries, list/create/update/delete/import readings.",[24,504,506],{"id":505},"tutorial-updates","Tutorial updates",[29,508,509,518],{},[32,510,511,512,514,515,517],{},"The MCP Tokens page (",[36,513,406],{},") now has a ",[52,516,460],{}," tab that walks you through the OAuth setup.",[32,519,520],{},"Existing Claude Code / Claude Desktop / Cursor tabs are unchanged.",[11,522,524],{"id":523},"whats-new-under-the-hood","What's new under the hood",[29,526,527,537,549],{},[32,528,529,530,532,533,536],{},"Laravel Passport added alongside Sanctum, with both auth flows reaching ",[36,531,309],{}," through ",[36,534,535],{},"auth:sanctum,api",".",[32,538,539,540,543,544,43,546,548],{},"OAuth scope ",[36,541,542],{},"mcp:use"," is treated as full read+write access; granular ",[36,545,316],{},[36,547,320],{}," abilities still apply for Sanctum tokens.",[32,550,551,552,554],{},"Updated ",[36,553,430],{}," with the dual auth model, discovery endpoints, and ChatGPT setup steps.",{"title":97,"searchDepth":98,"depth":98,"links":556},[557,558,563],{"id":13,"depth":98,"text":14},{"id":128,"depth":98,"text":129,"children":559},[560,561,562],{"id":466,"depth":104,"text":467},{"id":481,"depth":104,"text":482},{"id":505,"depth":104,"text":506},{"id":523,"depth":98,"text":524},{},"/releases/1.2.0",{"title":450,"description":97},"releases/1.2.0","1.2.0","gKEl6yYBYGfvd1xWrSUpQ_IDwW3ZT4q0BVTMntmZnYI",1781087508078]