1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8860],{10193:e=>{e.exports={section:"journal-ai-section_section__4m2I7",background:"journal-ai-section_background__QkxlK",heroShader:"journal-ai-section_heroShader__fNHKV",canvas:"journal-ai-section_canvas__RiyNN",cardsEntrance:"journal-ai-section_cardsEntrance__vHTgd","cards-in":"journal-ai-section_cards-in__WUIh_",card:"journal-ai-section_card__4nsMr"}},10386:(e,t,a)=>{(window.__NEXT_P=window.__NEXT_P||[]).push(["/trade-journal",function(){return a(81209)}])},55054:e=>{e.exports={section:"journal-edge-section_section__HKUuD",background:"journal-edge-section_background__xv49h",radar:"journal-edge-section_radar__Dp9uo",breathe:"journal-edge-section_breathe__V1BLn",focus:"journal-edge-section_focus__oThVT",axes:"journal-edge-section_axes__x5lw3",profile:"journal-edge-section_profile__xBFL0"}},55080:e=>{e.exports={section:"journal-notes-section_section__8omFT",background:"journal-notes-section_background__odBVi",editor:"journal-notes-section_editor__PcjR9",appearance:"journal-notes-section_appearance__9R9yk",title:"journal-notes-section_title__PPDjD",toolbar:"journal-notes-section_toolbar__lxh5n",body:"journal-notes-section_body__aTMUx",line:"journal-notes-section_line__YuZU_",typing:"journal-notes-section_typing__GX73Q",caret:"journal-notes-section_caret___DWAT",footer:"journal-notes-section_footer__0q9O_"}},59376:e=>{e.exports={root:"trade-journal-sync_root__Vd4Hk",canvas:"trade-journal-sync_canvas__KnAQZ",caption:"trade-journal-sync_caption__OzmN3"}},81209:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>en});var n=a(66352),s=a(3389),r=a.n(s),l=a(94092),i=a.n(l),o=a(95132),d=a(56900),c=a(59038),h=a(72766),u=a(75271),m=a(69626),x=a(50821),p=a(19932),g=a(75623),f=a(61737),v=a(329),y=a(59376),j=a.n(y);let w={__html:' <section\n class="exhibit"\n aria-label="Illustration of broker history syncing into the Trade Journal"\n >\n <div class="animation-stage">\n <div\n class="broker-selector"\n aria-label="Supported broker sync and statement import options"\n ></div>\n\n <div class="traveler" aria-hidden="true">\n <span class="actor-logo"></span><span class="actor-name"></span\n ><small>Read-only broker sync</small>\n </div>\n <div class="journal-presentation">\n <div class="journal-intro">\n <p class="ownership">Self-hosted. Free, forever.</p>\n </div>\n <div class="app-window">\n <span class="sync-intake" aria-hidden="true"></span>\n <div class="app-top">\n <span class="app-brand"\n ><img\n class="luxalgo-symbol"\n src="/images/trade-journal/luxalgo-symbol-white.png"\n alt="LuxAlgo"\n />\n <b>Trade Journal</b></span\n ><span class="current-view-name">Dashboard</span\n ><span class="account" title="Read-only broker sync"><span class="account-dot" aria-hidden="true"></span><span id="account">Alpaca</span><span class="connection-kind">Read-only sync</span><span class="connection-label" id="phase">Read-only broker sync</span></span\n ><span class="period">7Dã30Dã90DãYTDã<b>All</b></span\n ><span class="filter-chip">â· Filters</span\n ><span class="view-actions"></span>\n </div>\n <div class="app-layout">\n <aside aria-label="Journal views">\n <nav class="view-nav"></nav>\n <span>Self-hosted<br />Open source \xb7 GitHub</span>\n </aside>\n <div class="journal-content">\n <label class="mobile-view-label"\n >Explore\n <select id="mobile-view" aria-label="Journal view"></select\n ></label>\n <div class="dashboard">\n <div class="dashboard-toolbar">\n <span>⦠Layouts â <small>16 of 16 cards</small></span\n ><span>â· Customize</span>\n </div>\n <div class="metrics">\n <div class="card">\n <label>NET P&L</label><strong id="net">+$0.00</strong\n ><small>6 closed trades</small>\n </div>\n <div class="card">\n <label>TRADE WIN %</label>\n <div class="gauge">\n <svg viewBox="0 0 120 66">\n <path d="M8 58 A52 52 0 0 1 112 58" />\n <path\n class="gauge-fill"\n d="M8 58 A52 52 0 0 1 112 58"\n pathLength="100"\n /></svg\n ><strong id="win">0%</strong>\n </div>\n <small id="win-count"></small>\n </div>\n <div class="card">\n <label>PROFIT FACTOR</label\n ><strong id="factor">0.00</strong\n ><small>gross profit \xf7 gross loss</small>\n </div>\n <div class="card">\n <label>DAY WIN %</label>\n <div class="gauge day-gauge">\n <svg viewBox="0 0 120 66">\n <path d="M8 58 A52 52 0 0 1 112 58" />\n <path\n class="gauge-fill"\n d="M8 58 A52 52 0 0 1 112 58"\n pathLength="100"\n /></svg\n ><strong id="daywin">0%</strong>\n </div>\n <small>4 trading days</small>\n </div>\n <div class="card">\n <label>AVG WIN / LOSS</label\n ><strong id="ratio">0.00</strong>\n <div>\n <div class="wl-bar"><i></i><i></i></div>\n <small id="avg-sizes"></small>\n </div>\n </div>\n </div>\n <div class="charts">\n <div class="card radar">\n <label>EDGE SCORE <span id="edge-score-value"></span></label\n >
1<svg\n viewBox="0 0 240 185"\n aria-label="Edge Score profile"\n >\n <defs><clipPath id="journal-edge-clip"><path d="M120 25L195 67L195 142L120 177L45 142L45 67Z"/></clipPath></defs>\n <g fill="none" stroke="#25252c">\n <path\n d="M120 25L195 67L195 142L120 177L45 142L45 67Z M120 52L173 81L173 130L120 154L67 130L67 81Z M120 78L148 94L148 119L120 133L92 119L92 94Z"\n />\n <path d="M120 25V177M45 67L195 142M45 142L195 67" />\n </g>\n <g clip-path="url(#journal-edge-clip)"><path\n class="radar-result"\n d="M120 38L165 85L179 132L120 158L51 135L59 75Z"\n /></g>\n <g class="chart-label">\n <text x="120" y="15" text-anchor="middle">Win %</text>\n <text x="184" y="56">Profit factor</text>\n <text x="187" y="153">Avg W/L</text>\n <text x="120" y="184" text-anchor="middle">\n Drawdown\n </text>\n <text x="2" y="155">Recovery</text>\n <text x="0" y="57">Consistency</text>\n </g>\n </svg>\n </div>\n <div class="card equity">\n <label>DAILY NET CUMULATIVE P&L</label\n >
1<svg\n viewBox="0 0 320 185"\n preserveAspectRatio="none"\n aria-label="Sample cumulative P and L"\n >\n <g stroke="#222228">\n <path d="M0 35H320M0 80H320M0 125H320M0 170H320" />\n </g>\n <path class="equity-fill" />\n <path class="equity-line" pathLength="100" /></svg\n ><small\n >Four trading days \xb7 <span class="sample-symbol"></span\n ></small>\n <div class="drawdown">\n <label\n >RELATIVE DRAWDOWN <span id="max-drawdown"></span\n ></label>\n <div class="drawdown-bars"></div>\n <small>$10k opening balance</small>\n </div>\n </div>\n <div class="card daily">\n <label>NET DAILY P&L</label>\n <div class="bars"></div>\n <small>Wins and losses by trading day</small>\n </div>\n </div>\n <div class="bottom">\n <div class="card calendar">\n <label>SEPTEMBER 2026 <span>Full calendar</span></label>\n <div class="weekdays">\n <span>Sun</span><span>Mon</span><span>Tue</span\n ><span>Wed</span><span>Thu</span><span>Fri</span\n ><span>Sat</span><span>Week</span>\n </div>\n <div class="calendar-grid"></div>\n <div class="dashboard-month-summary"></div>\n </div>\n <div class="card activity">\n <label>ACTIVITY</label>\n <div class="activity-tabs">\n <span>Recent trades</span><span>Open positions</span>\n </div>\n <div class="trades"></div>\n </div>\n </div>\n </div>\n <div class="alternate-view" hidden></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </section>'},b=(0,o.memo)((0,o.forwardRef)(function(e,t){return(0,n.jsx)("div",{ref:t,className:j().canvas,dangerouslySetInnerHTML:w})}));function N(e){let{caption:t}=e,s=(0,o.useRef)(null),r=(0,o.useRef)(null),[l,i]=(0,o.useState)(null);return(0,o.useEffect)(()=>{var e;let t,n=s.current,l=r.current;if(!n||!l)return;let o=!1,d=document.createElement("div");d.className=j().caption,null==(e=l.querySelector(".journal-presentation"))||e.append(d),i(d);let c=new IntersectionObserver(e=>{let[s]=e;s.isIntersecting&&(c.disconnect(),a.e(386).then(a.bind(a,20386)).then(e=>{let{mountJournalSync:a}=e;o||(t=a(n))}).catch(()=>{}))},{rootMargin:"600px"});return c.observe(n),()=>{o=!0,c.disconnect(),null==t||t(),d.remove()}},[]),(0,n.jsxs)("div",{ref:s,className:j().root,children:[(0,n.jsx)(b,{ref:r}),l&&t&&(0,v.createPortal)(t,l)]})}var _=a(10193),L=a.n(_);function k(e){let{children:t}=e,s=(0,o.useRef)(null),r=(0,o.useRef)(null),l=(0,o.useRef)(null),[i,d]=(0,o.useState)("fallback");return(0,o.useEffect)(()=>{let e,t=s.current,n=r.current,i=l.current;if(!t||!n||!i)return;let o=t.querySelector("[data-journal-interaction]");if(!o)return;let c=!1,h=[...t.querySelectorAll("[data-tile-quiet]")],u="",m=()=>{if(c)return;let a=n.getBoundingClientRect();if(!a.width||!a.height)return;let s=o.getBoundingClientRect().top-a.top;t.style.setProperty("--journal-start","".concat(s,"px")),t.style.setProperty("--hero-midpoint","".concat(.45*s,"px"));let r=h.map(e=>{let t=e.getBoundingClientRect();return'<rect x="'.concat(t.left-a.left-28,'" y="').concat(t.top-a.top-28,'" width="').concat(t.width+56,'" height="').concat(t.height+56,'" fill="black"/>')}).join(""),l='<svg xmlns="http://www.w3.org/2000/svg" width="'.concat(a.width,'" height="').concat(a.height,'" viewBox="0 0 ').concat(a.width," ").concat(a.height,'"><defs><filter id="soft" x="-50%" y="-50%" width="200%" height="200%"><feGaussianBlur stdDeviation="12"/></filter><mask id="quiet" maskUnits="userSpaceOnUse" x="0" y="0" width="').concat(a.width,'" height="').concat(a.height,'"><rect width="100%" height="100%" fill="white"/>
1<g filter="url(#soft)">').concat(r,'</g></mask></defs><rect width="100%" height="100%" fill="white" mask="url(#quiet)"/></svg>');null==e||e.refreshLayout(),l!==u&&(u=l,n.style.maskImage='url("data:image/svg+xml,'.concat(encodeURIComponent(l),'")'))},x=new ResizeObserver(m);return x.observe(t),x.observe(o),h.forEach(e=>x.observe(e)),t.addEventListener("animationend",m),t.addEventListener("transitionend",m),document.fonts.ready.then(m),m(),a.e(6190).then(a.bind(a,26190)).then(t=>{let{createTileField:a,FIELD_DEFAULTS:s}=t;c||(e=a(n,s,d,{baseCanvas:i,interactionElement:o,effectOpacity:.22,driftingShadows:!0}))}).catch(()=>{c||d("fallback")}),()=>{c=!0,x.disconnect(),t.removeEventListener("animationend",m),t.removeEventListener("transitionend",m),null==e||e.destroy()}},[]),(0,n.jsxs)("div",{ref:s,className:L().section,"data-motion":i,children:[(0,n.jsxs)("div",{className:L().background,"aria-hidden":"true",children:[(0,n.jsx)("canvas",{ref:l,className:L().canvas}),(0,n.jsx)("canvas",{ref:r,className:L().canvas})]}),t]})}function A(e){let{children:t}=e;return(0,n.jsx)("div",{"data-tile-quiet":!0,className:"space-y-5",children:t})}function M(e){let{children:t}=e,[a,s]=(0,m.Wx)({threshold:.01});return(0,n.jsx)("div",{ref:a,className:L().cardsEntrance,"data-visible":s,children:t})}var T=a(55054),E=a.n(T);let P=[[120,25],[195,67],[195,142],[120,177],[45,142],[45,67]],R=[[12,24],[42,15],[75,22],[92,48],[72,86],[30,88],[7,65]],S=[{id:0,location:0,focus:0,x:12,y:24,zoom:1,duration:14,delay:0},{id:0,location:4,focus:3,x:72,y:86,zoom:1.3,duration:15,delay:5}];function I(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=(e.location+1+Math.floor(Math.random()*(R.length-1)))%R.length,n=(e.focus+1+Math.floor(5*Math.random()))%6;return{id:e.id+1,location:a,focus:n,x:R[a][0]+(Math.random()-.5)*12,y:R[a][1]+(Math.random()-.5)*10,zoom:.85+.95*Math.random(),duration:12+4*Math.random(),delay:t}}function C(e){let{children:t}=e,a=(0,o.useRef)(null),[s,r]=(0,o.useState)(!1),[l,i]=(0,o.useState)(S);return(0,o.useEffect)(()=>{if(!a.current)return;i(S.map((e,t)=>I(e,5*t)));let e=!1,t=()=>r(e&&!document.hidden),n=new IntersectionObserver(a=>{let[n]=a;e=n.isIntersecting,t()});return n.observe(a.current),document.addEventListener("visibilitychange",t),()=>{n.disconnect(),document.removeEventListener("visibilitychange",t)}},[]),(0,n.jsxs)("div",{ref:a,className:E().section,"data-radar-active":s,children:[(0,n.jsx)("div",{className:E().background,"aria-hidden":"true",children:["M120 32 L180 76 L132 113 L120 168 L91 120 L71 82 Z","M120 55 L171 80 L164 127 L120 150 L82 123 L59 75 Z"].map((e,t)=>{let a=l[t],s=P[a.focus],r=240/a.zoom,o=120+(s[0]-120)*.4,d=101+(s[1]-101)*.4;return(0,n.jsxs)("svg",{className:E().radar,style:{left:"".concat(a.x,"%"),top:"".concat(a.y,"%"),"--radar-duration":"".concat(a.duration,"s"),"--radar-delay":"".concat(a.delay,"s")},onAnimationEnd:e=>{e.target===e.currentTarget&&i(e=>e.map((e,a)=>a===t?I(e):e))},viewBox:"".concat(o-r/2," ").concat(d-r/2," ").concat(r," ").concat(r),fill:"none",children:[(0,n.jsxs)("g",{className:E().axes,children:[(0,n.jsx)("path",{d:"M120 25L195 67L195 142L120 177L45 142L45 67Z M120 52L173 81L173 130L120 154L67 130L67 81Z M120 78L148 94L148 119L120 133L92 119L92 94Z"}),(0,n.jsx)("path",{d:"M120 25V177M45 67L195 142M45 142L195 67"})]}),(0,n.jsx)("path",{className:E().profile,d:e}),(0,n.jsx)("path",{className:E().focus,d:"M120 101 L".concat(s[0]," ").concat(s[1])})]},"".concat(t,"-").concat(a.id))})}),t]})}var D=a(55080),O=a.n(D);let q=(e,t)=>e.x<t.x+t.width&&e.x+e.width>t.x&&e.y<t.y+t.height&&e.y+e.height>t.y,F=[{title:"Session review",lines:["Waited for the setup to complete.","Recorded the reason for each exit.","Review the entries again tomorrow."]},{title:"Trading checklist",lines:["Check the plan before the session.","Keep a note beside each trade.","Compare the outcome with the plan."]},{title:"Tuesday reflections",lines:["The opening session felt rushed.","Taking a break helped me reset.","Tomorrow: leave more time to prepare."]},{title:"Lessons from today",lines:["Logged the fills and added context.","Tagged the trades worth revisiting.","One clear lesson for the next session."]}];function B(e){let{children:t}=e,a=(0,o.useRef)(null),s=(0,o.useRef)(null),r=(0,o.useRef)(()=>{}),[l,i]=(0,o.useState)(!1),[d,c]=(0,o.useState)(null);(0,o.useEffect)(()=>{let e,t=a.current;if(!t)return;let n=!1,l=!1,o=0,d="",h=[...t.querySelectorAll("section h2, section p")],u=()=>{let e=t.getBoundingClientRect(),a=h.map(a=>{let n=0,s=0,r=a;for(;r&&r!==t;)n+=r.offsetLeft,s+=r.offsetTop,r=r.offsetParent;let l=a.getBoundingClientRect(),i=Math.min(n,l.left-e.left),o=Math.min(s,l.top-e.top);return{x:i-12,y:o-12,width:Math.max(n+a.offsetWidth,l.right-e.left)-i+24,height:Math.max(s+a.offsetHeight,l.bottom-e.top)-o+24}});return{width:e.width,height:e.height,excluded:a}},m=()=>{if(n)return;let t=u(),a=function(e,t,a,n){let s=[{x:8,y:8,width:e-16,height:t-16}];for(let e of a)s=s.flatMap(t=>q(t,e)?[{...t,height:e.y-t.y},{...t,y:e.y+e.height,height:t.y+t.height-e.y-e.height},{...t,width:e.x-t.x},{...t,x:e.x+e.width,width:t.x+t.width-e.x-e.width}].filter(e=>e.width>=320&&e.height>=80):[t]);s=s.filter(e=>e.width>=320&&e.height>=80);let r=null;for(let e=0;e<80&&s.length;e++){let e=s[Math.floor(Math.random()*s.length)],t=320+Math.random()*(Math.min(520,e.width)-320),l=e.height>190&&Math.random()>.45?168:80,i=(2*Math.random()-1)*Math.min(4,Math.max(0,(e.height-l-2)/t*180/Math.PI)),o=Math.abs(i)*Math.PI/180,d=t*Math.cos(o)+l*Math.sin(o),c=l*Math.cos(o)+t*Math.sin(o);if(d>e.width||c>e.height)continue;let h={x:e.x+Math.random()*(e.width-d),y:e.y+Math.random()*(e.height-c),width:d,height:c};if(a.some(e=>q(h,e)))continue;let u={x:h.x+d/2,y:h.y+c/2,width:t,height:l,angle:i,bounds:h};if(r=u,!n||Math.hypot(u.x-n.x,u.y-n.y)>120)return u}return r}(t.width,t.height,t.excluded,e),s=a?{...a,id:++o,note:e?(e.note+1+Math.floor(Math.random()*(F.length-1)))%F.length:Math.floor(Math.random()*F.length)}:null;s&&(e=s),c(s)};r.current=m;let x=()=>
1{if(n)return;let e=JSON.stringify(u());e!==d&&(d=e,s.current&&(s.current.style.visibility="hidden"),m())},p=()=>i(l&&!document.hidden),g=new IntersectionObserver(e=>{let[t]=e;l=t.isIntersecting,p()});g.observe(t);let f=new ResizeObserver(x);f.observe(t),h.forEach(e=>f.observe(e));let v=e=>{e.target instanceof Element&&e.target.closest("section")&&x()};return t.addEventListener("animationend",v),document.addEventListener("visibilitychange",p),document.fonts.ready.then(x),x(),()=>{n=!0,g.disconnect(),f.disconnect(),t.removeEventListener("animationend",v),document.removeEventListener("visibilitychange",p),r.current=()=>{}}},[]);let h=d?F[d.note]:null;return(0,n.jsxs)("div",{ref:a,className:O().section,"data-notes-active":l,children:[(0,n.jsx)("div",{"aria-hidden":"true",className:O().background,children:d&&h&&(0,n.jsxs)("div",{ref:s,className:O().editor,"data-note-card":"","data-compact":80===d.height,style:{left:d.x,top:d.y,width:d.width,height:d.height,transform:"translate(-50%, -50%) rotate(".concat(d.angle,"deg)")},onAnimationEnd:e=>{e.target===e.currentTarget&&r.current()},children:[(0,n.jsxs)("div",{className:O().title,children:[(0,n.jsx)("strong",{children:h.title}),(0,n.jsx)("span",{children:"Preview"}),(0,n.jsx)("span",{children:"Dictate"})]}),(0,n.jsxs)("div",{className:O().toolbar,children:[(0,n.jsx)("b",{children:"B"}),(0,n.jsx)("i",{children:"I"}),(0,n.jsx)("span",{children:"H2"}),(0,n.jsx)("span",{children:"List"}),(0,n.jsx)("span",{children:"Checklist"}),(0,n.jsx)("span",{children:"Link trade"}),(0,n.jsx)("span",{children:"Insert templateâ¦"})]}),(0,n.jsx)("div",{className:O().body,children:h.lines.slice(0,80===d.height?2:3).map((e,t)=>(0,n.jsx)("div",{className:O().line,style:{"--characters":e.length,"--typing-delay":"".concat(2.6+2.3*t,"s")},children:e},e))}),(0,n.jsxs)("div",{className:O().footer,children:[(0,n.jsx)("span",{children:"Saved"}),(0,n.jsx)("span",{children:"Export PDF"}),(0,n.jsx)("span",{children:"Export PNG"})]})]},d.id)}),t]})}var W=a(26505),z=a(50056);let Y="https://github.com/LuxAlgo/trade-journal",G={hosted:!0,tools:[{name:"journal_list_accounts",when:"Your journal accounts and timezone: the first call, since every account filter takes these ids."},{name:"journal_overview",when:"The dashboard for a window: metrics, Edge Score, per-day P&L, equity curve, open positions. Compare adds the previous window."},{name:"journal_calendar",when:"One month of the P&L calendar: day cells, weekly and monthly totals, trading and winning days."},{name:"journal_breakdown",when:"Closed trades grouped by weekday, time of day, hold time, symbol, side, size, tag, rating and asset class."},{name:"journal_list_trades",when:"Trade summaries, paginated: filter by account, day window, symbol, direction, status and tag; sort either way."},{name:"journal_get_trade",when:"One trade in full: fills, per-exit P&L, every annotation."},{name:"journal_get_day",when:"A single dayâs stats, trades and notes."},{name:"journal_list_tags",when:"Your tags, mistakes and playbooks with usage counts, so new annotations reuse your words."},{name:"journal_search_notes",when:"Day notes and trade notes as one newest-first stream, with text, day, symbol and account filters."},{name:"journal_add_trade",when:"Log a trade by hand: its fills into a manual or import account."},{name:"journal_update_trade",when:"Annotate a trade: notes, tags, mistakes, playbook, rating, stop, target, reviewed."},{name:"journal_write_note",when:"Add a note to a day."},{name:"journal_update_note",when:"Replace a day noteâs text or move it to another day."}]},V=[{days:[{date:2,pnl:240,trades:3},{date:3,pnl:-120,trades:2},{date:4,pnl:85,trades:1},{date:5,pnl:null,trades:0},{date:6,pnl:310,trades:4}]},{days:[{date:9,pnl:-260,trades:2},{date:10,pnl:145,trades:3},{date:11,pnl:420,trades:5},{date:12,pnl:-95,trades:1},{date:13,pnl:-180,trades:2}]},{days:[{date:16,pnl:95,trades:2},{date:17,pnl:230,trades:3},{date:18,pnl:-340,trades:4},{date:19,pnl:120,trades:2},{date:20,pnl:65,trades:1}]},{days:[{date:23,pnl:-150,trades:3},{date:24,pnl:280,trades:2},{date:25,pnl:75,trades:1},{date:26,pnl:-420,trades:5},{date:27,pnl:190,trades:2}]}],H=V.flatMap(e=>e.days).filter(e=>null!==e.pnl),U=H.reduce((e,t)=>
1{var a;return e+(null!=(a=t.pnl)?a:0)},0),Z=Math.round(H.filter(e=>{var t;return(null!=(t=e.pnl)?t:0)>0}).length/H.length*100),J=e=>"".concat(e<0?"-":"+","$").concat(Math.abs(e).toLocaleString());function K(e){let{color:t,delay:a=0}=e;return(0,n.jsx)("span",{"aria-hidden":!0,style:{borderColor:t,boxShadow:"0 0 14px ".concat(t,"66, inset 0 0 8px ").concat(t,"26"),animationDelay:"".concat(a,"ms")},className:"jsx-e8cd8d525fa60799 entry-glow pointer-events-none absolute -inset-px rounded-[inherit] border opacity-0",children:(0,n.jsx)(r(),{id:"e8cd8d525fa60799",children:".entry-glow.jsx-e8cd8d525fa60799{animation:journal-entry-glow 1e3ms ease-in-out both}@keyframes journal-entry-glow{0%,100%{opacity:0}30%{opacity:1}65%{opacity:.65}}@media(prefers-reduced-motion:reduce){.entry-glow.jsx-e8cd8d525fa60799{animation:none}}"})})}function $(e){let{day:t,glowDelay:a}=e;if(null===t.pnl)return(0,n.jsxs)("div",{className:"flex min-h-[64px] flex-col justify-between rounded-md border border-white/[0.05] bg-white/[0.015] p-2",children:[(0,n.jsx)("span",{className:"text-[10px] font-medium text-fg-300",children:t.date}),(0,n.jsx)("span",{className:"font-mono text-[10px] text-fg-300/60",children:"\xb7"})]});let s=t.pnl>0;return(0,n.jsxs)("div",{className:"relative flex min-h-[64px] flex-col justify-between rounded-md border p-2 ".concat(s?"border-[#089981]/25 bg-[#089981]/[0.09]":"border-[#f23645]/25 bg-[#f23645]/[0.09]"),children:[void 0!==a&&(0,n.jsx)(K,{color:s?"#2ebd85":"#f23645",delay:a}),(0,n.jsxs)("div",{className:"flex items-baseline justify-between",children:[(0,n.jsx)("span",{className:"text-[10px] font-medium text-fg-300",children:t.date}),(0,n.jsxs)("span",{className:"font-mono text-[9px] text-fg-300",children:[t.trades,"t"]})]}),(0,n.jsx)("span",{className:"font-mono text-xs tabular-nums ".concat(s?"text-[#2ebd85]":"text-[#f23645]"),children:J(t.pnl)})]})}let Q=[{label:"Win rate",value:.58},{label:"Profit factor",value:.52},{label:"Avg W/L",value:.61},{label:"Drawdown",value:.7},{label:"Recovery",value:.48},{label:"Consistency",value:.55}];function X(){let e=(e,t)=>{let a=-Math.PI/2+e*Math.PI/3;return"".concat((70+44*Math.cos(a)*t).toFixed(1),",").concat((64+44*Math.sin(a)*t).toFixed(1))};return(0,n.jsxs)("svg",{viewBox:"-15 0 170 132",className:"mx-auto w-full max-w-[210px]",children:[[.33,.66,1].map(t=>(0,n.jsx)("polygon",{points:Q.map((a,n)=>e(n,t)).join(" "),fill:"none",stroke:"rgba(255,255,255,0.08)",strokeWidth:"1"},t)),Q.map((t,a)=>(0,n.jsx)("line",{x1:70,y1:64,x2:e(a,1).split(",")[0],y2:e(a,1).split(",")[1],stroke:"rgba(255,255,255,0.06)"},a)),(0,n.jsx)("polygon",{points:Q.map((t,a)=>e(a,t.value)).join(" "),fill:"rgba(53,162,222,0.16)",stroke:"#35a2de",strokeWidth:"1.25",strokeLinejoin:"round"}),Q.map((e,t)=>{let a=-Math.PI/2+t*Math.PI/3,s=70+58*Math.cos(a),r=64+56*Math.sin(a);return(0,n.jsx)("text",{x:s,y:r,textAnchor:"middle",dominantBaseline:"middle",className:"font-mono",fontSize:"6.5",fill:"#7d7d7d",children:e.label},e.label)})]})}function ee(){let[e,t]=(0,m.Wx)(),[a,s]=(0,o.useState)([]);return(0,o.useEffect)(()=>{let e=H.map(e=>e.date);for(let t=e.length-1;t>0;t--){let a=Math.floor(Math.random()*(t+1));[e[t],e[a]]=[e[a],e[t]]}s(e.slice(0,4))},[]),(0,n.jsx)("div",{className:"dark",children:(0,n.jsxs)("div",{className:"relative overflow-hidden rounded-2xl border border-white/10 bg-[#060606]",children:[(0,n.jsxs)("div",{className:"flex items-center justify-between gap-4 border-b border-white/[0.06] px-5 py-3 sm:px-6",children:[(0,n.jsx)("span",{className:"text-xs font-medium text-fg-300",children:"dashboard \xb7 P&L calendar \xb7 Edge Score"}),(0,n.jsx)("span",{className:"hidden text-[11px] font-medium text-fg-300 sm:inline",children:"free in LuxAlgo \xb7 self-hosted"})]}),(0,n.jsxs)("div",{className:"grid gap-6 p-5 sm:p-6 lg:grid-cols-[1.75fr_1fr]",children:[(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsx)("div",{className:"mb-2 grid grid-cols-[repeat(5,1fr)_64px] gap-1.5",children:["Mon","Tue","Wed","Thu","Fri","Week"].map(e=>(0,n.jsx)("span",{className:"text-center text-[10px] font-medium text-fg-300",children:e},e))}),(0,n.jsx)("div",{className:"space-y-1.5",children:V.map((e,s)=>{let r=e.days.reduce((e,t)=>
1{var a;return e+(null!=(a=t.pnl)?a:0)},0);return(0,n.jsxs)("div",{className:"grid grid-cols-[repeat(5,1fr)_64px] gap-1.5",children:[e.days.map(e=>{let s=a.indexOf(e.date);return(0,n.jsx)($,{day:e,glowDelay:t&&s>=0?130*s:void 0},e.date)}),(0,n.jsxs)("div",{className:"flex min-h-[64px] flex-col items-end justify-between rounded-md border border-white/[0.07] bg-white/[0.03] p-2",children:[(0,n.jsxs)("span",{className:"text-[9px] font-medium text-fg-300",children:["wk ",s+1]}),(0,n.jsx)("span",{className:"font-mono text-xs tabular-nums ".concat(r>=0?"text-[#2ebd85]":"text-[#f23645]"),children:J(r)})]})]},s)})})]}),(0,n.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,n.jsxs)("div",{className:"relative rounded-lg border border-white/[0.07] bg-white/[0.02] p-4",children:[t&&(0,n.jsx)(K,{color:"#35a2de",delay:200}),(0,n.jsxs)("div",{className:"flex items-baseline justify-between",children:[(0,n.jsx)("p",{className:"text-[10px] font-medium text-fg-300",children:"Edge Score"}),(0,n.jsx)("p",{className:"text-[10px] font-medium text-fg-300",children:"v2 \xb7 open formula"})]}),(0,n.jsx)(X,{})]}),(0,n.jsxs)("div",{ref:e,className:"grid grid-cols-2 gap-4",children:[(0,n.jsxs)("div",{className:"rounded-lg border border-white/[0.07] bg-white/[0.02] p-4",children:[(0,n.jsx)("p",{className:"text-[10px] font-medium text-fg-300",children:"Net P&L"}),(0,n.jsxs)("p",{className:"mt-1 font-mono text-xl tabular-nums text-[#2ebd85]",children:["+$",(0,n.jsx)(m.T9,{value:U,start:t})]})]}),(0,n.jsxs)("div",{className:"rounded-lg border border-white/[0.07] bg-white/[0.02] p-4",children:[(0,n.jsx)("p",{className:"text-[10px] font-medium text-fg-300",children:"Day win rate"}),(0,n.jsx)("p",{className:"mt-1 font-mono text-xl tabular-nums text-fg-100",children:(0,n.jsx)(m.T9,{value:Z,suffix:"%",start:t})})]})]})]})]}),(0,n.jsxs)("p",{className:"border-t border-white/[0.06] px-5 py-3 text-xs text-fg-300 sm:px-6",children:["Sample data, drawn in HTML. The real dashboard renders your own fills, plus equity curve, gauges, and time-of-day heatmaps, with every chart drawn by"," ",(0,n.jsx)(i(),{href:"/vela",className:"text-fg-100 underline decoration-white/25 underline-offset-2 transition-colors duration-150 hover:decoration-white/60",children:"Velaâ¢"}),", our open-source charting engine built for speed in the agentic era."]})]})})}let et=[["Win rate","full marks at 60%",15],["Profit factor","full marks at 3.0",25],["Avg win / avg loss","full marks at 2.5 : 1",20],["Drawdown","full marks at 0%, zero at 25%+",15],["Recovery factor","net P&L = 3x max drawdown",10],["Consistency","best day <= 15% of day profits",15]],ea=[[[g.T.dim,"$ "],[g.T.hi,"git clone https://github.com/LuxAlgo/trade-journal"]],[[g.T.dim,"$ "],[g.T.hi,"cd trade-journal && pnpm install && pnpm dev"]],[],[[g.T.cmt,"# http://localhost:3000 \xb7 SQLite creates itself"]],[[g.T.cmt,"# no migration tool, no setup wizard, no account"]],[],[[g.T.cmt,"# or, with Docker:"]],[[g.T.dim,"$ "],[g.T.hi,"docker compose up -d"]]];function en(){return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(d.A,{title:"Trade Journal: The Free Open-Source Trading Journal | LuxAlgo",description:"A free trading journal you own: automatic broker sync, a P&L calendar, deep analytics, daily notes with voice dictation, and AI reflection. Use it free inside LuxAlgo, where your AI reads and writes it over MCP, or run it on your own machine. Free forever either way.",canonicalUrl:"".concat("https://www.luxalgo.com","/trade-journal"),openGraphImageUrl:"/api/og/page/?title=Trade%20Journal",markdownPath:"/trade-journal.md"}),(0,n.jsx)(c.gk,{items:[{name:"LuxAlgo",url:"/"},{name:"Trade Journal",url:"/trade-journal/"}]}),(0,n.jsx)(c.Ec,{project:"trade-journal"}),(0,n.jsxs)(k,{children:[(0,n.jsxs)("section",{"data-tile-quiet":!0,className:"relative z-10 overflow-hidden px-6 pt-24 pb-16 sm:pt-32 sm:pb-20",children:[(0,n.jsx)(x.A,{wgsl:"\nstruct Params { time: f32, aspect: f32, light: f32 }\n@group(0) @binding(0) var<uniform> params: Params;\n\nfn hash21(p: vec2f) -> f32 {\n var q = fract(p * vec2f(123.34, 345.45));\n q += dot(q, q + 34.345);\n return fract(q.x * q.y);\n}\n\n@fragment fn fs_main(@location(0) uv: vec2f) -> @location(0) vec4f {\n // A faint month grid;
1 cells breathe green or red, one at a time.\n let gx = uv.x * params.aspect * 7.0;\n let gy = uv.y * 7.0;\n let cell = vec2f(floor(gx), floor(gy));\n let fx = fract(gx);\n let fy = fract(gy);\n\n // Hairline grid.\n let lineX = smoothstep(0.03, 0.0, min(fx, 1.0 - fx));\n let lineY = smoothstep(0.045, 0.0, min(fy, 1.0 - fy));\n var lum = max(lineX, lineY) * 0.05;\n\n // Cell breath: staggered slow pulses on ~40% of cells.\n let seed = hash21(cell);\n let gate = step(0.6, seed);\n let pulse = 0.5 + 0.5 * sin(params.time * 0.5 + seed * 40.0);\n let inset = smoothstep(0.06, 0.22, fx) * smoothstep(0.94, 0.78, fx)\n * smoothstep(0.08, 0.28, fy) * smoothstep(0.92, 0.72, fy);\n let breath = gate * pulse * inset * 0.13;\n\n // Green days outnumber red ones, quietly.\n let sidePick = hash21(cell * 3.3);\n var tint = vec3f(0.45, 1.1, 0.75);\n if (sidePick < 0.32) { tint = vec3f(1.15, 0.5, 0.55); }\n\n let dd = distance(vec2f(uv.x, uv.y * 1.5), vec2f(0.5, 0.1));\n var base = smoothstep(0.85, 0.0, dd) * 0.06;\n var fade = smoothstep(0.0, 0.08, uv.y) * smoothstep(1.0, 0.72, uv.y);\n lum = (lum + base) * fade;\n let cellGlow = breath * fade;\n lum += (hash21(uv * 519.7) - 0.5) * 0.004;\n\n let dark = vec3f(lum) + cellGlow * tint;\n let paper = vec3f(1.0) - vec3f(lum * 1.3) - cellGlow * (vec3f(1.4) - tint);\n let col = mix(dark, paper, params.light);\n return vec4f(col, 1.0);\n}\n",className:L().heroShader}),(0,n.jsxs)("div",{className:"relative mx-auto max-w-3xl space-y-8 text-center",children:[(0,n.jsx)(u.A,{immediate:!0,children:(0,n.jsxs)("div",{className:"space-y-6",children:[(0,n.jsx)("h1",{className:"text-[clamp(38px,5.5vw,64px)] leading-[1.06] font-medium tracking-tight text-fg-100 text-balance",children:"Record every trade. See what actually works."}),(0,n.jsx)(h.Y0,{children:(0,n.jsx)("span",{className:"mx-auto block max-w-2xl",children:"The open-source trade journal: broker sync, deep analytics, a P&L calendar, daily journaling with voice dictation, and AI reflection. Free inside LuxAlgo, where your AI can read and write it over MCP, or on your own machine."})})]})}),(0,n.jsx)(u.A,{immediate:!0,delay:120,children:(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-center gap-4",children:[(0,n.jsx)(h.Bk,{href:"https://app.luxalgo.com",children:"Use it free in LuxAlgo"}),(0,n.jsx)(z.jY,{config:G}),(0,n.jsx)(f.A,{repo:"LuxAlgo/trade-journal",href:Y})]})})]}),(0,n.jsx)(u.A,{delay:260,className:"relative mx-auto mt-14 max-w-[1100px]",children:(0,n.jsx)(ee,{})})]}),(0,n.jsx)("div",{id:"ask-your-journal","data-journal-interaction":!0,className:"relative z-10 scroll-mt-20",children:(0,n.jsxs)(p.Ay,{hue:"sky",hue2:"green",glow:!1,className:"z-10",innerClassName:"space-y-10",children:[(0,n.jsxs)("div",{className:"grid items-start gap-6 lg:grid-cols-[1fr_1.1fr] lg:gap-12",children:[(0,n.jsx)(u.A,{children:(0,n.jsxs)(A,{children:[(0,n.jsx)(p.v0,{hue:"emerald",children:"Live on mcp.luxalgo.com \xb7 sign in"}),(0,n.jsx)("h2",{className:"text-[clamp(30px,4vw,52px)] leading-[1.06] font-medium tracking-tight text-fg-100 text-balance",children:"Ask your journal from any AI."})]})}),(0,n.jsx)(u.A,{delay:100,children:(0,n.jsxs)(A,{children:[(0,n.jsx)("p",{className:"max-w-xl text-base leading-relaxed text-fg-300 sm:text-lg",children:"Connect the LuxAlgo MCP in Claude, ChatGPT, Cursor or any MCP client, and thirteen journal_* tools read and write the journal inside LuxAlgo, as you. Ask for your worst weekday and the trades behind it, have the agent tag them and write the day note, or log a trade by hand. The first protected call asks you to sign in with your LuxAlgo account; the app owns the rules and validates every change."}),(0,n.jsxs)("p",{className:"max-w-xl text-sm leading-relaxed text-fg-300",children:["Running the server locally instead? Sign in once with"," ",(0,n.jsx)("span",{className:"font-mono text-[0.95em] text-fg-200",children:"npx -y @luxalgo/mcp login"})," ","and the same tools follow."]}),(0,n.jsx)("div",{className:"flex flex-wrap items-center gap-3",children:(0,n.jsx)(h.Bk,{href:"/mcp",children:"Connect the LuxAlgo MCP"})})]})})]}),(0,n.jsx)(M,{children:(0,n.jsx)(z._d,{tools:G.tools,cardClassName:L().card})})]})})]}),(0,n.jsx)(p.Ay,{hue:"green",hue2:"sky",children:(0,n.jsxs)("div",{id:"broker-sync",className:"scroll-mt-28 space-y-10",children:[(0,n.jsxs)("div",{className:"grid items-start gap-6 lg:grid-cols-[1fr_1.1fr] lg:gap-12",children:[(0,n.jsx)(u.A,{children:(0,n.jsx)("h2",{className:"text-[clamp(30px,4vw,52px)] leading-[1.06] font-medium tracking-tight text-fg-100 text-balance",children:"Your fills find their own way in."})}),(0,n.jsx)(u.A,{delay:100,children:(0,n.jsx)("p",{className:"max-w-xl text-base leading-relaxed text-fg-300 sm:text-lg",children:"Read-only broker sync through the open Broker SDK (Alpaca, Binance, Kraken, IBKR Flex, Topstep, and more), with credentials AES-256-GCM encrypted next to your database. Or drop a statement on the import page: twelve formats auto-detect, re-imports dedupe themselves, and a column mapper covers any other CSV."})})]}),(0,n.jsx)("div",{className:"space-y-6",children:(0,n.jsx)(N,{caption:(0,n.jsx)("p",{className:"mx-auto max-w-3xl text-sm leading-relaxed text-fg-300",children:"Moving from the popular hosted journals is one click, and
1your stated net P&L is preserved to the cent."})})})]})}),(0,n.jsx)(p.Ay,{hue:"sky",hue2:"green",glow:!1,pad:!1,className:"pt-24 pb-16 sm:pt-28 sm:pb-20",children:(0,n.jsxs)("div",{className:"space-y-20 text-center",children:[(0,n.jsx)("div",{className:"grid gap-12 sm:grid-cols-3 sm:gap-8",children:[["Round trips, not rows","Flat-to-flat position cycles rebuilt from raw fills: partial fills, scale-ins, flips, futures multipliers."],["Your accounting, per account","FIFO, LIFO, or weighted average per account. Switch it and the engine rebuilds every cycle."],["Notes that survive","Ratings, tags, mistakes, and journal notes are keyed to the trade, so they survive every rebuild."]].map((e,t)=>{let[a,s]=e;return(0,n.jsx)(u.A,{delay:80*t,children:(0,n.jsxs)("div",{className:"space-y-3",children:[(0,n.jsx)("p",{className:"text-[13px] font-medium text-fg-300",children:a}),(0,n.jsx)("p",{className:"mx-auto max-w-[36ch] text-lg leading-snug text-fg-100 text-balance sm:text-xl",children:s})]})},a)})}),(0,n.jsx)(u.A,{delay:120,children:(0,n.jsx)("p",{className:"mx-auto max-w-3xl text-sm leading-relaxed text-fg-300 text-balance",children:"Analytics on top: net and gross P&L, win and day-win rates, profit factor, expectancy, R multiples, streaks, drawdown and recovery, profit concentration, and per-symbol, tag, mistake, and playbook breakdowns."})})]})}),(0,n.jsx)(C,{children:(0,n.jsx)(p.Ay,{hue:"green",hue2:"purple",children:(0,n.jsxs)("div",{children:[(0,n.jsxs)("div",{className:"grid items-start gap-6 lg:grid-cols-[1fr_1.1fr] lg:gap-12",children:[(0,n.jsx)(u.A,{children:(0,n.jsx)("h2",{className:"text-[clamp(30px,4vw,52px)] leading-[1.06] font-medium tracking-tight text-fg-100 text-balance",children:"A score that shows its formula."})}),(0,n.jsx)(u.A,{delay:100,children:(0,n.jsx)("p",{className:"max-w-xl text-base leading-relaxed text-fg-300 sm:text-lg",children:"The Edge Score is a 0 to 100 composite of six components with published weights, versioned in the repo and withheld entirely below five closed trades. No black box: the same radar the dashboard draws is the table below."})})]}),(0,n.jsx)(u.A,{delay:140,className:"mt-12",children:(0,n.jsx)("div",{className:"overflow-hidden rounded-xl border border-white/10",children:et.map((e,t)=>{let[a,s,r]=e;return(0,n.jsxs)("div",{className:"grid grid-cols-[1fr_auto] items-center gap-4 bg-surface-100 px-5 py-3.5 sm:grid-cols-[220px_1fr_auto] sm:px-6 ".concat(t>0?"border-t border-white/[0.06]":""),children:[(0,n.jsx)("p",{className:"text-sm font-medium text-fg-100",children:a}),(0,n.jsx)("p",{className:"hidden font-mono text-xs text-fg-300 sm:block",children:s}),(0,n.jsxs)("div",{className:"flex items-center gap-3",children:[(0,n.jsx)("span",{"aria-hidden":!0,className:"hidden h-1.5 rounded-full sm:block",style:{width:"".concat(4*r,"px"),background:"linear-gradient(90deg, color-mix(in srgb, var(--color-fg-100) ".concat(2.2*r,"%, transparent), color-mix(in srgb, var(--color-fg-100) ").concat(3.2*r,"%, transparent))")}}),(0,n.jsxs)("span",{className:"font-mono text-xs tabular-nums text-fg-200",children:["weight ",r]})]})]},a)})})}),(0,n.jsx)(u.A,{delay:80,children:(0,n.jsx)("p",{className:"mt-4 font-mono text-[11px] text-fg-300",children:"Score = Σ(componentᵢ \xd7 weightᵢ) / Σ weights \xb7 EDGE_SCORE_VERSION = 2"})})]})})}),(0,n.jsx)(B,{children:(0,n.jsxs)(p.Ay,{hue:"sky",hue2:"pink",glow:!1,innerClassName:"grid items-start gap-10 lg:grid-cols-2 lg:gap-16",children:[(0,n.jsx)(u.A,{children:(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsx)("h2",{className:"text-2xl font-medium tracking-tight text-fg-100 sm:text-[28px]",children:"Write the day down. Or just say it."}),(0,n.jsx)(h.iq,{children:"Every trading day gets a page: day stats, the intraday P&L curve, and autosaving notes. Type them or dictate them with browser speech recognition, zero keys, zero cost. Folders, search, and tagged notebooks hold the longer thinking; playbooks turn setups into rule checklists that Reports scores."})]})}),(0,n.jsx)(u.A,{delay:120,children:(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsx)("h2",{className:"text-2xl font-medium tracking-tight text-fg-100 sm:text-[28px]",children:"Reflection, with your own key."}),(0,n.jsx)(h.iq,{children:"Bring an Anthropic API key and the journal reflects back: session recaps, per-trade critiques, and ask-your-journal answers grounded in your own aggregates. The key is encrypted at rest, and requests go from your server to the model, nowhere else. Want your own agent to do the journaling? The hosted LuxAlgo MCP above reads and writes the journal inside LuxAlgo, as you."})]})})]})}),(0,n.jsxs)(p.Ay,{hue:"green",hue2:"sky",glow:!1,innerClassName:"grid items-center gap-10 lg:grid-cols-2 lg:gap-16",children:[(0,n.jsx)(u.A,{children:(0,n.jsxs)("div",{className:"space-y-4",children:[(0,n.jsx)("h2",{className:"text-2xl font-medium tracking-tight text-fg-100 sm:text-[28px]",children:"Running before your coffee is."}),(0,n.jsx)(h.iq,{children:"Node 22+ and pnpm, or just Docker. First run creates the SQLite database by itself; a password and at-rest encryption are one env var each when you want them. Early release: APIs and schema may still move before 1.0."})]})}),(0,n.jsx)(u.A,{delay:120,className:"min-w-0",children:(0,n.jsx)(g.A,{title:"terminal",lines:ea,typewriter:!0})})]}),(0,n.jsx)(W.A,{heading:"Your trades. Your journal. Your story.",statement:"Free inside LuxAlgo, or self-hosted. Free, forever.",hue:"green",hue2:"sky",body:"MIT-licensed, with no telemetry, ever. The free journal inside LuxAlgo runs on this same open engine, and the repo stands alone: LuxAlgo integrations are optional bridges, never dependencies.",repo:"LuxAlgo/trade-journal",repoUrl:Y,licenseLine:"MIT \xa9 LuxAlgo Global, LLC \xb7 free in LuxAlgo or self-hosted \xb7 no telemetry, ever"}),(0,n.jsx)("div",{className:"border-t border-white/[0.06] px-6 py-8",children:(0,n.jsx)("p",{className:"mx-auto max-w-3xl text-center text-xs leading-relaxed text-fg-300",children:"Trade Journal reports and analyzes what your broker reports. Nothing it computes or generates (including generated recaps, critiques, and answers
1) is investment advice, and no metric predicts future results. Verify important numbers against your brokerâs own statements."})})]})}}},e=>{e.O(0,[2227,636,6593,8792],()=>e(e.s=10386)),_N_E=e.O()}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.