[{"data":1,"prerenderedAt":1270},["ShallowReactive",2],{"fougere:post.list:{}":3,"docs:\u002Fdocs\u002Fadopt\u002Fexisting-app":6,"docs-uses":971,"docs-nav":1132},{"items":4,"hasMore":5},[],false,{"id":7,"title":8,"body":9,"description":957,"extension":958,"forms":959,"kind":961,"meta":962,"navigation":204,"path":963,"seo":964,"stem":965,"step":966,"uses":967,"__hash__":970},"docs\u002Fdocs\u002F7.adopt\u002F2.existing-app.md","Add Fougere to an existing app",{"type":10,"value":11,"toc":948},"minimark",[12,43,48,59,140,155,276,286,294,309,321,325,328,419,422,426,429,440,450,612,626,781,796,833,840,843,876,880,909,913,919,923,926,929,933,944],[13,14,15,16,20,21,24,25,28,29,32,33,36,37,42],"p",{},"You keep your app as it is: routing, pages, components, styling and server routes stay in\nplace. Fougere only adds its own paths: ",[17,18,19],"code",{},"\u002F_fougere\u002Fcall",", the one endpoint your pages call —\nwho is signed in included, ",[17,22,23],{},"session.get","; ",[17,26,27],{},"\u002Fauth\u002F**",", which answers once you turn auth on; and\n",[17,30,31],{},"\u002Fapi\u002F{frond}\u002F…"," and ",[17,34,35],{},"\u002Fgraphql"," if you turn ",[38,39,41],"a",{"href":40},"\u002Fdocs\u002Fserve\u002Frest-graphql","REST or GraphQL"," on.",[44,45,47],"h2",{"id":46},"the-three-pieces","The three pieces",[13,49,50,54,55,58],{},[51,52,53],"strong",{},"1. The module"," — in your existing ",[17,56,57],{},"nuxt.config.ts",":",[60,61,66],"pre",{"className":62,"code":63,"language":64,"meta":65,"style":65},"language-ts shiki shiki-themes material-theme-lighter fougere-pastel material-theme-palenight","export default defineNuxtConfig({\n  modules: [\u002F* your modules *\u002F, '@fougere\u002Fnuxt'],\n});\n","ts","",[17,67,68,92,128],{"__ignoreMap":65},[69,70,73,77,80,84,88],"span",{"class":71,"line":72},"line",1,[69,74,76],{"class":75},"sK6XW","export",[69,78,79],{"class":75}," default",[69,81,83],{"class":82},"s4mR9"," defineNuxtConfig",[69,85,87],{"class":86},"srlTG","(",[69,89,91],{"class":90},"s15xx","{\n",[69,93,95,99,101,104,108,111,115,119,122,125],{"class":71,"line":94},2,[69,96,98],{"class":97},"sHtqg","  modules",[69,100,58],{"class":90},[69,102,103],{"class":86}," [",[69,105,107],{"class":106},"skXKP","\u002F* your modules *\u002F",[69,109,110],{"class":90},",",[69,112,114],{"class":113},"sDDC1"," '",[69,116,118],{"class":117},"sN-8n","@fougere\u002Fnuxt",[69,120,121],{"class":113},"'",[69,123,124],{"class":86},"]",[69,126,127],{"class":90},",\n",[69,129,131,134,137],{"class":71,"line":130},3,[69,132,133],{"class":90},"}",[69,135,136],{"class":86},")",[69,138,139],{"class":90},";\n",[13,141,142,145,146,149,150,154],{},[51,143,144],{},"2. The config"," — ",[17,147,148],{},"fougere.config.ts"," at the root (",[38,151,153],{"href":152},"\u002Freference\u002Fconfig","every key","):",[60,156,158],{"className":62,"code":157,"language":64,"meta":65,"style":65},"import '@fougere\u002Fadapter-sql';\nimport { defineFougere } from '@fougere\u002Fcore';\n\nexport default defineFougere({\n  sources: { main: { type: 'sqlite', path: '.data\u002Fapp.db' } },\n});\n",[17,159,160,174,200,206,219,267],{"__ignoreMap":65},[69,161,162,165,167,170,172],{"class":71,"line":72},[69,163,164],{"class":75},"import",[69,166,114],{"class":113},[69,168,169],{"class":117},"@fougere\u002Fadapter-sql",[69,171,121],{"class":113},[69,173,139],{"class":90},[69,175,176,178,181,185,188,191,193,196,198],{"class":71,"line":94},[69,177,164],{"class":75},[69,179,180],{"class":90}," {",[69,182,184],{"class":183},"sPEhv"," defineFougere",[69,186,187],{"class":90}," }",[69,189,190],{"class":75}," from",[69,192,114],{"class":113},[69,194,195],{"class":117},"@fougere\u002Fcore",[69,197,121],{"class":113},[69,199,139],{"class":90},[69,201,202],{"class":71,"line":130},[69,203,205],{"emptyLinePlaceholder":204},true,"\n",[69,207,209,211,213,215,217],{"class":71,"line":208},4,[69,210,76],{"class":75},[69,212,79],{"class":75},[69,214,184],{"class":82},[69,216,87],{"class":86},[69,218,91],{"class":90},[69,220,222,225,227,229,232,234,236,239,241,243,246,248,250,253,255,257,260,262,264],{"class":71,"line":221},5,[69,223,224],{"class":97},"  sources",[69,226,58],{"class":90},[69,228,180],{"class":90},[69,230,231],{"class":97}," main",[69,233,58],{"class":90},[69,235,180],{"class":90},[69,237,238],{"class":97}," type",[69,240,58],{"class":90},[69,242,114],{"class":113},[69,244,245],{"class":117},"sqlite",[69,247,121],{"class":113},[69,249,110],{"class":90},[69,251,252],{"class":97}," path",[69,254,58],{"class":90},[69,256,114],{"class":113},[69,258,259],{"class":117},".data\u002Fapp.db",[69,261,121],{"class":113},[69,263,187],{"class":90},[69,265,266],{"class":90}," },\n",[69,268,270,272,274],{"class":71,"line":269},6,[69,271,133],{"class":90},[69,273,136],{"class":86},[69,275,139],{"class":90},[13,277,278,281,282,285],{},[51,279,280],{},"3. A first frond"," — one entity and one handler, under ",[17,283,284],{},"fronds\u002F"," in the app you already have:",[60,287,292],{"className":288,"code":290,"language":291},[289],"language-text","fronds\u002Ftodo\u002Fentities\u002FTodo.ts\nfronds\u002Ftodo\u002Fhandlers\u002FTodoHandler.ts\n","text",[17,293,290],{"__ignoreMap":65},[13,295,296,297,300,301,304,305,308],{},"Fougere knows what each file is from the folder it sits in. A page imports the entity with\n",[17,298,299],{},"import Todo from '@fronds\u002Ftodo\u002Fentities\u002FTodo.js'",": the alias exists on its own, so you add\nno ",[17,302,303],{},"package.json"," and no workspace entry. A second domain later goes in ",[17,306,307],{},"fronds\u002Fbilling\u002F",",\nnext to this one.",[13,310,311,312,315,316,320],{},"Run ",[17,313,314],{},"npm run dev"," and check the ",[38,317,319],{"href":318},"\u002Fdocs\u002Fadopt\u002Fnew-project#create-it","boot log",".",[44,322,324],{"id":323},"migrate-feature-by-feature","Migrate feature by feature",[13,326,327],{},"Move one feature at a time, while your old routes keep serving the rest. Here is what\neach thing you maintain today becomes:",[329,330,331,344],"table",{},[332,333,334],"thead",{},[335,336,337,341],"tr",{},[338,339,340],"th",{},"You maintain today",[338,342,343],{},"It becomes",[345,346,347,360,372,388,402],"tbody",{},[335,348,349,353],{},[350,351,352],"td",{},"a Zod\u002FYup schema",[350,354,355,356],{},"the entity's fields — ",[38,357,359],{"href":358},"\u002Fdocs\u002Fconcepts\u002Fentity","shape axis",[335,361,362,365],{},[350,363,364],{},"a table definition or additive migration",[350,366,367,368,371],{},"derived — ",[17,369,370],{},"fougere migrate"," writes it from the same fields; destructive changes stay explicit",[335,373,374,380],{},[350,375,376,379],{},[17,377,378],{},"server\u002Fapi\u002Ftodos.post.ts"," + validation call",[350,381,382,383,387],{},"a ",[38,384,386],{"href":385},"\u002Fdocs\u002Fconcepts\u002Fhandler","handler"," operation, validated before your code runs",[335,389,390,393],{},[350,391,392],{},"form state + client-side rules",[350,394,395,401],{},[38,396,398],{"href":397},"\u002Fdocs\u002Fserve\u002Fforms",[17,399,400],{},"useFormFor(Todo)"," — same validation as the server",[335,403,404,410],{},[350,405,406,409],{},[17,407,408],{},"useFetch('\u002Fapi\u002Ftodos')"," + refresh bookkeeping",[350,411,412,418],{},[38,413,415],{"href":414},"\u002Fdocs\u002Fserve\u002Fpages",[17,416,417],{},"useQuery(todo, 'list')"," — typed by the handler, revalidated by commands",[13,420,421],{},"Delete the old files as each feature moves over: the goal is fewer files to keep in sync,\nnot a second copy.",[44,423,425],{"id":424},"untangle-a-monolith","Untangle a monolith",[13,427,428],{},"A monolith is hard to split because you decide everything at once: the boundary, the new\nservice and the network. Here you draw the boundary first, and the network can wait.",[13,430,431,432,435,436,439],{},"Say ",[17,433,434],{},"OrderService"," calls ",[17,437,438],{},"PricingService"," directly, and pricing should be able to leave.",[13,441,442,445,446,449],{},[51,443,444],{},"1. Give pricing its own frond."," Move the service and its entities to ",[17,447,448],{},"fronds\u002Fpricing\u002F",",\nthen write a handler for what other fronds may call. It is a handler like any other: it says\nwhat goes out, and it checks what it has to check.",[60,451,453],{"className":62,"code":452,"language":64,"meta":65,"style":65},"\u002F\u002F fronds\u002Fpricing\u002Fhandlers\u002FPricingHandler.ts\nimport PricingService from '..\u002Fservices\u002FPricingService.js';\n\nexport default class PricingHandler {\n  constructor(private pricing: PricingService) {}\n\n  \u002F** What this cart comes to. *\u002F\n  async total(cartId: string): Promise\u003Cnumber> {\n    return this.pricing.total(cartId);\n  }\n}\n",[17,454,455,460,479,483,500,524,528,534,570,600,606],{"__ignoreMap":65},[69,456,457],{"class":71,"line":72},[69,458,459],{"class":106},"\u002F\u002F fronds\u002Fpricing\u002Fhandlers\u002FPricingHandler.ts\n",[69,461,462,464,467,470,472,475,477],{"class":71,"line":94},[69,463,164],{"class":75},[69,465,466],{"class":183}," PricingService ",[69,468,469],{"class":75},"from",[69,471,114],{"class":113},[69,473,474],{"class":117},"..\u002Fservices\u002FPricingService.js",[69,476,121],{"class":113},[69,478,139],{"class":90},[69,480,481],{"class":71,"line":130},[69,482,205],{"emptyLinePlaceholder":204},[69,484,485,487,489,493,497],{"class":71,"line":208},[69,486,76],{"class":75},[69,488,79],{"class":75},[69,490,492],{"class":491},"s76I7"," class",[69,494,496],{"class":495},"sBZYL"," PricingHandler",[69,498,499],{"class":90}," {\n",[69,501,502,505,507,510,514,516,519,521],{"class":71,"line":221},[69,503,504],{"class":491},"  constructor",[69,506,87],{"class":90},[69,508,509],{"class":491},"private",[69,511,513],{"class":512},"shDUQ"," pricing",[69,515,58],{"class":90},[69,517,518],{"class":495}," PricingService",[69,520,136],{"class":90},[69,522,523],{"class":90}," {}\n",[69,525,526],{"class":71,"line":269},[69,527,205],{"emptyLinePlaceholder":204},[69,529,531],{"class":71,"line":530},7,[69,532,533],{"class":106},"  \u002F** What this cart comes to. *\u002F\n",[69,535,537,540,544,546,549,551,554,556,559,562,565,568],{"class":71,"line":536},8,[69,538,539],{"class":491},"  async",[69,541,543],{"class":542},"shDkW"," total",[69,545,87],{"class":90},[69,547,548],{"class":512},"cartId",[69,550,58],{"class":90},[69,552,553],{"class":495}," string",[69,555,154],{"class":90},[69,557,558],{"class":495}," Promise",[69,560,561],{"class":90},"\u003C",[69,563,564],{"class":495},"number",[69,566,567],{"class":90},">",[69,569,499],{"class":90},[69,571,573,576,580,582,586,588,591,594,596,598],{"class":71,"line":572},9,[69,574,575],{"class":75},"    return",[69,577,579],{"class":578},"sxG60"," this",[69,581,320],{"class":90},[69,583,585],{"class":584},"sy9f4","pricing",[69,587,320],{"class":90},[69,589,590],{"class":82},"total",[69,592,87],{"class":593},"spAFX",[69,595,548],{"class":183},[69,597,136],{"class":593},[69,599,139],{"class":90},[69,601,603],{"class":71,"line":602},10,[69,604,605],{"class":90},"  }\n",[69,607,609],{"class":71,"line":608},11,[69,610,611],{"class":90},"}\n",[13,613,614,621,622,625],{},[51,615,616,617,320],{},"2. Call it through its ",[38,618,620],{"href":619},"\u002Fdocs\u002Fconcepts\u002Ffacade","facade"," The caller asks for the type and\nadds an ",[17,623,624],{},"await",". Everything still runs in one process, with no network.",[60,627,629],{"className":62,"code":628,"language":64,"meta":65,"style":65},"\u002F\u002F fronds\u002Forder\u002Fservices\u002FOrderService.ts\nimport type { Facade } from '@fougere\u002Fcore';\nimport type PricingHandler from '@fronds\u002Fpricing\u002Fhandlers\u002FPricingHandler.js';\n\nexport default class OrderService {\n  constructor(private pricing: Facade\u003CPricingHandler>) {}\n\n  async checkout(cartId: string): Promise\u003Cnumber> {\n    return this.pricing.total(cartId);\n  }\n}\n",[17,630,631,636,659,679,683,696,720,724,751,773,777],{"__ignoreMap":65},[69,632,633],{"class":71,"line":72},[69,634,635],{"class":106},"\u002F\u002F fronds\u002Forder\u002Fservices\u002FOrderService.ts\n",[69,637,638,640,642,644,647,649,651,653,655,657],{"class":71,"line":94},[69,639,164],{"class":75},[69,641,238],{"class":75},[69,643,180],{"class":90},[69,645,646],{"class":183}," Facade",[69,648,187],{"class":90},[69,650,190],{"class":75},[69,652,114],{"class":113},[69,654,195],{"class":117},[69,656,121],{"class":113},[69,658,139],{"class":90},[69,660,661,663,665,668,670,672,675,677],{"class":71,"line":130},[69,662,164],{"class":75},[69,664,238],{"class":75},[69,666,667],{"class":183}," PricingHandler ",[69,669,469],{"class":75},[69,671,114],{"class":113},[69,673,674],{"class":117},"@fronds\u002Fpricing\u002Fhandlers\u002FPricingHandler.js",[69,676,121],{"class":113},[69,678,139],{"class":90},[69,680,681],{"class":71,"line":208},[69,682,205],{"emptyLinePlaceholder":204},[69,684,685,687,689,691,694],{"class":71,"line":221},[69,686,76],{"class":75},[69,688,79],{"class":75},[69,690,492],{"class":491},[69,692,693],{"class":495}," OrderService",[69,695,499],{"class":90},[69,697,698,700,702,704,706,708,710,712,715,718],{"class":71,"line":269},[69,699,504],{"class":491},[69,701,87],{"class":90},[69,703,509],{"class":491},[69,705,513],{"class":512},[69,707,58],{"class":90},[69,709,646],{"class":495},[69,711,561],{"class":90},[69,713,714],{"class":495},"PricingHandler",[69,716,717],{"class":90},">)",[69,719,523],{"class":90},[69,721,722],{"class":71,"line":530},[69,723,205],{"emptyLinePlaceholder":204},[69,725,726,728,731,733,735,737,739,741,743,745,747,749],{"class":71,"line":536},[69,727,539],{"class":491},[69,729,730],{"class":542}," checkout",[69,732,87],{"class":90},[69,734,548],{"class":512},[69,736,58],{"class":90},[69,738,553],{"class":495},[69,740,154],{"class":90},[69,742,558],{"class":495},[69,744,561],{"class":90},[69,746,564],{"class":495},[69,748,567],{"class":90},[69,750,499],{"class":90},[69,752,753,755,757,759,761,763,765,767,769,771],{"class":71,"line":572},[69,754,575],{"class":75},[69,756,579],{"class":578},[69,758,320],{"class":90},[69,760,585],{"class":584},[69,762,320],{"class":90},[69,764,590],{"class":82},[69,766,87],{"class":593},[69,768,548],{"class":183},[69,770,136],{"class":593},[69,772,139],{"class":90},[69,774,775],{"class":71,"line":602},[69,776,605],{"class":90},[69,778,779],{"class":71,"line":608},[69,780,611],{"class":90},[13,782,783,786,787,790,791,795],{},[51,784,785],{},"3. Move it when it is worth it."," One line in ",[17,788,789],{},"fronds:"," is the whole ",[38,792,794],{"href":793},"\u002Fdocs\u002Frun\u002Fdeploy","move",",\nand the code above does not change:",[60,797,799],{"className":62,"code":798,"language":64,"meta":65,"style":65},"fronds: { pricing: { remote: 'http:\u002F\u002Fpricing:4610' } },\n",[17,800,801],{"__ignoreMap":65},[69,802,803,807,809,811,813,815,817,820,822,824,827,829,831],{"class":71,"line":72},[69,804,806],{"class":805},"sWI7z","fronds",[69,808,58],{"class":90},[69,810,180],{"class":90},[69,812,513],{"class":805},[69,814,58],{"class":90},[69,816,180],{"class":90},[69,818,819],{"class":805}," remote",[69,821,58],{"class":90},[69,823,114],{"class":113},[69,825,826],{"class":117},"http:\u002F\u002Fpricing:4610",[69,828,121],{"class":113},[69,830,187],{"class":90},[69,832,266],{"class":90},[13,834,835,836,839],{},"From then on, each call costs a network call. If you never take this step, you still have a\nmonolith with cleaner boundaries, and it cost you almost nothing. ",[17,837,838],{},"demos\u002Fcrossing-cost"," runs\nthe same code with 0 hops or 2.",[13,841,842],{},"Three things show you where a boundary does not hold:",[844,845,846,853,863],"ul",{},[847,848,849,852],"li",{},[51,850,851],{},"What crosses must be plain data."," A class instance with methods does not survive the\ntrip, so pass an id or plain fields.",[847,854,855,858,859,320],{},[51,856,857],{},"A join between two fronds' tables"," stops working once the rows leave. Read through the\nfacade, or keep a ",[38,860,862],{"href":861},"\u002Fdocs\u002Fdata\u002Fmirror","copy",[847,864,865,868,869,875],{},[51,866,867],{},"Two writes that must stand or fall as one"," stay in one process. ",[38,870,872],{"href":871},"\u002Fdocs\u002Fdata\u002Ftogether",[17,873,874],{},"Together","\nholds them across two fronds, and refuses a frond placed elsewhere, so those two move\ntogether or not at all.",[44,877,879],{"id":878},"what-stays-yours","What stays yours",[844,881,882,888,894],{},[847,883,884,887],{},[51,885,886],{},"Pages and components"," — Fougere adds composables, not components: no layout, no widgets.",[847,889,890,893],{},[51,891,892],{},"Other server routes"," — anything outside the paths above is left alone.",[847,895,896,899,900,903,904,908],{},[51,897,898],{},"Auth"," — optional. Keep your own system if you have one; ",[17,901,902],{},"useCurrentUser"," and the\nsession-to-handler flow need ",[38,905,907],{"href":906},"\u002Fdocs\u002Faccess\u002Fauthentication","Fougere auth"," to be enabled.",[44,910,912],{"id":911},"what-fougere-owns","What Fougere owns",[13,914,915,916,918],{},"Fougere owns an entity's rows: their table is written by ",[17,917,370],{}," (SQLite, Postgres, MySQL,\nSQL Server, D1), or they are files or memory. Move a feature over when you can hand its table to\nFougere, and keep your existing database code for the rest.",[44,920,922],{"id":921},"ask-your-agent","Ask your agent",[13,924,925],{},"Before moving anything, paste this prompt into the agent that already knows your codebase.\nIt finds what your code declares twice and what that has cost you, then prices moving one\nmodule to Fougere, and what would get worse.",[927,928],"audit-prompt",{},[44,930,932],{"id":931},"another-host","Another host?",[13,934,935,936,943],{},"This page is about Nuxt because its module does the mounting for you. The same frond runs\nunder Next, TanStack Start, React Router, SvelteKit and Express — see ",[937,938,939],"em",{},[38,940,942],{"href":941},"\u002Fdocs\u002Fadopt\u002Fhosts","Hosts","\nfor what each one costs.",[945,946,947],"style",{},"html pre.shiki code .sK6XW, html code.shiki .sK6XW{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#8FCF86;--shiki-default-font-style:inherit;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s4mR9, html code.shiki .s4mR9{--shiki-light:#6182B8;--shiki-default:#C9B6EA;--shiki-dark:#82AAFF}html pre.shiki code .srlTG, html code.shiki .srlTG{--shiki-light:#90A4AE;--shiki-default:#A3B0A5;--shiki-dark:#BABED8}html pre.shiki code .s15xx, html code.shiki .s15xx{--shiki-light:#39ADB5;--shiki-default:#A3B0A5;--shiki-dark:#89DDFF}html pre.shiki code .sHtqg, html code.shiki .sHtqg{--shiki-light:#E53935;--shiki-default:#93CFC0;--shiki-dark:#F07178}html pre.shiki code .skXKP, html code.shiki .skXKP{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#7D8C80;--shiki-default-font-style:inherit;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sDDC1, html code.shiki .sDDC1{--shiki-light:#39ADB5;--shiki-default:#EE9F6B;--shiki-dark:#89DDFF}html pre.shiki code .sN-8n, html code.shiki .sN-8n{--shiki-light:#91B859;--shiki-default:#EE9F6B;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sPEhv, html code.shiki .sPEhv{--shiki-light:#90A4AE;--shiki-default:#DDE5DA;--shiki-dark:#BABED8}html pre.shiki code .s76I7, html code.shiki .s76I7{--shiki-light:#9C3EDA;--shiki-default:#8FCF86;--shiki-dark:#C792EA}html pre.shiki code .sBZYL, html code.shiki .sBZYL{--shiki-light:#E2931D;--shiki-default:#EFCD8F;--shiki-dark:#FFCB6B}html pre.shiki code .shDUQ, html code.shiki .shDUQ{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#DDE5DA;--shiki-default-font-style:inherit;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .shDkW, html code.shiki .shDkW{--shiki-light:#E53935;--shiki-default:#C9B6EA;--shiki-dark:#F07178}html pre.shiki code .sxG60, html code.shiki .sxG60{--shiki-light:#39ADB5;--shiki-light-font-style:inherit;--shiki-default:#8FCF86;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:inherit}html pre.shiki code .sy9f4, html code.shiki .sy9f4{--shiki-light:#90A4AE;--shiki-default:#93CFC0;--shiki-dark:#BABED8}html pre.shiki code .spAFX, html code.shiki .spAFX{--shiki-light:#E53935;--shiki-default:#A3B0A5;--shiki-dark:#F07178}html pre.shiki code .sWI7z, html code.shiki .sWI7z{--shiki-light:#E2931D;--shiki-default:#93CFC0;--shiki-dark:#FFCB6B}",{"title":65,"searchDepth":94,"depth":94,"links":949},[950,951,952,953,954,955,956],{"id":46,"depth":94,"text":47},{"id":323,"depth":94,"text":324},{"id":424,"depth":94,"text":425},{"id":878,"depth":94,"text":879},{"id":911,"depth":94,"text":912},{"id":921,"depth":94,"text":922},{"id":931,"depth":94,"text":932},"One frond inside the app you already have.","md",[118,960],"answer(app, request)","task",{},"\u002Fdocs\u002Fadopt\u002Fexisting-app",{"title":8,"description":957},"docs\u002F7.adopt\u002F2.existing-app",null,[968,969],"frond","configuration","KWNsga943FgeVWAglAAdD-WK_-xxVkG6YgO7OlYI8k4",[972,974,976,979,982,984,987,990,993,997,1001,1006,1010,1014,1018,1022,1026,1030,1033,1037,1042,1045,1048,1051,1055,1058,1062,1066,1070,1074,1078,1082,1084,1088,1091,1095,1099,1102,1105,1108,1111,1114,1117,1120,1123,1126,1129],{"path":358,"title":973,"uses":966},"Entity",{"path":385,"title":975,"uses":966},"Handler",{"path":977,"title":978,"uses":966},"\u002Fdocs\u002Fconcepts\u002Frepository","Repository",{"path":980,"title":981,"uses":966},"\u002Fdocs\u002Fconcepts\u002Ffrond","Frond",{"path":619,"title":983,"uses":966},"Facade",{"path":985,"title":986,"uses":966},"\u002Fdocs\u002Fconcepts\u002Ffact","Fact",{"path":988,"title":989,"uses":966},"\u002Fdocs\u002Fconcepts\u002Fport","Port",{"path":991,"title":992,"uses":966},"\u002Fdocs\u002Fconcepts\u002Fconfiguration","Configuration",{"path":906,"title":994,"uses":995},"Authentication",[996,968],"port",{"path":998,"title":999,"uses":1000},"\u002Fdocs\u002Faccess\u002Fstate","Keep a caller's state",[969,386],{"path":1002,"title":1003,"uses":1004},"\u002Fdocs\u002Fdata\u002Fsql","SQLite or Postgres",[1005,969],"entity",{"path":1007,"title":1008,"uses":1009},"\u002Fdocs\u002Fdata\u002Fseveral-databases","Several databases",[969,1005],{"path":1011,"title":1012,"uses":1013},"\u002Fdocs\u002Fdata\u002Fcomputed-field","A computed field",[1005,996],{"path":1015,"title":1016,"uses":1017},"\u002Fdocs\u002Fdata\u002Fevolve","Evolve a schema",[1005],{"path":1019,"title":1020,"uses":1021},"\u002Fdocs\u002Fdata\u002Fseeds","Seed data",[1005],{"path":1023,"title":1024,"uses":1025},"\u002Fdocs\u002Fdata\u002Fvalues","Read settings and secrets",[1005,969],{"path":861,"title":1027,"uses":1028},"Mirror a source you cannot query",[1029],"repository",{"path":871,"title":1031,"uses":1032},"Two writes as one",[1029],{"path":1034,"title":1035,"uses":1036},"\u002Fdocs\u002Fbehaviour\u002Faround-every-call","Around every call",[996,968],{"path":1038,"title":1039,"uses":1040},"\u002Fdocs\u002Fbehaviour\u002Ffinish-a-fact","Finish a fact",[1041],"fact",{"path":40,"title":1043,"uses":1044},"REST, OpenAPI, GraphQL",[386,969],{"path":414,"title":1046,"uses":1047},"Pages: queries and commands",[386,620],{"path":397,"title":1049,"uses":1050},"A form",[1005],{"path":1052,"title":1053,"uses":1054},"\u002Fdocs\u002Fserve\u002Fadmin","An admin panel",[386],{"path":793,"title":1056,"uses":1057},"Deploy a split",[969,968],{"path":1059,"title":1060,"uses":1061},"\u002Fdocs\u002Frun\u002Fsecure","Secure calls between processes",[969,968],{"path":1063,"title":1064,"uses":1065},"\u002Fdocs\u002Frun\u002Flifecycle","Reload and shut down",[969],{"path":1067,"title":1068,"uses":1069},"\u002Fdocs\u002Frun\u002Fobserve","Observe",[969,386],{"path":1071,"title":1072,"uses":1073},"\u002Fdocs\u002Frun\u002Fdev-panel","The dev panel",[386],{"path":1075,"title":1076,"uses":1077},"\u002Fdocs\u002Frun\u002Ftest","Test",[1005,996],{"path":1079,"title":1080,"uses":1081},"\u002Fdocs\u002Fadopt\u002Fnew-project","Start a project",[968,969],{"path":963,"title":8,"uses":1083},[968,969],{"path":1085,"title":1086,"uses":1087},"\u002Fdocs\u002Fadopt\u002Fbring-your-schema","Bring your schema",[1005],{"path":941,"title":1089,"uses":1090},"Pick a host",[969],{"path":1092,"title":1093,"uses":1094},"\u002Fdocs\u002Fadopt\u002Fanother-repository","A frond from another repository",[620,968],{"path":1096,"title":1097,"uses":1098},"\u002Fdocs\u002Fadopt\u002Fdemos","Demos",[],{"path":1100,"title":1101,"uses":966},"\u002Fdocs\u002Fextending\u002Fscan","How the scan reads a project",{"path":1103,"title":1104,"uses":966},"\u002Fdocs\u002Fextending\u002Fwithout-compiler","Boot without the compiler",{"path":1106,"title":1107,"uses":966},"\u002Fdocs\u002Fextending\u002Fboot","The boot, step by step",{"path":1109,"title":1110,"uses":966},"\u002Fdocs\u002Fextending\u002Fcard-and-wire","The card and the wire",{"path":1112,"title":1113,"uses":966},"\u002Fdocs\u002Fextending\u002Fextension-points","Registries and extension points",{"path":1115,"title":1116,"uses":966},"\u002Fdocs\u002Fextending\u002Fvocabulary","Teach a word",{"path":1118,"title":1119,"uses":966},"\u002Fdocs\u002Fextending\u002Fextensions","Run code at boot and shutdown",{"path":1121,"title":1122,"uses":966},"\u002Fdocs\u002Fextending\u002Fsource-adapter","Write a source adapter",{"path":1124,"title":1125,"uses":966},"\u002Fdocs\u002Fextending\u002Fsurface","Write a surface",{"path":1127,"title":1128,"uses":966},"\u002Fdocs\u002Fextending\u002Fforeign-frond","A frond in another language",{"path":1130,"title":1131,"uses":966},"\u002Fdocs","What is Fougere",[1133],{"title":1134,"path":1130,"stem":1135,"children":1136,"page":-1},"Docs","docs",[1137,1139,1160,1169,1190,1199,1212,1229,1245],{"title":1131,"path":1130,"stem":1138},"docs\u002Findex",{"title":1140,"path":1141,"stem":1142,"children":1143,"page":5},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F1.concepts",[1144,1146,1148,1150,1152,1154,1156,1158],{"title":973,"path":358,"stem":1145},"docs\u002F1.concepts\u002F1.entity",{"title":975,"path":385,"stem":1147},"docs\u002F1.concepts\u002F2.handler",{"title":978,"path":977,"stem":1149},"docs\u002F1.concepts\u002F3.repository",{"title":981,"path":980,"stem":1151},"docs\u002F1.concepts\u002F4.frond",{"title":983,"path":619,"stem":1153},"docs\u002F1.concepts\u002F5.facade",{"title":986,"path":985,"stem":1155},"docs\u002F1.concepts\u002F6.fact",{"title":989,"path":988,"stem":1157},"docs\u002F1.concepts\u002F7.port",{"title":992,"path":991,"stem":1159},"docs\u002F1.concepts\u002F8.configuration",{"title":1161,"path":1162,"stem":1163,"children":1164,"page":5},"Access","\u002Fdocs\u002Faccess","docs\u002F2.access",[1165,1167],{"title":994,"path":906,"stem":1166},"docs\u002F2.access\u002F1.authentication",{"title":999,"path":998,"stem":1168},"docs\u002F2.access\u002F2.state",{"title":1170,"path":1171,"stem":1172,"children":1173,"page":5},"Data","\u002Fdocs\u002Fdata","docs\u002F3.data",[1174,1176,1178,1180,1182,1184,1186,1188],{"title":1003,"path":1002,"stem":1175},"docs\u002F3.data\u002F1.sql",{"title":1008,"path":1007,"stem":1177},"docs\u002F3.data\u002F2.several-databases",{"title":1012,"path":1011,"stem":1179},"docs\u002F3.data\u002F3.computed-field",{"title":1016,"path":1015,"stem":1181},"docs\u002F3.data\u002F4.evolve",{"title":1020,"path":1019,"stem":1183},"docs\u002F3.data\u002F5.seeds",{"title":1024,"path":1023,"stem":1185},"docs\u002F3.data\u002F6.values",{"title":1027,"path":861,"stem":1187},"docs\u002F3.data\u002F7.mirror",{"title":1031,"path":871,"stem":1189},"docs\u002F3.data\u002F8.together",{"title":1191,"path":1192,"stem":1193,"children":1194,"page":5},"Behaviour","\u002Fdocs\u002Fbehaviour","docs\u002F4.behaviour",[1195,1197],{"title":1035,"path":1034,"stem":1196},"docs\u002F4.behaviour\u002F1.around-every-call",{"title":1039,"path":1038,"stem":1198},"docs\u002F4.behaviour\u002F2.finish-a-fact",{"title":1200,"path":1201,"stem":1202,"children":1203,"page":5},"Serve","\u002Fdocs\u002Fserve","docs\u002F5.serve",[1204,1206,1208,1210],{"title":1043,"path":40,"stem":1205},"docs\u002F5.serve\u002F1.rest-graphql",{"title":1046,"path":414,"stem":1207},"docs\u002F5.serve\u002F2.pages",{"title":1049,"path":397,"stem":1209},"docs\u002F5.serve\u002F3.forms",{"title":1053,"path":1052,"stem":1211},"docs\u002F5.serve\u002F4.admin",{"title":1213,"path":1214,"stem":1215,"children":1216,"page":5},"Run","\u002Fdocs\u002Frun","docs\u002F6.run",[1217,1219,1221,1223,1225,1227],{"title":1056,"path":793,"stem":1218},"docs\u002F6.run\u002F1.deploy",{"title":1060,"path":1059,"stem":1220},"docs\u002F6.run\u002F2.secure",{"title":1064,"path":1063,"stem":1222},"docs\u002F6.run\u002F3.lifecycle",{"title":1068,"path":1067,"stem":1224},"docs\u002F6.run\u002F4.observe",{"title":1072,"path":1071,"stem":1226},"docs\u002F6.run\u002F5.dev-panel",{"title":1076,"path":1075,"stem":1228},"docs\u002F6.run\u002F6.test",{"title":1230,"path":1231,"stem":1232,"children":1233,"page":5},"Adopt","\u002Fdocs\u002Fadopt","docs\u002F7.adopt",[1234,1236,1237,1239,1241,1243],{"title":1080,"path":1079,"stem":1235},"docs\u002F7.adopt\u002F1.new-project",{"title":8,"path":963,"stem":965},{"title":1086,"path":1085,"stem":1238},"docs\u002F7.adopt\u002F3.bring-your-schema",{"title":1089,"path":941,"stem":1240},"docs\u002F7.adopt\u002F4.hosts",{"title":1093,"path":1092,"stem":1242},"docs\u002F7.adopt\u002F5.another-repository",{"title":1097,"path":1096,"stem":1244},"docs\u002F7.adopt\u002F6.demos",{"title":1246,"path":1247,"stem":1248,"children":1249,"page":5},"Extending","\u002Fdocs\u002Fextending","docs\u002F8.extending",[1250,1252,1254,1256,1258,1260,1262,1264,1266,1268],{"title":1101,"path":1100,"stem":1251},"docs\u002F8.extending\u002F1.scan",{"title":1104,"path":1103,"stem":1253},"docs\u002F8.extending\u002F10.without-compiler",{"title":1107,"path":1106,"stem":1255},"docs\u002F8.extending\u002F2.boot",{"title":1110,"path":1109,"stem":1257},"docs\u002F8.extending\u002F3.card-and-wire",{"title":1113,"path":1112,"stem":1259},"docs\u002F8.extending\u002F4.extension-points",{"title":1116,"path":1115,"stem":1261},"docs\u002F8.extending\u002F5.vocabulary",{"title":1119,"path":1118,"stem":1263},"docs\u002F8.extending\u002F6.extensions",{"title":1122,"path":1121,"stem":1265},"docs\u002F8.extending\u002F7.source-adapter",{"title":1125,"path":1124,"stem":1267},"docs\u002F8.extending\u002F8.surface",{"title":1128,"path":1127,"stem":1269},"docs\u002F8.extending\u002F9.foreign-frond",1794396611898]