[{"data":1,"prerenderedAt":1314},["ShallowReactive",2],{"navigation_docs":3,"-reference-workspace-format":172,"-reference-workspace-format-surround":1309},[4,30,100,134],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":29},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,14,18,21,25],{"title":11,"path":12,"stem":13},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction",{"title":15,"path":16,"stem":17},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation",{"title":5,"path":19,"stem":20},"\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start",{"title":22,"path":23,"stem":24},"Build from source","\u002Fgetting-started\u002Fbuild-from-source","1.getting-started\u002F4.build-from-source",{"title":26,"path":27,"stem":28},"Troubleshooting","\u002Fgetting-started\u002Ftroubleshooting","1.getting-started\u002F5.troubleshooting",false,{"title":31,"icon":32,"path":33,"stem":34,"children":35,"page":29},"Guide","i-lucide-book-open","\u002Fguide","2.guide",[36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96],{"title":37,"path":38,"stem":39},"Interface","\u002Fguide\u002Finterface","2.guide\u002F01.interface",{"title":41,"path":42,"stem":43},"Workspace","\u002Fguide\u002Fworkspace","2.guide\u002F02.workspace",{"title":45,"path":46,"stem":47},"Collections","\u002Fguide\u002Fcollections","2.guide\u002F03.collections",{"title":49,"path":50,"stem":51},"HTTP requests","\u002Fguide\u002Fhttp-requests","2.guide\u002F04.http-requests",{"title":53,"path":54,"stem":55},"Variables","\u002Fguide\u002Fvariables","2.guide\u002F05.variables",{"title":57,"path":58,"stem":59},"Authorization","\u002Fguide\u002Fauthorization","2.guide\u002F06.authorization",{"title":61,"path":62,"stem":63},"Scripts and tests","\u002Fguide\u002Fscripts-and-tests","2.guide\u002F07.scripts-and-tests",{"title":65,"path":66,"stem":67},"Collection runner","\u002Fguide\u002Fcollection-runner","2.guide\u002F08.collection-runner",{"title":69,"path":70,"stem":71},"Import and export","\u002Fguide\u002Fimport-export","2.guide\u002F09.import-export",{"title":73,"path":74,"stem":75},"Code snippets","\u002Fguide\u002Fcode-snippets","2.guide\u002F10.code-snippets",{"title":77,"path":78,"stem":79},"gRPC","\u002Fguide\u002Fgrpc","2.guide\u002F11.grpc",{"title":81,"path":82,"stem":83},"WebSocket","\u002Fguide\u002Fwebsocket","2.guide\u002F12.websocket",{"title":85,"path":86,"stem":87},"Cookies, proxy and certificates","\u002Fguide\u002Fcookies-proxy-certificates","2.guide\u002F13.cookies-proxy-certificates",{"title":89,"path":90,"stem":91},"Settings","\u002Fguide\u002Fsettings","2.guide\u002F14.settings",{"title":93,"path":94,"stem":95},"Keyboard shortcuts","\u002Fguide\u002Fkeyboard-shortcuts","2.guide\u002F15.keyboard-shortcuts",{"title":97,"path":98,"stem":99},"Privacy and security","\u002Fguide\u002Fprivacy-and-security","2.guide\u002F16.privacy-and-security",{"title":101,"icon":102,"path":103,"stem":104,"children":105,"page":29},"Reference","i-lucide-square-terminal","\u002Freference","3.reference",[106,110,114,118,122,126,130],{"title":107,"path":108,"stem":109},"Command line","\u002Freference\u002Fcli","3.reference\u002F1.cli",{"title":111,"path":112,"stem":113},"Automation tools","\u002Freference\u002Fautomation-tools","3.reference\u002F2.automation-tools",{"title":115,"path":116,"stem":117},"Scripting API","\u002Freference\u002Fscripting-api","3.reference\u002F3.scripting-api",{"title":119,"path":120,"stem":121},"Dynamic variables","\u002Freference\u002Fdynamic-variables","3.reference\u002F4.dynamic-variables",{"title":123,"path":124,"stem":125},"UI control channel","\u002Freference\u002Fui-control-channel","3.reference\u002F5.ui-control-channel",{"title":127,"path":128,"stem":129},"Workspace format","\u002Freference\u002Fworkspace-format","3.reference\u002F6.workspace-format",{"title":131,"path":132,"stem":133},"Feature status","\u002Freference\u002Ffeature-status","3.reference\u002F7.feature-status",{"title":135,"icon":136,"path":137,"stem":138,"children":139,"page":29},"Contributing","i-lucide-git-pull-request","\u002Fcontributing","4.contributing",[140,144,148,152,156,160,164,168],{"title":141,"path":142,"stem":143},"Contributing overview","\u002Fcontributing\u002Foverview","4.contributing\u002F1.overview",{"title":145,"path":146,"stem":147},"Development","\u002Fcontributing\u002Fdevelopment","4.contributing\u002F2.development",{"title":149,"path":150,"stem":151},"Architecture","\u002Fcontributing\u002Farchitecture","4.contributing\u002F3.architecture",{"title":153,"path":154,"stem":155},"Known gaps","\u002Fcontributing\u002Fgaps","4.contributing\u002F4.gaps",{"title":157,"path":158,"stem":159},"Adding a feature","\u002Fcontributing\u002Fadding-a-feature","4.contributing\u002F5.adding-a-feature",{"title":161,"path":162,"stem":163},"Assets and clean-room","\u002Fcontributing\u002Fassets-and-clean-room","4.contributing\u002F6.assets-and-clean-room",{"title":165,"path":166,"stem":167},"Releasing","\u002Fcontributing\u002Freleasing","4.contributing\u002F7.releasing",{"title":169,"path":170,"stem":171},"Writing the documentation","\u002Fcontributing\u002Fdocumentation","4.contributing\u002F8.documentation",{"id":173,"title":127,"body":174,"description":1302,"extension":1303,"links":1304,"meta":1305,"navigation":1306,"path":128,"seo":1307,"stem":129,"__hash__":1308},"docs\u002F3.reference\u002F6.workspace-format.md",{"type":175,"value":176,"toc":1290},"minimark",[177,195,200,210,270,274,279,396,460,463,467,470,541,627,631,638,657,661,671,718,766,793,808,812,821,905,919,923,940,1042,1074,1081,1085,1098,1127,1131,1137,1141,1187,1190,1273,1286],[178,179,180,181,184,185,194],"p",{},"A workspace is one folder. Everything Postguy stores is in it. There is no database and no account. The files are pretty-printed JSON, so they diff well in Git. For the user view, see ",[182,183,41],"a",{"href":42},". This page is the file reference. The source is ",[182,186,190],{"href":187,"rel":188},"https:\u002F\u002Fgithub.com\u002Fzuramai\u002Fpostguy\u002Fblob\u002Fmain\u002Fcrates\u002Fstore\u002Fsrc\u002Fpaths.rs",[189],"nofollow",[191,192,193],"code",{},"crates\u002Fstore",".",[196,197,199],"h2",{"id":198},"directory-layout","Directory layout",[201,202,208],"pre",{"className":203,"code":205,"language":206,"meta":207},[204],"language-text","\u003Cworkspace>\u002F\n  postguy.json                  schema, collection order, environment order, active environment id\n  collections\u002F\u003Cid>.json         one file per collection (folders and requests nested inside)\n  environments\u002F\u003Cid>.json        one file per environment\n  globals.json                  the globals, an environment-shaped file\n  protos\u002F\u003Cname>\u002F...             .proto files imported for gRPC\n  files\u002F                        the default working directory for file references\n  assets\u002F\u003Ccollection id>\u002F...    the collection's Assets folder\n  history.jsonl                 request history, one JSON object per line\n  .trash\u002F                       deleted items and their metadata\n  .postguy\u002F\n    secrets.json                values of variables marked secret (0600 on Unix)\n    cookies.json                the persistent cookie jar\n    responses\u002F                  cached response bodies\n    runs\u002F\u003Ccollection id>\u002F\u003Crun id>.json   stored collection runs\n    lock                        the workspace lock\n  .postguy-config\u002F\n    settings.json               settings\n    session.json                open tabs, drafts, window geometry\n    recent.json                 recently opened workspaces\n","text","",[191,209,205],{"__ignoreMap":207},[211,212,213,245,252],"ul",{},[214,215,216,217,220,221,220,224,220,227,220,230,220,233,236,237,240,241,244],"li",{},"Opening a workspace creates the folder and ",[191,218,219],{},"collections\u002F",", ",[191,222,223],{},"environments\u002F",[191,225,226],{},"protos\u002F",[191,228,229],{},"files\u002F",[191,231,232],{},".trash\u002F",[191,234,235],{},".postguy\u002F"," and ",[191,238,239],{},".postguy\u002Fresponses\u002F",". It then takes the lock and creates ",[191,242,243],{},"postguy.json"," if it is missing. Other paths are created on first use.",[214,246,247,248,251],{},"Every file the store writes is written atomically. A temporary file in the same folder is synced, then renamed over the target. The previous version stays next to it as ",[191,249,250],{},"\u003Cname>.bak"," (one generation only). A failed write leaves the old file in place.",[214,253,254,257,258,261,262,265,266,269],{},[191,255,256],{},".postguy-config\u002F"," sits inside the workspace in the desktop app (",[191,259,260],{},"apps\u002Fpostguy\u002Fsrc\u002Fmain.rs",") and in the automation sessions of ",[191,263,264],{},"postguy-cli"," (",[191,267,268],{},"crates\u002Fautomation\u002Fsrc\u002Fsession.rs","). The whole state moves with the folder.",[271,272,273],"note",{},"The app holds the workspace lock while it is open. Close Postguy before you edit files by hand. Otherwise a later save from the app can overwrite your change.",[196,275,277],{"id":276},"postguyjson",[191,278,243],{},[201,280,284],{"className":281,"code":282,"language":283,"meta":207,"style":207},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"schema\": \"postguy\u002Fworkspace\u002F1\",\n  \"collectionOrder\": [\"\u003Ccollection id>\"],\n  \"environmentOrder\": [\"\u003Cenvironment id>\"],\n  \"activeEnvironmentId\": \"\u003Cenvironment id>\"\n}\n","json",[191,285,286,295,323,348,371,390],{"__ignoreMap":207},[287,288,291],"span",{"class":289,"line":290},"line",1,[287,292,294],{"class":293},"sMK4o","{\n",[287,296,298,301,305,308,311,314,318,320],{"class":289,"line":297},2,[287,299,300],{"class":293},"  \"",[287,302,304],{"class":303},"spNyl","schema",[287,306,307],{"class":293},"\"",[287,309,310],{"class":293},":",[287,312,313],{"class":293}," \"",[287,315,317],{"class":316},"sfazB","postguy\u002Fworkspace\u002F1",[287,319,307],{"class":293},[287,321,322],{"class":293},",\n",[287,324,326,328,331,333,335,338,340,343,345],{"class":289,"line":325},3,[287,327,300],{"class":293},[287,329,330],{"class":303},"collectionOrder",[287,332,307],{"class":293},[287,334,310],{"class":293},[287,336,337],{"class":293}," [",[287,339,307],{"class":293},[287,341,342],{"class":316},"\u003Ccollection id>",[287,344,307],{"class":293},[287,346,347],{"class":293},"],\n",[287,349,351,353,356,358,360,362,364,367,369],{"class":289,"line":350},4,[287,352,300],{"class":293},[287,354,355],{"class":303},"environmentOrder",[287,357,307],{"class":293},[287,359,310],{"class":293},[287,361,337],{"class":293},[287,363,307],{"class":293},[287,365,366],{"class":316},"\u003Cenvironment id>",[287,368,307],{"class":293},[287,370,347],{"class":293},[287,372,374,376,379,381,383,385,387],{"class":289,"line":373},5,[287,375,300],{"class":293},[287,377,378],{"class":303},"activeEnvironmentId",[287,380,307],{"class":293},[287,382,310],{"class":293},[287,384,313],{"class":293},[287,386,366],{"class":316},[287,388,389],{"class":293},"\"\n",[287,391,393],{"class":289,"line":392},6,[287,394,395],{"class":293},"}\n",[397,398,399,412],"table",{},[400,401,402],"thead",{},[403,404,405,409],"tr",{},[406,407,408],"th",{},"Key",[406,410,411],{},"Meaning",[413,414,415,428,440,451],"tbody",{},[403,416,417,422],{},[418,419,420],"td",{},[191,421,304],{},[418,423,424,425,427],{},"Always ",[191,426,317],{}," today. Missing means the same value.",[403,429,430,434],{},[418,431,432],{},[191,433,330],{},[418,435,436,437,439],{},"Collection ids in sidebar order. Files in ",[191,438,219],{}," that are not listed are appended after, sorted by id.",[403,441,442,446],{},[418,443,444],{},[191,445,355],{},[418,447,448,449,194],{},"The same for ",[191,450,223],{},[403,452,453,457],{},[418,454,455],{},[191,456,378],{},[418,458,459],{},"The selected environment. Omitted when none is selected. Cleared when that environment is deleted.",[178,461,462],{},"Unknown keys are kept and written back.",[196,464,466],{"id":465},"collection-and-environment-files","Collection and environment files",[178,468,469],{},"Both use camelCase keys. Every field has a default, so partial files load.",[397,471,472,482],{},[400,473,474],{},[403,475,476,479],{},[406,477,478],{},"File",[406,480,481],{},"Top-level keys",[413,483,484,520],{},[403,485,486,491],{},[418,487,488],{},[191,489,490],{},"collections\u002F\u003Cid>.json",[418,492,493,220,496,220,499,220,502,220,505,220,508,220,511,220,514,220,517],{},[191,494,495],{},"id",[191,497,498],{},"name",[191,500,501],{},"description",[191,503,504],{},"variables",[191,506,507],{},"auth",[191,509,510],{},"scripts",[191,512,513],{},"pinnedEnvironment",[191,515,516],{},"favourite",[191,518,519],{},"items",[403,521,522,530],{},[418,523,524,220,527],{},[191,525,526],{},"environments\u002F\u003Cid>.json",[191,528,529],{},"globals.json",[418,531,532,220,534,220,536,220,539],{},[191,533,495],{},[191,535,498],{},[191,537,538],{},"color",[191,540,504],{},[211,542,543,599,624],{},[214,544,545,547,548,265,551,554,555,558,559,562,563],{},[191,546,519],{}," holds folders and requests as objects tagged with ",[191,549,550],{},"itemType",[191,552,553],{},"folder"," or ",[191,556,557],{},"request",") and ",[191,560,561],{},"item",".\n",[211,564,565,583],{},[214,566,567,568,220,570,220,572,220,574,220,576,220,578,580,581,194],{},"Folders carry ",[191,569,495],{},[191,571,498],{},[191,573,501],{},[191,575,504],{},[191,577,507],{},[191,579,510],{}," and their own ",[191,582,519],{},[214,584,585,586,220,588,220,590,220,592,595,596,194],{},"Requests carry ",[191,587,495],{},[191,589,498],{},[191,591,501],{},[191,593,594],{},"kind"," (the HTTP, gRPC or WebSocket body) and ",[191,597,598],{},"examples",[214,600,601,602,220,605,220,608,220,610,613,614,558,617,613,620,623],{},"A variable row is ",[191,603,604],{},"key",[191,606,607],{},"value",[191,609,501],{},[191,611,612],{},"enabled"," (default ",[191,615,616],{},"true",[191,618,619],{},"secret",[191,621,622],{},"false",").",[214,625,626],{},"Unknown keys are preserved (they round-trip), so an older version does not truncate files from a newer one.",[196,628,630],{"id":629},"ids","Ids",[178,632,633,634,637],{},"Files are named after ids. An id used as a file name must match ",[191,635,636],{},"[A-Za-z0-9_-]{1,64}",". No dots, slashes or spaces are allowed, so an id cannot escape its folder.",[211,639,640,643,650],{},[214,641,642],{},"Postguy generates UUID text.",[214,644,645,646,649],{},"Imported Postman files often carry short ids like ",[191,647,648],{},"env-1",". These are accepted.",[214,651,652,653,656],{},"Run ids and the collection id in ",[191,654,655],{},".postguy\u002Fruns\u002F"," may be up to 128 characters of the same set.",[196,658,660],{"id":659},"secrets","Secrets",[178,662,663,664,667,668,194],{},"A variable with ",[191,665,666],{},"secret: true"," keeps only the flag in the collection, environment or globals file. Its value is blanked there and stored in ",[191,669,670],{},".postguy\u002Fsecrets.json",[201,672,674],{"className":281,"code":673,"language":283,"meta":207,"style":207},"{\n  \"\u003Cowner id>\": { \"\u003Cvariable key>\": \"\u003Cvalue>\" }\n}\n",[191,675,676,680,714],{"__ignoreMap":207},[287,677,678],{"class":289,"line":290},[287,679,294],{"class":293},[287,681,682,684,687,689,691,694,696,700,702,704,706,709,711],{"class":289,"line":297},[287,683,300],{"class":293},[287,685,686],{"class":303},"\u003Cowner id>",[287,688,307],{"class":293},[287,690,310],{"class":293},[287,692,693],{"class":293}," {",[287,695,313],{"class":293},[287,697,699],{"class":698},"sBMFI","\u003Cvariable key>",[287,701,307],{"class":293},[287,703,310],{"class":293},[287,705,313],{"class":293},[287,707,708],{"class":316},"\u003Cvalue>",[287,710,307],{"class":293},[287,712,713],{"class":293}," }\n",[287,715,716],{"class":289,"line":325},[287,717,395],{"class":293},[397,719,720,730],{},[400,721,722],{},[403,723,724,727],{},[406,725,726],{},"Owner id",[406,728,729],{},"Holds",[413,731,732,740,750,758],{},[403,733,734,737],{},[418,735,736],{},"an environment id",[418,738,739],{},"that environment's secret variables",[403,741,742,747],{},[418,743,744],{},[191,745,746],{},"globals",[418,748,749],{},"secret global variables",[403,751,752,755],{},[418,753,754],{},"a collection id or folder id",[418,756,757],{},"that collection's or folder's secret variables, and OAuth 2.0 tokens from its auth block",[403,759,760,763],{},[418,761,762],{},"a request id",[418,764,765],{},"OAuth 2.0 tokens of that request's auth block",[211,767,768,777,780,783,790],{},[214,769,770,771,236,774,194],{},"OAuth 2.0 tokens are stored under the keys ",[191,772,773],{},"oauth2.access",[191,775,776],{},"oauth2.refresh",[214,778,779],{},"An empty secret value removes the key.",[214,781,782],{},"Deleting an environment or collection (including its folders) removes its owner entries.",[214,784,785,786,789],{},"The file is set to mode ",[191,787,788],{},"0600"," on Unix. On Windows no extra permission step is taken.",[214,791,792],{},"The file is read back into the variables when the workspace loads.",[794,795,796,797,801,802,804,805,807],"warning",{},"Secret values are ",[798,799,800],"strong",{},"not encrypted at rest",". They are kept out of collection and environment files so those can be committed, but ",[191,803,670],{}," is plain JSON. Do not commit ",[191,806,235],{},". The source says an OS keychain is a deferred decision.",[196,809,811],{"id":810},"history","History",[178,813,814,817,818,194],{},[191,815,816],{},"history.jsonl"," has one JSON object per line, each wrapped as ",[191,819,820],{},"{\"entry\": {...}}",[397,822,823,832],{},[400,824,825],{},[403,826,827,830],{},[406,828,829],{},"Entry key",[406,831,411],{},[413,833,834,843,853,862,872,882,892],{},[403,835,836,840],{},[418,837,838],{},[191,839,495],{},[418,841,842],{},"Entry id.",[403,844,845,850],{},[418,846,847],{},[191,848,849],{},"timeMs",[418,851,852],{},"Unix time in milliseconds.",[403,854,855,859],{},[418,856,857],{},[191,858,557],{},[418,860,861],{},"Snapshot of the request as sent.",[403,863,864,869],{},[418,865,866],{},[191,867,868],{},"status",[418,870,871],{},"HTTP status, when there was a response.",[403,873,874,879],{},[418,875,876],{},[191,877,878],{},"durationMs",[418,880,881],{},"Round-trip time.",[403,883,884,889],{},[418,885,886],{},[191,887,888],{},"sizeBytes",[418,890,891],{},"Response body size (decoded size for compressed responses).",[403,893,894,899],{},[418,895,896],{},[191,897,898],{},"responseRef",[418,900,901,902,904],{},"Reference into ",[191,903,239],{}," when responses are saved.",[211,906,907,910,913,916],{},[214,908,909],{},"Only sends you make yourself are recorded. The collection runner sends without writing history.",[214,911,912],{},"The file keeps the newest 5000 entries. Appends are a single line write until the cap. After that, the file is rewritten without the oldest entry.",[214,914,915],{},"A line that does not parse (for example a torn last line after a crash) is skipped when reading.",[214,917,918],{},"Deleting one entry or clearing history rewrites the file atomically.",[196,920,922],{"id":921},"trash","Trash",[178,924,925,926,928,929,932,933,936,937,194],{},"Deleting a collection or environment moves its file into ",[191,927,232],{},". The content goes under an id of the form ",[191,930,931],{},"t\u003Cunix ms>-\u003Cpid>"," (a numbered ",[191,934,935],{},"-N.trash"," name is used on a collision), with a sidecar ",[191,938,939],{},"\u003Cid>.meta.json",[201,941,943],{"className":281,"code":942,"language":283,"meta":207,"style":207},"{\n  \"id\": \"t1730000000000-4242\",\n  \"original\": \"\u002Fpath\u002Fto\u002Fworkspace\u002Fcollections\u002F\u003Cid>.json\",\n  \"kind\": \"collection\",\n  \"deletedAtMs\": 1730000000000,\n  \"sizeBytes\": 2048\n}\n",[191,944,945,949,968,988,1007,1024,1037],{"__ignoreMap":207},[287,946,947],{"class":289,"line":290},[287,948,294],{"class":293},[287,950,951,953,955,957,959,961,964,966],{"class":289,"line":297},[287,952,300],{"class":293},[287,954,495],{"class":303},[287,956,307],{"class":293},[287,958,310],{"class":293},[287,960,313],{"class":293},[287,962,963],{"class":316},"t1730000000000-4242",[287,965,307],{"class":293},[287,967,322],{"class":293},[287,969,970,972,975,977,979,981,984,986],{"class":289,"line":325},[287,971,300],{"class":293},[287,973,974],{"class":303},"original",[287,976,307],{"class":293},[287,978,310],{"class":293},[287,980,313],{"class":293},[287,982,983],{"class":316},"\u002Fpath\u002Fto\u002Fworkspace\u002Fcollections\u002F\u003Cid>.json",[287,985,307],{"class":293},[287,987,322],{"class":293},[287,989,990,992,994,996,998,1000,1003,1005],{"class":289,"line":350},[287,991,300],{"class":293},[287,993,594],{"class":303},[287,995,307],{"class":293},[287,997,310],{"class":293},[287,999,313],{"class":293},[287,1001,1002],{"class":316},"collection",[287,1004,307],{"class":293},[287,1006,322],{"class":293},[287,1008,1009,1011,1014,1016,1018,1022],{"class":289,"line":373},[287,1010,300],{"class":293},[287,1012,1013],{"class":303},"deletedAtMs",[287,1015,307],{"class":293},[287,1017,310],{"class":293},[287,1019,1021],{"class":1020},"sbssI"," 1730000000000",[287,1023,322],{"class":293},[287,1025,1026,1028,1030,1032,1034],{"class":289,"line":392},[287,1027,300],{"class":293},[287,1029,888],{"class":303},[287,1031,307],{"class":293},[287,1033,310],{"class":293},[287,1035,1036],{"class":1020}," 2048\n",[287,1038,1040],{"class":289,"line":1039},7,[287,1041,395],{"class":293},[211,1043,1044,1054],{},[214,1045,1046,1047,1049,1050,1053],{},"Restore moves the file back to ",[191,1048,974],{},". If something already exists there, the file is restored with ",[191,1051,1052],{}," restored"," added before the extension.",[214,1055,1056,1057,1060,1061,220,1063,220,1066,220,1069,236,1072,194],{},"Deleting a folder or request writes a JSON snapshot ",[191,1058,1059],{},".trash\u002Fitem-\u003Cnanos>.json"," with the keys ",[191,1062,594],{},[191,1064,1065],{},"collectionId",[191,1067,1068],{},"itemId",[191,1070,1071],{},"deletedAt",[191,1073,561],{},[271,1075,1076,1077,1080],{},"The store defines a 30-day retention window and a purge function. Nothing in the app or the CLI calls the purge, so trashed files stay until you delete them. The Trash panel lists collections and environments and restores them. Item snapshots (",[191,1078,1079],{},"item-\u003Cnanos>.json",") are written, but the Trash panel does not list them yet. Its source says they appear once the item-restore path lands.",[196,1082,1084],{"id":1083},"lock","Lock",[178,1086,1087,1090,1091,236,1094,1097],{},[191,1088,1089],{},".postguy\u002Flock"," contains ",[191,1092,1093],{},"pid=\u003Cpid>",[191,1095,1096],{},"start=\u003Cunix ms>"," lines.",[211,1099,1100,1107,1110,1113,1116],{},[214,1101,1102,1103],{},"A second process that opens the same workspace is refused while the owner process is alive and the lock is younger than 3 minutes. The error is \"workspace already open by pid N; close that instance or remove ",[1104,1105,1106],"path",{}," if it is gone\".",[214,1108,1109],{},"A lock whose process is gone, or that is older than 3 minutes, is taken over.",[214,1111,1112],{},"The lock is never renewed. So a workspace that stays open for more than 3 minutes can be opened by a second process.",[214,1114,1115],{},"The lock file is removed when the workspace closes.",[214,1117,1118,1119,1122,1123,1126],{},"Liveness is checked with ",[191,1120,1121],{},"ps -p"," on Unix and ",[191,1124,1125],{},"tasklist"," on Windows. If that check cannot run, the process is assumed alive.",[196,1128,1130],{"id":1129},"stored-runs","Stored runs",[178,1132,1133,1136],{},[191,1134,1135],{},".postguy\u002Fruns\u002F\u003Ccollection id>\u002F\u003Crun id>.json"," holds one collection-runner result. Run ids sort by time. Only the newest 20 per collection are kept. Older files are deleted when a new run is saved. A stored run is read back with a 32 MiB cap.",[196,1138,1140],{"id":1139},"read-caps-and-corrupt-files","Read caps and corrupt files",[397,1142,1143,1152],{},[400,1144,1145],{},[403,1146,1147,1149],{},[406,1148,478],{},[406,1150,1151],{},"Read cap",[413,1153,1154,1164,1179],{},[403,1155,1156,1161],{},[418,1157,1158,1159],{},"Collection, environment, globals, ",[191,1160,243],{},[418,1162,1163],{},"100 MiB",[403,1165,1166,1176],{},[418,1167,1168,220,1171,220,1174],{},[191,1169,1170],{},"settings.json",[191,1172,1173],{},"session.json",[191,1175,670],{},[418,1177,1178],{},"8 MiB",[403,1180,1181,1184],{},[418,1182,1183],{},"Stored run",[418,1185,1186],{},"32 MiB",[178,1188,1189],{},"A file over its cap is refused with an error rather than loaded.",[397,1191,1192,1202],{},[400,1193,1194],{},[403,1195,1196,1199],{},[406,1197,1198],{},"Situation",[406,1200,1201],{},"Result",[413,1203,1204,1222,1232,1241,1252,1265],{},[403,1205,1206,1212],{},[418,1207,1208,1209,1211],{},"A collection, environment, globals or ",[191,1210,243],{}," file does not parse",[418,1213,1214,1215,1218,1219,1221],{},"The file is renamed to ",[191,1216,1217],{},"\u003Cname>.corrupt-\u003Cnanoseconds>"," and the app continues with an empty default. The user is told. The bytes stay for manual salvage; the previous version is also in ",[191,1220,250],{}," if one exists.",[403,1223,1224,1229],{},[418,1225,1226,1228],{},[191,1227,1170],{}," does not parse",[418,1230,1231],{},"Quarantined the same way; defaults are used.",[403,1233,1234,1238],{},[418,1235,1236,1228],{},[191,1237,1173],{},[418,1239,1240],{},"Quarantined; the session starts fresh.",[403,1242,1243,1249],{},[418,1244,1245,1248],{},[191,1246,1247],{},".postguy\u002Fcookies.json"," does not parse or is not an object",[418,1250,1251],{},"Quarantined; the jar starts empty.",[403,1253,1254,1258],{},[418,1255,1256,1228],{},[191,1257,670],{},[418,1259,1260,1261,1264],{},"Quarantined and the open fails with \"secrets file was corrupt; moved to ...\"; restore the file from ",[191,1262,1263],{},"secrets.json.bak"," or recreate the secret values.",[403,1266,1267,1270],{},[418,1268,1269],{},"A missing file",[418,1271,1272],{},"Treated as a fresh default; nothing is reported.",[178,1274,1275,1276,1278,1279,1282,1283,194],{},"To recover from a quarantined file, copy ",[191,1277,250],{}," (or the ",[191,1280,1281],{},".corrupt-*"," file after repair) back to ",[191,1284,1285],{},"\u003Cname>",[1287,1288,1289],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":207,"searchDepth":297,"depth":297,"links":1291},[1292,1293,1294,1295,1296,1297,1298,1299,1300,1301],{"id":198,"depth":297,"text":199},{"id":276,"depth":297,"text":243},{"id":465,"depth":297,"text":466},{"id":629,"depth":297,"text":630},{"id":659,"depth":297,"text":660},{"id":810,"depth":297,"text":811},{"id":921,"depth":297,"text":922},{"id":1083,"depth":297,"text":1084},{"id":1129,"depth":297,"text":1130},{"id":1139,"depth":297,"text":1140},"The on-disk layout of a Postguy workspace folder, the JSON files in it, and the rules for ids, secrets, history, trash, caps and corrupt files.","md",null,{},true,{"title":127,"description":1302},"DE0OpD1FUL9-CTbwKKO_jSH-Tz2MmsbPQ3G6gn2hmCY",[1310,1312],{"title":123,"path":124,"stem":125,"description":1311,"children":-1},"The opt-in local HTTP channel that lets postguy-cli inspect and drive the running desktop app: launch, control file, endpoints, set keys, command ids and limits.",{"title":131,"path":132,"stem":133,"description":1313,"children":-1},"What is shipped, partial, planned or out of scope in each area, from the parity file, plus the known limitations in plain terms.",1793179614287]