[{"data":1,"prerenderedAt":1604},["ShallowReactive",2],{"work-list-en":3,"work-en-connect-atilim":1329},[4,629,1023],{"id":5,"title":6,"approach":7,"body":8,"client":595,"description":596,"draft":597,"extension":598,"href":599,"kind":600,"media":601,"mediaAlt":604,"mediaCaptions":607,"meta":610,"navigation":611,"order":612,"path":613,"problem":614,"result":615,"seo":616,"stem":617,"tech":618,"unreleased":597,"__hash__":628},"work_en\u002Fen\u002Fwork\u002Fatilim-university-web.md","Atılım University Web and VectorCMS","Preserve first, then improve: a panel built for the institution (VectorCMS) and a new site with two themes (v2, v3), keeping old addresses and content IDs; every step with tests and a rehearsed migration.",{"type":9,"value":10,"toc":572},"minimark",[11,16,20,23,28,57,61,79,83,115,119,123,129,149,160,164,172,182,186,190,201,205,210,236,240,250,265,269,273,281,285,299,303,307,315,319,322,404,408,535,539,542,546],[12,13,15],"h2",{"id":14},"context","Context",[17,18,19],"p",{},"The university's website, in use since 2018, carried the content of 313 units,\nfrom faculties to student clubs: about 4,500 pages, 6,000 news items, 9,700\nannouncements, 4,600 events, 1,358 staff profiles, 196 academic programmes and\n7,400 courses. As it grew, it became harder to manage.",[17,21,22],{},"The request came from the Directorate of Corporate Communications and\nPromotion; the server, database and access were set up on the DevOps side.\nEverything in between, product and interface design, front-end and back-end\ndevelopment, data migration, testing, security fixes and documentation, was\nmy work; I am the only developer writing code for the project.",[24,25,27],"h3",{"id":26},"the-problem","The problem",[29,30,31,39,45,51],"ul",{},[32,33,34,38],"li",{},[35,36,37],"strong",{},"Scattered content management."," Units used the same system, but\npermissions, content structures and publishing habits differed. Rules such\nas when an announcement expires or where a page sits in the menu changed\nfrom person to person.",[32,40,41,44],{},[35,42,43],{},"An ageing interface."," Mobile experience, accessibility and page speed\nlagged behind current expectations.",[32,46,47,50],{},[35,48,49],{},"Connected systems."," Staff data came from the institutional HR system,\ncourse and programme data from the ECTS database; both had to appear\nconsistently on the site.",[32,52,53,56],{},[35,54,55],{},"What could not be lost."," Tens of thousands of items, addresses linked\nfrom outside for years, search visibility and a file archive of about 50 GB.",[24,58,60],{"id":59},"goals","Goals",[62,63,64,67,70,73,76],"ol",{},[32,65,66],{},"A fast, mobile-friendly, accessible site that fits the institutional\nidentity.",[32,68,69],{},"A panel that is easy to learn, forgiving (undo, version history, recovery)\nand shaped by permissions.",[32,71,72],{},"A migration from the old site with no loss of content or addresses.",[32,74,75],{},"A codebase protected by tests and cleared by independent security audits.",[32,77,78],{},"Documentation the institution can maintain on its own.",[24,80,82],{"id":81},"principles","Principles",[29,84,85,91,97,103,109],{},[32,86,87,90],{},[35,88,89],{},"Preserve first, then improve."," Old addresses, content IDs and the data\nstructure were carried over intact; old links still working was an\nacceptance criterion ahead of any new feature.",[32,92,93,96],{},[35,94,95],{},"A single source."," Instead of synchronising two databases, I decided the\nnew system would be installed in place over the old database on migration\nday. The migration steps were rehearsed again and again on a copy of the old\ndatabase.",[32,98,99,102],{},[35,100,101],{},"Staged environments."," Every change passed through development, internal\ntesting, institutional testing and production; feedback was collected at the\nrelevant stage.",[32,104,105,108],{},[35,106,107],{},"Rules that come from users."," Listing logic, such as announcement expiry,\nupcoming \u002F past events and staff ordering, was shaped by feedback from units\nand with respect for the institutional hierarchy.",[32,110,111,114],{},[35,112,113],{},"Verifiable quality, small steps."," Every work item shipped with tests;\nlarge plans were broken into testable pieces, and each piece was approved\nbefore moving to the next.",[12,116,118],{"id":117},"what-was-built","What was built",[24,120,122],{"id":121},"vectorcms-a-panel-built-for-the-institution","VectorCMS: a panel built for the institution",[124,125],"case-figure",{"caption":126,"src":127,"side":128},"Block editor: layers panel and selection path.","media\u002Fatilim-web\u002F21-panel-blok-editor-katmanlar.webp","right",[29,130,131,137,143],{},[32,132,133,136],{},[35,134,135],{},"Block editor."," Content is made of blocks placed on a 12-column grid and\n17 module types inside them (text, gallery, video, table, accordion, tabs,\nform, survey, regulation list…). Editors edit content as it looks on the\nsite, with desktop, tablet and phone previews.",[32,138,139,142],{},[35,140,141],{},"Forgiving by design."," Undo \u002F redo, version history and restore, recovery\nof unsaved changes, a recycle bin.",[32,144,145,148],{},[35,146,147],{},"Layers panel and selection."," User tests showed editors could not tell\nwhether a block was selected, and clicks got lost on elements such as\nfull-bleed video. Solved in three steps: a click shield for embedded\ncontent, clear selection with a selection path, and a navigator-style layers\npanel.",[150,151,152,156],"case-figures",{},[124,153],{"caption":154,"src":155},"Dashboard.","media\u002Fatilim-web\u002F20-panel-gosterge-paneli.webp",[124,157],{"caption":158,"src":159},"Page tree: menu order by drag and drop.","media\u002Fatilim-web\u002F22-panel-sayfa-agaci.webp",[124,161],{"caption":162,"src":163,"side":128},"Approval flow for event locations.","media\u002Fatilim-web\u002F26-panel-lokasyon-onay.webp",[29,165,166],{},[32,167,168,171],{},[35,169,170],{},"Permission model."," 12 roles and 151 permissions; editors see only the\ncontent of units they are authorised for. Permission requests, profile change\napprovals and support requests run through the panel; every action is\nlogged.",[150,173,174,178],{},[124,175],{"caption":176,"src":177},"News editing and side column settings.","media\u002Fatilim-web\u002F23-panel-haber-duzenleme.webp",[124,179],{"caption":180,"src":181},"Popup form with live preview.","media\u002Fatilim-web\u002F24-panel-popup-onizleme.webp",[124,183],{"caption":184,"src":185},"Main menu management.","media\u002Fatilim-web\u002F25-panel-menu-yonetimi.webp",[24,187,189],{"id":188},"lossless-migration","Lossless migration",[29,191,192,195,198],{},[32,193,194],{},"Old content IDs and addresses are preserved; section names in old addresses\nredirect to their new counterparts.",[32,196,197],{},"A phased migration command that keeps a status log and can resume where it\nstopped, with a step-by-step operations and rollback plan for migration day.",[32,199,200],{},"Inconsistencies in the old data (mis-mapped fields, place names spelled\ndifferently, leftovers from the old file uploader) were identified and added\nto a fix list.",[24,202,204],{"id":203},"visitor-experience","Visitor experience",[124,206],{"caption":207,"src":208,"side":128,":tall":209},"A department's home page.","media\u002Fatilim-web\u002F03-onyuz-birim-anasayfa.webp","true",[29,211,212,218,224,230],{},[32,213,214,217],{},[35,215,216],{},"Two themes."," v2 (the current design) and v3 (an entirely new design)\nfeed from the same content; switching takes a single setting. Both sit side\nby side in the showcase at the end of the page.",[32,219,220,223],{},[35,221,222],{},"Listing logic."," University-wide announcements and featured news in their\nown windows; expired announcements move to the archive; upcoming \u002F past\nevents, with one-click add to calendar.",[32,225,226,229],{},[35,227,228],{},"Staff ordering."," Academic staff ordered by institutional hierarchy (Board\nof Trustees, Rectorate, units) and by registry order, with an alphabetical\noption.",[32,231,232,235],{},[35,233,234],{},"Mobile-first"," layout and accessibility improvements.",[124,237],{"caption":238,"src":239,":tall":209},"News: the university window and unit news.","media\u002Fatilim-web\u002F04-onyuz-haberler.webp",[150,241,242,246],{},[124,243],{"caption":244,"src":245},"Unit announcements: important items and the expired archive.","media\u002Fatilim-web\u002F05-onyuz-duyurular.webp",[124,247],{"caption":248,"src":249},"Site search, with tabs by content type.","media\u002Fatilim-web\u002F08-onyuz-arama.webp",[150,251,253,257,261],{":phones":209,"cols":252},3,[124,254],{"caption":255,"src":256,":phone":209},"Home page on a phone.","media\u002Fatilim-web\u002F10-mobil-anasayfa.webp",[124,258],{"caption":259,"src":260,":phone":209},"Unit page on a phone.","media\u002Fatilim-web\u002F11-mobil-birim.webp",[124,262],{"caption":263,"src":264,":phone":209},"Curriculum on a phone.","media\u002Fatilim-web\u002F12-mobil-akts.webp",[24,266,268],{"id":267},"integration-with-institutional-systems","Integration with institutional systems",[124,270],{"caption":271,"src":272,"side":128},"ECTS catalogue: programme curriculum.","media\u002Fatilim-web\u002F07-onyuz-akts-mufredat.webp",[29,274,275,278],{},[32,276,277],{},"Staff data updates automatically from the institutional HR system; which\ndetails appear on academic profiles is managed from the panel.",[32,279,280],{},"ECTS \u002F Bologna catalogue: 196 programmes and about 7,400 courses; current\nand archived curricula, course pages within programmes, learning outcome\nmatrices.",[24,282,284],{"id":283},"quality-and-security","Quality and security",[29,286,287,290,293,296],{},[32,288,289],{},"About 1,000 automated tests (unit and feature tests).",[32,291,292],{},"An independent penetration test: almost all findings closed, the software\nside of the rest completed.",[32,294,295],{},"A business logic audit before going live: 136 of 144 findings closed; all\ncritical findings resolved.",[32,297,298],{},"A check in development that automatically catches access to fields missing\nfrom the database; load test scenarios and operations notes.",[24,300,302],{"id":301},"documentation","Documentation",[124,304],{"caption":305,"src":306,"side":128},"In-panel guide; the annotated images are generated by code.","media\u002Fatilim-web\u002F27-panel-kullanim-kilavuzu.webp",[29,308,309,312],{},[32,310,311],{},"The user guide lives inside the panel. Its images are generated by code, not\nby hand: a script opens the panel, prepares the screen, adds numbered markers\nand highlights, and takes the capture. When the interface changes, every\nguide image is regenerated with one command.",[32,313,314],{},"Every behaviour described in the guide was verified against the code; bugs\nfound along the way went into a separate work queue.",[12,316,318],{"id":317},"delivery","Delivery",[17,320,321],{},"The institutional site (v2 and v3 themes), the VectorCMS content management\npanel, the ECTS \u002F Bologna catalogue and the in-panel user guide.",[323,324,325,336],"table",{},[326,327,328],"thead",{},[329,330,331,334],"tr",{},[332,333],"th",{},[332,335],{},[337,338,339,348,356,364,372,380,388,396],"tbody",{},[329,340,341,345],{},[342,343,344],"td",{},"Duration",[342,346,347],{},"14+ months",[329,349,350,353],{},[342,351,352],{},"Commits",[342,354,355],{},"1,373",[329,357,358,361],{},[342,359,360],{},"Releases",[342,362,363],{},"From VectorCMS 1.0 to 2.0 release candidate 12",[329,365,366,369],{},[342,367,368],{},"Panel screens \u002F components",[342,370,371],{},"113 screens, 97 components",[329,373,374,377],{},[342,375,376],{},"Database migrations",[342,378,379],{},"133",[329,381,382,385],{},[342,383,384],{},"Automated tests",[342,386,387],{},"~1,000",[329,389,390,393],{},[342,391,392],{},"Content migrated",[342,394,395],{},"~25,000 pages, news items, announcements and events",[329,397,398,401],{},[342,399,400],{},"Unit sites",[342,402,403],{},"313",[24,405,407],{"id":406},"roadmap","Roadmap",[323,409,410,423],{},[326,411,412],{},[329,413,414,417,420],{},[332,415,416],{},"Period",[332,418,419],{},"Stage",[332,421,422],{},"Output",[337,424,425,436,447,458,469,480,491,502,513,524],{},[329,426,427,430,433],{},[342,428,429],{},"Jul – Aug 2025",[342,431,432],{},"Discovery and design system",[342,434,435],{},"Institutional design language, inner page template, first front-end prototype, navigation architecture",[329,437,438,441,444],{},[342,439,440],{},"Sep – Nov 2025",[342,442,443],{},"Content model and panel core",[342,445,446],{},"The first VectorCMS release",[329,448,449,452,455],{},[342,450,451],{},"Nov 2025 – Jan 2026",[342,453,454],{},"Maintenance window",[342,456,457],{},"Broke my left elbow; two plates went in. The only system upgraded in this period was the developer.",[329,459,460,463,466],{},[342,461,462],{},"Jan 2026",[342,464,465],{},"Panel launch",[342,467,468],{},"VectorCMS 1.0: version history, activity log, popups and drafts, form builder",[329,470,471,474,477],{},[342,472,473],{},"Feb – Mar 2026",[342,475,476],{},"New site, first release candidate",[342,478,479],{},"Home page management, recycle bin, site search, media, mobile and accessibility",[329,481,482,485,488],{},[342,483,484],{},"Apr 2026",[342,486,487],{},"Multilingual content and migration strategy",[342,489,490],{},"Turkish \u002F English content; single-database decision and migration rehearsal",[329,492,493,496,499],{},[342,494,495],{},"Apr – May 2026",[342,497,498],{},"Security",[342,500,501],{},"Independent penetration test; findings closed, stability release",[329,503,504,507,510],{},[342,505,506],{},"Jun 2026",[342,508,509],{},"Institutional test environment",[342,511,512],{},"Surveys, form improvements; feedback from management and units",[329,514,515,518,521],{},[342,516,517],{},"Sep 2026",[342,519,520],{},"Audit and new interface",[342,522,523],{},"Business logic audit; the panel's redesigned interface; the site's v3 theme; load test preparation",[329,525,526,529,532],{},[342,527,528],{},"Oct 2026",[342,530,531],{},"User experience and documentation",[342,533,534],{},"Layers panel and selection improvements in the block editor; user guide with annotated images",[12,536,538],{"id":537},"current-state","Current state",[17,540,541],{},"Started in July 2025 and ongoing. The launch date depends on the\ninstitution's approval processes more than on technical readiness, so each\nstage was planned to be usable on its own.",[24,543,545],{"id":544},"what-i-learned","What I learned",[29,547,548,554,560,566],{},[32,549,550,553],{},[35,551,552],{},"Old data was the biggest unknown."," Even a migration that looks\ntechnically correct can carry the old system's habits (fields used for\ndifferent purposes, the same place spelled differently). Putting screens\nside by side with the old site and tracing each difference down to the data\nproved the most reliable method.",[32,555,556,559],{},[35,557,558],{},"Feedback surfaces rules the code does not show."," Feedback from deans'\noffices and units brought out rules of hierarchy and wording (staff\nordering, \"System Administrator\" instead of \"IT support\").",[32,561,562,565],{},[35,563,564],{},"Repeated work should be automated."," Migration rehearsals, tests, guide\nimages and audits run as commands; this kept both speed and consistency.",[32,567,568,571],{},[35,569,570],{},"Verification discipline in AI-assisted development."," I used AI tools in\ndevelopment. They saved time, but I saw that they could also produce\nunverified assumptions in business logic carried over from the old system. I\nbalanced this with checks that verify every behaviour against the source\n(old code, the real data schema) and catch problems automatically.",{"title":573,"searchDepth":574,"depth":574,"links":575},"",2,[576,581,589,592],{"id":14,"depth":574,"text":15,"children":577},[578,579,580],{"id":26,"depth":252,"text":27},{"id":59,"depth":252,"text":60},{"id":81,"depth":252,"text":82},{"id":117,"depth":574,"text":118,"children":582},[583,584,585,586,587,588],{"id":121,"depth":252,"text":122},{"id":188,"depth":252,"text":189},{"id":203,"depth":252,"text":204},{"id":267,"depth":252,"text":268},{"id":283,"depth":252,"text":284},{"id":301,"depth":252,"text":302},{"id":317,"depth":574,"text":318,"children":590},[591],{"id":406,"depth":252,"text":407},{"id":537,"depth":574,"text":538,"children":593},[594],{"id":544,"depth":252,"text":545},"Atılım University","Rebuilding the institutional site that carries 313 unit sites, with a content management panel built for it; a migration from the old site that loses no content and no addresses.",false,"md",null,"institutional web · content management",[602,603],"media\u002Fatilim-web\u002F01-onyuz-anasayfa-ust.webp","media\u002Fatilim-web\u002F09-onyuz-mevcut-tasarim-anasayfa.webp",[605,606],"Atılım University website, v3 theme home page: campus photo with announcement and event panels","Atılım University website, v2 theme home page",[608,609],"v3 theme","v2 theme",{},true,1,"\u002Fen\u002Fwork\u002Fatilim-university-web","The site in use since 2018 had grown into a structure carrying the content of more than 300 units and getting harder to manage; tens of thousands of items and addresses linked from outside for years had to survive.","A panel shaped by 12 roles and 151 permissions, a migration plan that carries about 25,000 items without loss, about 1,000 automated tests and a codebase that passed independent audits.",{"title":6,"description":596},"en\u002Fwork\u002Fatilim-university-web",[619,620,621,622,623,624,625,626,627],"laravel","vue","primevue","blade","alpine.js","tailwind","mysql","playwright","pest","HrFMYOy3_zxpZwm9Cu8_efYoXc1EBWrViAoJibrQIJU",{"id":630,"title":631,"approach":632,"body":633,"client":595,"description":1000,"draft":597,"extension":598,"href":1001,"kind":1002,"media":1003,"mediaAlt":1006,"mediaCaptions":1009,"meta":1012,"navigation":611,"order":574,"path":1013,"problem":1014,"result":1015,"seo":1016,"stem":1017,"tech":1018,"unreleased":597,"__hash__":1022},"work_en\u002Fen\u002Fwork\u002Fconnect-atilim.md","Atılım Connect","Content separate from code, managed entirely from the panel; automation proposes, a person approves; unused modules are removed, versions kept current with tests.",{"type":9,"value":634,"toc":980},[635,637,640,644,647,661,663,695,697,701,705,708,719,723,727,730,734,737,741,745,748,752,756,759,763,766,769,779,789,793,796,798,801,804,870,872,941,943,946,948],[12,636,15],{"id":14},[17,638,639],{},"Atılım Connect is a portal for prospective students to get to know the\nuniversity, explore departments and apply for things like campus tours, fed\nentirely from its admin panel. I am the project's only developer; server and\ndeployment processes run together with the institution's DevOps team.",[24,641,643],{"id":642},"problem-and-goals","Problem and goals",[17,645,646],{},"The main site addressed the whole institution; there was no fast,\neasy-to-update channel focused on the prospective student's decision journey.\nGoals:",[29,648,649,652,655,658],{},[32,650,651],{},"Bring everything a prospective student looks for (departments, fees,\nscholarships, campus life, application forms) under one roof.",[32,653,654],{},"Make all content manageable from the panel, without a developer.",[32,656,657],{},"Run high-demand processes such as campus tours through verified online forms\ninstead of the phone.",[32,659,660],{},"Keep academic structure data (faculty, department, head) consistent with the\nmain site; end double data entry.",[24,662,82],{"id":81},[29,664,665,671,677,683,689],{},[32,666,667,670],{},[35,668,669],{},"Content is separate from code."," From the hero to statistic cards, from\nmenus to news, everything is managed from the panel; a design change does\nnot stop content operations.",[32,672,673,676],{},[35,674,675],{},"Automation proposes, a person approves."," The sync that pulls data from\nthe main site never changes a record on its own; it lists differences and\nleaves the decision to the editor.",[32,678,679,682],{},[35,680,681],{},"No dead weight."," Seven unused modules (appointments, scholarship\ncalculator, FAQ and similar) were identified and removed from the codebase\nentirely.",[32,684,685,688],{},[35,686,687],{},"Versions stay current."," Framework and package versions are upgraded\nwithout delay, verified by automated browser tests.",[32,690,691,694],{},[35,692,693],{},"Visitor data stays with us and is collected with consent."," Analytics\nwrites not a single row before cookie consent.",[12,696,118],{"id":117},[24,698,700],{"id":699},"sms-verified-form-system","SMS-verified form system",[124,702],{"caption":703,"src":704,"side":128,":tall":209},"Campus tour application: a dynamic form with SMS verification.","media\u002Fconnect\u002F16-basvuru-formu.webp",[17,706,707],{},"Campus tour applications ran on phone traffic. I wrote a form engine in which\nevery part, fields, button labels and info boxes included, can be built from\nthe panel.",[29,709,710,713,716],{},[32,711,712],{},"The phone number is verified with a one-time SMS code, the email address\nwith a confirmation link.",[32,714,715],{},"The school field searches live across more than 14,000 school records in\nTurkey.",[32,717,718],{},"Submissions land in the panel and notify the responsible staff by email.",[124,720],{"caption":721,"src":722},"Form management: title, description and message settings.","media\u002Fconnect\u002F14-panel-form-yonetimi.webp",[24,724,726],{"id":725},"approved-academic-sync-with-the-main-site","Approved academic sync with the main site",[17,728,729],{},"As details such as department heads, phone numbers and web addresses changed\non the main site, the portal fell behind. I wrote a command that scans the\nmain site regularly; it writes the differences it finds to a queue as\n\"pending\" and shows the current value beside the site's value in the panel,\nwith a confidence score. The editor applies or ignores each difference with\none click; the system never changes a record on its own.",[124,731],{"caption":732,"src":733},"Site sync: list of differences and the apply \u002F ignore flow (personal details blurred).","media\u002Fconnect\u002F15-panel-akademik-senkron.webp",[17,735,736],{},"Turkish was the hard part here: dotted and dotless I conversions, spelling\nvariants such as \"Anabilim Dalı\" and \"Ana Bilim Dalı\", and department names\nwith their word order reversed called for matching based on word sets.",[24,738,740],{"id":739},"visitor-analytics-that-need-consent","Visitor analytics that need consent",[124,742],{"caption":743,"src":744,"side":128},"Visitor summary in the panel; the figures shown are local test data.","media\u002Fconnect\u002F11-panel-gosterge.webp",[17,746,747],{},"We wanted to see visitor behaviour without moving the data elsewhere. I wrote\na session-based tracking layer: device type, page views and popular pages are\nsummarised in the panel. Tracking does not run at all until analytics consent\nis given in the cookie banner; without a decision, not a single record is\nwritten.",[24,749,751],{"id":750},"content-operations-in-the-panel","Content operations in the panel",[124,753],{"caption":754,"src":755,"side":128},"Pulled news: publishing approval for news from the main site.","media\u002Fconnect\u002F13-panel-haber-listesi.webp",[17,757,758],{},"News published on the main site is pulled automatically; in the panel's\n\"Pulled News\" list the editor toggles which items appear on the portal.\nHand-written news, announcements, events, the hero, menus and pages are\nmanaged from the same panel. Day-to-day running of the portal is in the\ncontent team's hands.",[24,760,762],{"id":761},"design-system-refresh","Design system refresh",[124,764],{"caption":255,"src":765,"side":128,":phone":209},"media\u002Fconnect\u002F03-anasayfa-telefon.webp",[17,767,768],{},"To leave the template look of the first version behind, the whole front end\nwas rebuilt on design tokens in summer 2026: an original type pairing,\nvariables derived from the institution's colours, a header with a mega menu,\nan infographic \"Why Atılım\" page and a single template with a sticky sidebar\nfor inner pages. New sections now open with the same component set.",[150,770,771,775],{},[124,772],{"caption":773,"src":774,":tall":209},"Why Atılım: ten cards with SVG infographics.","media\u002Fconnect\u002F08-neden-atilim.webp",[124,776],{"caption":777,"src":778,":tall":209},"Campus life page.","media\u002Fconnect\u002F09-kampus-yasami.webp",[150,780,781,785],{},[124,782],{"caption":783,"src":784},"News list.","media\u002Fconnect\u002F06-haberler.webp",[124,786],{"caption":787,"src":788},"News detail page.","media\u002Fconnect\u002F07-haber-detay.webp",[24,790,792],{"id":791},"keeping-the-framework-current","Keeping the framework current",[17,794,795],{},"The project moved from Laravel 11 to 12, Filament 3 to 5 and Tailwind to 4.\nThe big jumps were made in an isolated working copy; the list and create\nscreens of 36 panel resources were verified with Playwright before merging.\nDeployment also moved from copying files by hand to a scripted pipeline on\nGitLab CI.",[12,797,318],{"id":317},[17,799,800],{},"The live portal, the content management panel, the SMS-verified form engine,\nsync with the main site and in-panel visitor analytics.",[17,802,803],{},"The figures below were read from the development copy's database; content\ncounts in production are higher.",[323,805,806,814],{},[326,807,808],{},[329,809,810,812],{},[332,811],{},[332,813],{},[337,815,816,824,832,840,848,855,862],{},[329,817,818,821],{},[342,819,820],{},"Academic units",[342,822,823],{},"14 (7 faculties, 4 schools, 3 institutes), 76 departments",[329,825,826,829],{},[342,827,828],{},"Content",[342,830,831],{},"102 pulled news items, 54 announcements, 43 events, 15 managed pages",[329,833,834,837],{},[342,835,836],{},"School records (form search)",[342,838,839],{},"14,125",[329,841,842,845],{},[342,843,844],{},"Pending sync proposals",[342,846,847],{},"250",[329,849,850,852],{},[342,851,352],{},[342,853,854],{},"173",[329,856,857,859],{},[342,858,376],{},[342,860,861],{},"76",[329,863,864,867],{},[342,865,866],{},"Panel resources",[342,868,869],{},"25",[24,871,407],{"id":406},[323,873,874,883],{},[326,875,876],{},[329,877,878,880],{},[332,879,416],{},[332,881,882],{},"What happened",[337,884,885,893,901,909,917,925,933],{},[329,886,887,890],{},[342,888,889],{},"Jun 2025",[342,891,892],{},"Setup: Laravel + Filament skeleton, academic hierarchy model (faculty, school, institute, department), multilingual groundwork, hero and carousel management, first version of the form system",[329,894,895,898],{},[342,896,897],{},"Jul 2025",[342,899,900],{},"Going live: production settings, media and asset pipeline, first real content",[329,902,903,906],{},[342,904,905],{},"Sep 2025",[342,907,908],{},"Operations: visitor analytics tracked from the panel; scope cleanup (seven unused modules, more than 29 files and 8 tables removed)",[329,910,911,914],{},[342,912,913],{},"Oct – Dec 2025",[342,915,916],{},"Post-launch improvements and small fixes",[329,918,919,922],{},[342,920,921],{},"Mar – May 2026",[342,923,924],{},"Infrastructure maintenance; the form system grows into its SMS-verified version",[329,926,927,930],{},[342,928,929],{},"Jul 2026",[342,931,932],{},"Major refresh: new design system, Laravel 12 + Filament 5 + Tailwind 4, approved sync with the main site, GitLab CI deployment, rewritten \"Why Atılım\" and \"Campus Life\" pages",[329,934,935,938],{},[342,936,937],{},"Aug – Sep 2026",[342,939,940],{},"Content and measurement touch-ups",[12,942,538],{"id":537},[17,944,945],{},"Live since July 2025, development ongoing. The English version was\ntemporarily closed, with its data kept, because there was no capacity to keep\nits content current; the steps to reopen it are documented.",[24,947,545],{"id":544},[29,949,950,956,962,968,974],{},[32,951,952,955],{},[35,953,954],{},"Turkish is its own discipline in text processing."," Because of dotted I\nconversion, suffixes breaking word boundaries and different spellings of the\nsame name, plain text comparison did not work for the sync; normalisation\nand word-set matching were needed.",[32,957,958,961],{},[35,959,960],{},"Removing features is engineering too."," Clearing every trace of seven\nmodules, models, panel resources, migrations and tables included, took more\ncare than adding them; but it lowered the maintenance load for good.",[32,963,964,967],{},[35,965,966],{},"Multilingual is not free."," Building TR \u002F EN groundwork from the start was\nright; keeping English live without capacity to maintain it was wrong.\nClosing it with the data kept and documenting how to reopen gave the best of\nboth.",[32,969,970,973],{},[35,971,972],{},"Big upgrades do not reach the main branch untested."," The Filament 5 move\nwas done in an isolated copy, verifying real create-edit-save flows with\nbrowser automation; there were no surprises in production.",[32,975,976,979],{},[35,977,978],{},"Working with institutional processes is part of technical decisions."," The\ndeployment pipeline followed the model the DevOps team preferred; settling\nrules early, such as running database migrations by hand and under control\nrather than in deploy scripts, prevented surprises.",{"title":573,"searchDepth":574,"depth":574,"links":981},[982,986,994,997],{"id":14,"depth":574,"text":15,"children":983},[984,985],{"id":642,"depth":252,"text":643},{"id":81,"depth":252,"text":82},{"id":117,"depth":574,"text":118,"children":987},[988,989,990,991,992,993],{"id":699,"depth":252,"text":700},{"id":725,"depth":252,"text":726},{"id":739,"depth":252,"text":740},{"id":750,"depth":252,"text":751},{"id":761,"depth":252,"text":762},{"id":791,"depth":252,"text":792},{"id":317,"depth":574,"text":318,"children":995},[996],{"id":406,"depth":252,"text":407},{"id":537,"depth":574,"text":538,"children":998},[999],{"id":544,"depth":252,"text":545},"A portal for the prospective student's decision journey, fed entirely from its panel: SMS-verified forms, approved sync with the main site, visitor analytics that run only with consent.","https:\u002F\u002Fconnect.atilim.edu.tr","prospective student portal",[1004,1005],"media\u002Fconnect\u002F01-anasayfa-hero.webp","media\u002Fconnect\u002F12-panel-icerik-editoru.webp",[1007,1008],"Atılım Connect prospective student portal home page: campus images and the \"Why Atılım?\" list","Atılım Connect admin panel, content editor",[1010,1011],"portal","admin panel",{},"\u002Fen\u002Fwork\u002Fconnect-atilim","The main site addressed the whole institution; there was no fast, easy-to-update channel focused on the prospective student's decision journey. Campus tour applications ran over the phone.","Live since July 2025: an SMS-verified form engine, approved academic sync with the main site, analytics that write nothing without consent; day-to-day running is in the content team's hands.",{"title":631,"description":1000},"en\u002Fwork\u002Fconnect-atilim",[619,1019,1020,624,625,626,1021],"filament","livewire","gitlab ci","_QJ6Dh1MNq5VLVivFvjIT9R9gobSUVxGCYpRyf0Hzoo",{"id":1024,"title":1025,"approach":1026,"body":1027,"client":595,"description":1305,"draft":597,"extension":598,"href":599,"kind":1306,"media":1307,"mediaAlt":1310,"mediaCaptions":1313,"meta":1316,"navigation":611,"order":252,"path":1317,"problem":1318,"result":1319,"seo":1320,"stem":1321,"tech":1322,"unreleased":611,"__hash__":1328},"work_en\u002Fen\u002Fwork\u002Frequest-workflow.md","Corporate communications request and workflow system","Format first, then code: forms and workflows are defined as schemas and changed with editors inside the panel; rules are the same on client and server; forms and workflows are versioned.",{"type":9,"value":1028,"toc":1285},[1029,1031,1034,1037,1041,1043,1060,1062,1094,1097,1099,1103,1107,1110,1114,1118,1121,1125,1129,1132,1136,1140,1143,1147,1151,1154,1157,1161,1165,1168,1178,1182,1186,1189,1199,1203,1207,1211,1214,1218,1221,1223,1226,1229,1252,1254,1257,1259],[12,1030,15],{"id":14},[17,1032,1033],{},"An application that gathers the web page, graphic design, email announcement,\nweb announcement and news requests sent to the Directorate of Corporate\nCommunications and Promotion into one system. Staff submit a request through\nits own form; the Directorate approves it, assigns it to someone on the\nrelevant team, asks for revisions if needed and delivers. The same system lets\nthe promotion team measure school visits and fairs without keeping personal\ndata.",[17,1035,1036],{},"I am the product owner and developer; development ran with an AI coding\nassistant (Claude Code). The interface was implemented from a design project\nprepared beforehand.",[124,1038],{"caption":1039,"src":1040,"side":128},"Choosing a request type: a separate form and an estimated duration for each.","media\u002Ftalep\u002F02-talep-turu-secimi.webp",[24,1042,60],{"id":59},[29,1044,1045,1048,1051,1054,1057],{},[32,1046,1047],{},"A form and a process of its own for each request type, but one shared view.",[32,1049,1050],{},"Transparency for the requester: which stage, with whom, when it will be\ndelivered.",[32,1052,1053],{},"A view of workload, delays and service-time targets for management.",[32,1055,1056],{},"A structure that needs no code to change forms and processes.",[32,1058,1059],{},"Numeric measurement of promotion events without keeping prospective student\ndata.",[24,1061,82],{"id":81},[29,1063,1064,1070,1076,1082,1088],{},[32,1065,1066,1069],{},[35,1067,1068],{},"Format first, then code."," Form and workflow schemas were documented and\nvalidated with examples before any code; everything after rested on that\ncontract.",[32,1071,1072,1075],{},[35,1073,1074],{},"Rules in one place."," Conditions are evaluated with the same rules on the\nclient and the server; server validation is always binding.",[32,1077,1078,1081],{},[35,1079,1080],{},"History does not break."," Forms and workflows are versioned; an open\nrequest continues on the version it started with.",[32,1083,1084,1087],{},[35,1085,1086],{},"Visibility by role."," Each user sees only what concerns them.",[32,1089,1090,1093],{},[35,1091,1092],{},"Working with AI, I stay in control."," I set the decisions, scope and\nrelease steps; at every stage I checked the tests, static analysis and\nscreens myself.",[17,1095,1096],{},"The data in the screenshots is sample data: personal names were replaced with\nrole labels; the product name, request numbers and unit names are blurred.",[12,1098,118],{"id":117},[24,1100,1102],{"id":1101},"schema-based-forms","Schema-based forms",[124,1104],{"caption":1105,"src":1106,"side":128,":tall":209},"New request form: fields that open with each choice, and a process summary.","media\u002Ftalep\u002F03-yeni-talep-formu.webp",[17,1108,1109],{},"Each of the five request types needs different fields, and those needs\nchange. Forms are defined with a JSON schema: sections, field types,\nconditionally visible and conditionally required fields. The form editor in\nthe panel edits this schema visually, locks the identifiers of published\nfields and stores every publication as a new version.",[124,1111],{"caption":1112,"src":1113},"Form editor: field types and conditional fields.","media\u002Ftalep\u002F12-form-builder.webp",[24,1115,1117],{"id":1116},"visual-workflow-engine","Visual workflow engine",[17,1119,1120],{},"Some requests need approval, some go straight to the team; the process varies\nby type and content. The workflow is modelled as a graph of state, condition,\naction and wait steps. Transitions are role-based; a condition step branches\non the request's content (small fixes skip approval, for example). Actions\nsend notifications and make assignments; wait steps set reminders before the\ndue date. The workflow is managed in a visual editor on a canvas, which\nvalidates the graph before publishing and offers role-based simulation.",[124,1122],{"caption":1123,"src":1124},"Workflow canvas: state, condition, action and wait steps; role-based transitions, condition branches on their own line.","media\u002Ftalep\u002F19-akis-tuvali.webp",[124,1126],{"caption":1127,"src":1128,"side":128},"Role and state simulation: which transitions and fields a role sees in a given state.","media\u002Ftalep\u002F25-akis-simulasyonu.webp",[17,1130,1131],{},"Before publishing, the simulation shows the workflow through a role's eyes:\nwhich action buttons appear for the chosen role and state, and which fields\ncan be edited. Wiring a transition to the wrong role is caught before it goes\nlive.",[24,1133,1135],{"id":1134},"rule-bound-kanban","Rule-bound kanban",[124,1137],{"caption":1138,"src":1139,"side":128},"Approval step: an assignee and an estimated delivery are asked for on approval.","media\u002Ftalep\u002F13-onay-diyalogu.webp",[17,1141,1142],{},"A drag-and-drop board is handy but can easily bypass the process. When a card\nis dropped, the server checks whether a defined transition exists between the\ntwo stages that the user is authorised for. Transitions that need more\ninformation open a dialog; undefined or unauthorised drops are rejected with\nan explanation.",[24,1144,1146],{"id":1145},"requests-pinned-to-a-version-and-semantic-stages","Requests pinned to a version, and semantic stages",[124,1148],{"caption":1149,"src":1150,"side":128,":tall":209},"A request on the management side: event log, state change and internal notes.","media\u002Ftalep\u002F10-talep-detayi-yonetim.webp",[17,1152,1153],{},"Every request is tied to the workflow version it started on. When a new\nversion is published, open requests are unaffected; if the manager chooses,\nthey are moved by mapping old stages to new ones, and the step is written to\nthe event log.",[17,1155,1156],{},"Workflows could change freely in the editor, but the dashboard, reports and\nservice-time indicators looked at specific stage names; renaming a stage would\nhave left those screens silently empty. Stages gained semantic types\n(approval, in progress, revision, done) and transitions an intent (approve,\nreject, ask for information). Screens now look at meaning, not names.",[24,1158,1160],{"id":1159},"through-the-requester-s-eyes","Through the requester's eyes",[124,1162],{"caption":1163,"src":1164,"side":128,":tall":209},"Requester: status timeline, revision request and available actions.","media\u002Ftalep\u002F04-talep-detayi-talep-eden.webp",[17,1166,1167],{},"Requesters see on their own screen which stage their request is at, with whom\nit is waiting and when it will be delivered, and answer revision requests\nfrom there. Every screen does the same job on a phone.",[150,1169,1170,1174],{":phones":209,"cols":574},[124,1171],{"caption":1172,"src":1173,":tall":209,":phone":209},"Choosing a request type on a phone.","media\u002Ftalep\u002F21-telefon-talep-turu.webp",[124,1175],{"caption":1176,"src":1177,":tall":209,":phone":209},"New request form on a phone.","media\u002Ftalep\u002F22-telefon-yeni-talep.webp",[24,1179,1181],{"id":1180},"management-view-and-reports","Management view and reports",[124,1183],{"caption":1184,"src":1185,"side":128,":tall":209},"Reports: durations by type and unit, revision rate, service-time compliance.","media\u002Ftalep\u002F11-raporlar.webp",[17,1187,1188],{},"The management dashboard shows pending approvals, delays and team load\ntogether; the request list filters by type, unit, assignee and stage. Reports\nsummarise durations by type and unit, the revision rate and compliance with\nservice-time targets.",[150,1190,1191,1195],{},[124,1192],{"caption":1193,"src":1194},"Management dashboard: pending approvals, delays and team load.","media\u002Ftalep\u002F05-yonetim-panosu.webp",[124,1196],{"caption":1197,"src":1198},"Workflow status: load at each stage of every request type, with a bottleneck warning.","media\u002Ftalep\u002F08-talepler-akis-durumu.webp",[124,1200],{"caption":1201,"src":1202},"Request list: filtering by type, unit, assignee and stage.","media\u002Ftalep\u002F06-talepler-liste.webp",[24,1204,1206],{"id":1205},"measuring-events-without-personal-data","Measuring events without personal data",[124,1208],{"caption":1209,"src":1210,"side":128},"Event term report: distribution by type, province, cost and staff.","media\u002Ftalep\u002F17-etkinlik-raporu.webp",[17,1212,1213],{},"The promotion team wants to see the effect of school visits and fairs, but\nnot to keep prospective student data. The module stores only numeric outputs\n(visitors, conversations, number of forms collected), records per institution\nand cost items; the calendar, institution directory and term report work from\nthese.",[24,1215,1217],{"id":1216},"role-based-visibility-and-security","Role-based visibility and security",[17,1219,1220],{},"The same system is used by requesting staff, managers, delivery teams and the\npromotion team. Every screen and action is authorised on the server; delivery\nstaff see only their own team's requests, promotion staff only the events they\nare assigned to. An internal security review was carried out; all findings\nwere fixed and each is covered by an automated test.",[12,1222,318],{"id":317},[17,1224,1225],{},"The requester application, the management panel, the form editor, the visual\nworkflow editor and the promotion events module; five request types with\nready-made workflows. Unit, feature and browser tests and static analysis are\npart of every stage.",[17,1227,1228],{},"Development ran in September 2026, over about two weeks, in this order:",[62,1230,1231,1234,1237,1240,1243,1246,1249],{},[32,1232,1233],{},"Documenting the form and workflow schema formats.",[32,1235,1236],{},"Data layer, schema validator and workflow engine.",[32,1238,1239],{},"Requester and management screens; kanban and reports.",[32,1241,1242],{},"Form editor, report export and the visual workflow editor.",[32,1244,1245],{},"Promotion events module.",[32,1247,1248],{},"Role-based sign-in and menus, first internal installation.",[32,1250,1251],{},"Internal security review and hardening.",[12,1253,538],{"id":537},[17,1255,1256],{},"In internal testing; not yet launched, development ongoing. Real usage figures\n(numbers of requests and users) are therefore not given.",[24,1258,545],{"id":544},[29,1260,1261,1267,1273,1279],{},[32,1262,1263,1266],{},[35,1264,1265],{},"Flexibility creates new dependencies."," The more freedom the visual editor\ngave, the more fragile every screen that looked at that structure by name\nbecame. Embedding meaning in the structure (stage types) solved today's\nproblem and prepared the system to open up to other units.",[32,1268,1269,1272],{},[35,1270,1271],{},"A documented contract buys speed."," Writing the schema formats first let\nthe following stages move consistently within a few days.",[32,1274,1275,1278],{},[35,1276,1277],{},"Working locally is not enough."," The first internal installation surfaced\na gap not noticed locally; tying installation to a repeatable script catches\nsuch problems early.",[32,1280,1281,1284],{},[35,1282,1283],{},"Productivity with AI, but only with discipline."," The assistant produces\nfast; quality came from tests, static analysis and screen checks at every\nstage. I kept scope, security decisions and release steps to myself.",{"title":573,"searchDepth":574,"depth":574,"links":1286},[1287,1291,1301,1302],{"id":14,"depth":574,"text":15,"children":1288},[1289,1290],{"id":59,"depth":252,"text":60},{"id":81,"depth":252,"text":82},{"id":117,"depth":574,"text":118,"children":1292},[1293,1294,1295,1296,1297,1298,1299,1300],{"id":1101,"depth":252,"text":1102},{"id":1116,"depth":252,"text":1117},{"id":1134,"depth":252,"text":1135},{"id":1145,"depth":252,"text":1146},{"id":1159,"depth":252,"text":1160},{"id":1180,"depth":252,"text":1181},{"id":1205,"depth":252,"text":1206},{"id":1216,"depth":252,"text":1217},{"id":317,"depth":574,"text":318},{"id":537,"depth":574,"text":538,"children":1303},[1304],{"id":544,"depth":252,"text":545},"An application that gathers the web, design, announcement and news requests sent to a directorate into one system, with forms and approval processes designed from the panel.","request and workflow management",[1308,1309],"media\u002Ftalep\u002F18-akis-editoru.webp","media\u002Ftalep\u002F07-talepler-kanban.webp",[1311,1312],"Workflow editor: node list, flow diagram and status properties panel","Requests on a kanban board, in status columns",[1314,1315],"workflow editor","kanban",{},"\u002Fen\u002Fwork\u002Frequest-workflow","Requests arrived through scattered channels; which request was at which stage, and with whom it was waiting, could not be seen at a glance. Each request type needed different information and a different process.","A transparent process for requesters, a dashboard, kanban and reports for management; a new request type or approval step can be added without waiting for a developer.",{"title":1025,"description":1305},"en\u002Fwork\u002Frequest-workflow",[619,1323,620,1324,624,1325,1326,1327,627,626],"inertia","typescript","vue flow","json schema","jsonlogic","hcwjyyVOE8Lyfv_J1cJSpgd29DiWgB6TSXkRCq-TWS4",{"id":630,"title":631,"approach":632,"body":1330,"client":595,"description":1000,"draft":597,"extension":598,"href":1001,"kind":1002,"media":1598,"mediaAlt":1599,"mediaCaptions":1600,"meta":1601,"navigation":611,"order":574,"path":1013,"problem":1014,"result":1015,"seo":1602,"stem":1017,"tech":1603,"unreleased":597,"__hash__":1022},{"type":9,"value":1331,"toc":1578},[1332,1334,1336,1338,1340,1350,1352,1374,1376,1378,1380,1382,1390,1392,1394,1396,1398,1400,1402,1404,1406,1408,1410,1412,1414,1416,1418,1424,1430,1432,1434,1436,1438,1440,1494,1496,1550,1552,1554,1556],[12,1333,15],{"id":14},[17,1335,639],{},[24,1337,643],{"id":642},[17,1339,646],{},[29,1341,1342,1344,1346,1348],{},[32,1343,651],{},[32,1345,654],{},[32,1347,657],{},[32,1349,660],{},[24,1351,82],{"id":81},[29,1353,1354,1358,1362,1366,1370],{},[32,1355,1356,670],{},[35,1357,669],{},[32,1359,1360,676],{},[35,1361,675],{},[32,1363,1364,682],{},[35,1365,681],{},[32,1367,1368,688],{},[35,1369,687],{},[32,1371,1372,694],{},[35,1373,693],{},[12,1375,118],{"id":117},[24,1377,700],{"id":699},[124,1379],{"caption":703,"src":704,"side":128,":tall":209},[17,1381,707],{},[29,1383,1384,1386,1388],{},[32,1385,712],{},[32,1387,715],{},[32,1389,718],{},[124,1391],{"caption":721,"src":722},[24,1393,726],{"id":725},[17,1395,729],{},[124,1397],{"caption":732,"src":733},[17,1399,736],{},[24,1401,740],{"id":739},[124,1403],{"caption":743,"src":744,"side":128},[17,1405,747],{},[24,1407,751],{"id":750},[124,1409],{"caption":754,"src":755,"side":128},[17,1411,758],{},[24,1413,762],{"id":761},[124,1415],{"caption":255,"src":765,"side":128,":phone":209},[17,1417,768],{},[150,1419,1420,1422],{},[124,1421],{"caption":773,"src":774,":tall":209},[124,1423],{"caption":777,"src":778,":tall":209},[150,1425,1426,1428],{},[124,1427],{"caption":783,"src":784},[124,1429],{"caption":787,"src":788},[24,1431,792],{"id":791},[17,1433,795],{},[12,1435,318],{"id":317},[17,1437,800],{},[17,1439,803],{},[323,1441,1442,1450],{},[326,1443,1444],{},[329,1445,1446,1448],{},[332,1447],{},[332,1449],{},[337,1451,1452,1458,1464,1470,1476,1482,1488],{},[329,1453,1454,1456],{},[342,1455,820],{},[342,1457,823],{},[329,1459,1460,1462],{},[342,1461,828],{},[342,1463,831],{},[329,1465,1466,1468],{},[342,1467,836],{},[342,1469,839],{},[329,1471,1472,1474],{},[342,1473,844],{},[342,1475,847],{},[329,1477,1478,1480],{},[342,1479,352],{},[342,1481,854],{},[329,1483,1484,1486],{},[342,1485,376],{},[342,1487,861],{},[329,1489,1490,1492],{},[342,1491,866],{},[342,1493,869],{},[24,1495,407],{"id":406},[323,1497,1498,1506],{},[326,1499,1500],{},[329,1501,1502,1504],{},[332,1503,416],{},[332,1505,882],{},[337,1507,1508,1514,1520,1526,1532,1538,1544],{},[329,1509,1510,1512],{},[342,1511,889],{},[342,1513,892],{},[329,1515,1516,1518],{},[342,1517,897],{},[342,1519,900],{},[329,1521,1522,1524],{},[342,1523,905],{},[342,1525,908],{},[329,1527,1528,1530],{},[342,1529,913],{},[342,1531,916],{},[329,1533,1534,1536],{},[342,1535,921],{},[342,1537,924],{},[329,1539,1540,1542],{},[342,1541,929],{},[342,1543,932],{},[329,1545,1546,1548],{},[342,1547,937],{},[342,1549,940],{},[12,1551,538],{"id":537},[17,1553,945],{},[24,1555,545],{"id":544},[29,1557,1558,1562,1566,1570,1574],{},[32,1559,1560,955],{},[35,1561,954],{},[32,1563,1564,961],{},[35,1565,960],{},[32,1567,1568,967],{},[35,1569,966],{},[32,1571,1572,973],{},[35,1573,972],{},[32,1575,1576,979],{},[35,1577,978],{},{"title":573,"searchDepth":574,"depth":574,"links":1579},[1580,1584,1592,1595],{"id":14,"depth":574,"text":15,"children":1581},[1582,1583],{"id":642,"depth":252,"text":643},{"id":81,"depth":252,"text":82},{"id":117,"depth":574,"text":118,"children":1585},[1586,1587,1588,1589,1590,1591],{"id":699,"depth":252,"text":700},{"id":725,"depth":252,"text":726},{"id":739,"depth":252,"text":740},{"id":750,"depth":252,"text":751},{"id":761,"depth":252,"text":762},{"id":791,"depth":252,"text":792},{"id":317,"depth":574,"text":318,"children":1593},[1594],{"id":406,"depth":252,"text":407},{"id":537,"depth":574,"text":538,"children":1596},[1597],{"id":544,"depth":252,"text":545},[1004,1005],[1007,1008],[1010,1011],{},{"title":631,"description":1000},[619,1019,1020,624,625,626,1021],1792418550681]