GET https://kbin.spritesserver.nl/u/@ptz@dubvee.org/threads/hot/%E2%88%9E/articles

Components

18 Twig Components
37 Render Count
33 ms Render Time
12.0 MiB Memory Usage

Components

Name Metadata Render Count Render Time
settings_row_switch
"App\Twig\Components\SettingsRowSwitchComponent"
components/_settings_row_switch.html.twig
15 3.61ms
user_settings_row_switch
"App\Twig\Components\UserSettingsRowSwitchComponent"
components/_user_settings_row_switch.html.twig
4 0.69ms
date
"App\Twig\Components\DateComponent"
components/date.html.twig
2 0.35ms
settings_row_enum
"App\Twig\Components\SettingsRowEnumComponent"
components/_settings_row_enum.html.twig
2 0.37ms
entry
"App\Twig\Components\EntryComponent"
components/_cached.html.twig
1 14.15ms
user_inline
"App\Twig\Components\UserInlineComponent"
components/user_inline.html.twig
1 0.30ms
date_edited
"App\Twig\Components\DateEditedComponent"
components/date_edited.html.twig
1 0.21ms
magazine_inline
"App\Twig\Components\MagazineInlineComponent"
components/magazine_inline.html.twig
1 0.20ms
vote
"App\Twig\Components\VoteComponent"
components/vote.html.twig
1 0.50ms
boost
"App\Twig\Components\BoostComponent"
components/boost.html.twig
1 2.56ms
user_actions
"App\Twig\Components\UserActionsComponent"
components/user_actions.html.twig
1 0.46ms
related_magazines
"App\Twig\Components\RelatedMagazinesComponent"
components/_cached.html.twig
1 3.50ms
active_users
"App\Twig\Components\ActiveUsersComponent"
components/_cached.html.twig
1 0.31ms
related_categories
"App\Twig\Components\RelatedCategoriesComponent"
components/_cached.html.twig
1 1.87ms
related_posts
"App\Twig\Components\RelatedPostsComponent"
components/_cached.html.twig
1 2.20ms
related_entries
"App\Twig\Components\RelatedEntriesComponent"
components/_cached.html.twig
1 3.75ms
support_us_block
"App\Twig\Components\SupportUsBlock"
components/_cached.html.twig
1 0.37ms
featured_magazines
"App\Twig\Components\FeaturedMagazinesComponent"
components/_cached.html.twig
1 1.67ms

Render calls

entry App\Twig\Components\EntryComponent 12.0 MiB 14.15 ms
Input props
[
  "entry" => App\Entity\Entry {#2360
    +user: App\Entity\User {#265
      +avatar: Proxies\__CG__\App\Entity\Image {#246 …}
      +cover: Proxies\__CG__\App\Entity\Image {#247 …}
      +email: "ptz@dubvee.org"
      +username: "@ptz@dubvee.org"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: "Ask me anything."
      +lastActive: DateTime @1707767810 {#273
        date: 2024-02-12 20:56:50.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#236 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#232 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#221 …}
      +entries: Doctrine\ORM\PersistentCollection {#179 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#151 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#124 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#94 …}
      +posts: Doctrine\ORM\PersistentCollection {#67 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#82 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1372 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1594 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1873 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1769 …}
      +follows: Doctrine\ORM\PersistentCollection {#1809 …}
      +followers: Doctrine\ORM\PersistentCollection {#2390 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1860 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1857 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1791 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#2401 …}
      +reports: Doctrine\ORM\PersistentCollection {#2480 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1373 …}
      +violations: Doctrine\ORM\PersistentCollection {#2413 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1884 …}
      +awards: Doctrine\ORM\PersistentCollection {#1867 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1920 …}
      +categories: Doctrine\ORM\PersistentCollection {#1395 …}
      -id: 31957
      -password: "$2y$13$GQ5ytKsdAjGNepaBKTyaw.LxgdDgO3AmJCBWfHMnv0zu0ZgfjN0A2"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1953 …}
      +apId: "ptz@dubvee.org"
      +apProfileId: "https://dubvee.org/u/ptz"
      +apPublicUrl: "https://dubvee.org/u/ptz"
      +apFollowersUrl: null
      +apInboxUrl: "https://dubvee.org/inbox"
      +apDomain: "dubvee.org"
      +apPreferredUsername: "ptz"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1711023282 {#274
        date: 2024-03-21 13:14:42.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689880362 {#268
        date: 2023-07-20 21:12:42.0 +02:00
      }
    }
    +magazine: Proxies\__CG__\App\Entity\Magazine {#2377
      +icon: null
      +name: "lemmy_support@lemmy.ml"
      +title: "lemmy_support"
      +description: """
        Support / questions about Lemmy.\n
        \n
        [Matrix Space: #lemmy-space](https://matrix.to/#/#lemmy-space:matrix.org)
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 130
      +entryCommentCount: 600
      +postCount: 2
      +postCommentCount: 14
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1728910137 {#2233
        date: 2024-10-14 14:48:57.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#2238 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#2249 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#2259 …}
      +entries: Doctrine\ORM\PersistentCollection {#2244 …}
      +posts: Doctrine\ORM\PersistentCollection {#2250 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#2245 …}
      +bans: Doctrine\ORM\PersistentCollection {#2251 …}
      +reports: Doctrine\ORM\PersistentCollection {#2039 …}
      +badges: Doctrine\ORM\PersistentCollection {#2149 …}
      +logs: Doctrine\ORM\PersistentCollection {#2173 …}
      +awards: Doctrine\ORM\PersistentCollection {#2157 …}
      +categories: Doctrine\ORM\PersistentCollection {#2178 …}
      -id: 40
      +apId: "lemmy_support@lemmy.ml"
      +apProfileId: "https://lemmy.ml/c/lemmy_support"
      +apPublicUrl: "https://lemmy.ml/c/lemmy_support"
      +apFollowersUrl: "https://lemmy.ml/c/lemmy_support/followers"
      +apInboxUrl: "https://lemmy.ml/inbox"
      +apDomain: "lemmy.ml"
      +apPreferredUsername: "lemmy_support"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1729581033 {#2226
        date: 2024-10-22 09:10:33.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1696687715 {#2234
        date: 2023-10-07 16:08:35.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#2467 …}
    +slug: "RFC-Add-custom-fields-to-local-site-and-local-user-tables"
    +title: "[RFC] Add custom fields to local_site and local_user tables"
    +url: null
    +body: """
      ### Proposal\n
      \n
      Add custom database columns to the `local_site` and `local_user` tables and corresponding config keys in the `editSite` and `saveUserSettings` interfaces. Data type would be `text` and the column name could be `user_custom` or something like that.\n
      \n
      ### Rationale\n
      \n
      Many 3rd party Lemmy UIs offer more config options than are covered by the discrete config keys currently exposed via `saveUserSettings` and in the `MyUserInfo` interface. A custom field where a JSON blob could be stored would allow 3rd party Lemmy UI clients to save site-level and user-level config options to the API similar to how Lemmy-UI has its settings saved.\n
      \n
      Currently, 3PAs largely (exclusively?) utilize local storage which limits any persistence to individual devices/browsers. Adding those `text` columns and exposing them via the `getSite`, `editSite` and `saveUserSettings` interfaces would allow 3rd party apps the ability to persist settings across devices by serializing them to JSON and storing/serving from the API.\n
      \n
      ### Use Cases\n
      \n
      - Application settings and preferences\n
      - Keyword filters\n
      - Favorite community lists\n
      - Community group lists\n
      - Structured site-level data such as rules, public community groups, report and moderation templates, etc.\n
      \n
      ### Possible Cons\n
      \n
      - Would slightly increase amount of data returned in the `getSite` API call due to the extra data in the `local_site` and `my_user` keys.\n
      - 3PA developers would have to share this field. \n
          - Not really a concern for the Lemmy devs, but there would ultimately need to be some cooperation between 3PA devs to avoid contention (e.g. a container with namespaces, etc).\n
      \n
      ### Workarounds Considered\n
      \n
      Adding a backend server to each 3rd party UI is possible but may be overkill for the relatively common and simple task of persisting settings. A custom field exposed by the Lemmy API would alleviate that. For use-cases more advanced than simple settings storage, the 3PA dev may opt to build their own backend anyway.\n
      \n
      In Tesseract, the current workaround is done by allowing export and import of user settings to a JSON file which can be loaded into a new device/browser. While that’s better than nothing, it’s far from ideal.\n
      \n
      Thoughts?\n
      \n
      **Update**: To test the viability of this RFC, I’ve horribly abused the `theme` field to store about 60 KB of JSON user settings data. Aside from breaking the CSS in Lemmy-UI (as expected), everything works great. The additional payload data in the `getSite` response doesn’t seem to be causing much of an impact. I may leave this in the next release under “advanced settings” with appropriate warnings as well as adding a “restore” button to restore it to a valid theme value. Ultimately, though, a dedicated field for 3PAs to use would be ideal.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 0
    +favouriteCount: 4
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1699709635 {#2455
      date: 2023-11-11 14:33:55.0 +01:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#2363 …}
    +votes: Doctrine\ORM\PersistentCollection {#2372 …}
    +reports: Doctrine\ORM\PersistentCollection {#2386 …}
    +favourites: Doctrine\ORM\PersistentCollection {#2385 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2378 …}
    +badges: Doctrine\ORM\PersistentCollection {#2381 …}
    +children: []
    -id: 11991
    -titleTs: "'add':2 'custom':3 'field':4 'local':6,9 'rfc':1 'site':7 'tabl':11 'user':10"
    -bodyTs: "'3pa':216,242,302 '3pas':110,443 '3rd':43,80,139,261 '60':369 'abil':143 'abus':362 'across':147 'ad':123,255,425 'add':2 'addit':391 'advanc':296,417 'allevi':289 'allow':79,138,320 'amount':194 'anyway':311 'api':98,158,201,287 'app':141 'applic':161 'appropri':420 'asid':376 'avoid':245 'backend':257,310 'better':342 'blob':74 'break':378 'build':307 'button':428 'call':202 'case':160,294 'caus':403 'client':84 'column':5,31,126 'common':273 'communiti':168,170,182 'con':190 'concern':227 'config':16,49,57,94 'consid':254 'contain':249 'content':246 'cooper':240 'correspond':15 'could':33,75 'cover':53 'css':380 'current':59,109,315 'custom':3,36,69,281 'data':24,177,196,207,375,393 'databas':4 'dedic':440 'dev':231,243,303 'develop':217 'devic':148 'device/browser':338 'devices/browsers':122 'discret':56 'doesn':398 'done':318 'due':203 'e.g':247 'editsit':20,133 'etc':188,252 'everyth':387 'exclus':112 'expect':386 'export':321 'expos':60,128,283 'extra':206 'far':347 'favorit':167 'field':70,223,282,365,441 'file':330 'filter':166 'getsit':132,200,396 'great':389 'group':171,183 'horribl':361 'ideal':349,448 'impact':407 'import':323 'increas':193 'individu':121 'interfac':23,67,136 'json':73,153,329,372 'kb':370 'key':17,58,215 'keyword':165 'larg':111 'leav':410 'lemmi':45,82,103,230,286,383 'lemmy-ui':102,382 'level':89,93,176 'like':39 'limit':117 'list':169,172 'load':334 'local':8,11,114,210 'mani':42 'may':267,304,409 'moder':186 'much':404 'myuserinfo':66 'name':32 'namespac':251 'need':236 'new':337 'next':414 'noth':344 'offer':47 'opt':305 'option':50,95 'overkil':269 'parti':44,81,140,262 'payload':392 'persist':119,145,278 'possibl':189,265 'prefer':164 'propos':1 'public':181 'rational':41 'realli':225 'relat':272 'releas':415 'report':184 'respons':397 'restor':427,430 'return':197 'rfc':358 'rule':180 'save':86,108 'saveuserset':22,62,135 'seem':400 'serial':150 'server':258 'set':107,146,162,279,299,326,374,418 'share':221 'similar':99 'simpl':275,298 'site':9,88,175,211 'site-level':87,174 'slight':192 'someth':38 'storag':115,300 'store':77,367 'storing/serving':155 'structur':173 'tabl':13 'task':276 'templat':187 'tesseract':313 'test':353 'text':28,125 'theme':364,435 'though':438 'thought':350 'type':25 'ui':46,83,104,263,384 'ultim':235,437 'updat':351 'use':159,293,445 'use-cas':292 'user':12,35,92,214,325,373 'user-level':91 'util':113 'valid':434 'valu':436 've':360 'via':61,130 'viabil':355 'warn':421 'well':423 'work':388 'workaround':253,316 'would':26,78,137,191,218,234,288,446"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1699718635
    +visibility: "visible             "
    +apId: "https://dubvee.org/post/370736"
    +editedAt: DateTimeImmutable @1699874770 {#2452
      date: 2023-11-13 12:26:10.0 +01:00
    }
    +createdAt: DateTimeImmutable @1699709635 {#2370
      date: 2023-11-11 14:33:55.0 +01:00
    }
  }
  "showMagazineName" => true
]
Attributes
[]
Component
App\Twig\Components\EntryComponent {#2302
  -authorizationChecker: Symfony\Component\Security\Core\Authorization\AuthorizationChecker {#931 …}
  -newCommentMarkerCount: App\Kbin\NewCommentMarker\NewCommentMarkerCount {#2301 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -security: Symfony\Bundle\SecurityBundle\Security {#1101 …}
  +entry: App\Entity\Entry {#2360
    +user: App\Entity\User {#265
      +avatar: Proxies\__CG__\App\Entity\Image {#246 …}
      +cover: Proxies\__CG__\App\Entity\Image {#247 …}
      +email: "ptz@dubvee.org"
      +username: "@ptz@dubvee.org"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: "Ask me anything."
      +lastActive: DateTime @1707767810 {#273
        date: 2024-02-12 20:56:50.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#236 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#232 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#221 …}
      +entries: Doctrine\ORM\PersistentCollection {#179 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#151 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#124 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#94 …}
      +posts: Doctrine\ORM\PersistentCollection {#67 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#82 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1372 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1594 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1873 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1769 …}
      +follows: Doctrine\ORM\PersistentCollection {#1809 …}
      +followers: Doctrine\ORM\PersistentCollection {#2390 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1860 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1857 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1791 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#2401 …}
      +reports: Doctrine\ORM\PersistentCollection {#2480 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1373 …}
      +violations: Doctrine\ORM\PersistentCollection {#2413 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1884 …}
      +awards: Doctrine\ORM\PersistentCollection {#1867 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1920 …}
      +categories: Doctrine\ORM\PersistentCollection {#1395 …}
      -id: 31957
      -password: "$2y$13$GQ5ytKsdAjGNepaBKTyaw.LxgdDgO3AmJCBWfHMnv0zu0ZgfjN0A2"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1953 …}
      +apId: "ptz@dubvee.org"
      +apProfileId: "https://dubvee.org/u/ptz"
      +apPublicUrl: "https://dubvee.org/u/ptz"
      +apFollowersUrl: null
      +apInboxUrl: "https://dubvee.org/inbox"
      +apDomain: "dubvee.org"
      +apPreferredUsername: "ptz"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1711023282 {#274
        date: 2024-03-21 13:14:42.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689880362 {#268
        date: 2023-07-20 21:12:42.0 +02:00
      }
    }
    +magazine: Proxies\__CG__\App\Entity\Magazine {#2377
      +icon: null
      +name: "lemmy_support@lemmy.ml"
      +title: "lemmy_support"
      +description: """
        Support / questions about Lemmy.\n
        \n
        [Matrix Space: #lemmy-space](https://matrix.to/#/#lemmy-space:matrix.org)
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 130
      +entryCommentCount: 600
      +postCount: 2
      +postCommentCount: 14
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1728910137 {#2233
        date: 2024-10-14 14:48:57.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#2238 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#2249 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#2259 …}
      +entries: Doctrine\ORM\PersistentCollection {#2244 …}
      +posts: Doctrine\ORM\PersistentCollection {#2250 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#2245 …}
      +bans: Doctrine\ORM\PersistentCollection {#2251 …}
      +reports: Doctrine\ORM\PersistentCollection {#2039 …}
      +badges: Doctrine\ORM\PersistentCollection {#2149 …}
      +logs: Doctrine\ORM\PersistentCollection {#2173 …}
      +awards: Doctrine\ORM\PersistentCollection {#2157 …}
      +categories: Doctrine\ORM\PersistentCollection {#2178 …}
      -id: 40
      +apId: "lemmy_support@lemmy.ml"
      +apProfileId: "https://lemmy.ml/c/lemmy_support"
      +apPublicUrl: "https://lemmy.ml/c/lemmy_support"
      +apFollowersUrl: "https://lemmy.ml/c/lemmy_support/followers"
      +apInboxUrl: "https://lemmy.ml/inbox"
      +apDomain: "lemmy.ml"
      +apPreferredUsername: "lemmy_support"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1729581033 {#2226
        date: 2024-10-22 09:10:33.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1696687715 {#2234
        date: 2023-10-07 16:08:35.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#2467 …}
    +slug: "RFC-Add-custom-fields-to-local-site-and-local-user-tables"
    +title: "[RFC] Add custom fields to local_site and local_user tables"
    +url: null
    +body: """
      ### Proposal\n
      \n
      Add custom database columns to the `local_site` and `local_user` tables and corresponding config keys in the `editSite` and `saveUserSettings` interfaces. Data type would be `text` and the column name could be `user_custom` or something like that.\n
      \n
      ### Rationale\n
      \n
      Many 3rd party Lemmy UIs offer more config options than are covered by the discrete config keys currently exposed via `saveUserSettings` and in the `MyUserInfo` interface. A custom field where a JSON blob could be stored would allow 3rd party Lemmy UI clients to save site-level and user-level config options to the API similar to how Lemmy-UI has its settings saved.\n
      \n
      Currently, 3PAs largely (exclusively?) utilize local storage which limits any persistence to individual devices/browsers. Adding those `text` columns and exposing them via the `getSite`, `editSite` and `saveUserSettings` interfaces would allow 3rd party apps the ability to persist settings across devices by serializing them to JSON and storing/serving from the API.\n
      \n
      ### Use Cases\n
      \n
      - Application settings and preferences\n
      - Keyword filters\n
      - Favorite community lists\n
      - Community group lists\n
      - Structured site-level data such as rules, public community groups, report and moderation templates, etc.\n
      \n
      ### Possible Cons\n
      \n
      - Would slightly increase amount of data returned in the `getSite` API call due to the extra data in the `local_site` and `my_user` keys.\n
      - 3PA developers would have to share this field. \n
          - Not really a concern for the Lemmy devs, but there would ultimately need to be some cooperation between 3PA devs to avoid contention (e.g. a container with namespaces, etc).\n
      \n
      ### Workarounds Considered\n
      \n
      Adding a backend server to each 3rd party UI is possible but may be overkill for the relatively common and simple task of persisting settings. A custom field exposed by the Lemmy API would alleviate that. For use-cases more advanced than simple settings storage, the 3PA dev may opt to build their own backend anyway.\n
      \n
      In Tesseract, the current workaround is done by allowing export and import of user settings to a JSON file which can be loaded into a new device/browser. While that’s better than nothing, it’s far from ideal.\n
      \n
      Thoughts?\n
      \n
      **Update**: To test the viability of this RFC, I’ve horribly abused the `theme` field to store about 60 KB of JSON user settings data. Aside from breaking the CSS in Lemmy-UI (as expected), everything works great. The additional payload data in the `getSite` response doesn’t seem to be causing much of an impact. I may leave this in the next release under “advanced settings” with appropriate warnings as well as adding a “restore” button to restore it to a valid theme value. Ultimately, though, a dedicated field for 3PAs to use would be ideal.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 0
    +favouriteCount: 4
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1699709635 {#2455
      date: 2023-11-11 14:33:55.0 +01:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#2363 …}
    +votes: Doctrine\ORM\PersistentCollection {#2372 …}
    +reports: Doctrine\ORM\PersistentCollection {#2386 …}
    +favourites: Doctrine\ORM\PersistentCollection {#2385 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2378 …}
    +badges: Doctrine\ORM\PersistentCollection {#2381 …}
    +children: []
    -id: 11991
    -titleTs: "'add':2 'custom':3 'field':4 'local':6,9 'rfc':1 'site':7 'tabl':11 'user':10"
    -bodyTs: "'3pa':216,242,302 '3pas':110,443 '3rd':43,80,139,261 '60':369 'abil':143 'abus':362 'across':147 'ad':123,255,425 'add':2 'addit':391 'advanc':296,417 'allevi':289 'allow':79,138,320 'amount':194 'anyway':311 'api':98,158,201,287 'app':141 'applic':161 'appropri':420 'asid':376 'avoid':245 'backend':257,310 'better':342 'blob':74 'break':378 'build':307 'button':428 'call':202 'case':160,294 'caus':403 'client':84 'column':5,31,126 'common':273 'communiti':168,170,182 'con':190 'concern':227 'config':16,49,57,94 'consid':254 'contain':249 'content':246 'cooper':240 'correspond':15 'could':33,75 'cover':53 'css':380 'current':59,109,315 'custom':3,36,69,281 'data':24,177,196,207,375,393 'databas':4 'dedic':440 'dev':231,243,303 'develop':217 'devic':148 'device/browser':338 'devices/browsers':122 'discret':56 'doesn':398 'done':318 'due':203 'e.g':247 'editsit':20,133 'etc':188,252 'everyth':387 'exclus':112 'expect':386 'export':321 'expos':60,128,283 'extra':206 'far':347 'favorit':167 'field':70,223,282,365,441 'file':330 'filter':166 'getsit':132,200,396 'great':389 'group':171,183 'horribl':361 'ideal':349,448 'impact':407 'import':323 'increas':193 'individu':121 'interfac':23,67,136 'json':73,153,329,372 'kb':370 'key':17,58,215 'keyword':165 'larg':111 'leav':410 'lemmi':45,82,103,230,286,383 'lemmy-ui':102,382 'level':89,93,176 'like':39 'limit':117 'list':169,172 'load':334 'local':8,11,114,210 'mani':42 'may':267,304,409 'moder':186 'much':404 'myuserinfo':66 'name':32 'namespac':251 'need':236 'new':337 'next':414 'noth':344 'offer':47 'opt':305 'option':50,95 'overkil':269 'parti':44,81,140,262 'payload':392 'persist':119,145,278 'possibl':189,265 'prefer':164 'propos':1 'public':181 'rational':41 'realli':225 'relat':272 'releas':415 'report':184 'respons':397 'restor':427,430 'return':197 'rfc':358 'rule':180 'save':86,108 'saveuserset':22,62,135 'seem':400 'serial':150 'server':258 'set':107,146,162,279,299,326,374,418 'share':221 'similar':99 'simpl':275,298 'site':9,88,175,211 'site-level':87,174 'slight':192 'someth':38 'storag':115,300 'store':77,367 'storing/serving':155 'structur':173 'tabl':13 'task':276 'templat':187 'tesseract':313 'test':353 'text':28,125 'theme':364,435 'though':438 'thought':350 'type':25 'ui':46,83,104,263,384 'ultim':235,437 'updat':351 'use':159,293,445 'use-cas':292 'user':12,35,92,214,325,373 'user-level':91 'util':113 'valid':434 'valu':436 've':360 'via':61,130 'viabil':355 'warn':421 'well':423 'work':388 'workaround':253,316 'would':26,78,137,191,218,234,288,446"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1699718635
    +visibility: "visible             "
    +apId: "https://dubvee.org/post/370736"
    +editedAt: DateTimeImmutable @1699874770 {#2452
      date: 2023-11-13 12:26:10.0 +01:00
    }
    +createdAt: DateTimeImmutable @1699709635 {#2370
      date: 2023-11-11 14:33:55.0 +01:00
    }
  }
  +isSingle: false
  +showShortSentence: true
  +showBody: false
  +showMagazineName: true
  +canSeeTrash: false
  +newComments: 0
}
user_inline App\Twig\Components\UserInlineComponent 12.0 MiB 0.30 ms
Input props
[
  "user" => App\Entity\User {#265
    +avatar: Proxies\__CG__\App\Entity\Image {#246 …}
    +cover: Proxies\__CG__\App\Entity\Image {#247 …}
    +email: "ptz@dubvee.org"
    +username: "@ptz@dubvee.org"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: "Ask me anything."
    +lastActive: DateTime @1707767810 {#273
      date: 2024-02-12 20:56:50.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#236 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#232 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#221 …}
    +entries: Doctrine\ORM\PersistentCollection {#179 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#151 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#124 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#94 …}
    +posts: Doctrine\ORM\PersistentCollection {#67 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#82 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1372 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1594 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1873 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1769 …}
    +follows: Doctrine\ORM\PersistentCollection {#1809 …}
    +followers: Doctrine\ORM\PersistentCollection {#2390 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1860 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1857 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1791 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#2401 …}
    +reports: Doctrine\ORM\PersistentCollection {#2480 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1373 …}
    +violations: Doctrine\ORM\PersistentCollection {#2413 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1884 …}
    +awards: Doctrine\ORM\PersistentCollection {#1867 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1920 …}
    +categories: Doctrine\ORM\PersistentCollection {#1395 …}
    -id: 31957
    -password: "$2y$13$GQ5ytKsdAjGNepaBKTyaw.LxgdDgO3AmJCBWfHMnv0zu0ZgfjN0A2"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1953 …}
    +apId: "ptz@dubvee.org"
    +apProfileId: "https://dubvee.org/u/ptz"
    +apPublicUrl: "https://dubvee.org/u/ptz"
    +apFollowersUrl: null
    +apInboxUrl: "https://dubvee.org/inbox"
    +apDomain: "dubvee.org"
    +apPreferredUsername: "ptz"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1711023282 {#274
      date: 2024-03-21 13:14:42.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689880362 {#268
      date: 2023-07-20 21:12:42.0 +02:00
    }
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\UserInlineComponent {#2646
  +user: App\Entity\User {#265
    +avatar: Proxies\__CG__\App\Entity\Image {#246 …}
    +cover: Proxies\__CG__\App\Entity\Image {#247 …}
    +email: "ptz@dubvee.org"
    +username: "@ptz@dubvee.org"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: "Ask me anything."
    +lastActive: DateTime @1707767810 {#273
      date: 2024-02-12 20:56:50.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#236 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#232 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#221 …}
    +entries: Doctrine\ORM\PersistentCollection {#179 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#151 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#124 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#94 …}
    +posts: Doctrine\ORM\PersistentCollection {#67 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#82 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1372 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1594 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1873 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1769 …}
    +follows: Doctrine\ORM\PersistentCollection {#1809 …}
    +followers: Doctrine\ORM\PersistentCollection {#2390 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1860 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1857 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1791 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#2401 …}
    +reports: Doctrine\ORM\PersistentCollection {#2480 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1373 …}
    +violations: Doctrine\ORM\PersistentCollection {#2413 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1884 …}
    +awards: Doctrine\ORM\PersistentCollection {#1867 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1920 …}
    +categories: Doctrine\ORM\PersistentCollection {#1395 …}
    -id: 31957
    -password: "$2y$13$GQ5ytKsdAjGNepaBKTyaw.LxgdDgO3AmJCBWfHMnv0zu0ZgfjN0A2"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1953 …}
    +apId: "ptz@dubvee.org"
    +apProfileId: "https://dubvee.org/u/ptz"
    +apPublicUrl: "https://dubvee.org/u/ptz"
    +apFollowersUrl: null
    +apInboxUrl: "https://dubvee.org/inbox"
    +apDomain: "dubvee.org"
    +apPreferredUsername: "ptz"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1711023282 {#274
      date: 2024-03-21 13:14:42.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689880362 {#268
      date: 2023-07-20 21:12:42.0 +02:00
    }
  }
  +showAvatar: false
}
date App\Twig\Components\DateComponent 12.0 MiB 0.22 ms
Input props
[
  "date" => DateTimeImmutable @1699709635 {#2370
    date: 2023-11-11 14:33:55.0 +01:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#2713
  +date: DateTimeImmutable @1699709635 {#2370
    date: 2023-11-11 14:33:55.0 +01:00
  }
}
date_edited App\Twig\Components\DateEditedComponent 12.0 MiB 0.21 ms
Input props
[
  "createdAt" => DateTimeImmutable @1699709635 {#2370
    date: 2023-11-11 14:33:55.0 +01:00
  }
  "editedAt" => DateTimeImmutable @1699874770 {#2452
    date: 2023-11-13 12:26:10.0 +01:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateEditedComponent {#2777
  +createdAt: DateTimeImmutable @1699709635 {#2370
    date: 2023-11-11 14:33:55.0 +01:00
  }
  +editedAt: DateTimeImmutable @1699874770 {#2452
    date: 2023-11-13 12:26:10.0 +01:00
  }
}
magazine_inline App\Twig\Components\MagazineInlineComponent 12.0 MiB 0.20 ms
Input props
[
  "magazine" => Proxies\__CG__\App\Entity\Magazine {#2377
    +icon: null
    +name: "lemmy_support@lemmy.ml"
    +title: "lemmy_support"
    +description: """
      Support / questions about Lemmy.\n
      \n
      [Matrix Space: #lemmy-space](https://matrix.to/#/#lemmy-space:matrix.org)
      """
    +rules: null
    +subscriptionsCount: 1
    +entryCount: 130
    +entryCommentCount: 600
    +postCount: 2
    +postCommentCount: 14
    +isAdult: false
    +customCss: null
    +lastActive: DateTime @1728910137 {#2233
      date: 2024-10-14 14:48:57.0 +02:00
    }
    +markedForDeletionAt: null
    +tags: null
    +moderators: Doctrine\ORM\PersistentCollection {#2238 …}
    +ownershipRequests: Doctrine\ORM\PersistentCollection {#2249 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#2259 …}
    +entries: Doctrine\ORM\PersistentCollection {#2244 …}
    +posts: Doctrine\ORM\PersistentCollection {#2250 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#2245 …}
    +bans: Doctrine\ORM\PersistentCollection {#2251 …}
    +reports: Doctrine\ORM\PersistentCollection {#2039 …}
    +badges: Doctrine\ORM\PersistentCollection {#2149 …}
    +logs: Doctrine\ORM\PersistentCollection {#2173 …}
    +awards: Doctrine\ORM\PersistentCollection {#2157 …}
    +categories: Doctrine\ORM\PersistentCollection {#2178 …}
    -id: 40
    +apId: "lemmy_support@lemmy.ml"
    +apProfileId: "https://lemmy.ml/c/lemmy_support"
    +apPublicUrl: "https://lemmy.ml/c/lemmy_support"
    +apFollowersUrl: "https://lemmy.ml/c/lemmy_support/followers"
    +apInboxUrl: "https://lemmy.ml/inbox"
    +apDomain: "lemmy.ml"
    +apPreferredUsername: "lemmy_support"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: null
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1729581033 {#2226
      date: 2024-10-22 09:10:33.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1696687715 {#2234
      date: 2023-10-07 16:08:35.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  "showAvatar" => false
]
Attributes
[]
Component
App\Twig\Components\MagazineInlineComponent {#2842
  +magazine: Proxies\__CG__\App\Entity\Magazine {#2377
    +icon: null
    +name: "lemmy_support@lemmy.ml"
    +title: "lemmy_support"
    +description: """
      Support / questions about Lemmy.\n
      \n
      [Matrix Space: #lemmy-space](https://matrix.to/#/#lemmy-space:matrix.org)
      """
    +rules: null
    +subscriptionsCount: 1
    +entryCount: 130
    +entryCommentCount: 600
    +postCount: 2
    +postCommentCount: 14
    +isAdult: false
    +customCss: null
    +lastActive: DateTime @1728910137 {#2233
      date: 2024-10-14 14:48:57.0 +02:00
    }
    +markedForDeletionAt: null
    +tags: null
    +moderators: Doctrine\ORM\PersistentCollection {#2238 …}
    +ownershipRequests: Doctrine\ORM\PersistentCollection {#2249 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#2259 …}
    +entries: Doctrine\ORM\PersistentCollection {#2244 …}
    +posts: Doctrine\ORM\PersistentCollection {#2250 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#2245 …}
    +bans: Doctrine\ORM\PersistentCollection {#2251 …}
    +reports: Doctrine\ORM\PersistentCollection {#2039 …}
    +badges: Doctrine\ORM\PersistentCollection {#2149 …}
    +logs: Doctrine\ORM\PersistentCollection {#2173 …}
    +awards: Doctrine\ORM\PersistentCollection {#2157 …}
    +categories: Doctrine\ORM\PersistentCollection {#2178 …}
    -id: 40
    +apId: "lemmy_support@lemmy.ml"
    +apProfileId: "https://lemmy.ml/c/lemmy_support"
    +apPublicUrl: "https://lemmy.ml/c/lemmy_support"
    +apFollowersUrl: "https://lemmy.ml/c/lemmy_support/followers"
    +apInboxUrl: "https://lemmy.ml/inbox"
    +apDomain: "lemmy.ml"
    +apPreferredUsername: "lemmy_support"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: null
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1729581033 {#2226
      date: 2024-10-22 09:10:33.0 +02:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1696687715 {#2234
      date: 2023-10-07 16:08:35.0 +02:00
    }
    +__isInitialized__: true
     …2
  }
  +showTitle: true
  +fullName: false
  +stretchedLink: false
  +showAvatar: false
}
vote App\Twig\Components\VoteComponent 12.0 MiB 0.50 ms
Input props
[
  "subject" => App\Entity\Entry {#2360
    +user: App\Entity\User {#265
      +avatar: Proxies\__CG__\App\Entity\Image {#246 …}
      +cover: Proxies\__CG__\App\Entity\Image {#247 …}
      +email: "ptz@dubvee.org"
      +username: "@ptz@dubvee.org"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: "Ask me anything."
      +lastActive: DateTime @1707767810 {#273
        date: 2024-02-12 20:56:50.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#236 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#232 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#221 …}
      +entries: Doctrine\ORM\PersistentCollection {#179 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#151 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#124 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#94 …}
      +posts: Doctrine\ORM\PersistentCollection {#67 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#82 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1372 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1594 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1873 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1769 …}
      +follows: Doctrine\ORM\PersistentCollection {#1809 …}
      +followers: Doctrine\ORM\PersistentCollection {#2390 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1860 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1857 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1791 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#2401 …}
      +reports: Doctrine\ORM\PersistentCollection {#2480 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1373 …}
      +violations: Doctrine\ORM\PersistentCollection {#2413 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1884 …}
      +awards: Doctrine\ORM\PersistentCollection {#1867 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1920 …}
      +categories: Doctrine\ORM\PersistentCollection {#1395 …}
      -id: 31957
      -password: "$2y$13$GQ5ytKsdAjGNepaBKTyaw.LxgdDgO3AmJCBWfHMnv0zu0ZgfjN0A2"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1953 …}
      +apId: "ptz@dubvee.org"
      +apProfileId: "https://dubvee.org/u/ptz"
      +apPublicUrl: "https://dubvee.org/u/ptz"
      +apFollowersUrl: null
      +apInboxUrl: "https://dubvee.org/inbox"
      +apDomain: "dubvee.org"
      +apPreferredUsername: "ptz"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1711023282 {#274
        date: 2024-03-21 13:14:42.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689880362 {#268
        date: 2023-07-20 21:12:42.0 +02:00
      }
    }
    +magazine: Proxies\__CG__\App\Entity\Magazine {#2377
      +icon: null
      +name: "lemmy_support@lemmy.ml"
      +title: "lemmy_support"
      +description: """
        Support / questions about Lemmy.\n
        \n
        [Matrix Space: #lemmy-space](https://matrix.to/#/#lemmy-space:matrix.org)
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 130
      +entryCommentCount: 600
      +postCount: 2
      +postCommentCount: 14
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1728910137 {#2233
        date: 2024-10-14 14:48:57.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#2238 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#2249 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#2259 …}
      +entries: Doctrine\ORM\PersistentCollection {#2244 …}
      +posts: Doctrine\ORM\PersistentCollection {#2250 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#2245 …}
      +bans: Doctrine\ORM\PersistentCollection {#2251 …}
      +reports: Doctrine\ORM\PersistentCollection {#2039 …}
      +badges: Doctrine\ORM\PersistentCollection {#2149 …}
      +logs: Doctrine\ORM\PersistentCollection {#2173 …}
      +awards: Doctrine\ORM\PersistentCollection {#2157 …}
      +categories: Doctrine\ORM\PersistentCollection {#2178 …}
      -id: 40
      +apId: "lemmy_support@lemmy.ml"
      +apProfileId: "https://lemmy.ml/c/lemmy_support"
      +apPublicUrl: "https://lemmy.ml/c/lemmy_support"
      +apFollowersUrl: "https://lemmy.ml/c/lemmy_support/followers"
      +apInboxUrl: "https://lemmy.ml/inbox"
      +apDomain: "lemmy.ml"
      +apPreferredUsername: "lemmy_support"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1729581033 {#2226
        date: 2024-10-22 09:10:33.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1696687715 {#2234
        date: 2023-10-07 16:08:35.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#2467 …}
    +slug: "RFC-Add-custom-fields-to-local-site-and-local-user-tables"
    +title: "[RFC] Add custom fields to local_site and local_user tables"
    +url: null
    +body: """
      ### Proposal\n
      \n
      Add custom database columns to the `local_site` and `local_user` tables and corresponding config keys in the `editSite` and `saveUserSettings` interfaces. Data type would be `text` and the column name could be `user_custom` or something like that.\n
      \n
      ### Rationale\n
      \n
      Many 3rd party Lemmy UIs offer more config options than are covered by the discrete config keys currently exposed via `saveUserSettings` and in the `MyUserInfo` interface. A custom field where a JSON blob could be stored would allow 3rd party Lemmy UI clients to save site-level and user-level config options to the API similar to how Lemmy-UI has its settings saved.\n
      \n
      Currently, 3PAs largely (exclusively?) utilize local storage which limits any persistence to individual devices/browsers. Adding those `text` columns and exposing them via the `getSite`, `editSite` and `saveUserSettings` interfaces would allow 3rd party apps the ability to persist settings across devices by serializing them to JSON and storing/serving from the API.\n
      \n
      ### Use Cases\n
      \n
      - Application settings and preferences\n
      - Keyword filters\n
      - Favorite community lists\n
      - Community group lists\n
      - Structured site-level data such as rules, public community groups, report and moderation templates, etc.\n
      \n
      ### Possible Cons\n
      \n
      - Would slightly increase amount of data returned in the `getSite` API call due to the extra data in the `local_site` and `my_user` keys.\n
      - 3PA developers would have to share this field. \n
          - Not really a concern for the Lemmy devs, but there would ultimately need to be some cooperation between 3PA devs to avoid contention (e.g. a container with namespaces, etc).\n
      \n
      ### Workarounds Considered\n
      \n
      Adding a backend server to each 3rd party UI is possible but may be overkill for the relatively common and simple task of persisting settings. A custom field exposed by the Lemmy API would alleviate that. For use-cases more advanced than simple settings storage, the 3PA dev may opt to build their own backend anyway.\n
      \n
      In Tesseract, the current workaround is done by allowing export and import of user settings to a JSON file which can be loaded into a new device/browser. While that’s better than nothing, it’s far from ideal.\n
      \n
      Thoughts?\n
      \n
      **Update**: To test the viability of this RFC, I’ve horribly abused the `theme` field to store about 60 KB of JSON user settings data. Aside from breaking the CSS in Lemmy-UI (as expected), everything works great. The additional payload data in the `getSite` response doesn’t seem to be causing much of an impact. I may leave this in the next release under “advanced settings” with appropriate warnings as well as adding a “restore” button to restore it to a valid theme value. Ultimately, though, a dedicated field for 3PAs to use would be ideal.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 0
    +favouriteCount: 4
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1699709635 {#2455
      date: 2023-11-11 14:33:55.0 +01:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#2363 …}
    +votes: Doctrine\ORM\PersistentCollection {#2372 …}
    +reports: Doctrine\ORM\PersistentCollection {#2386 …}
    +favourites: Doctrine\ORM\PersistentCollection {#2385 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2378 …}
    +badges: Doctrine\ORM\PersistentCollection {#2381 …}
    +children: []
    -id: 11991
    -titleTs: "'add':2 'custom':3 'field':4 'local':6,9 'rfc':1 'site':7 'tabl':11 'user':10"
    -bodyTs: "'3pa':216,242,302 '3pas':110,443 '3rd':43,80,139,261 '60':369 'abil':143 'abus':362 'across':147 'ad':123,255,425 'add':2 'addit':391 'advanc':296,417 'allevi':289 'allow':79,138,320 'amount':194 'anyway':311 'api':98,158,201,287 'app':141 'applic':161 'appropri':420 'asid':376 'avoid':245 'backend':257,310 'better':342 'blob':74 'break':378 'build':307 'button':428 'call':202 'case':160,294 'caus':403 'client':84 'column':5,31,126 'common':273 'communiti':168,170,182 'con':190 'concern':227 'config':16,49,57,94 'consid':254 'contain':249 'content':246 'cooper':240 'correspond':15 'could':33,75 'cover':53 'css':380 'current':59,109,315 'custom':3,36,69,281 'data':24,177,196,207,375,393 'databas':4 'dedic':440 'dev':231,243,303 'develop':217 'devic':148 'device/browser':338 'devices/browsers':122 'discret':56 'doesn':398 'done':318 'due':203 'e.g':247 'editsit':20,133 'etc':188,252 'everyth':387 'exclus':112 'expect':386 'export':321 'expos':60,128,283 'extra':206 'far':347 'favorit':167 'field':70,223,282,365,441 'file':330 'filter':166 'getsit':132,200,396 'great':389 'group':171,183 'horribl':361 'ideal':349,448 'impact':407 'import':323 'increas':193 'individu':121 'interfac':23,67,136 'json':73,153,329,372 'kb':370 'key':17,58,215 'keyword':165 'larg':111 'leav':410 'lemmi':45,82,103,230,286,383 'lemmy-ui':102,382 'level':89,93,176 'like':39 'limit':117 'list':169,172 'load':334 'local':8,11,114,210 'mani':42 'may':267,304,409 'moder':186 'much':404 'myuserinfo':66 'name':32 'namespac':251 'need':236 'new':337 'next':414 'noth':344 'offer':47 'opt':305 'option':50,95 'overkil':269 'parti':44,81,140,262 'payload':392 'persist':119,145,278 'possibl':189,265 'prefer':164 'propos':1 'public':181 'rational':41 'realli':225 'relat':272 'releas':415 'report':184 'respons':397 'restor':427,430 'return':197 'rfc':358 'rule':180 'save':86,108 'saveuserset':22,62,135 'seem':400 'serial':150 'server':258 'set':107,146,162,279,299,326,374,418 'share':221 'similar':99 'simpl':275,298 'site':9,88,175,211 'site-level':87,174 'slight':192 'someth':38 'storag':115,300 'store':77,367 'storing/serving':155 'structur':173 'tabl':13 'task':276 'templat':187 'tesseract':313 'test':353 'text':28,125 'theme':364,435 'though':438 'thought':350 'type':25 'ui':46,83,104,263,384 'ultim':235,437 'updat':351 'use':159,293,445 'use-cas':292 'user':12,35,92,214,325,373 'user-level':91 'util':113 'valid':434 'valu':436 've':360 'via':61,130 'viabil':355 'warn':421 'well':423 'work':388 'workaround':253,316 'would':26,78,137,191,218,234,288,446"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1699718635
    +visibility: "visible             "
    +apId: "https://dubvee.org/post/370736"
    +editedAt: DateTimeImmutable @1699874770 {#2452
      date: 2023-11-13 12:26:10.0 +01:00
    }
    +createdAt: DateTimeImmutable @1699709635 {#2370
      date: 2023-11-11 14:33:55.0 +01:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\VoteComponent {#2908
  +subject: App\Entity\Entry {#2360
    +user: App\Entity\User {#265
      +avatar: Proxies\__CG__\App\Entity\Image {#246 …}
      +cover: Proxies\__CG__\App\Entity\Image {#247 …}
      +email: "ptz@dubvee.org"
      +username: "@ptz@dubvee.org"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: "Ask me anything."
      +lastActive: DateTime @1707767810 {#273
        date: 2024-02-12 20:56:50.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#236 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#232 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#221 …}
      +entries: Doctrine\ORM\PersistentCollection {#179 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#151 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#124 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#94 …}
      +posts: Doctrine\ORM\PersistentCollection {#67 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#82 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1372 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1594 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1873 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1769 …}
      +follows: Doctrine\ORM\PersistentCollection {#1809 …}
      +followers: Doctrine\ORM\PersistentCollection {#2390 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1860 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1857 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1791 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#2401 …}
      +reports: Doctrine\ORM\PersistentCollection {#2480 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1373 …}
      +violations: Doctrine\ORM\PersistentCollection {#2413 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1884 …}
      +awards: Doctrine\ORM\PersistentCollection {#1867 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1920 …}
      +categories: Doctrine\ORM\PersistentCollection {#1395 …}
      -id: 31957
      -password: "$2y$13$GQ5ytKsdAjGNepaBKTyaw.LxgdDgO3AmJCBWfHMnv0zu0ZgfjN0A2"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1953 …}
      +apId: "ptz@dubvee.org"
      +apProfileId: "https://dubvee.org/u/ptz"
      +apPublicUrl: "https://dubvee.org/u/ptz"
      +apFollowersUrl: null
      +apInboxUrl: "https://dubvee.org/inbox"
      +apDomain: "dubvee.org"
      +apPreferredUsername: "ptz"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1711023282 {#274
        date: 2024-03-21 13:14:42.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689880362 {#268
        date: 2023-07-20 21:12:42.0 +02:00
      }
    }
    +magazine: Proxies\__CG__\App\Entity\Magazine {#2377
      +icon: null
      +name: "lemmy_support@lemmy.ml"
      +title: "lemmy_support"
      +description: """
        Support / questions about Lemmy.\n
        \n
        [Matrix Space: #lemmy-space](https://matrix.to/#/#lemmy-space:matrix.org)
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 130
      +entryCommentCount: 600
      +postCount: 2
      +postCommentCount: 14
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1728910137 {#2233
        date: 2024-10-14 14:48:57.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#2238 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#2249 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#2259 …}
      +entries: Doctrine\ORM\PersistentCollection {#2244 …}
      +posts: Doctrine\ORM\PersistentCollection {#2250 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#2245 …}
      +bans: Doctrine\ORM\PersistentCollection {#2251 …}
      +reports: Doctrine\ORM\PersistentCollection {#2039 …}
      +badges: Doctrine\ORM\PersistentCollection {#2149 …}
      +logs: Doctrine\ORM\PersistentCollection {#2173 …}
      +awards: Doctrine\ORM\PersistentCollection {#2157 …}
      +categories: Doctrine\ORM\PersistentCollection {#2178 …}
      -id: 40
      +apId: "lemmy_support@lemmy.ml"
      +apProfileId: "https://lemmy.ml/c/lemmy_support"
      +apPublicUrl: "https://lemmy.ml/c/lemmy_support"
      +apFollowersUrl: "https://lemmy.ml/c/lemmy_support/followers"
      +apInboxUrl: "https://lemmy.ml/inbox"
      +apDomain: "lemmy.ml"
      +apPreferredUsername: "lemmy_support"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1729581033 {#2226
        date: 2024-10-22 09:10:33.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1696687715 {#2234
        date: 2023-10-07 16:08:35.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#2467 …}
    +slug: "RFC-Add-custom-fields-to-local-site-and-local-user-tables"
    +title: "[RFC] Add custom fields to local_site and local_user tables"
    +url: null
    +body: """
      ### Proposal\n
      \n
      Add custom database columns to the `local_site` and `local_user` tables and corresponding config keys in the `editSite` and `saveUserSettings` interfaces. Data type would be `text` and the column name could be `user_custom` or something like that.\n
      \n
      ### Rationale\n
      \n
      Many 3rd party Lemmy UIs offer more config options than are covered by the discrete config keys currently exposed via `saveUserSettings` and in the `MyUserInfo` interface. A custom field where a JSON blob could be stored would allow 3rd party Lemmy UI clients to save site-level and user-level config options to the API similar to how Lemmy-UI has its settings saved.\n
      \n
      Currently, 3PAs largely (exclusively?) utilize local storage which limits any persistence to individual devices/browsers. Adding those `text` columns and exposing them via the `getSite`, `editSite` and `saveUserSettings` interfaces would allow 3rd party apps the ability to persist settings across devices by serializing them to JSON and storing/serving from the API.\n
      \n
      ### Use Cases\n
      \n
      - Application settings and preferences\n
      - Keyword filters\n
      - Favorite community lists\n
      - Community group lists\n
      - Structured site-level data such as rules, public community groups, report and moderation templates, etc.\n
      \n
      ### Possible Cons\n
      \n
      - Would slightly increase amount of data returned in the `getSite` API call due to the extra data in the `local_site` and `my_user` keys.\n
      - 3PA developers would have to share this field. \n
          - Not really a concern for the Lemmy devs, but there would ultimately need to be some cooperation between 3PA devs to avoid contention (e.g. a container with namespaces, etc).\n
      \n
      ### Workarounds Considered\n
      \n
      Adding a backend server to each 3rd party UI is possible but may be overkill for the relatively common and simple task of persisting settings. A custom field exposed by the Lemmy API would alleviate that. For use-cases more advanced than simple settings storage, the 3PA dev may opt to build their own backend anyway.\n
      \n
      In Tesseract, the current workaround is done by allowing export and import of user settings to a JSON file which can be loaded into a new device/browser. While that’s better than nothing, it’s far from ideal.\n
      \n
      Thoughts?\n
      \n
      **Update**: To test the viability of this RFC, I’ve horribly abused the `theme` field to store about 60 KB of JSON user settings data. Aside from breaking the CSS in Lemmy-UI (as expected), everything works great. The additional payload data in the `getSite` response doesn’t seem to be causing much of an impact. I may leave this in the next release under “advanced settings” with appropriate warnings as well as adding a “restore” button to restore it to a valid theme value. Ultimately, though, a dedicated field for 3PAs to use would be ideal.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 0
    +favouriteCount: 4
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1699709635 {#2455
      date: 2023-11-11 14:33:55.0 +01:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#2363 …}
    +votes: Doctrine\ORM\PersistentCollection {#2372 …}
    +reports: Doctrine\ORM\PersistentCollection {#2386 …}
    +favourites: Doctrine\ORM\PersistentCollection {#2385 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2378 …}
    +badges: Doctrine\ORM\PersistentCollection {#2381 …}
    +children: []
    -id: 11991
    -titleTs: "'add':2 'custom':3 'field':4 'local':6,9 'rfc':1 'site':7 'tabl':11 'user':10"
    -bodyTs: "'3pa':216,242,302 '3pas':110,443 '3rd':43,80,139,261 '60':369 'abil':143 'abus':362 'across':147 'ad':123,255,425 'add':2 'addit':391 'advanc':296,417 'allevi':289 'allow':79,138,320 'amount':194 'anyway':311 'api':98,158,201,287 'app':141 'applic':161 'appropri':420 'asid':376 'avoid':245 'backend':257,310 'better':342 'blob':74 'break':378 'build':307 'button':428 'call':202 'case':160,294 'caus':403 'client':84 'column':5,31,126 'common':273 'communiti':168,170,182 'con':190 'concern':227 'config':16,49,57,94 'consid':254 'contain':249 'content':246 'cooper':240 'correspond':15 'could':33,75 'cover':53 'css':380 'current':59,109,315 'custom':3,36,69,281 'data':24,177,196,207,375,393 'databas':4 'dedic':440 'dev':231,243,303 'develop':217 'devic':148 'device/browser':338 'devices/browsers':122 'discret':56 'doesn':398 'done':318 'due':203 'e.g':247 'editsit':20,133 'etc':188,252 'everyth':387 'exclus':112 'expect':386 'export':321 'expos':60,128,283 'extra':206 'far':347 'favorit':167 'field':70,223,282,365,441 'file':330 'filter':166 'getsit':132,200,396 'great':389 'group':171,183 'horribl':361 'ideal':349,448 'impact':407 'import':323 'increas':193 'individu':121 'interfac':23,67,136 'json':73,153,329,372 'kb':370 'key':17,58,215 'keyword':165 'larg':111 'leav':410 'lemmi':45,82,103,230,286,383 'lemmy-ui':102,382 'level':89,93,176 'like':39 'limit':117 'list':169,172 'load':334 'local':8,11,114,210 'mani':42 'may':267,304,409 'moder':186 'much':404 'myuserinfo':66 'name':32 'namespac':251 'need':236 'new':337 'next':414 'noth':344 'offer':47 'opt':305 'option':50,95 'overkil':269 'parti':44,81,140,262 'payload':392 'persist':119,145,278 'possibl':189,265 'prefer':164 'propos':1 'public':181 'rational':41 'realli':225 'relat':272 'releas':415 'report':184 'respons':397 'restor':427,430 'return':197 'rfc':358 'rule':180 'save':86,108 'saveuserset':22,62,135 'seem':400 'serial':150 'server':258 'set':107,146,162,279,299,326,374,418 'share':221 'similar':99 'simpl':275,298 'site':9,88,175,211 'site-level':87,174 'slight':192 'someth':38 'storag':115,300 'store':77,367 'storing/serving':155 'structur':173 'tabl':13 'task':276 'templat':187 'tesseract':313 'test':353 'text':28,125 'theme':364,435 'though':438 'thought':350 'type':25 'ui':46,83,104,263,384 'ultim':235,437 'updat':351 'use':159,293,445 'use-cas':292 'user':12,35,92,214,325,373 'user-level':91 'util':113 'valid':434 'valu':436 've':360 'via':61,130 'viabil':355 'warn':421 'well':423 'work':388 'workaround':253,316 'would':26,78,137,191,218,234,288,446"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1699718635
    +visibility: "visible             "
    +apId: "https://dubvee.org/post/370736"
    +editedAt: DateTimeImmutable @1699874770 {#2452
      date: 2023-11-13 12:26:10.0 +01:00
    }
    +createdAt: DateTimeImmutable @1699709635 {#2370
      date: 2023-11-11 14:33:55.0 +01:00
    }
  }
  +formDest: "entry"
  +showDownvote: true
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
boost App\Twig\Components\BoostComponent 12.0 MiB 2.56 ms
Input props
[
  "subject" => App\Entity\Entry {#2360
    +user: App\Entity\User {#265
      +avatar: Proxies\__CG__\App\Entity\Image {#246 …}
      +cover: Proxies\__CG__\App\Entity\Image {#247 …}
      +email: "ptz@dubvee.org"
      +username: "@ptz@dubvee.org"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: "Ask me anything."
      +lastActive: DateTime @1707767810 {#273
        date: 2024-02-12 20:56:50.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#236 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#232 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#221 …}
      +entries: Doctrine\ORM\PersistentCollection {#179 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#151 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#124 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#94 …}
      +posts: Doctrine\ORM\PersistentCollection {#67 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#82 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1372 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1594 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1873 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1769 …}
      +follows: Doctrine\ORM\PersistentCollection {#1809 …}
      +followers: Doctrine\ORM\PersistentCollection {#2390 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1860 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1857 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1791 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#2401 …}
      +reports: Doctrine\ORM\PersistentCollection {#2480 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1373 …}
      +violations: Doctrine\ORM\PersistentCollection {#2413 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1884 …}
      +awards: Doctrine\ORM\PersistentCollection {#1867 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1920 …}
      +categories: Doctrine\ORM\PersistentCollection {#1395 …}
      -id: 31957
      -password: "$2y$13$GQ5ytKsdAjGNepaBKTyaw.LxgdDgO3AmJCBWfHMnv0zu0ZgfjN0A2"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1953 …}
      +apId: "ptz@dubvee.org"
      +apProfileId: "https://dubvee.org/u/ptz"
      +apPublicUrl: "https://dubvee.org/u/ptz"
      +apFollowersUrl: null
      +apInboxUrl: "https://dubvee.org/inbox"
      +apDomain: "dubvee.org"
      +apPreferredUsername: "ptz"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1711023282 {#274
        date: 2024-03-21 13:14:42.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689880362 {#268
        date: 2023-07-20 21:12:42.0 +02:00
      }
    }
    +magazine: Proxies\__CG__\App\Entity\Magazine {#2377
      +icon: null
      +name: "lemmy_support@lemmy.ml"
      +title: "lemmy_support"
      +description: """
        Support / questions about Lemmy.\n
        \n
        [Matrix Space: #lemmy-space](https://matrix.to/#/#lemmy-space:matrix.org)
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 130
      +entryCommentCount: 600
      +postCount: 2
      +postCommentCount: 14
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1728910137 {#2233
        date: 2024-10-14 14:48:57.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#2238 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#2249 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#2259 …}
      +entries: Doctrine\ORM\PersistentCollection {#2244 …}
      +posts: Doctrine\ORM\PersistentCollection {#2250 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#2245 …}
      +bans: Doctrine\ORM\PersistentCollection {#2251 …}
      +reports: Doctrine\ORM\PersistentCollection {#2039 …}
      +badges: Doctrine\ORM\PersistentCollection {#2149 …}
      +logs: Doctrine\ORM\PersistentCollection {#2173 …}
      +awards: Doctrine\ORM\PersistentCollection {#2157 …}
      +categories: Doctrine\ORM\PersistentCollection {#2178 …}
      -id: 40
      +apId: "lemmy_support@lemmy.ml"
      +apProfileId: "https://lemmy.ml/c/lemmy_support"
      +apPublicUrl: "https://lemmy.ml/c/lemmy_support"
      +apFollowersUrl: "https://lemmy.ml/c/lemmy_support/followers"
      +apInboxUrl: "https://lemmy.ml/inbox"
      +apDomain: "lemmy.ml"
      +apPreferredUsername: "lemmy_support"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1729581033 {#2226
        date: 2024-10-22 09:10:33.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1696687715 {#2234
        date: 2023-10-07 16:08:35.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#2467 …}
    +slug: "RFC-Add-custom-fields-to-local-site-and-local-user-tables"
    +title: "[RFC] Add custom fields to local_site and local_user tables"
    +url: null
    +body: """
      ### Proposal\n
      \n
      Add custom database columns to the `local_site` and `local_user` tables and corresponding config keys in the `editSite` and `saveUserSettings` interfaces. Data type would be `text` and the column name could be `user_custom` or something like that.\n
      \n
      ### Rationale\n
      \n
      Many 3rd party Lemmy UIs offer more config options than are covered by the discrete config keys currently exposed via `saveUserSettings` and in the `MyUserInfo` interface. A custom field where a JSON blob could be stored would allow 3rd party Lemmy UI clients to save site-level and user-level config options to the API similar to how Lemmy-UI has its settings saved.\n
      \n
      Currently, 3PAs largely (exclusively?) utilize local storage which limits any persistence to individual devices/browsers. Adding those `text` columns and exposing them via the `getSite`, `editSite` and `saveUserSettings` interfaces would allow 3rd party apps the ability to persist settings across devices by serializing them to JSON and storing/serving from the API.\n
      \n
      ### Use Cases\n
      \n
      - Application settings and preferences\n
      - Keyword filters\n
      - Favorite community lists\n
      - Community group lists\n
      - Structured site-level data such as rules, public community groups, report and moderation templates, etc.\n
      \n
      ### Possible Cons\n
      \n
      - Would slightly increase amount of data returned in the `getSite` API call due to the extra data in the `local_site` and `my_user` keys.\n
      - 3PA developers would have to share this field. \n
          - Not really a concern for the Lemmy devs, but there would ultimately need to be some cooperation between 3PA devs to avoid contention (e.g. a container with namespaces, etc).\n
      \n
      ### Workarounds Considered\n
      \n
      Adding a backend server to each 3rd party UI is possible but may be overkill for the relatively common and simple task of persisting settings. A custom field exposed by the Lemmy API would alleviate that. For use-cases more advanced than simple settings storage, the 3PA dev may opt to build their own backend anyway.\n
      \n
      In Tesseract, the current workaround is done by allowing export and import of user settings to a JSON file which can be loaded into a new device/browser. While that’s better than nothing, it’s far from ideal.\n
      \n
      Thoughts?\n
      \n
      **Update**: To test the viability of this RFC, I’ve horribly abused the `theme` field to store about 60 KB of JSON user settings data. Aside from breaking the CSS in Lemmy-UI (as expected), everything works great. The additional payload data in the `getSite` response doesn’t seem to be causing much of an impact. I may leave this in the next release under “advanced settings” with appropriate warnings as well as adding a “restore” button to restore it to a valid theme value. Ultimately, though, a dedicated field for 3PAs to use would be ideal.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 0
    +favouriteCount: 4
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1699709635 {#2455
      date: 2023-11-11 14:33:55.0 +01:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#2363 …}
    +votes: Doctrine\ORM\PersistentCollection {#2372 …}
    +reports: Doctrine\ORM\PersistentCollection {#2386 …}
    +favourites: Doctrine\ORM\PersistentCollection {#2385 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2378 …}
    +badges: Doctrine\ORM\PersistentCollection {#2381 …}
    +children: []
    -id: 11991
    -titleTs: "'add':2 'custom':3 'field':4 'local':6,9 'rfc':1 'site':7 'tabl':11 'user':10"
    -bodyTs: "'3pa':216,242,302 '3pas':110,443 '3rd':43,80,139,261 '60':369 'abil':143 'abus':362 'across':147 'ad':123,255,425 'add':2 'addit':391 'advanc':296,417 'allevi':289 'allow':79,138,320 'amount':194 'anyway':311 'api':98,158,201,287 'app':141 'applic':161 'appropri':420 'asid':376 'avoid':245 'backend':257,310 'better':342 'blob':74 'break':378 'build':307 'button':428 'call':202 'case':160,294 'caus':403 'client':84 'column':5,31,126 'common':273 'communiti':168,170,182 'con':190 'concern':227 'config':16,49,57,94 'consid':254 'contain':249 'content':246 'cooper':240 'correspond':15 'could':33,75 'cover':53 'css':380 'current':59,109,315 'custom':3,36,69,281 'data':24,177,196,207,375,393 'databas':4 'dedic':440 'dev':231,243,303 'develop':217 'devic':148 'device/browser':338 'devices/browsers':122 'discret':56 'doesn':398 'done':318 'due':203 'e.g':247 'editsit':20,133 'etc':188,252 'everyth':387 'exclus':112 'expect':386 'export':321 'expos':60,128,283 'extra':206 'far':347 'favorit':167 'field':70,223,282,365,441 'file':330 'filter':166 'getsit':132,200,396 'great':389 'group':171,183 'horribl':361 'ideal':349,448 'impact':407 'import':323 'increas':193 'individu':121 'interfac':23,67,136 'json':73,153,329,372 'kb':370 'key':17,58,215 'keyword':165 'larg':111 'leav':410 'lemmi':45,82,103,230,286,383 'lemmy-ui':102,382 'level':89,93,176 'like':39 'limit':117 'list':169,172 'load':334 'local':8,11,114,210 'mani':42 'may':267,304,409 'moder':186 'much':404 'myuserinfo':66 'name':32 'namespac':251 'need':236 'new':337 'next':414 'noth':344 'offer':47 'opt':305 'option':50,95 'overkil':269 'parti':44,81,140,262 'payload':392 'persist':119,145,278 'possibl':189,265 'prefer':164 'propos':1 'public':181 'rational':41 'realli':225 'relat':272 'releas':415 'report':184 'respons':397 'restor':427,430 'return':197 'rfc':358 'rule':180 'save':86,108 'saveuserset':22,62,135 'seem':400 'serial':150 'server':258 'set':107,146,162,279,299,326,374,418 'share':221 'similar':99 'simpl':275,298 'site':9,88,175,211 'site-level':87,174 'slight':192 'someth':38 'storag':115,300 'store':77,367 'storing/serving':155 'structur':173 'tabl':13 'task':276 'templat':187 'tesseract':313 'test':353 'text':28,125 'theme':364,435 'though':438 'thought':350 'type':25 'ui':46,83,104,263,384 'ultim':235,437 'updat':351 'use':159,293,445 'use-cas':292 'user':12,35,92,214,325,373 'user-level':91 'util':113 'valid':434 'valu':436 've':360 'via':61,130 'viabil':355 'warn':421 'well':423 'work':388 'workaround':253,316 'would':26,78,137,191,218,234,288,446"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1699718635
    +visibility: "visible             "
    +apId: "https://dubvee.org/post/370736"
    +editedAt: DateTimeImmutable @1699874770 {#2452
      date: 2023-11-13 12:26:10.0 +01:00
    }
    +createdAt: DateTimeImmutable @1699709635 {#2370
      date: 2023-11-11 14:33:55.0 +01:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\BoostComponent {#2975
  +formDest: "entry"
  +subject: App\Entity\Entry {#2360
    +user: App\Entity\User {#265
      +avatar: Proxies\__CG__\App\Entity\Image {#246 …}
      +cover: Proxies\__CG__\App\Entity\Image {#247 …}
      +email: "ptz@dubvee.org"
      +username: "@ptz@dubvee.org"
      +roles: []
      +followersCount: 0
      +homepage: "front"
      +about: "Ask me anything."
      +lastActive: DateTime @1707767810 {#273
        date: 2024-02-12 20:56:50.0 +01:00
      }
      +markedForDeletionAt: null
      +fields: null
      +oauthGithubId: null
      +oauthGoogleId: null
      +oauthFacebookId: null
      +oauthKeycloakId: null
      +hideAdult: true
      +showSubscribedUsers: true
      +showSubscribedMagazines: true
      +showSubscribedDomains: true
      +preferredLanguages: []
      +featuredMagazines: null
      +showProfileSubscriptions: true
      +showProfileFollowings: true
      +markNewComments: false
      +notifyOnNewEntry: false
      +notifyOnNewEntryReply: false
      +notifyOnNewEntryCommentReply: false
      +notifyOnNewPost: false
      +notifyOnNewPostReply: false
      +notifyOnNewPostCommentReply: false
      +addMentionsEntries: false
      +addMentionsPosts: true
      +isBanned: false
      +isVerified: false
      +isDeleted: false
      +isBot: false
      +spamProtection: true
      +customCss: null
      +ignoreMagazinesCustomCss: false
      +moderatorTokens: Doctrine\ORM\PersistentCollection {#236 …}
      +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#232 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#221 …}
      +entries: Doctrine\ORM\PersistentCollection {#179 …}
      +entryVotes: Doctrine\ORM\PersistentCollection {#151 …}
      +entryComments: Doctrine\ORM\PersistentCollection {#124 …}
      +entryCommentVotes: Doctrine\ORM\PersistentCollection {#94 …}
      +posts: Doctrine\ORM\PersistentCollection {#67 …}
      +postVotes: Doctrine\ORM\PersistentCollection {#82 …}
      +postComments: Doctrine\ORM\PersistentCollection {#1372 …}
      +postCommentVotes: Doctrine\ORM\PersistentCollection {#1594 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#1873 …}
      +subscribedDomains: Doctrine\ORM\PersistentCollection {#1769 …}
      +follows: Doctrine\ORM\PersistentCollection {#1809 …}
      +followers: Doctrine\ORM\PersistentCollection {#2390 …}
      +blocks: Doctrine\ORM\PersistentCollection {#1860 …}
      +blockers: Doctrine\ORM\PersistentCollection {#1857 …}
      +blockedMagazines: Doctrine\ORM\PersistentCollection {#1791 …}
      +blockedDomains: Doctrine\ORM\PersistentCollection {#2401 …}
      +reports: Doctrine\ORM\PersistentCollection {#2480 …}
      +favourites: Doctrine\ORM\PersistentCollection {#1373 …}
      +violations: Doctrine\ORM\PersistentCollection {#2413 …}
      +notifications: Doctrine\ORM\PersistentCollection {#1884 …}
      +awards: Doctrine\ORM\PersistentCollection {#1867 …}
      +subscribedCategories: Doctrine\ORM\PersistentCollection {#1920 …}
      +categories: Doctrine\ORM\PersistentCollection {#1395 …}
      -id: 31957
      -password: "$2y$13$GQ5ytKsdAjGNepaBKTyaw.LxgdDgO3AmJCBWfHMnv0zu0ZgfjN0A2"
      -totpSecret: null
      -totpBackupCodes: []
      -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1953 …}
      +apId: "ptz@dubvee.org"
      +apProfileId: "https://dubvee.org/u/ptz"
      +apPublicUrl: "https://dubvee.org/u/ptz"
      +apFollowersUrl: null
      +apInboxUrl: "https://dubvee.org/inbox"
      +apDomain: "dubvee.org"
      +apPreferredUsername: "ptz"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: false
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1711023282 {#274
        date: 2024-03-21 13:14:42.0 +01:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1689880362 {#268
        date: 2023-07-20 21:12:42.0 +02:00
      }
    }
    +magazine: Proxies\__CG__\App\Entity\Magazine {#2377
      +icon: null
      +name: "lemmy_support@lemmy.ml"
      +title: "lemmy_support"
      +description: """
        Support / questions about Lemmy.\n
        \n
        [Matrix Space: #lemmy-space](https://matrix.to/#/#lemmy-space:matrix.org)
        """
      +rules: null
      +subscriptionsCount: 1
      +entryCount: 130
      +entryCommentCount: 600
      +postCount: 2
      +postCommentCount: 14
      +isAdult: false
      +customCss: null
      +lastActive: DateTime @1728910137 {#2233
        date: 2024-10-14 14:48:57.0 +02:00
      }
      +markedForDeletionAt: null
      +tags: null
      +moderators: Doctrine\ORM\PersistentCollection {#2238 …}
      +ownershipRequests: Doctrine\ORM\PersistentCollection {#2249 …}
      +moderatorRequests: Doctrine\ORM\PersistentCollection {#2259 …}
      +entries: Doctrine\ORM\PersistentCollection {#2244 …}
      +posts: Doctrine\ORM\PersistentCollection {#2250 …}
      +subscriptions: Doctrine\ORM\PersistentCollection {#2245 …}
      +bans: Doctrine\ORM\PersistentCollection {#2251 …}
      +reports: Doctrine\ORM\PersistentCollection {#2039 …}
      +badges: Doctrine\ORM\PersistentCollection {#2149 …}
      +logs: Doctrine\ORM\PersistentCollection {#2173 …}
      +awards: Doctrine\ORM\PersistentCollection {#2157 …}
      +categories: Doctrine\ORM\PersistentCollection {#2178 …}
      -id: 40
      +apId: "lemmy_support@lemmy.ml"
      +apProfileId: "https://lemmy.ml/c/lemmy_support"
      +apPublicUrl: "https://lemmy.ml/c/lemmy_support"
      +apFollowersUrl: "https://lemmy.ml/c/lemmy_support/followers"
      +apInboxUrl: "https://lemmy.ml/inbox"
      +apDomain: "lemmy.ml"
      +apPreferredUsername: "lemmy_support"
      +apDiscoverable: true
      +apManuallyApprovesFollowers: null
      +privateKey: null
      +publicKey: null
      +apFetchedAt: DateTime @1729581033 {#2226
        date: 2024-10-22 09:10:33.0 +02:00
      }
      +apDeletedAt: null
      +apTimeoutAt: null
      +visibility: "visible             "
      +createdAt: DateTimeImmutable @1696687715 {#2234
        date: 2023-10-07 16:08:35.0 +02:00
      }
      +__isInitialized__: true
       …2
    }
    +image: null
    +domain: Proxies\__CG__\App\Entity\Domain {#2467 …}
    +slug: "RFC-Add-custom-fields-to-local-site-and-local-user-tables"
    +title: "[RFC] Add custom fields to local_site and local_user tables"
    +url: null
    +body: """
      ### Proposal\n
      \n
      Add custom database columns to the `local_site` and `local_user` tables and corresponding config keys in the `editSite` and `saveUserSettings` interfaces. Data type would be `text` and the column name could be `user_custom` or something like that.\n
      \n
      ### Rationale\n
      \n
      Many 3rd party Lemmy UIs offer more config options than are covered by the discrete config keys currently exposed via `saveUserSettings` and in the `MyUserInfo` interface. A custom field where a JSON blob could be stored would allow 3rd party Lemmy UI clients to save site-level and user-level config options to the API similar to how Lemmy-UI has its settings saved.\n
      \n
      Currently, 3PAs largely (exclusively?) utilize local storage which limits any persistence to individual devices/browsers. Adding those `text` columns and exposing them via the `getSite`, `editSite` and `saveUserSettings` interfaces would allow 3rd party apps the ability to persist settings across devices by serializing them to JSON and storing/serving from the API.\n
      \n
      ### Use Cases\n
      \n
      - Application settings and preferences\n
      - Keyword filters\n
      - Favorite community lists\n
      - Community group lists\n
      - Structured site-level data such as rules, public community groups, report and moderation templates, etc.\n
      \n
      ### Possible Cons\n
      \n
      - Would slightly increase amount of data returned in the `getSite` API call due to the extra data in the `local_site` and `my_user` keys.\n
      - 3PA developers would have to share this field. \n
          - Not really a concern for the Lemmy devs, but there would ultimately need to be some cooperation between 3PA devs to avoid contention (e.g. a container with namespaces, etc).\n
      \n
      ### Workarounds Considered\n
      \n
      Adding a backend server to each 3rd party UI is possible but may be overkill for the relatively common and simple task of persisting settings. A custom field exposed by the Lemmy API would alleviate that. For use-cases more advanced than simple settings storage, the 3PA dev may opt to build their own backend anyway.\n
      \n
      In Tesseract, the current workaround is done by allowing export and import of user settings to a JSON file which can be loaded into a new device/browser. While that’s better than nothing, it’s far from ideal.\n
      \n
      Thoughts?\n
      \n
      **Update**: To test the viability of this RFC, I’ve horribly abused the `theme` field to store about 60 KB of JSON user settings data. Aside from breaking the CSS in Lemmy-UI (as expected), everything works great. The additional payload data in the `getSite` response doesn’t seem to be causing much of an impact. I may leave this in the next release under “advanced settings” with appropriate warnings as well as adding a “restore” button to restore it to a valid theme value. Ultimately, though, a dedicated field for 3PAs to use would be ideal.
      """
    +type: "article"
    +lang: "en"
    +isOc: false
    +hasEmbed: false
    +commentCount: 0
    +favouriteCount: 4
    +score: 0
    +isAdult: false
    +sticky: false
    +lastActive: DateTime @1699709635 {#2455
      date: 2023-11-11 14:33:55.0 +01:00
    }
    +ip: null
    +adaAmount: 0
    +tags: null
    +mentions: null
    +comments: Doctrine\ORM\PersistentCollection {#2363 …}
    +votes: Doctrine\ORM\PersistentCollection {#2372 …}
    +reports: Doctrine\ORM\PersistentCollection {#2386 …}
    +favourites: Doctrine\ORM\PersistentCollection {#2385 …}
    +notifications: Doctrine\ORM\PersistentCollection {#2378 …}
    +badges: Doctrine\ORM\PersistentCollection {#2381 …}
    +children: []
    -id: 11991
    -titleTs: "'add':2 'custom':3 'field':4 'local':6,9 'rfc':1 'site':7 'tabl':11 'user':10"
    -bodyTs: "'3pa':216,242,302 '3pas':110,443 '3rd':43,80,139,261 '60':369 'abil':143 'abus':362 'across':147 'ad':123,255,425 'add':2 'addit':391 'advanc':296,417 'allevi':289 'allow':79,138,320 'amount':194 'anyway':311 'api':98,158,201,287 'app':141 'applic':161 'appropri':420 'asid':376 'avoid':245 'backend':257,310 'better':342 'blob':74 'break':378 'build':307 'button':428 'call':202 'case':160,294 'caus':403 'client':84 'column':5,31,126 'common':273 'communiti':168,170,182 'con':190 'concern':227 'config':16,49,57,94 'consid':254 'contain':249 'content':246 'cooper':240 'correspond':15 'could':33,75 'cover':53 'css':380 'current':59,109,315 'custom':3,36,69,281 'data':24,177,196,207,375,393 'databas':4 'dedic':440 'dev':231,243,303 'develop':217 'devic':148 'device/browser':338 'devices/browsers':122 'discret':56 'doesn':398 'done':318 'due':203 'e.g':247 'editsit':20,133 'etc':188,252 'everyth':387 'exclus':112 'expect':386 'export':321 'expos':60,128,283 'extra':206 'far':347 'favorit':167 'field':70,223,282,365,441 'file':330 'filter':166 'getsit':132,200,396 'great':389 'group':171,183 'horribl':361 'ideal':349,448 'impact':407 'import':323 'increas':193 'individu':121 'interfac':23,67,136 'json':73,153,329,372 'kb':370 'key':17,58,215 'keyword':165 'larg':111 'leav':410 'lemmi':45,82,103,230,286,383 'lemmy-ui':102,382 'level':89,93,176 'like':39 'limit':117 'list':169,172 'load':334 'local':8,11,114,210 'mani':42 'may':267,304,409 'moder':186 'much':404 'myuserinfo':66 'name':32 'namespac':251 'need':236 'new':337 'next':414 'noth':344 'offer':47 'opt':305 'option':50,95 'overkil':269 'parti':44,81,140,262 'payload':392 'persist':119,145,278 'possibl':189,265 'prefer':164 'propos':1 'public':181 'rational':41 'realli':225 'relat':272 'releas':415 'report':184 'respons':397 'restor':427,430 'return':197 'rfc':358 'rule':180 'save':86,108 'saveuserset':22,62,135 'seem':400 'serial':150 'server':258 'set':107,146,162,279,299,326,374,418 'share':221 'similar':99 'simpl':275,298 'site':9,88,175,211 'site-level':87,174 'slight':192 'someth':38 'storag':115,300 'store':77,367 'storing/serving':155 'structur':173 'tabl':13 'task':276 'templat':187 'tesseract':313 'test':353 'text':28,125 'theme':364,435 'though':438 'thought':350 'type':25 'ui':46,83,104,263,384 'ultim':235,437 'updat':351 'use':159,293,445 'use-cas':292 'user':12,35,92,214,325,373 'user-level':91 'util':113 'valid':434 'valu':436 've':360 'via':61,130 'viabil':355 'warn':421 'well':423 'work':388 'workaround':253,316 'would':26,78,137,191,218,234,288,446"
    +cross: false
    +upVotes: 0
    +downVotes: 0
    +ranking: 1699718635
    +visibility: "visible             "
    +apId: "https://dubvee.org/post/370736"
    +editedAt: DateTimeImmutable @1699874770 {#2452
      date: 2023-11-13 12:26:10.0 +01:00
    }
    +createdAt: DateTimeImmutable @1699709635 {#2370
      date: 2023-11-11 14:33:55.0 +01:00
    }
  }
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
}
settings_row_enum App\Twig\Components\SettingsRowEnumComponent 12.0 MiB 0.22 ms
Input props
[
  "label" => "Sidebar position"
  "settingsKey" => "KBIN_GENERAL_SIDEBAR_POSITION"
  "values" => [
    [
      "name" => "Left"
      "value" => "LEFT"
    ]
    [
      "name" => "Right"
      "value" => "RIGHT"
    ]
  ]
  "defaultValue" => "RIGHT"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowEnumComponent {#3343
  +label: "Sidebar position"
  +help: ""
  +settingsKey: "KBIN_GENERAL_SIDEBAR_POSITION"
  +values: [
    [
      "name" => "Left"
      "value" => "LEFT"
    ]
    [
      "name" => "Right"
      "value" => "RIGHT"
    ]
  ]
  +defaultValue: "RIGHT"
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.19 ms
Input props
[
  "label" => "Dynamic lists"
  "settingsKey" => "KBIN_GENERAL_DYNAMIC_LISTS"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#3401
  +label: "Dynamic lists"
  +help: ""
  +settingsKey: "KBIN_GENERAL_DYNAMIC_LISTS"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.13 ms
Input props
[
  "label" => "Rounded edges"
  "settingsKey" => "KBIN_GENERAL_ROUNDED_EDGES"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#3463
  +label: "Rounded edges"
  +help: ""
  +settingsKey: "KBIN_GENERAL_ROUNDED_EDGES"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.14 ms
Input props
[
  "label" => "Infinite scrolling"
  "help" => "Automatically load more content when you reach the bottom of the page."
  "settingsKey" => "KBIN_GENERAL_INFINITE_SCROLL"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#3519
  +label: "Infinite scrolling"
  +help: "Automatically load more content when you reach the bottom of the page."
  +settingsKey: "KBIN_GENERAL_INFINITE_SCROLL"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.13 ms
Input props
[
  "label" => "Sticky navbar"
  "help" => "The navbar will stick to the top of the page when you scroll down."
  "settingsKey" => "KBIN_GENERAL_FIXED_NAVBAR"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#3578
  +label: "Sticky navbar"
  +help: "The navbar will stick to the top of the page when you scroll down."
  +settingsKey: "KBIN_GENERAL_FIXED_NAVBAR"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.12 ms
Input props
[
  "label" => "Show top bar"
  "settingsKey" => "KBIN_GENERAL_TOPBAR"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#3634
  +label: "Show top bar"
  +help: ""
  +settingsKey: "KBIN_GENERAL_TOPBAR"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.17 ms
Input props
[
  "label" => "Turbo mode (experimental)"
  "settingsKey" => "KBIN_GENERAL_TURBO"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#3690
  +label: "Turbo mode (experimental)"
  +help: ""
  +settingsKey: "KBIN_GENERAL_TURBO"
  +defaultValue: false
  +reloadRequired: true
}
user_settings_row_switch App\Twig\Components\UserSettingsRowSwitchComponent 12.0 MiB 0.22 ms
Input props
[
  "label" => "Mark new comments"
  "settingsKey" => "KBIN_MARK_NEW_COMMENTS"
]
Attributes
[]
Component
App\Twig\Components\UserSettingsRowSwitchComponent {#3748
  +label: "Mark new comments"
  +help: ""
  +settingsKey: "KBIN_MARK_NEW_COMMENTS"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.13 ms
Input props
[
  "label" => "Show "Support Us" block"
  "settingsKey" => "KBIN_GENERAL_SUPPORT_US_BLOCK"
  "defaultValue" => true
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#3811
  +label: "Show "Support Us" block"
  +help: ""
  +settingsKey: "KBIN_GENERAL_SUPPORT_US_BLOCK"
  +defaultValue: true
  +reloadRequired: true
}
user_settings_row_switch App\Twig\Components\UserSettingsRowSwitchComponent 12.0 MiB 0.15 ms
Input props
[
  "label" => "Show subscribed users"
  "settingsKey" => "KBIN_SUB_CHANNEL_USERS"
]
Attributes
[]
Component
App\Twig\Components\UserSettingsRowSwitchComponent {#3869
  +label: "Show subscribed users"
  +help: ""
  +settingsKey: "KBIN_SUB_CHANNEL_USERS"
  +defaultValue: false
  +reloadRequired: true
}
user_settings_row_switch App\Twig\Components\UserSettingsRowSwitchComponent 12.0 MiB 0.17 ms
Input props
[
  "label" => "Show subscribed magazines"
  "settingsKey" => "KBIN_SUB_CHANNEL_MAGAZINES"
]
Attributes
[]
Component
App\Twig\Components\UserSettingsRowSwitchComponent {#3925
  +label: "Show subscribed magazines"
  +help: ""
  +settingsKey: "KBIN_SUB_CHANNEL_MAGAZINES"
  +defaultValue: false
  +reloadRequired: true
}
user_settings_row_switch App\Twig\Components\UserSettingsRowSwitchComponent 12.0 MiB 0.15 ms
Input props
[
  "label" => "Show subscribed domains"
  "settingsKey" => "KBIN_SUB_CHANNEL_DOMAINS"
]
Attributes
[]
Component
App\Twig\Components\UserSettingsRowSwitchComponent {#3981
  +label: "Show subscribed domains"
  +help: ""
  +settingsKey: "KBIN_SUB_CHANNEL_DOMAINS"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.13 ms
Input props
[
  "label" => "Auto media preview"
  "help" => "Automatically expand media previews."
  "settingsKey" => "KBIN_ENTRIES_SHOW_PREVIEW"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#4037
  +label: "Auto media preview"
  +help: "Automatically expand media previews."
  +settingsKey: "KBIN_ENTRIES_SHOW_PREVIEW"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.12 ms
Input props
[
  "label" => "Compact view"
  "settingsKey" => "KBIN_ENTRIES_COMPACT"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#4093
  +label: "Compact view"
  +help: ""
  +settingsKey: "KBIN_ENTRIES_COMPACT"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 1.63 ms
Input props
[
  "label" => "Show users’ avatars"
  "settingsKey" => "KBIN_ENTRIES_SHOW_USERS_AVATARS"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#4149
  +label: "Show users’ avatars"
  +help: ""
  +settingsKey: "KBIN_ENTRIES_SHOW_USERS_AVATARS"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.21 ms
Input props
[
  "label" => "Show magazines’ icons"
  "settingsKey" => "KBIN_ENTRIES_SHOW_MAGAZINES_ICONS"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#4205
  +label: "Show magazines’ icons"
  +help: ""
  +settingsKey: "KBIN_ENTRIES_SHOW_MAGAZINES_ICONS"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.13 ms
Input props
[
  "label" => "Show thumbnails"
  "settingsKey" => "KBIN_ENTRIES_SHOW_THUMBNAILS"
  "defaultValue" => true
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#4261
  +label: "Show thumbnails"
  +help: ""
  +settingsKey: "KBIN_ENTRIES_SHOW_THUMBNAILS"
  +defaultValue: true
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.12 ms
Input props
[
  "label" => "Auto media preview"
  "help" => "Automatically expand media previews."
  "settingsKey" => "KBIN_POSTS_SHOW_PREVIEW"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#4317
  +label: "Auto media preview"
  +help: "Automatically expand media previews."
  +settingsKey: "KBIN_POSTS_SHOW_PREVIEW"
  +defaultValue: false
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.12 ms
Input props
[
  "label" => "Show users’ avatars"
  "settingsKey" => "KBIN_POSTS_SHOW_USERS_AVATARS"
  "defaultValue" => true
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#4373
  +label: "Show users’ avatars"
  +help: ""
  +settingsKey: "KBIN_POSTS_SHOW_USERS_AVATARS"
  +defaultValue: true
  +reloadRequired: true
}
settings_row_enum App\Twig\Components\SettingsRowEnumComponent 12.0 MiB 0.15 ms
Input props
[
  "label" => "Comment reply position"
  "help" => "Display the comment reply form either at the top or bottom of the page. When 'infinite scroll' is enabled the position will always appear at the top."
  "settingsKey" => "KBIN_COMMENTS_REPLY_POSITION"
  "values" => [
    [
      "name" => "top"
      "value" => "TOP"
    ]
    [
      "name" => "bottom"
      "value" => "BOTTOM"
    ]
  ]
  "defaultValue" => "TOP"
]
Attributes
[]
Component
App\Twig\Components\SettingsRowEnumComponent {#4429
  +label: "Comment reply position"
  +help: "Display the comment reply form either at the top or bottom of the page. When 'infinite scroll' is enabled the position will always appear at the top."
  +settingsKey: "KBIN_COMMENTS_REPLY_POSITION"
  +values: [
    [
      "name" => "top"
      "value" => "TOP"
    ]
    [
      "name" => "bottom"
      "value" => "BOTTOM"
    ]
  ]
  +defaultValue: "TOP"
  +reloadRequired: true
}
settings_row_switch App\Twig\Components\SettingsRowSwitchComponent 12.0 MiB 0.13 ms
Input props
[
  "label" => "Show Comment Avatars"
  "help" => "Display/hide user avatars when viewing comments on a single thread or post."
  "settingsKey" => "KBIN_COMMENTS_SHOW_USER_AVATAR"
  "defaultValue" => true
]
Attributes
[]
Component
App\Twig\Components\SettingsRowSwitchComponent {#4487
  +label: "Show Comment Avatars"
  +help: "Display/hide user avatars when viewing comments on a single thread or post."
  +settingsKey: "KBIN_COMMENTS_SHOW_USER_AVATAR"
  +defaultValue: true
  +reloadRequired: true
}
user_actions App\Twig\Components\UserActionsComponent 12.0 MiB 0.46 ms
Input props
[
  "user" => App\Entity\User {#265
    +avatar: Proxies\__CG__\App\Entity\Image {#246 …}
    +cover: Proxies\__CG__\App\Entity\Image {#247 …}
    +email: "ptz@dubvee.org"
    +username: "@ptz@dubvee.org"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: "Ask me anything."
    +lastActive: DateTime @1707767810 {#273
      date: 2024-02-12 20:56:50.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#236 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#232 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#221 …}
    +entries: Doctrine\ORM\PersistentCollection {#179 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#151 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#124 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#94 …}
    +posts: Doctrine\ORM\PersistentCollection {#67 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#82 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1372 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1594 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1873 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1769 …}
    +follows: Doctrine\ORM\PersistentCollection {#1809 …}
    +followers: Doctrine\ORM\PersistentCollection {#2390 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1860 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1857 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1791 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#2401 …}
    +reports: Doctrine\ORM\PersistentCollection {#2480 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1373 …}
    +violations: Doctrine\ORM\PersistentCollection {#2413 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1884 …}
    +awards: Doctrine\ORM\PersistentCollection {#1867 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1920 …}
    +categories: Doctrine\ORM\PersistentCollection {#1395 …}
    -id: 31957
    -password: "$2y$13$GQ5ytKsdAjGNepaBKTyaw.LxgdDgO3AmJCBWfHMnv0zu0ZgfjN0A2"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1953 …}
    +apId: "ptz@dubvee.org"
    +apProfileId: "https://dubvee.org/u/ptz"
    +apPublicUrl: "https://dubvee.org/u/ptz"
    +apFollowersUrl: null
    +apInboxUrl: "https://dubvee.org/inbox"
    +apDomain: "dubvee.org"
    +apPreferredUsername: "ptz"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1711023282 {#274
      date: 2024-03-21 13:14:42.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689880362 {#268
      date: 2023-07-20 21:12:42.0 +02:00
    }
  }
]
Attributes
[]
Component
App\Twig\Components\UserActionsComponent {#4565
  +user: App\Entity\User {#265
    +avatar: Proxies\__CG__\App\Entity\Image {#246 …}
    +cover: Proxies\__CG__\App\Entity\Image {#247 …}
    +email: "ptz@dubvee.org"
    +username: "@ptz@dubvee.org"
    +roles: []
    +followersCount: 0
    +homepage: "front"
    +about: "Ask me anything."
    +lastActive: DateTime @1707767810 {#273
      date: 2024-02-12 20:56:50.0 +01:00
    }
    +markedForDeletionAt: null
    +fields: null
    +oauthGithubId: null
    +oauthGoogleId: null
    +oauthFacebookId: null
    +oauthKeycloakId: null
    +hideAdult: true
    +showSubscribedUsers: true
    +showSubscribedMagazines: true
    +showSubscribedDomains: true
    +preferredLanguages: []
    +featuredMagazines: null
    +showProfileSubscriptions: true
    +showProfileFollowings: true
    +markNewComments: false
    +notifyOnNewEntry: false
    +notifyOnNewEntryReply: false
    +notifyOnNewEntryCommentReply: false
    +notifyOnNewPost: false
    +notifyOnNewPostReply: false
    +notifyOnNewPostCommentReply: false
    +addMentionsEntries: false
    +addMentionsPosts: true
    +isBanned: false
    +isVerified: false
    +isDeleted: false
    +isBot: false
    +spamProtection: true
    +customCss: null
    +ignoreMagazinesCustomCss: false
    +moderatorTokens: Doctrine\ORM\PersistentCollection {#236 …}
    +magazineOwnershipRequests: Doctrine\ORM\PersistentCollection {#232 …}
    +moderatorRequests: Doctrine\ORM\PersistentCollection {#221 …}
    +entries: Doctrine\ORM\PersistentCollection {#179 …}
    +entryVotes: Doctrine\ORM\PersistentCollection {#151 …}
    +entryComments: Doctrine\ORM\PersistentCollection {#124 …}
    +entryCommentVotes: Doctrine\ORM\PersistentCollection {#94 …}
    +posts: Doctrine\ORM\PersistentCollection {#67 …}
    +postVotes: Doctrine\ORM\PersistentCollection {#82 …}
    +postComments: Doctrine\ORM\PersistentCollection {#1372 …}
    +postCommentVotes: Doctrine\ORM\PersistentCollection {#1594 …}
    +subscriptions: Doctrine\ORM\PersistentCollection {#1873 …}
    +subscribedDomains: Doctrine\ORM\PersistentCollection {#1769 …}
    +follows: Doctrine\ORM\PersistentCollection {#1809 …}
    +followers: Doctrine\ORM\PersistentCollection {#2390 …}
    +blocks: Doctrine\ORM\PersistentCollection {#1860 …}
    +blockers: Doctrine\ORM\PersistentCollection {#1857 …}
    +blockedMagazines: Doctrine\ORM\PersistentCollection {#1791 …}
    +blockedDomains: Doctrine\ORM\PersistentCollection {#2401 …}
    +reports: Doctrine\ORM\PersistentCollection {#2480 …}
    +favourites: Doctrine\ORM\PersistentCollection {#1373 …}
    +violations: Doctrine\ORM\PersistentCollection {#2413 …}
    +notifications: Doctrine\ORM\PersistentCollection {#1884 …}
    +awards: Doctrine\ORM\PersistentCollection {#1867 …}
    +subscribedCategories: Doctrine\ORM\PersistentCollection {#1920 …}
    +categories: Doctrine\ORM\PersistentCollection {#1395 …}
    -id: 31957
    -password: "$2y$13$GQ5ytKsdAjGNepaBKTyaw.LxgdDgO3AmJCBWfHMnv0zu0ZgfjN0A2"
    -totpSecret: null
    -totpBackupCodes: []
    -oAuth2UserConsents: Doctrine\ORM\PersistentCollection {#1953 …}
    +apId: "ptz@dubvee.org"
    +apProfileId: "https://dubvee.org/u/ptz"
    +apPublicUrl: "https://dubvee.org/u/ptz"
    +apFollowersUrl: null
    +apInboxUrl: "https://dubvee.org/inbox"
    +apDomain: "dubvee.org"
    +apPreferredUsername: "ptz"
    +apDiscoverable: true
    +apManuallyApprovesFollowers: false
    +privateKey: null
    +publicKey: null
    +apFetchedAt: DateTime @1711023282 {#274
      date: 2024-03-21 13:14:42.0 +01:00
    }
    +apDeletedAt: null
    +apTimeoutAt: null
    +visibility: "visible             "
    +createdAt: DateTimeImmutable @1689880362 {#268
      date: 2023-07-20 21:12:42.0 +02:00
    }
  }
}
date App\Twig\Components\DateComponent 12.0 MiB 0.13 ms
Input props
[
  "date" => DateTimeImmutable @1689880362 {#268
    date: 2023-07-20 21:12:42.0 +02:00
  }
]
Attributes
[]
Component
App\Twig\Components\DateComponent {#4626
  +date: DateTimeImmutable @1689880362 {#268
    date: 2023-07-20 21:12:42.0 +02:00
  }
}
related_magazines App\Twig\Components\RelatedMagazinesComponent 12.0 MiB 3.50 ms
Input props
[
  "magazine" => null
  "tag" => null
]
Attributes
[]
Component
App\Twig\Components\RelatedMagazinesComponent {#4713
  +limit: 4
  +tag: null
  +magazine: null
  +type: "random"
  +title: "random_magazines"
  +refreshedRandom: false
  -repository: App\Repository\MagazineRepository {#2446 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
active_users App\Twig\Components\ActiveUsersComponent 12.0 MiB 0.31 ms
Input props
[
  "magazine" => null
]
Attributes
[]
Component
App\Twig\Components\ActiveUsersComponent {#4778
  +magazine: null
  -userRepository: App\Repository\UserRepository {#603 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
related_categories App\Twig\Components\RelatedCategoriesComponent 12.0 MiB 1.87 ms
Input props
[
  "magazine" => null
  "tag" => null
]
Attributes
[]
Component
App\Twig\Components\RelatedCategoriesComponent {#4837
  +limit: 4
  +tag: null
  +magazine: null
  +type: "random"
  +title: "random_categories"
  +refreshedRandom: false
  -repository: App\Repository\CategoryRepository {#4838 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
}
related_posts App\Twig\Components\RelatedPostsComponent 12.0 MiB 2.20 ms
Input props
[
  "magazine" => null
  "tag" => null
]
Attributes
[]
Component
App\Twig\Components\RelatedPostsComponent {#4908
  +limit: 4
  +tag: null
  +magazine: null
  +type: "random"
  +post: null
  +title: "random_posts"
  +refreshedRandom: false
  -repository: App\Repository\PostRepository {#4907 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -mentionManager: App\Service\MentionManager {#1536 …}
}
related_entries App\Twig\Components\RelatedEntriesComponent 12.0 MiB 3.75 ms
Input props
[
  "magazine" => null
  "tag" => null
]
Attributes
[]
Component
App\Twig\Components\RelatedEntriesComponent {#4977
  +limit: 4
  +tag: null
  +magazine: null
  +type: "random"
  +entry: null
  +title: "random_entries"
  +refreshedRandom: false
  -repository: App\Repository\EntryRepository {#1474 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -twig: Twig\Environment {#1252 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -mentionManager: App\Service\MentionManager {#1536 …}
}
support_us_block App\Twig\Components\SupportUsBlock 12.0 MiB 0.37 ms
Input props
[]
Attributes
[]
Component
App\Twig\Components\SupportUsBlock {#5046
  +subject: ? App\Entity\Contracts\VotableInterface
  +url: ? string
  -twig: Twig\Environment {#1252 …}
  -cache: Symfony\Component\Cache\Adapter\TraceableTagAwareAdapter {#600 …}
  -requestStack: Symfony\Component\HttpFoundation\RequestStack {#1328 …}
  -partnerBlockRepository: App\Repository\PartnerBlockRepository {#5047 …}
}
featured_magazines App\Twig\Components\FeaturedMagazinesComponent 12.0 MiB 1.67 ms
Input props
[
  "magazine" => null
]
Attributes
[]
Component
App\Twig\Components\FeaturedMagazinesComponent {#5139
  +magazine: null
  -twig: Twig\Environment {#1252 …}
  -repository: App\Repository\MagazineRepository {#2446 …}
}