[{"data":1,"prerenderedAt":2220},["ShallowReactive",2],{"navigation_docs":3,"-recipes-audit-log-for-admins":111,"-recipes-audit-log-for-admins-surround":2215},[4,20,30,66,82,89,96],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15],{"title":11,"path":12,"stem":13,"icon":14},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F1.installation","i-lucide-download",{"title":16,"path":17,"stem":18,"icon":19},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F2.quick-start","i-lucide-rocket",{"title":21,"icon":22,"path":23,"stem":24,"children":25,"page":6},"Concepts","i-lucide-compass","\u002Fconcepts","2.concepts",[26],{"title":27,"path":28,"stem":29,"icon":22},"How it works","\u002Fconcepts\u002Fhow-it-works","2.concepts\u002F1.how-it-works",{"title":31,"icon":32,"path":33,"stem":34,"children":35,"page":6},"Essentials","i-lucide-book-open","\u002Fessentials","3.essentials",[36,41,46,51,56,61],{"title":37,"path":38,"stem":39,"icon":40},"Sources","\u002Fessentials\u002Fsources","3.essentials\u002F1.sources","i-lucide-layers",{"title":42,"path":43,"stem":44,"icon":45},"Filament UI","\u002Fessentials\u002Ffilament-ui","3.essentials\u002F2.filament-ui","i-lucide-layout-dashboard",{"title":47,"path":48,"stem":49,"icon":50},"Refining the timeline","\u002Fessentials\u002Frefining-the-timeline","3.essentials\u002F3.refining-the-timeline","i-lucide-filter",{"title":52,"path":53,"stem":54,"icon":55},"Customization","\u002Fessentials\u002Fcustomization","3.essentials\u002F4.customization","i-lucide-paintbrush",{"title":57,"path":58,"stem":59,"icon":60},"Caching","\u002Fessentials\u002Fcaching","3.essentials\u002F5.caching","i-lucide-database",{"title":62,"path":63,"stem":64,"icon":65},"Configuration","\u002Fessentials\u002Fconfiguration","3.essentials\u002F6.configuration","i-lucide-settings",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":6},"Recipes","i-lucide-chef-hat","\u002Frecipes","4.recipes",[72,77],{"title":73,"path":74,"stem":75,"icon":76},"CRM person feed","\u002Frecipes\u002Fcrm-person-feed","4.recipes\u002F1.crm-person-feed","i-lucide-users",{"title":78,"path":79,"stem":80,"icon":81},"Audit log for admins","\u002Frecipes\u002Faudit-log-for-admins","4.recipes\u002F2.audit-log-for-admins","i-lucide-shield",{"title":83,"path":84,"stem":85,"children":86,"icon":88},"Testing","\u002Ftesting","5.testing\u002F1.index",[87],{"title":83,"path":84,"stem":85,"icon":88},"i-lucide-flask-conical",{"title":90,"path":91,"stem":92,"children":93,"icon":95},"Troubleshooting","\u002Ftroubleshooting","6.troubleshooting\u002F1.index",[94],{"title":90,"path":91,"stem":92,"icon":95},"i-lucide-life-buoy",{"title":97,"path":98,"stem":99,"children":100,"page":6},"Community","\u002Fcommunity","7.community",[101,106],{"title":102,"path":103,"stem":104,"icon":105},"Contributing","\u002Fcommunity\u002Fcontributing","7.community\u002F1.contributing","i-lucide-heart-handshake",{"title":107,"path":108,"stem":109,"icon":110},"License","\u002Fcommunity\u002Flicense","7.community\u002F2.license","i-lucide-scale",{"id":112,"title":78,"body":113,"description":2206,"extension":2207,"links":2208,"meta":2209,"navigation":2210,"path":79,"seo":2211,"stem":80,"__hash__":2214},"docs\u002F4.recipes\u002F2.audit-log-for-admins.md",{"type":114,"value":115,"toc":2198},"minimark",[116,129,134,141,170,180,768,781,785,792,1088,1102,1106,1128,1986,2001,2007,2160,2172,2176,2194],[117,118,119,120,124,125,128],"p",{},"Your admin team needs a clean audit trail when investigating User accounts — what changed, who changed it, when. No emails, no related-model noise. Sensitive fields like ",[121,122,123],"code",{},"password"," and ",[121,126,127],{},"remember_token"," must never render in the diff. The slide-over should only be visible to admins.",[130,131,133],"h2",{"id":132},"setup","Setup",[117,135,136,137,140],{},"Assuming you've completed ",[138,139,12],"a",{"href":12},", this recipe expects:",[142,143,144,160,167],"ul",{},[145,146,147,148,151,152,155,156,159],"li",{},"The ",[121,149,150],{},"User"," model uses ",[121,153,154],{},"LogsActivity"," with explicit ",[121,157,158],{},"logFillable()"," to control which attributes get logged.",[145,161,162,163,166],{},"Admin gating via a Policy or a ",[121,164,165],{},"User::isAdmin()"," boolean — adapt to your authorization stack.",[145,168,169],{},"No relations involved — this recipe stays focused on the User's own log.",[130,171,173,174,176,177],{"id":172},"step-1-user-model-with-focused-timeline","Step 1 — ",[121,175,150],{}," model with focused ",[121,178,179],{},"timeline()",[181,182,187],"pre",{"className":183,"code":184,"language":185,"meta":186,"style":186},"language-php shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","namespace App\\Models;\n\nuse Illuminate\\Foundation\\Auth\\User as Authenticatable;\nuse Relaticle\\ActivityLog\\Concerns\\InteractsWithTimeline;\nuse Relaticle\\ActivityLog\\Contracts\\HasTimeline;\nuse Relaticle\\ActivityLog\\Timeline\\TimelineBuilder;\nuse Spatie\\Activitylog\\LogOptions;\nuse Spatie\\Activitylog\\Traits\\LogsActivity;\n\nfinal class User extends Authenticatable implements HasTimeline\n{\n    use InteractsWithTimeline;\n    use LogsActivity;\n\n    protected $fillable = ['name', 'email', 'role', 'password'];\n\n    protected $hidden = ['password', 'remember_token'];\n\n    public function getActivitylogOptions(): LogOptions\n    {\n        return LogOptions::defaults()\n            ->logFillable()\n            ->logOnlyDirty()\n            ->dontSubmitEmptyLogs();\n    }\n\n    public function isAdmin(): bool\n    {\n        return $this->role === 'admin';\n    }\n\n    public function timeline(): TimelineBuilder\n    {\n        return TimelineBuilder::make($this)\n            ->fromActivityLog()\n            ->ofEvent(['created', 'updated', 'deleted', 'restored']);\n    }\n}\n","php","",[121,188,189,212,219,251,276,299,322,342,364,369,393,399,410,420,425,483,488,518,523,542,548,567,578,588,599,605,610,625,630,653,658,663,678,683,699,709,757,762],{"__ignoreMap":186},[190,191,194,198,202,206,209],"span",{"class":192,"line":193},"line",1,[190,195,197],{"class":196},"sbssI","namespace",[190,199,201],{"class":200},"sBMFI"," App",[190,203,205],{"class":204},"sMK4o","\\",[190,207,208],{"class":200},"Models",[190,210,211],{"class":204},";\n",[190,213,215],{"class":192,"line":214},2,[190,216,218],{"emptyLinePlaceholder":217},true,"\n",[190,220,222,225,229,231,234,236,239,241,243,246,249],{"class":192,"line":221},3,[190,223,224],{"class":196},"use",[190,226,228],{"class":227},"sTEyZ"," Illuminate",[190,230,205],{"class":204},[190,232,233],{"class":227},"Foundation",[190,235,205],{"class":204},[190,237,238],{"class":227},"Auth",[190,240,205],{"class":204},[190,242,150],{"class":227},[190,244,245],{"class":196}," as",[190,247,248],{"class":200}," Authenticatable",[190,250,211],{"class":204},[190,252,254,256,259,261,264,266,269,271,274],{"class":192,"line":253},4,[190,255,224],{"class":196},[190,257,258],{"class":227}," Relaticle",[190,260,205],{"class":204},[190,262,263],{"class":227},"ActivityLog",[190,265,205],{"class":204},[190,267,268],{"class":227},"Concerns",[190,270,205],{"class":204},[190,272,273],{"class":227},"InteractsWithTimeline",[190,275,211],{"class":204},[190,277,279,281,283,285,287,289,292,294,297],{"class":192,"line":278},5,[190,280,224],{"class":196},[190,282,258],{"class":227},[190,284,205],{"class":204},[190,286,263],{"class":227},[190,288,205],{"class":204},[190,290,291],{"class":227},"Contracts",[190,293,205],{"class":204},[190,295,296],{"class":227},"HasTimeline",[190,298,211],{"class":204},[190,300,302,304,306,308,310,312,315,317,320],{"class":192,"line":301},6,[190,303,224],{"class":196},[190,305,258],{"class":227},[190,307,205],{"class":204},[190,309,263],{"class":227},[190,311,205],{"class":204},[190,313,314],{"class":227},"Timeline",[190,316,205],{"class":204},[190,318,319],{"class":227},"TimelineBuilder",[190,321,211],{"class":204},[190,323,325,327,330,332,335,337,340],{"class":192,"line":324},7,[190,326,224],{"class":196},[190,328,329],{"class":227}," Spatie",[190,331,205],{"class":204},[190,333,334],{"class":227},"Activitylog",[190,336,205],{"class":204},[190,338,339],{"class":227},"LogOptions",[190,341,211],{"class":204},[190,343,345,347,349,351,353,355,358,360,362],{"class":192,"line":344},8,[190,346,224],{"class":196},[190,348,329],{"class":227},[190,350,205],{"class":204},[190,352,334],{"class":227},[190,354,205],{"class":204},[190,356,357],{"class":227},"Traits",[190,359,205],{"class":204},[190,361,154],{"class":227},[190,363,211],{"class":204},[190,365,367],{"class":192,"line":366},9,[190,368,218],{"emptyLinePlaceholder":217},[190,370,372,376,379,382,385,387,390],{"class":192,"line":371},10,[190,373,375],{"class":374},"spNyl","final",[190,377,378],{"class":374}," class",[190,380,381],{"class":200}," User",[190,383,384],{"class":374}," extends",[190,386,248],{"class":200},[190,388,389],{"class":374}," implements",[190,391,392],{"class":200}," HasTimeline\n",[190,394,396],{"class":192,"line":395},11,[190,397,398],{"class":204},"{\n",[190,400,402,405,408],{"class":192,"line":401},12,[190,403,404],{"class":196},"    use",[190,406,407],{"class":227}," InteractsWithTimeline",[190,409,211],{"class":204},[190,411,413,415,418],{"class":192,"line":412},13,[190,414,404],{"class":196},[190,416,417],{"class":227}," LogsActivity",[190,419,211],{"class":204},[190,421,423],{"class":192,"line":422},14,[190,424,218],{"emptyLinePlaceholder":217},[190,426,428,431,434,437,440,443,446,450,452,455,458,461,463,465,467,470,472,474,476,478,480],{"class":192,"line":427},15,[190,429,430],{"class":374},"    protected",[190,432,433],{"class":204}," $",[190,435,436],{"class":227},"fillable ",[190,438,439],{"class":204},"=",[190,441,442],{"class":204}," [",[190,444,445],{"class":204},"'",[190,447,449],{"class":448},"sfazB","name",[190,451,445],{"class":204},[190,453,454],{"class":204},",",[190,456,457],{"class":204}," '",[190,459,460],{"class":448},"email",[190,462,445],{"class":204},[190,464,454],{"class":204},[190,466,457],{"class":204},[190,468,469],{"class":448},"role",[190,471,445],{"class":204},[190,473,454],{"class":204},[190,475,457],{"class":204},[190,477,123],{"class":448},[190,479,445],{"class":204},[190,481,482],{"class":204},"];\n",[190,484,486],{"class":192,"line":485},16,[190,487,218],{"emptyLinePlaceholder":217},[190,489,491,493,495,498,500,502,504,506,508,510,512,514,516],{"class":192,"line":490},17,[190,492,430],{"class":374},[190,494,433],{"class":204},[190,496,497],{"class":227},"hidden ",[190,499,439],{"class":204},[190,501,442],{"class":204},[190,503,445],{"class":204},[190,505,123],{"class":448},[190,507,445],{"class":204},[190,509,454],{"class":204},[190,511,457],{"class":204},[190,513,127],{"class":448},[190,515,445],{"class":204},[190,517,482],{"class":204},[190,519,521],{"class":192,"line":520},18,[190,522,218],{"emptyLinePlaceholder":217},[190,524,526,529,532,536,539],{"class":192,"line":525},19,[190,527,528],{"class":374},"    public",[190,530,531],{"class":374}," function",[190,533,535],{"class":534},"s2Zo4"," getActivitylogOptions",[190,537,538],{"class":204},"():",[190,540,541],{"class":200}," LogOptions\n",[190,543,545],{"class":192,"line":544},20,[190,546,547],{"class":204},"    {\n",[190,549,551,555,558,561,564],{"class":192,"line":550},21,[190,552,554],{"class":553},"s7zQu","        return",[190,556,557],{"class":200}," LogOptions",[190,559,560],{"class":204},"::",[190,562,563],{"class":534},"defaults",[190,565,566],{"class":204},"()\n",[190,568,570,573,576],{"class":192,"line":569},22,[190,571,572],{"class":204},"            ->",[190,574,575],{"class":534},"logFillable",[190,577,566],{"class":204},[190,579,581,583,586],{"class":192,"line":580},23,[190,582,572],{"class":204},[190,584,585],{"class":534},"logOnlyDirty",[190,587,566],{"class":204},[190,589,591,593,596],{"class":192,"line":590},24,[190,592,572],{"class":204},[190,594,595],{"class":534},"dontSubmitEmptyLogs",[190,597,598],{"class":204},"();\n",[190,600,602],{"class":192,"line":601},25,[190,603,604],{"class":204},"    }\n",[190,606,608],{"class":192,"line":607},26,[190,609,218],{"emptyLinePlaceholder":217},[190,611,613,615,617,620,622],{"class":192,"line":612},27,[190,614,528],{"class":374},[190,616,531],{"class":374},[190,618,619],{"class":534}," isAdmin",[190,621,538],{"class":204},[190,623,624],{"class":196}," bool\n",[190,626,628],{"class":192,"line":627},28,[190,629,547],{"class":204},[190,631,633,635,638,641,644,646,649,651],{"class":192,"line":632},29,[190,634,554],{"class":553},[190,636,637],{"class":204}," $this->",[190,639,640],{"class":227},"role ",[190,642,643],{"class":204},"===",[190,645,457],{"class":204},[190,647,648],{"class":448},"admin",[190,650,445],{"class":204},[190,652,211],{"class":204},[190,654,656],{"class":192,"line":655},30,[190,657,604],{"class":204},[190,659,661],{"class":192,"line":660},31,[190,662,218],{"emptyLinePlaceholder":217},[190,664,666,668,670,673,675],{"class":192,"line":665},32,[190,667,528],{"class":374},[190,669,531],{"class":374},[190,671,672],{"class":534}," timeline",[190,674,538],{"class":204},[190,676,677],{"class":200}," TimelineBuilder\n",[190,679,681],{"class":192,"line":680},33,[190,682,547],{"class":204},[190,684,686,688,691,693,696],{"class":192,"line":685},34,[190,687,554],{"class":553},[190,689,690],{"class":200}," TimelineBuilder",[190,692,560],{"class":204},[190,694,695],{"class":534},"make",[190,697,698],{"class":204},"($this)\n",[190,700,702,704,707],{"class":192,"line":701},35,[190,703,572],{"class":204},[190,705,706],{"class":534},"fromActivityLog",[190,708,566],{"class":204},[190,710,712,714,717,720,722,725,727,729,731,734,736,738,740,743,745,747,749,752,754],{"class":192,"line":711},36,[190,713,572],{"class":204},[190,715,716],{"class":534},"ofEvent",[190,718,719],{"class":204},"([",[190,721,445],{"class":204},[190,723,724],{"class":448},"created",[190,726,445],{"class":204},[190,728,454],{"class":204},[190,730,457],{"class":204},[190,732,733],{"class":448},"updated",[190,735,445],{"class":204},[190,737,454],{"class":204},[190,739,457],{"class":204},[190,741,742],{"class":448},"deleted",[190,744,445],{"class":204},[190,746,454],{"class":204},[190,748,457],{"class":204},[190,750,751],{"class":448},"restored",[190,753,445],{"class":204},[190,755,756],{"class":204},"]);\n",[190,758,760],{"class":192,"line":759},37,[190,761,604],{"class":204},[190,763,765],{"class":192,"line":764},38,[190,766,767],{"class":204},"}\n",[117,769,770,772,773,776,777,780],{},[121,771,158],{}," + ",[121,774,775],{},"logOnlyDirty()"," keeps spatie focused on the audit-relevant fields and skips no-op writes. ",[121,778,779],{},"ofEvent([...])"," filters out anything that isn't a CRUD operation (custom events from related models, integration callbacks, etc.). The combo gives you a clean \"who-did-what\" stream without operational noise.",[130,782,784],{"id":783},"step-2-admin-gated-header-action","Step 2 — Admin-gated header action",[117,786,787,788,791],{},"Drop the bundled action into the User view page and gate it with ",[121,789,790],{},"->visible()",":",[181,793,795],{"className":183,"code":794,"language":185,"meta":186,"style":186},"namespace App\\Filament\\Resources\\Users\\Pages;\n\nuse App\\Filament\\Resources\\Users\\UserResource;\nuse Filament\\Resources\\Pages\\ViewRecord;\nuse Relaticle\\ActivityLog\\Filament\\Actions\\ActivityLogAction;\n\nfinal class ViewUser extends ViewRecord\n{\n    protected static string $resource = UserResource::class;\n\n    protected function getHeaderActions(): array\n    {\n        return [\n            ActivityLogAction::make()\n                ->label('Audit log')\n                ->icon('heroicon-o-shield-check')\n                ->visible(fn (): bool => auth()->user()?->isAdmin() ?? false),\n        ];\n    }\n}\n",[121,796,797,825,829,854,876,902,906,920,924,951,955,969,973,980,991,1012,1030,1075,1080,1084],{"__ignoreMap":186},[190,798,799,801,803,805,808,810,813,815,818,820,823],{"class":192,"line":193},[190,800,197],{"class":196},[190,802,201],{"class":200},[190,804,205],{"class":204},[190,806,807],{"class":200},"Filament",[190,809,205],{"class":204},[190,811,812],{"class":200},"Resources",[190,814,205],{"class":204},[190,816,817],{"class":200},"Users",[190,819,205],{"class":204},[190,821,822],{"class":200},"Pages",[190,824,211],{"class":204},[190,826,827],{"class":192,"line":214},[190,828,218],{"emptyLinePlaceholder":217},[190,830,831,833,835,837,839,841,843,845,847,849,852],{"class":192,"line":221},[190,832,224],{"class":196},[190,834,201],{"class":227},[190,836,205],{"class":204},[190,838,807],{"class":227},[190,840,205],{"class":204},[190,842,812],{"class":227},[190,844,205],{"class":204},[190,846,817],{"class":227},[190,848,205],{"class":204},[190,850,851],{"class":227},"UserResource",[190,853,211],{"class":204},[190,855,856,858,861,863,865,867,869,871,874],{"class":192,"line":253},[190,857,224],{"class":196},[190,859,860],{"class":227}," Filament",[190,862,205],{"class":204},[190,864,812],{"class":227},[190,866,205],{"class":204},[190,868,822],{"class":227},[190,870,205],{"class":204},[190,872,873],{"class":227},"ViewRecord",[190,875,211],{"class":204},[190,877,878,880,882,884,886,888,890,892,895,897,900],{"class":192,"line":278},[190,879,224],{"class":196},[190,881,258],{"class":227},[190,883,205],{"class":204},[190,885,263],{"class":227},[190,887,205],{"class":204},[190,889,807],{"class":227},[190,891,205],{"class":204},[190,893,894],{"class":227},"Actions",[190,896,205],{"class":204},[190,898,899],{"class":227},"ActivityLogAction",[190,901,211],{"class":204},[190,903,904],{"class":192,"line":301},[190,905,218],{"emptyLinePlaceholder":217},[190,907,908,910,912,915,917],{"class":192,"line":324},[190,909,375],{"class":374},[190,911,378],{"class":374},[190,913,914],{"class":200}," ViewUser",[190,916,384],{"class":374},[190,918,919],{"class":200}," ViewRecord\n",[190,921,922],{"class":192,"line":344},[190,923,398],{"class":204},[190,925,926,928,931,934,936,939,941,944,946,949],{"class":192,"line":366},[190,927,430],{"class":374},[190,929,930],{"class":374}," static",[190,932,933],{"class":196}," string",[190,935,433],{"class":204},[190,937,938],{"class":227},"resource ",[190,940,439],{"class":204},[190,942,943],{"class":200}," UserResource",[190,945,560],{"class":204},[190,947,948],{"class":196},"class",[190,950,211],{"class":204},[190,952,953],{"class":192,"line":371},[190,954,218],{"emptyLinePlaceholder":217},[190,956,957,959,961,964,966],{"class":192,"line":395},[190,958,430],{"class":374},[190,960,531],{"class":374},[190,962,963],{"class":534}," getHeaderActions",[190,965,538],{"class":204},[190,967,968],{"class":196}," array\n",[190,970,971],{"class":192,"line":401},[190,972,547],{"class":204},[190,974,975,977],{"class":192,"line":412},[190,976,554],{"class":553},[190,978,979],{"class":204}," [\n",[190,981,982,985,987,989],{"class":192,"line":422},[190,983,984],{"class":200},"            ActivityLogAction",[190,986,560],{"class":204},[190,988,695],{"class":534},[190,990,566],{"class":204},[190,992,993,996,999,1002,1004,1007,1009],{"class":192,"line":427},[190,994,995],{"class":204},"                ->",[190,997,998],{"class":534},"label",[190,1000,1001],{"class":204},"(",[190,1003,445],{"class":204},[190,1005,1006],{"class":448},"Audit log",[190,1008,445],{"class":204},[190,1010,1011],{"class":204},")\n",[190,1013,1014,1016,1019,1021,1023,1026,1028],{"class":192,"line":485},[190,1015,995],{"class":204},[190,1017,1018],{"class":534},"icon",[190,1020,1001],{"class":204},[190,1022,445],{"class":204},[190,1024,1025],{"class":448},"heroicon-o-shield-check",[190,1027,445],{"class":204},[190,1029,1011],{"class":204},[190,1031,1032,1034,1037,1039,1042,1045,1048,1051,1054,1057,1060,1063,1066,1069,1072],{"class":192,"line":490},[190,1033,995],{"class":204},[190,1035,1036],{"class":534},"visible",[190,1038,1001],{"class":204},[190,1040,1041],{"class":374},"fn",[190,1043,1044],{"class":204}," ():",[190,1046,1047],{"class":196}," bool",[190,1049,1050],{"class":204}," =>",[190,1052,1053],{"class":534}," auth",[190,1055,1056],{"class":204},"()->",[190,1058,1059],{"class":534},"user",[190,1061,1062],{"class":204},"()?->",[190,1064,1065],{"class":534},"isAdmin",[190,1067,1068],{"class":204},"()",[190,1070,1071],{"class":204}," ??",[190,1073,1074],{"class":204}," false),\n",[190,1076,1077],{"class":192,"line":520},[190,1078,1079],{"class":204},"        ];\n",[190,1081,1082],{"class":192,"line":525},[190,1083,604],{"class":204},[190,1085,1086],{"class":192,"line":544},[190,1087,767],{"class":204},[117,1089,1090,1091,1093,1094,1097,1098,1101],{},"Non-admins never see the action — Filament evaluates ",[121,1092,790],{}," on render. The slide-over uses the built-in ",[121,1095,1096],{},"ActivityLogRenderer"," (auto-registered for the ",[121,1099,1100],{},"'activity_log'"," type), so diff rows render automatically without any extra wiring.",[130,1103,1105],{"id":1104},"step-3-redact-sensitive-fields-with-a-wrapping-renderer","Step 3 — Redact sensitive fields with a wrapping renderer",[117,1107,1108,1109,1112,1113,1115,1116,1119,1120,1123,1124,1127],{},"Replace the built-in renderer with one that filters ",[121,1110,1111],{},"$entry->properties"," before delegating back to the original. This way you keep all the diff\u002Fmarkup logic from ",[121,1114,1096],{}," (which uses ",[121,1117,1118],{},"ActivityLogSummary"," under the hood — see ",[138,1121,53],{"href":1122},"\u002Fessentials\u002Fcustomization#replacing-the-built-in-activitylog-renderer",") and only intercept the ",[121,1125,1126],{},"properties"," array.",[181,1129,1131],{"className":183,"code":1130,"language":185,"meta":186,"style":186},"namespace App\\Timeline\\Renderers;\n\nuse Illuminate\\Contracts\\View\\View;\nuse Illuminate\\Support\\HtmlString;\nuse Relaticle\\ActivityLog\\Contracts\\TimelineRenderer;\nuse Relaticle\\ActivityLog\\Renderers\\ActivityLogRenderer;\nuse Relaticle\\ActivityLog\\Timeline\\TimelineEntry;\n\nfinal class RedactedAuditRenderer implements TimelineRenderer\n{\n    \u002F** @var array\u003Cint, string> *\u002F\n    private const REDACTED_KEYS = ['password', 'remember_token', 'two_factor_secret', 'two_factor_recovery_codes'];\n\n    public function __construct(private readonly ActivityLogRenderer $inner) {}\n\n    public function render(TimelineEntry $entry): View|HtmlString\n    {\n        $properties = $entry->properties;\n\n        foreach (['attributes', 'old'] as $bucket) {\n            if (! isset($properties[$bucket]) || ! is_array($properties[$bucket])) {\n                continue;\n            }\n\n            foreach (self::REDACTED_KEYS as $key) {\n                if (array_key_exists($key, $properties[$bucket])) {\n                    $properties[$bucket][$key] = '••••••••';\n                }\n            }\n        }\n\n        $redacted = new TimelineEntry(\n            id: $entry->id,\n            type: $entry->type,\n            event: $entry->event,\n            occurredAt: $entry->occurredAt,\n            dedupKey: $entry->dedupKey,\n            sourcePriority: $entry->sourcePriority,\n            subject: $entry->subject,\n            causer: $entry->causer,\n            relatedModel: $entry->relatedModel,\n            title: $entry->title,\n            description: $entry->description,\n            icon: $entry->icon,\n            color: $entry->color,\n            renderer: $entry->renderer,\n            properties: $properties,\n        );\n\n        return $this->inner->render($redacted);\n    }\n}\n",[121,1132,1133,1150,1154,1175,1193,1214,1234,1255,1259,1273,1277,1299,1348,1352,1383,1387,1417,1421,1442,1446,1485,1531,1538,1543,1547,1575,1603,1633,1638,1642,1647,1651,1669,1688,1706,1724,1742,1760,1778,1797,1816,1835,1854,1873,1891,1910,1929,1943,1949,1954,1976,1981],{"__ignoreMap":186},[190,1134,1135,1137,1139,1141,1143,1145,1148],{"class":192,"line":193},[190,1136,197],{"class":196},[190,1138,201],{"class":200},[190,1140,205],{"class":204},[190,1142,314],{"class":200},[190,1144,205],{"class":204},[190,1146,1147],{"class":200},"Renderers",[190,1149,211],{"class":204},[190,1151,1152],{"class":192,"line":214},[190,1153,218],{"emptyLinePlaceholder":217},[190,1155,1156,1158,1160,1162,1164,1166,1169,1171,1173],{"class":192,"line":221},[190,1157,224],{"class":196},[190,1159,228],{"class":227},[190,1161,205],{"class":204},[190,1163,291],{"class":227},[190,1165,205],{"class":204},[190,1167,1168],{"class":227},"View",[190,1170,205],{"class":204},[190,1172,1168],{"class":227},[190,1174,211],{"class":204},[190,1176,1177,1179,1181,1183,1186,1188,1191],{"class":192,"line":253},[190,1178,224],{"class":196},[190,1180,228],{"class":227},[190,1182,205],{"class":204},[190,1184,1185],{"class":227},"Support",[190,1187,205],{"class":204},[190,1189,1190],{"class":227},"HtmlString",[190,1192,211],{"class":204},[190,1194,1195,1197,1199,1201,1203,1205,1207,1209,1212],{"class":192,"line":278},[190,1196,224],{"class":196},[190,1198,258],{"class":227},[190,1200,205],{"class":204},[190,1202,263],{"class":227},[190,1204,205],{"class":204},[190,1206,291],{"class":227},[190,1208,205],{"class":204},[190,1210,1211],{"class":227},"TimelineRenderer",[190,1213,211],{"class":204},[190,1215,1216,1218,1220,1222,1224,1226,1228,1230,1232],{"class":192,"line":301},[190,1217,224],{"class":196},[190,1219,258],{"class":227},[190,1221,205],{"class":204},[190,1223,263],{"class":227},[190,1225,205],{"class":204},[190,1227,1147],{"class":227},[190,1229,205],{"class":204},[190,1231,1096],{"class":227},[190,1233,211],{"class":204},[190,1235,1236,1238,1240,1242,1244,1246,1248,1250,1253],{"class":192,"line":324},[190,1237,224],{"class":196},[190,1239,258],{"class":227},[190,1241,205],{"class":204},[190,1243,263],{"class":227},[190,1245,205],{"class":204},[190,1247,314],{"class":227},[190,1249,205],{"class":204},[190,1251,1252],{"class":227},"TimelineEntry",[190,1254,211],{"class":204},[190,1256,1257],{"class":192,"line":344},[190,1258,218],{"emptyLinePlaceholder":217},[190,1260,1261,1263,1265,1268,1270],{"class":192,"line":366},[190,1262,375],{"class":374},[190,1264,378],{"class":374},[190,1266,1267],{"class":200}," RedactedAuditRenderer",[190,1269,389],{"class":374},[190,1271,1272],{"class":200}," TimelineRenderer\n",[190,1274,1275],{"class":192,"line":371},[190,1276,398],{"class":204},[190,1278,1279,1283,1287,1290,1293,1296],{"class":192,"line":395},[190,1280,1282],{"class":1281},"sHwdD","    \u002F** ",[190,1284,1286],{"class":1285},"svl4J","@var",[190,1288,1289],{"class":1285}," array",[190,1291,1292],{"class":1281},"\u003C",[190,1294,1295],{"class":1285},"int",[190,1297,1298],{"class":1281},", string> *\u002F\n",[190,1300,1301,1304,1307,1310,1312,1314,1316,1318,1320,1322,1324,1326,1328,1330,1332,1335,1337,1339,1341,1344,1346],{"class":192,"line":401},[190,1302,1303],{"class":374},"    private",[190,1305,1306],{"class":374}," const",[190,1308,1309],{"class":227}," REDACTED_KEYS ",[190,1311,439],{"class":204},[190,1313,442],{"class":204},[190,1315,445],{"class":204},[190,1317,123],{"class":448},[190,1319,445],{"class":204},[190,1321,454],{"class":204},[190,1323,457],{"class":204},[190,1325,127],{"class":448},[190,1327,445],{"class":204},[190,1329,454],{"class":204},[190,1331,457],{"class":204},[190,1333,1334],{"class":448},"two_factor_secret",[190,1336,445],{"class":204},[190,1338,454],{"class":204},[190,1340,457],{"class":204},[190,1342,1343],{"class":448},"two_factor_recovery_codes",[190,1345,445],{"class":204},[190,1347,482],{"class":204},[190,1349,1350],{"class":192,"line":412},[190,1351,218],{"emptyLinePlaceholder":217},[190,1353,1354,1356,1358,1361,1363,1366,1369,1372,1374,1377,1380],{"class":192,"line":422},[190,1355,528],{"class":374},[190,1357,531],{"class":374},[190,1359,1360],{"class":534}," __construct",[190,1362,1001],{"class":204},[190,1364,1365],{"class":374},"private",[190,1367,1368],{"class":374}," readonly",[190,1370,1371],{"class":200}," ActivityLogRenderer",[190,1373,433],{"class":204},[190,1375,1376],{"class":227},"inner",[190,1378,1379],{"class":204},")",[190,1381,1382],{"class":204}," {}\n",[190,1384,1385],{"class":192,"line":427},[190,1386,218],{"emptyLinePlaceholder":217},[190,1388,1389,1391,1393,1396,1398,1400,1402,1405,1408,1411,1414],{"class":192,"line":485},[190,1390,528],{"class":374},[190,1392,531],{"class":374},[190,1394,1395],{"class":534}," render",[190,1397,1001],{"class":204},[190,1399,1252],{"class":200},[190,1401,433],{"class":204},[190,1403,1404],{"class":227},"entry",[190,1406,1407],{"class":204},"):",[190,1409,1410],{"class":200}," View",[190,1412,1413],{"class":204},"|",[190,1415,1416],{"class":200},"HtmlString\n",[190,1418,1419],{"class":192,"line":490},[190,1420,547],{"class":204},[190,1422,1423,1426,1429,1431,1433,1435,1438,1440],{"class":192,"line":520},[190,1424,1425],{"class":204},"        $",[190,1427,1428],{"class":227},"properties ",[190,1430,439],{"class":204},[190,1432,433],{"class":204},[190,1434,1404],{"class":227},[190,1436,1437],{"class":204},"->",[190,1439,1126],{"class":227},[190,1441,211],{"class":204},[190,1443,1444],{"class":192,"line":525},[190,1445,218],{"emptyLinePlaceholder":217},[190,1447,1448,1451,1454,1456,1459,1461,1463,1465,1468,1470,1473,1475,1477,1480,1482],{"class":192,"line":544},[190,1449,1450],{"class":553},"        foreach",[190,1452,1453],{"class":204}," ([",[190,1455,445],{"class":204},[190,1457,1458],{"class":448},"attributes",[190,1460,445],{"class":204},[190,1462,454],{"class":204},[190,1464,457],{"class":204},[190,1466,1467],{"class":448},"old",[190,1469,445],{"class":204},[190,1471,1472],{"class":204},"]",[190,1474,245],{"class":204},[190,1476,433],{"class":204},[190,1478,1479],{"class":227},"bucket",[190,1481,1379],{"class":204},[190,1483,1484],{"class":204}," {\n",[190,1486,1487,1490,1493,1496,1499,1501,1504,1506,1509,1512,1515,1518,1520,1522,1524,1526,1529],{"class":192,"line":550},[190,1488,1489],{"class":553},"            if",[190,1491,1492],{"class":204}," (!",[190,1494,1495],{"class":534}," isset",[190,1497,1498],{"class":204},"($",[190,1500,1126],{"class":227},[190,1502,1503],{"class":204},"[$",[190,1505,1479],{"class":227},[190,1507,1508],{"class":204},"])",[190,1510,1511],{"class":204}," ||",[190,1513,1514],{"class":204}," !",[190,1516,1517],{"class":534}," is_array",[190,1519,1498],{"class":204},[190,1521,1126],{"class":227},[190,1523,1503],{"class":204},[190,1525,1479],{"class":227},[190,1527,1528],{"class":204},"]))",[190,1530,1484],{"class":204},[190,1532,1533,1536],{"class":192,"line":569},[190,1534,1535],{"class":553},"                continue",[190,1537,211],{"class":204},[190,1539,1540],{"class":192,"line":580},[190,1541,1542],{"class":204},"            }\n",[190,1544,1545],{"class":192,"line":590},[190,1546,218],{"emptyLinePlaceholder":217},[190,1548,1549,1552,1555,1558,1560,1563,1566,1568,1571,1573],{"class":192,"line":601},[190,1550,1551],{"class":553},"            foreach",[190,1553,1554],{"class":204}," (",[190,1556,1557],{"class":374},"self",[190,1559,560],{"class":204},[190,1561,1562],{"class":227},"REDACTED_KEYS ",[190,1564,1565],{"class":204},"as",[190,1567,433],{"class":204},[190,1569,1570],{"class":227},"key",[190,1572,1379],{"class":204},[190,1574,1484],{"class":204},[190,1576,1577,1580,1582,1585,1587,1589,1591,1593,1595,1597,1599,1601],{"class":192,"line":607},[190,1578,1579],{"class":553},"                if",[190,1581,1554],{"class":204},[190,1583,1584],{"class":534},"array_key_exists",[190,1586,1498],{"class":204},[190,1588,1570],{"class":227},[190,1590,454],{"class":204},[190,1592,433],{"class":204},[190,1594,1126],{"class":227},[190,1596,1503],{"class":204},[190,1598,1479],{"class":227},[190,1600,1528],{"class":204},[190,1602,1484],{"class":204},[190,1604,1605,1608,1610,1612,1614,1617,1619,1621,1624,1626,1629,1631],{"class":192,"line":612},[190,1606,1607],{"class":204},"                    $",[190,1609,1126],{"class":227},[190,1611,1503],{"class":204},[190,1613,1479],{"class":227},[190,1615,1616],{"class":204},"][$",[190,1618,1570],{"class":227},[190,1620,1472],{"class":204},[190,1622,1623],{"class":204}," =",[190,1625,457],{"class":204},[190,1627,1628],{"class":448},"••••••••",[190,1630,445],{"class":204},[190,1632,211],{"class":204},[190,1634,1635],{"class":192,"line":627},[190,1636,1637],{"class":204},"                }\n",[190,1639,1640],{"class":192,"line":632},[190,1641,1542],{"class":204},[190,1643,1644],{"class":192,"line":655},[190,1645,1646],{"class":204},"        }\n",[190,1648,1649],{"class":192,"line":660},[190,1650,218],{"emptyLinePlaceholder":217},[190,1652,1653,1655,1658,1660,1663,1666],{"class":192,"line":665},[190,1654,1425],{"class":204},[190,1656,1657],{"class":227},"redacted ",[190,1659,439],{"class":204},[190,1661,1662],{"class":196}," new",[190,1664,1665],{"class":200}," TimelineEntry",[190,1667,1668],{"class":204},"(\n",[190,1670,1671,1674,1676,1678,1680,1682,1685],{"class":192,"line":680},[190,1672,1673],{"class":200},"            id",[190,1675,791],{"class":204},[190,1677,433],{"class":204},[190,1679,1404],{"class":227},[190,1681,1437],{"class":204},[190,1683,1684],{"class":227},"id",[190,1686,1687],{"class":204},",\n",[190,1689,1690,1693,1695,1697,1699,1701,1704],{"class":192,"line":685},[190,1691,1692],{"class":200},"            type",[190,1694,791],{"class":204},[190,1696,433],{"class":204},[190,1698,1404],{"class":227},[190,1700,1437],{"class":204},[190,1702,1703],{"class":227},"type",[190,1705,1687],{"class":204},[190,1707,1708,1711,1713,1715,1717,1719,1722],{"class":192,"line":701},[190,1709,1710],{"class":200},"            event",[190,1712,791],{"class":204},[190,1714,433],{"class":204},[190,1716,1404],{"class":227},[190,1718,1437],{"class":204},[190,1720,1721],{"class":227},"event",[190,1723,1687],{"class":204},[190,1725,1726,1729,1731,1733,1735,1737,1740],{"class":192,"line":711},[190,1727,1728],{"class":200},"            occurredAt",[190,1730,791],{"class":204},[190,1732,433],{"class":204},[190,1734,1404],{"class":227},[190,1736,1437],{"class":204},[190,1738,1739],{"class":227},"occurredAt",[190,1741,1687],{"class":204},[190,1743,1744,1747,1749,1751,1753,1755,1758],{"class":192,"line":759},[190,1745,1746],{"class":200},"            dedupKey",[190,1748,791],{"class":204},[190,1750,433],{"class":204},[190,1752,1404],{"class":227},[190,1754,1437],{"class":204},[190,1756,1757],{"class":227},"dedupKey",[190,1759,1687],{"class":204},[190,1761,1762,1765,1767,1769,1771,1773,1776],{"class":192,"line":764},[190,1763,1764],{"class":200},"            sourcePriority",[190,1766,791],{"class":204},[190,1768,433],{"class":204},[190,1770,1404],{"class":227},[190,1772,1437],{"class":204},[190,1774,1775],{"class":227},"sourcePriority",[190,1777,1687],{"class":204},[190,1779,1781,1784,1786,1788,1790,1792,1795],{"class":192,"line":1780},39,[190,1782,1783],{"class":200},"            subject",[190,1785,791],{"class":204},[190,1787,433],{"class":204},[190,1789,1404],{"class":227},[190,1791,1437],{"class":204},[190,1793,1794],{"class":227},"subject",[190,1796,1687],{"class":204},[190,1798,1800,1803,1805,1807,1809,1811,1814],{"class":192,"line":1799},40,[190,1801,1802],{"class":200},"            causer",[190,1804,791],{"class":204},[190,1806,433],{"class":204},[190,1808,1404],{"class":227},[190,1810,1437],{"class":204},[190,1812,1813],{"class":227},"causer",[190,1815,1687],{"class":204},[190,1817,1819,1822,1824,1826,1828,1830,1833],{"class":192,"line":1818},41,[190,1820,1821],{"class":200},"            relatedModel",[190,1823,791],{"class":204},[190,1825,433],{"class":204},[190,1827,1404],{"class":227},[190,1829,1437],{"class":204},[190,1831,1832],{"class":227},"relatedModel",[190,1834,1687],{"class":204},[190,1836,1838,1841,1843,1845,1847,1849,1852],{"class":192,"line":1837},42,[190,1839,1840],{"class":200},"            title",[190,1842,791],{"class":204},[190,1844,433],{"class":204},[190,1846,1404],{"class":227},[190,1848,1437],{"class":204},[190,1850,1851],{"class":227},"title",[190,1853,1687],{"class":204},[190,1855,1857,1860,1862,1864,1866,1868,1871],{"class":192,"line":1856},43,[190,1858,1859],{"class":200},"            description",[190,1861,791],{"class":204},[190,1863,433],{"class":204},[190,1865,1404],{"class":227},[190,1867,1437],{"class":204},[190,1869,1870],{"class":227},"description",[190,1872,1687],{"class":204},[190,1874,1876,1879,1881,1883,1885,1887,1889],{"class":192,"line":1875},44,[190,1877,1878],{"class":200},"            icon",[190,1880,791],{"class":204},[190,1882,433],{"class":204},[190,1884,1404],{"class":227},[190,1886,1437],{"class":204},[190,1888,1018],{"class":227},[190,1890,1687],{"class":204},[190,1892,1894,1897,1899,1901,1903,1905,1908],{"class":192,"line":1893},45,[190,1895,1896],{"class":200},"            color",[190,1898,791],{"class":204},[190,1900,433],{"class":204},[190,1902,1404],{"class":227},[190,1904,1437],{"class":204},[190,1906,1907],{"class":227},"color",[190,1909,1687],{"class":204},[190,1911,1913,1916,1918,1920,1922,1924,1927],{"class":192,"line":1912},46,[190,1914,1915],{"class":200},"            renderer",[190,1917,791],{"class":204},[190,1919,433],{"class":204},[190,1921,1404],{"class":227},[190,1923,1437],{"class":204},[190,1925,1926],{"class":227},"renderer",[190,1928,1687],{"class":204},[190,1930,1932,1935,1937,1939,1941],{"class":192,"line":1931},47,[190,1933,1934],{"class":200},"            properties",[190,1936,791],{"class":204},[190,1938,433],{"class":204},[190,1940,1126],{"class":227},[190,1942,1687],{"class":204},[190,1944,1946],{"class":192,"line":1945},48,[190,1947,1948],{"class":204},"        );\n",[190,1950,1952],{"class":192,"line":1951},49,[190,1953,218],{"emptyLinePlaceholder":217},[190,1955,1957,1959,1961,1963,1965,1968,1970,1973],{"class":192,"line":1956},50,[190,1958,554],{"class":553},[190,1960,637],{"class":204},[190,1962,1376],{"class":227},[190,1964,1437],{"class":204},[190,1966,1967],{"class":534},"render",[190,1969,1498],{"class":204},[190,1971,1972],{"class":227},"redacted",[190,1974,1975],{"class":204},");\n",[190,1977,1979],{"class":192,"line":1978},51,[190,1980,604],{"class":204},[190,1982,1984],{"class":192,"line":1983},52,[190,1985,767],{"class":204},[117,1987,1988,1990,1991,1994,1995,1997,1998,2000],{},[121,1989,1252],{}," is a ",[121,1992,1993],{},"final readonly"," class — there's no setter, so the renderer rebuilds the entry from scratch with the filtered ",[121,1996,1126],{},". The constructor is container-resolved, so typehinting ",[121,1999,1096],{}," is enough to get the original instance injected.",[117,2002,2003,2004,791],{},"Register via the panel plugin in your ",[121,2005,2006],{},"AppPanelProvider",[181,2008,2010],{"className":183,"code":2009,"language":185,"meta":186,"style":186},"use App\\Timeline\\Renderers\\RedactedAuditRenderer;\nuse Relaticle\\ActivityLog\\Filament\\ActivityLogPlugin;\n\npublic function panel(Panel $panel): Panel\n{\n    return $panel\n        ->plugin(ActivityLogPlugin::make()->renderers([\n            'activity_log' => RedactedAuditRenderer::class,\n        ]))\n        \u002F\u002F ...\n    ;\n}\n",[121,2011,2012,2033,2054,2058,2083,2087,2097,2121,2141,2146,2151,2156],{"__ignoreMap":186},[190,2013,2014,2016,2018,2020,2022,2024,2026,2028,2031],{"class":192,"line":193},[190,2015,224],{"class":196},[190,2017,201],{"class":227},[190,2019,205],{"class":204},[190,2021,314],{"class":227},[190,2023,205],{"class":204},[190,2025,1147],{"class":227},[190,2027,205],{"class":204},[190,2029,2030],{"class":227},"RedactedAuditRenderer",[190,2032,211],{"class":204},[190,2034,2035,2037,2039,2041,2043,2045,2047,2049,2052],{"class":192,"line":214},[190,2036,224],{"class":196},[190,2038,258],{"class":227},[190,2040,205],{"class":204},[190,2042,263],{"class":227},[190,2044,205],{"class":204},[190,2046,807],{"class":227},[190,2048,205],{"class":204},[190,2050,2051],{"class":227},"ActivityLogPlugin",[190,2053,211],{"class":204},[190,2055,2056],{"class":192,"line":221},[190,2057,218],{"emptyLinePlaceholder":217},[190,2059,2060,2063,2065,2068,2070,2073,2075,2078,2080],{"class":192,"line":253},[190,2061,2062],{"class":374},"public",[190,2064,531],{"class":374},[190,2066,2067],{"class":534}," panel",[190,2069,1001],{"class":204},[190,2071,2072],{"class":200},"Panel",[190,2074,433],{"class":204},[190,2076,2077],{"class":227},"panel",[190,2079,1407],{"class":204},[190,2081,2082],{"class":200}," Panel\n",[190,2084,2085],{"class":192,"line":278},[190,2086,398],{"class":204},[190,2088,2089,2092,2094],{"class":192,"line":301},[190,2090,2091],{"class":553},"    return",[190,2093,433],{"class":204},[190,2095,2096],{"class":227},"panel\n",[190,2098,2099,2102,2105,2107,2109,2111,2113,2115,2118],{"class":192,"line":324},[190,2100,2101],{"class":204},"        ->",[190,2103,2104],{"class":534},"plugin",[190,2106,1001],{"class":204},[190,2108,2051],{"class":200},[190,2110,560],{"class":204},[190,2112,695],{"class":534},[190,2114,1056],{"class":204},[190,2116,2117],{"class":534},"renderers",[190,2119,2120],{"class":204},"([\n",[190,2122,2123,2126,2129,2131,2133,2135,2137,2139],{"class":192,"line":344},[190,2124,2125],{"class":204},"            '",[190,2127,2128],{"class":448},"activity_log",[190,2130,445],{"class":204},[190,2132,1050],{"class":204},[190,2134,1267],{"class":200},[190,2136,560],{"class":204},[190,2138,948],{"class":196},[190,2140,1687],{"class":204},[190,2142,2143],{"class":192,"line":366},[190,2144,2145],{"class":204},"        ]))\n",[190,2147,2148],{"class":192,"line":371},[190,2149,2150],{"class":1281},"        \u002F\u002F ...\n",[190,2152,2153],{"class":192,"line":395},[190,2154,2155],{"class":204},"    ;\n",[190,2157,2158],{"class":192,"line":401},[190,2159,767],{"class":204},[117,2161,147,2162,2164,2165,2167,2168,2171],{},[121,2163,1100],{}," type key replaces the built-in binding wholesale — every ",[121,2166,2128],{},"-type entry now flows through your wrapper. See ",[138,2169,2170],{"href":2170},"\u002Fessentials\u002Fcustomization#renderer-resolution-order"," for how the registry resolves bindings.",[130,2173,2175],{"id":2174},"what-you-get","What you get",[117,2177,2178,2179,2181,2182,2185,2186,2189,2190,2193],{},"Admins see a clean audit trail; non-admins don't see the action at all; sensitive fields render as ",[121,2180,1628],{}," regardless of who's viewing. URL filters work normally — admins can bookmark ",[121,2183,2184],{},"?from=2026-01-01"," to scope an investigation, or ",[121,2187,2188],{},"?event=updated"," to focus on changes only. See ",[138,2191,2192],{"href":2192},"\u002Fessentials\u002Ffilament-ui#built-in-url-filter-ui"," for the full list of supported query params.",[2195,2196,2197],"style",{},"html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}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 pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}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 .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .svl4J, html code.shiki .svl4J{--shiki-light:#F76D47;--shiki-light-font-style:italic;--shiki-default:#F78C6C;--shiki-default-font-style:italic;--shiki-dark:#F78C6C;--shiki-dark-font-style:italic}",{"title":186,"searchDepth":214,"depth":214,"links":2199},[2200,2201,2203,2204,2205],{"id":132,"depth":214,"text":133},{"id":172,"depth":214,"text":2202},"Step 1 — User model with focused timeline()",{"id":783,"depth":214,"text":784},{"id":1104,"depth":214,"text":1105},{"id":2174,"depth":214,"text":2175},"Read-only admin audit trail — own log only, role-gated visibility, sensitive-field redaction.","md",null,{},{"icon":81},{"description":2212,"ogImage":2213,"title":78},"Recipe — role-gated User audit timeline with own-log filtering and a wrapping renderer that redacts sensitive fields like password and remember_token.","\u002Fpreview.png","LXAzLzsoJhBv2GdMZ3oqXpJLy_q6Bp3YfTHUkyS0X_s",[2216,2218],{"title":73,"path":74,"stem":75,"description":2217,"icon":76,"children":-1},"End-to-end person profile timeline — own log, related logs, timestamp events, custom renderer.",{"title":83,"path":84,"stem":85,"description":2219,"icon":88,"children":-1},"Test patterns for the timeline component, relation manager, action, and builder.",1780504149910]