[{"data":1,"prerenderedAt":1555},["ShallowReactive",2],{"navigation":3,"\u002Fdocs\u002Frecommendations":188,"\u002Fdocs\u002Frecommendations-surround":1551},[4,8,20,24,59,65,69,73,77,100,104,108,112,116,120,124,128,160,164,168,172,176,180,184],{"title":5,"path":6,"stem":7},"","\u002Fdocs","1.docs\u002Findex",{"title":9,"path":10,"stem":11,"children":12,"icon":19},"Getting Started","\u002Fdocs\u002Fgetting-started","1.docs\u002F01.getting-started\u002F1.index",[13,15],{"title":14,"path":10,"stem":11},"Bosca",{"title":16,"path":17,"stem":18},"Quickstart","\u002Fdocs\u002Fgetting-started\u002Fquickstart","1.docs\u002F01.getting-started\u002F2.quickstart",false,{"title":21,"path":22,"stem":23},"Kit","\u002Fdocs\u002Fkit","1.docs\u002F01.kit",{"title":25,"path":26,"stem":27,"children":28},"Content","\u002Fdocs\u002Fcontent","1.docs\u002F02.content\u002F1.index",[29,31,53],{"title":30,"path":26,"stem":27},"Content Strategy",{"title":32,"path":33,"stem":34,"children":35},"Metadata","\u002Fdocs\u002Fcontent\u002Fmetadata","1.docs\u002F02.content\u002F1.metadata\u002F1.index",[36,37,41,45,49],{"title":32,"path":33,"stem":34},{"title":38,"path":39,"stem":40},"Supplementary","\u002Fdocs\u002Fcontent\u002Fmetadata\u002Fsupplementary","1.docs\u002F02.content\u002F1.metadata\u002F2.supplementary",{"title":42,"path":43,"stem":44},"Documents","\u002Fdocs\u002Fcontent\u002Fmetadata\u002Fdocuments","1.docs\u002F02.content\u002F1.metadata\u002F3.documents",{"title":46,"path":47,"stem":48},"Guides","\u002Fdocs\u002Fcontent\u002Fmetadata\u002Fguides","1.docs\u002F02.content\u002F1.metadata\u002F4.guides",{"title":50,"path":51,"stem":52},"Bible","\u002Fdocs\u002Fcontent\u002Fmetadata\u002Fbible","1.docs\u002F02.content\u002F1.metadata\u002F5.bible",{"title":54,"path":55,"stem":56,"children":57},"Collections","\u002Fdocs\u002Fcontent\u002Fcollections","1.docs\u002F02.content\u002F2.collections\u002F1.index",[58],{"title":54,"path":55,"stem":56},{"title":60,"path":61,"stem":62,"children":63},"Workflows","\u002Fdocs\u002Fworkflows","1.docs\u002F03.workflows\u002F1.index",[64],{"title":60,"path":61,"stem":62},{"title":66,"path":67,"stem":68},"Search","\u002Fdocs\u002Fsearch","1.docs\u002F04.search",{"title":70,"path":71,"stem":72},"Profiles","\u002Fdocs\u002Fprofiles","1.docs\u002F05.profiles",{"title":74,"path":75,"stem":76},"Organizations","\u002Fdocs\u002Forganizations","1.docs\u002F06.organizations",{"title":78,"path":79,"stem":80,"children":81,"icon":99},"Engineering","\u002Fdocs\u002Fengineering","1.docs\u002F07.engineering\u002F1.index",[82,83,87,91,95],{"title":78,"path":79,"stem":80},{"title":84,"path":85,"stem":86},"Infrastructure","\u002Fdocs\u002Fengineering\u002Finfrastructure","1.docs\u002F07.engineering\u002F2.infrastructure",{"title":88,"path":89,"stem":90},"Backend Services","\u002Fdocs\u002Fengineering\u002Fservices","1.docs\u002F07.engineering\u002F3.services",{"title":92,"path":93,"stem":94},"Deployment","\u002Fdocs\u002Fengineering\u002Fdeployment","1.docs\u002F07.engineering\u002F4.deployment",{"title":96,"path":97,"stem":98},"Framework Modules","\u002Fdocs\u002Fengineering\u002Fframework","1.docs\u002F07.engineering\u002F5.framework","i-heroicons-wrench-screwdriver",{"title":101,"path":102,"stem":103},"Identity Management","\u002Fdocs\u002Fidentity","1.docs\u002F07.identity",{"title":105,"path":106,"stem":107},"Localization","\u002Fdocs\u002Flocalization","1.docs\u002F08.localization",{"title":109,"path":110,"stem":111},"Analytics","\u002Fdocs\u002Fanalytics","1.docs\u002F09.analytics",{"title":113,"path":114,"stem":115},"AI & Agents","\u002Fdocs\u002Fai","1.docs\u002F10.ai",{"title":117,"path":118,"stem":119},"Messaging & Email","\u002Fdocs\u002Fmessages","1.docs\u002F11.messages",{"title":121,"path":122,"stem":123},"Scheduler","\u002Fdocs\u002Fscheduler","1.docs\u002F12.scheduler",{"title":125,"path":126,"stem":127},"Backup & Restore","\u002Fdocs\u002Fbackup","1.docs\u002F13.backup",{"title":129,"path":130,"stem":131,"children":132},"Architecture","\u002Fdocs\u002Farchitecture","1.docs\u002F14.architecture\u002F1.index",[133,134,137,141,145,149,153,157],{"title":129,"path":130,"stem":131},{"title":92,"path":135,"stem":136},"\u002Fdocs\u002Farchitecture\u002Fdeployment","1.docs\u002F14.architecture\u002F2.deployment",{"title":138,"path":139,"stem":140},"Security","\u002Fdocs\u002Farchitecture\u002Fsecurity","1.docs\u002F14.architecture\u002F3.security",{"title":142,"path":143,"stem":144},"Telemetry","\u002Fdocs\u002Farchitecture\u002Ftelemetry","1.docs\u002F14.architecture\u002F4.telemetry",{"title":146,"path":147,"stem":148},"Administration","\u002Fdocs\u002Farchitecture\u002Fadministration","1.docs\u002F14.architecture\u002F5.administration",{"title":150,"path":151,"stem":152},"GraphQL Schema","\u002Fdocs\u002Farchitecture\u002Fgraphql","1.docs\u002F14.architecture\u002F6.graphql",{"title":154,"path":155,"stem":156},"Storage","\u002Fdocs\u002Farchitecture\u002Fstorage","1.docs\u002F14.architecture\u002F7.storage",{"title":105,"path":158,"stem":159},"\u002Fdocs\u002Farchitecture\u002Flocalization","1.docs\u002F14.architecture\u002F8.localization",{"title":161,"path":162,"stem":163},"Scripting","\u002Fdocs\u002Fscripting","1.docs\u002F15.scripting",{"title":165,"path":166,"stem":167},"Configuration","\u002Fdocs\u002Fconfiguration","1.docs\u002F16.configuration",{"title":169,"path":170,"stem":171},"Forms","\u002Fdocs\u002Fforms","1.docs\u002F17.forms",{"title":173,"path":174,"stem":175},"Segmentation & Campaigns","\u002Fdocs\u002Fsegmentation","1.docs\u002F18.segmentation",{"title":177,"path":178,"stem":179},"Devices & Push","\u002Fdocs\u002Fdevices","1.docs\u002F19.devices",{"title":181,"path":182,"stem":183},"Feature Flags & Experimentation","\u002Fdocs\u002Fexperimentation","1.docs\u002F20.experimentation",{"title":185,"path":186,"stem":187},"Recommendations","\u002Fdocs\u002Frecommendations","1.docs\u002F20.recommendations",{"id":189,"title":185,"body":190,"description":1546,"extension":1547,"meta":1548,"navigation":978,"path":186,"seo":1549,"stem":187,"__hash__":1550},"docs\u002F1.docs\u002F20.recommendations.md",{"type":191,"value":192,"toc":1523},"minimark",[193,197,202,255,259,266,368,373,427,431,450,453,471,475,478,510,514,517,555,559,562,565,574,578,585,605,608,612,619,636,639,643,646,665,669,680,881,884,889,900,904,908,1132,1136,1168,1171,1176,1399,1403,1406,1447,1450,1454,1457,1483,1486,1519],[194,195,196],"p",{},"Bosca includes a recommendation engine that surfaces the right content for each user. It combines analytics-driven strategies, semantic similarity, audience segmentation, and machine learning to generate personalized suggestions for both metadata items and collections.",[198,199,201],"h2",{"id":200},"what-you-get","What you get",[203,204,205,213,219,225,231,237,243,249],"ul",{},[206,207,208,212],"li",{},[209,210,211],"strong",{},"Multiple strategy types"," — trending, segment-based, content similarity, curated lists, collaborative filtering, and ML-powered predictions",[206,214,215,218],{},[209,216,217],{},"Placement system"," — define named display slots in your UI and control which strategies feed each one",[206,220,221,224],{},[209,222,223],{},"Segment targeting"," — strategies can target specific audience segments or apply to all users",[206,226,227,230],{},[209,228,229],{},"Scheduled evaluation"," — strategies re-evaluate automatically on cron schedules to keep recommendations fresh",[206,232,233,236],{},[209,234,235],{},"Dismissals"," — users can dismiss content they don't want to see, and undo dismissals later",[206,238,239,242],{},[209,240,241],{},"Diversity controls"," — category caps and freshness boosting prevent filter bubbles",[206,244,245,248],{},[209,246,247],{},"TensorFlow Recommenders"," — train two-tower retrieval models on your interaction data and serve predictions via TF Serving",[206,250,251,254],{},[209,252,253],{},"Works for anonymous users"," — trending and curated strategies serve content without requiring a profile",[198,256,258],{"id":257},"strategy-types","Strategy Types",[194,260,261,262,265],{},"Recommendations are generated by ",[209,263,264],{},"strategies",", each using a different approach to match content with users.",[267,268,269,285],"table",{},[270,271,272],"thead",{},[273,274,275,279,282],"tr",{},[276,277,278],"th",{},"Type",[276,280,281],{},"How it works",[276,283,284],{},"Data source",[286,287,288,303,316,329,342,355],"tbody",{},[273,289,290,297,300],{},[291,292,293],"td",{},[294,295,296],"code",{},"TRENDING",[291,298,299],{},"Ranks content by recent interaction velocity across all users",[291,301,302],{},"Trino analytics queries over Iceberg events",[273,304,305,310,313],{},[291,306,307],{},[294,308,309],{},"SEGMENT_BASED",[291,311,312],{},"Surfaces content popular among users in the same audience segments",[291,314,315],{},"Trino queries filtered by segment membership",[273,317,318,323,326],{},[291,319,320],{},[294,321,322],{},"CONTENT_BASED",[291,324,325],{},"Finds content similar to what a user has interacted with, using categories, labels, and vector embeddings",[291,327,328],{},"Meilisearch hybrid search with semantic similarity",[273,330,331,336,339],{},[291,332,333],{},[294,334,335],{},"CURATED",[291,337,338],{},"Admin-managed content lists for editorial picks or featured content",[291,340,341],{},"Manual selection, no analytics query needed",[273,343,344,349,352],{},[291,345,346],{},[294,347,348],{},"COLLABORATIVE",[291,350,351],{},"Recommends content that similar users engaged with but the target user hasn't seen",[291,353,354],{},"Trino co-occurrence query with IDF weighting (seeded by default installer)",[273,356,357,362,365],{},[291,358,359],{},[294,360,361],{},"ML_MODEL",[291,363,364],{},"Uses a trained TensorFlow Recommenders model to predict personalized content rankings",[291,366,367],{},"TF Serving REST API backed by a TFRS two-tower model",[369,370,372],"h3",{"id":371},"strategy-lifecycle","Strategy Lifecycle",[267,374,375,385],{},[270,376,377],{},[273,378,379,382],{},[276,380,381],{},"Status",[276,383,384],{},"Description",[286,386,387,397,407,417],{},[273,388,389,394],{},[291,390,391],{},[294,392,393],{},"DRAFT",[291,395,396],{},"Being configured, not yet generating recommendations",[273,398,399,404],{},[291,400,401],{},[294,402,403],{},"ACTIVE",[291,405,406],{},"Live and producing recommendations on its evaluation schedule",[273,408,409,414],{},[291,410,411],{},[294,412,413],{},"PAUSED",[291,415,416],{},"Temporarily suspended",[273,418,419,424],{},[291,420,421],{},[294,422,423],{},"ARCHIVED",[291,425,426],{},"Retired and no longer evaluated",[198,428,430],{"id":429},"placements","Placements",[194,432,433,434,437,438,441,442,445,446,449],{},"A ",[209,435,436],{},"placement"," is a named location in your application where recommendations are displayed — for example, ",[294,439,440],{},"home_feed",", ",[294,443,444],{},"article_sidebar",", or ",[294,447,448],{},"post_read_next",". Each placement links to one or more strategies in priority order and defines a maximum number of items.",[194,451,452],{},"When a client requests recommendations for a placement, the system:",[454,455,456,459,462,465,468],"ol",{},[206,457,458],{},"Resolves the strategies linked to that placement",[206,460,461],{},"Filters to strategies applicable to the requesting user's segments",[206,463,464],{},"Queries pre-computed recommendations from each strategy",[206,466,467],{},"Runs the results through the assembler pipeline",[206,469,470],{},"Returns a ranked list",[198,472,474],{"id":473},"recommendation-assembly","Recommendation Assembly",[194,476,477],{},"Raw recommendations from multiple strategies pass through an assembly pipeline before being served:",[454,479,480,486,492,498,504],{},[206,481,482,485],{},[209,483,484],{},"Dismissed filtering"," — content the user has dismissed is removed",[206,487,488,491],{},[209,489,490],{},"Deduplication"," — when multiple strategies recommend the same content, only the highest-scoring entry is kept",[206,493,494,497],{},[209,495,496],{},"Freshness boost"," — scores are adjusted by a time-decay factor so recently generated recommendations surface above stale ones",[206,499,500,503],{},[209,501,502],{},"Category diversity cap"," — no single category dominates the result set (configurable, default 3 items per category)",[206,505,506,509],{},[209,507,508],{},"Final ranking"," — sorted by adjusted score, top N returned",[198,511,513],{"id":512},"how-it-stays-fresh","How It Stays Fresh",[194,515,516],{},"Recommendations update automatically through scheduled evaluation:",[203,518,519,526,540,543,549],{},[206,520,521,522,525],{},"Each strategy can have an ",[209,523,524],{},"evaluation schedule"," (cron expression) that triggers periodic re-evaluation",[206,527,528,531,532,535,536,539],{},[209,529,530],{},"Trending"," strategies typically refresh hourly, ",[209,533,534],{},"segment-based"," every 6 hours, ",[209,537,538],{},"ML models"," daily",[206,541,542],{},"The scheduler runs the strategy's analytics query against the latest Iceberg event data and upserts fresh scores",[206,544,545,548],{},[209,546,547],{},"Expired recommendations"," are cleaned up automatically by a periodic job",[206,550,551,554],{},[209,552,553],{},"Content-based similarity"," is always real-time — it queries Meilisearch on demand, so new content is discoverable immediately after indexing",[198,556,558],{"id":557},"machine-learning-with-tensorflow-recommenders","Machine Learning with TensorFlow Recommenders",[194,560,561],{},"For platforms with sufficient interaction data, Bosca supports ML-powered recommendations using TensorFlow Recommenders (TFRS).",[369,563,129],{"id":564},"architecture",[566,567,572],"pre",{"className":568,"code":570,"language":571},[569],"language-text","recommendation-trainer (Python)          tf-serving (Google)\n  1. Connect to Trino                      Loads trained SavedModel\n  2. Load interaction history              Serves predictions via REST\n  3. Train two-tower model                 Hot-reloads new model versions\n  4. Upload model to Bosca storage\n                                         bosca-server (Kotlin)\nrecommendation-model-loader (sidecar)      ML_MODEL strategy evaluation\n  Polls Bosca for new models               calls TF Serving\n  Downloads to TF Serving                  maps predictions to recommendations\n","text",[294,573,570],{"__ignoreMap":5},[369,575,577],{"id":576},"two-tower-model","Two-Tower Model",[194,579,580,581,584],{},"The TFRS model uses a ",[209,582,583],{},"two-tower architecture",":",[203,586,587,593,599],{},[206,588,589,592],{},[209,590,591],{},"User tower"," — maps user IDs to embedding vectors based on interaction patterns",[206,594,595,598],{},[209,596,597],{},"Content tower"," — maps content IDs plus features (content type, language, categories) to embedding vectors",[206,600,601,604],{},[209,602,603],{},"Scoring"," — the dot product of user and content embeddings predicts relevance",[194,606,607],{},"The model is trained on implicit feedback from Bosca's analytics events (impressions, interactions, completions) loaded directly from Trino.",[369,609,611],{"id":610},"training-pipeline","Training Pipeline",[194,613,614,615,618],{},"Training is triggered by Bosca's ",[294,616,617],{},"TrainModelJob",", which calls the trainer service's HTTP endpoint. The trainer:",[454,620,621,624,627,630,633],{},[206,622,623],{},"Queries Trino for interaction data and content features",[206,625,626],{},"Trains the two-tower retrieval model",[206,628,629],{},"Builds a ScaNN index for fast approximate nearest neighbor search",[206,631,632],{},"Exports the SavedModel and uploads it to Bosca's content storage",[206,634,635],{},"TF Serving detects the new version and hot-reloads it",[194,637,638],{},"Model artifacts are stored as Bosca metadata content — versioned, access-controlled, and backed up with everything else.",[369,640,642],{"id":641},"cold-start","Cold Start",[194,644,645],{},"The system handles cold start gracefully:",[203,647,648,654,660],{},[206,649,650,653],{},[209,651,652],{},"New users"," get trending and curated content, plus segment-based recommendations if they belong to any segments",[206,655,656,659],{},[209,657,658],{},"New content"," is immediately discoverable via Meilisearch similarity (embeddings are generated at index time) and appears in trending feeds once it accumulates interactions",[206,661,662,664],{},[209,663,538],{}," use content features (type, language, categories) alongside IDs, so items with zero interaction history still receive predictions based on their metadata",[198,666,668],{"id":667},"user-engagement-tracking","User Engagement Tracking",[194,670,671,672,675,676,679],{},"User interactions with recommended content (views, clicks, completions) are tracked through Bosca's existing ",[209,673,674],{},"analytics event pipeline"," — not a separate tracking system. When a client displays a recommendation, it should include attribution context in the analytics event's ",[294,677,678],{},"extras"," field so that strategy effectiveness can be measured:",[566,681,685],{"className":682,"code":683,"language":684,"meta":5,"style":5},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"type\": \"Interaction\",\n  \"element\": {\n    \"type\": \"recommendation\",\n    \"content\": [{\"id\": \"content-uuid\", \"type\": \"metadata\"}],\n    \"extras\": {\n      \"recommendation_strategy\": \"trending-24h\",\n      \"recommendation_position\": 3\n    }\n  }\n}\n","json",[294,686,687,696,723,738,760,813,826,848,863,869,875],{"__ignoreMap":5},[688,689,692],"span",{"class":690,"line":691},"line",1,[688,693,695],{"class":694},"sMK4o","{\n",[688,697,699,702,706,709,711,714,718,720],{"class":690,"line":698},2,[688,700,701],{"class":694},"  \"",[688,703,705],{"class":704},"spNyl","type",[688,707,708],{"class":694},"\"",[688,710,584],{"class":694},[688,712,713],{"class":694}," \"",[688,715,717],{"class":716},"sfazB","Interaction",[688,719,708],{"class":694},[688,721,722],{"class":694},",\n",[688,724,726,728,731,733,735],{"class":690,"line":725},3,[688,727,701],{"class":694},[688,729,730],{"class":704},"element",[688,732,708],{"class":694},[688,734,584],{"class":694},[688,736,737],{"class":694}," {\n",[688,739,741,744,747,749,751,753,756,758],{"class":690,"line":740},4,[688,742,743],{"class":694},"    \"",[688,745,705],{"class":746},"sBMFI",[688,748,708],{"class":694},[688,750,584],{"class":694},[688,752,713],{"class":694},[688,754,755],{"class":716},"recommendation",[688,757,708],{"class":694},[688,759,722],{"class":694},[688,761,763,765,768,770,772,775,777,781,783,785,787,790,792,795,797,799,801,803,805,808,810],{"class":690,"line":762},5,[688,764,743],{"class":694},[688,766,767],{"class":746},"content",[688,769,708],{"class":694},[688,771,584],{"class":694},[688,773,774],{"class":694}," [{",[688,776,708],{"class":694},[688,778,780],{"class":779},"sbssI","id",[688,782,708],{"class":694},[688,784,584],{"class":694},[688,786,713],{"class":694},[688,788,789],{"class":716},"content-uuid",[688,791,708],{"class":694},[688,793,794],{"class":694},",",[688,796,713],{"class":694},[688,798,705],{"class":779},[688,800,708],{"class":694},[688,802,584],{"class":694},[688,804,713],{"class":694},[688,806,807],{"class":716},"metadata",[688,809,708],{"class":694},[688,811,812],{"class":694},"}],\n",[688,814,816,818,820,822,824],{"class":690,"line":815},6,[688,817,743],{"class":694},[688,819,678],{"class":746},[688,821,708],{"class":694},[688,823,584],{"class":694},[688,825,737],{"class":694},[688,827,829,832,835,837,839,841,844,846],{"class":690,"line":828},7,[688,830,831],{"class":694},"      \"",[688,833,834],{"class":779},"recommendation_strategy",[688,836,708],{"class":694},[688,838,584],{"class":694},[688,840,713],{"class":694},[688,842,843],{"class":716},"trending-24h",[688,845,708],{"class":694},[688,847,722],{"class":694},[688,849,851,853,856,858,860],{"class":690,"line":850},8,[688,852,831],{"class":694},[688,854,855],{"class":779},"recommendation_position",[688,857,708],{"class":694},[688,859,584],{"class":694},[688,861,862],{"class":779}," 3\n",[688,864,866],{"class":690,"line":865},9,[688,867,868],{"class":694},"    }\n",[688,870,872],{"class":690,"line":871},10,[688,873,874],{"class":694},"  }\n",[688,876,878],{"class":690,"line":877},11,[688,879,880],{"class":694},"}\n",[194,882,883],{},"This data feeds back into strategy evaluation on the next cycle, creating a continuous improvement loop.",[194,885,886,888],{},[209,887,235],{}," are the one exception — they are stored as a persistent user preference (not an analytics event) because they need to be:",[203,890,891,894,897],{},[206,892,893],{},"Queried at serving time with low latency",[206,895,896],{},"Revocable (users can undo a dismissal)",[206,898,899],{},"Filtered in real-time, not on a batch schedule",[198,901,903],{"id":902},"graphql-api","GraphQL API",[369,905,907],{"id":906},"querying-recommendations","Querying Recommendations",[566,909,913],{"className":910,"code":911,"language":912,"meta":5,"style":5},"language-graphql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Personalized feed for a profile\nquery {\n  recommendation {\n    profile(profileId: \"...\", offset: 0, limit: 10) {\n      metadata { id name contentType }\n      collection { id name }\n      score\n      reason\n      strategy { name type }\n    }\n  }\n}\n\n# Recommendations for a specific UI placement\nquery {\n  recommendation {\n    placement(profileId: \"...\", placementSlug: \"home_feed\", limit: 5) {\n      metadata { id name }\n      score\n    }\n  }\n}\n\n# Similar content (real-time vector search)\nquery {\n  recommendation {\n    similar(metadataId: \"...\", limit: 5) {\n      metadata { id name }\n      score\n    }\n  }\n}\n\n# Trending (works without authentication)\nquery {\n  recommendation {\n    trending(offset: 0, limit: 10) {\n      metadata { id name }\n      score\n    }\n  }\n}\n","graphql",[294,914,915,920,925,930,935,940,945,950,955,960,964,968,973,980,986,991,996,1002,1008,1013,1018,1023,1028,1033,1039,1044,1049,1055,1060,1065,1070,1075,1080,1085,1091,1096,1101,1107,1112,1117,1122,1127],{"__ignoreMap":5},[688,916,917],{"class":690,"line":691},[688,918,919],{},"# Personalized feed for a profile\n",[688,921,922],{"class":690,"line":698},[688,923,924],{},"query {\n",[688,926,927],{"class":690,"line":725},[688,928,929],{},"  recommendation {\n",[688,931,932],{"class":690,"line":740},[688,933,934],{},"    profile(profileId: \"...\", offset: 0, limit: 10) {\n",[688,936,937],{"class":690,"line":762},[688,938,939],{},"      metadata { id name contentType }\n",[688,941,942],{"class":690,"line":815},[688,943,944],{},"      collection { id name }\n",[688,946,947],{"class":690,"line":828},[688,948,949],{},"      score\n",[688,951,952],{"class":690,"line":850},[688,953,954],{},"      reason\n",[688,956,957],{"class":690,"line":865},[688,958,959],{},"      strategy { name type }\n",[688,961,962],{"class":690,"line":871},[688,963,868],{},[688,965,966],{"class":690,"line":877},[688,967,874],{},[688,969,971],{"class":690,"line":970},12,[688,972,880],{},[688,974,976],{"class":690,"line":975},13,[688,977,979],{"emptyLinePlaceholder":978},true,"\n",[688,981,983],{"class":690,"line":982},14,[688,984,985],{},"# Recommendations for a specific UI placement\n",[688,987,989],{"class":690,"line":988},15,[688,990,924],{},[688,992,994],{"class":690,"line":993},16,[688,995,929],{},[688,997,999],{"class":690,"line":998},17,[688,1000,1001],{},"    placement(profileId: \"...\", placementSlug: \"home_feed\", limit: 5) {\n",[688,1003,1005],{"class":690,"line":1004},18,[688,1006,1007],{},"      metadata { id name }\n",[688,1009,1011],{"class":690,"line":1010},19,[688,1012,949],{},[688,1014,1016],{"class":690,"line":1015},20,[688,1017,868],{},[688,1019,1021],{"class":690,"line":1020},21,[688,1022,874],{},[688,1024,1026],{"class":690,"line":1025},22,[688,1027,880],{},[688,1029,1031],{"class":690,"line":1030},23,[688,1032,979],{"emptyLinePlaceholder":978},[688,1034,1036],{"class":690,"line":1035},24,[688,1037,1038],{},"# Similar content (real-time vector search)\n",[688,1040,1042],{"class":690,"line":1041},25,[688,1043,924],{},[688,1045,1047],{"class":690,"line":1046},26,[688,1048,929],{},[688,1050,1052],{"class":690,"line":1051},27,[688,1053,1054],{},"    similar(metadataId: \"...\", limit: 5) {\n",[688,1056,1058],{"class":690,"line":1057},28,[688,1059,1007],{},[688,1061,1063],{"class":690,"line":1062},29,[688,1064,949],{},[688,1066,1068],{"class":690,"line":1067},30,[688,1069,868],{},[688,1071,1073],{"class":690,"line":1072},31,[688,1074,874],{},[688,1076,1078],{"class":690,"line":1077},32,[688,1079,880],{},[688,1081,1083],{"class":690,"line":1082},33,[688,1084,979],{"emptyLinePlaceholder":978},[688,1086,1088],{"class":690,"line":1087},34,[688,1089,1090],{},"# Trending (works without authentication)\n",[688,1092,1094],{"class":690,"line":1093},35,[688,1095,924],{},[688,1097,1099],{"class":690,"line":1098},36,[688,1100,929],{},[688,1102,1104],{"class":690,"line":1103},37,[688,1105,1106],{},"    trending(offset: 0, limit: 10) {\n",[688,1108,1110],{"class":690,"line":1109},38,[688,1111,1007],{},[688,1113,1115],{"class":690,"line":1114},39,[688,1116,949],{},[688,1118,1120],{"class":690,"line":1119},40,[688,1121,868],{},[688,1123,1125],{"class":690,"line":1124},41,[688,1126,874],{},[688,1128,1130],{"class":690,"line":1129},42,[688,1131,880],{},[369,1133,1135],{"id":1134},"managing-dismissals","Managing Dismissals",[566,1137,1139],{"className":910,"code":1138,"language":912,"meta":5,"style":5},"mutation {\n  recommendation {\n    dismiss(profileId: \"...\", metadataId: \"...\")\n    undismiss(profileId: \"...\", metadataId: \"...\")\n  }\n}\n",[294,1140,1141,1146,1150,1155,1160,1164],{"__ignoreMap":5},[688,1142,1143],{"class":690,"line":691},[688,1144,1145],{},"mutation {\n",[688,1147,1148],{"class":690,"line":698},[688,1149,929],{},[688,1151,1152],{"class":690,"line":725},[688,1153,1154],{},"    dismiss(profileId: \"...\", metadataId: \"...\")\n",[688,1156,1157],{"class":690,"line":740},[688,1158,1159],{},"    undismiss(profileId: \"...\", metadataId: \"...\")\n",[688,1161,1162],{"class":690,"line":762},[688,1163,874],{},[688,1165,1166],{"class":690,"line":815},[688,1167,880],{},[369,1169,146],{"id":1170},"administration",[194,1172,1173,1174,584],{},"Strategies and placements are managed through admin-only fields nested under ",[294,1175,755],{},[566,1177,1179],{"className":910,"code":1178,"language":912,"meta":5,"style":5},"# Create a trending strategy with hourly refresh\nmutation {\n  recommendation {\n    strategies {\n      add(\n        strategy: {\n          name: \"Trending Content\"\n          type: TRENDING\n          status: ACTIVE\n          analyticsQueryId: \"...\"\n          evaluationSchedule: \"0 * * * *\"\n          priority: 5\n          maxRecommendations: 20\n        }\n        segmentIds: []\n      ) { id name evaluationSchedule }\n    }\n  }\n}\n\n# Create a placement that blends multiple strategies\nmutation {\n  recommendation {\n    placements {\n      add(\n        placement: {\n          name: \"Home Feed\"\n          slug: \"home_feed\"\n          maxItems: 10\n        }\n        strategyIds: [\"strategy-1\", \"strategy-2\"]\n      ) { id slug }\n    }\n  }\n}\n\n# Browse strategies and placements\nquery {\n  recommendation {\n    strategies {\n      all(offset: 0, limit: 10) { id name type status }\n    }\n    placements {\n      all { id name slug maxItems }\n    }\n  }\n}\n",[294,1180,1181,1186,1190,1194,1199,1204,1209,1214,1219,1224,1229,1234,1239,1244,1249,1254,1259,1263,1267,1271,1275,1280,1284,1288,1293,1297,1302,1307,1312,1317,1321,1326,1331,1335,1339,1343,1347,1352,1356,1360,1364,1369,1373,1378,1384,1389,1394],{"__ignoreMap":5},[688,1182,1183],{"class":690,"line":691},[688,1184,1185],{},"# Create a trending strategy with hourly refresh\n",[688,1187,1188],{"class":690,"line":698},[688,1189,1145],{},[688,1191,1192],{"class":690,"line":725},[688,1193,929],{},[688,1195,1196],{"class":690,"line":740},[688,1197,1198],{},"    strategies {\n",[688,1200,1201],{"class":690,"line":762},[688,1202,1203],{},"      add(\n",[688,1205,1206],{"class":690,"line":815},[688,1207,1208],{},"        strategy: {\n",[688,1210,1211],{"class":690,"line":828},[688,1212,1213],{},"          name: \"Trending Content\"\n",[688,1215,1216],{"class":690,"line":850},[688,1217,1218],{},"          type: TRENDING\n",[688,1220,1221],{"class":690,"line":865},[688,1222,1223],{},"          status: ACTIVE\n",[688,1225,1226],{"class":690,"line":871},[688,1227,1228],{},"          analyticsQueryId: \"...\"\n",[688,1230,1231],{"class":690,"line":877},[688,1232,1233],{},"          evaluationSchedule: \"0 * * * *\"\n",[688,1235,1236],{"class":690,"line":970},[688,1237,1238],{},"          priority: 5\n",[688,1240,1241],{"class":690,"line":975},[688,1242,1243],{},"          maxRecommendations: 20\n",[688,1245,1246],{"class":690,"line":982},[688,1247,1248],{},"        }\n",[688,1250,1251],{"class":690,"line":988},[688,1252,1253],{},"        segmentIds: []\n",[688,1255,1256],{"class":690,"line":993},[688,1257,1258],{},"      ) { id name evaluationSchedule }\n",[688,1260,1261],{"class":690,"line":998},[688,1262,868],{},[688,1264,1265],{"class":690,"line":1004},[688,1266,874],{},[688,1268,1269],{"class":690,"line":1010},[688,1270,880],{},[688,1272,1273],{"class":690,"line":1015},[688,1274,979],{"emptyLinePlaceholder":978},[688,1276,1277],{"class":690,"line":1020},[688,1278,1279],{},"# Create a placement that blends multiple strategies\n",[688,1281,1282],{"class":690,"line":1025},[688,1283,1145],{},[688,1285,1286],{"class":690,"line":1030},[688,1287,929],{},[688,1289,1290],{"class":690,"line":1035},[688,1291,1292],{},"    placements {\n",[688,1294,1295],{"class":690,"line":1041},[688,1296,1203],{},[688,1298,1299],{"class":690,"line":1046},[688,1300,1301],{},"        placement: {\n",[688,1303,1304],{"class":690,"line":1051},[688,1305,1306],{},"          name: \"Home Feed\"\n",[688,1308,1309],{"class":690,"line":1057},[688,1310,1311],{},"          slug: \"home_feed\"\n",[688,1313,1314],{"class":690,"line":1062},[688,1315,1316],{},"          maxItems: 10\n",[688,1318,1319],{"class":690,"line":1067},[688,1320,1248],{},[688,1322,1323],{"class":690,"line":1072},[688,1324,1325],{},"        strategyIds: [\"strategy-1\", \"strategy-2\"]\n",[688,1327,1328],{"class":690,"line":1077},[688,1329,1330],{},"      ) { id slug }\n",[688,1332,1333],{"class":690,"line":1082},[688,1334,868],{},[688,1336,1337],{"class":690,"line":1087},[688,1338,874],{},[688,1340,1341],{"class":690,"line":1093},[688,1342,880],{},[688,1344,1345],{"class":690,"line":1098},[688,1346,979],{"emptyLinePlaceholder":978},[688,1348,1349],{"class":690,"line":1103},[688,1350,1351],{},"# Browse strategies and placements\n",[688,1353,1354],{"class":690,"line":1109},[688,1355,924],{},[688,1357,1358],{"class":690,"line":1114},[688,1359,929],{},[688,1361,1362],{"class":690,"line":1119},[688,1363,1198],{},[688,1365,1366],{"class":690,"line":1124},[688,1367,1368],{},"      all(offset: 0, limit: 10) { id name type status }\n",[688,1370,1371],{"class":690,"line":1129},[688,1372,868],{},[688,1374,1376],{"class":690,"line":1375},43,[688,1377,1292],{},[688,1379,1381],{"class":690,"line":1380},44,[688,1382,1383],{},"      all { id name slug maxItems }\n",[688,1385,1387],{"class":690,"line":1386},45,[688,1388,868],{},[688,1390,1392],{"class":690,"line":1391},46,[688,1393,874],{},[688,1395,1397],{"class":690,"line":1396},47,[688,1398,880],{},[198,1400,1402],{"id":1401},"default-setup","Default Setup",[194,1404,1405],{},"On first startup, Bosca's package installer seeds:",[203,1407,1408,1414,1420,1426,1431,1437,1442],{},[206,1409,1410,1413],{},[209,1411,1412],{},"Trending Content"," analytics query (interaction velocity over 7 days with recency weighting)",[206,1415,1416,1419],{},[209,1417,1418],{},"Popular Content"," analytics query (interaction counts over 14 days)",[206,1421,1422,1425],{},[209,1423,1424],{},"Collaborative Filtering"," analytics query (co-occurrence with IDF weighting over 30 days)",[206,1427,433,1428,1430],{},[209,1429,530],{}," strategy with hourly evaluation",[206,1432,433,1433,1436],{},[209,1434,1435],{},"Popular"," strategy with 6-hour evaluation",[206,1438,433,1439,1441],{},[209,1440,1424],{}," strategy with daily evaluation",[206,1443,433,1444,1446],{},[209,1445,440],{}," placement linking all strategies",[194,1448,1449],{},"These defaults provide working recommendations out of the box as soon as analytics data starts flowing.",[198,1451,1453],{"id":1452},"for-developers","For developers",[194,1455,1456],{},"Related modules:",[203,1458,1459,1465,1471,1477],{},[206,1460,1461,1462],{},"Core interfaces: ",[294,1463,1464],{},"backend\u002Fframework\u002Fcore-recommendations",[206,1466,1467,1468],{},"Implementation: ",[294,1469,1470],{},"backend\u002Fframework\u002Frecommendations",[206,1472,1473,1474],{},"ML pipeline: ",[294,1475,1476],{},"ml\u002Frecommendation-trainer",[206,1478,1479,1480],{},"GraphQL schema: ",[294,1481,1482],{},"backend\u002Fframework\u002Frecommendations\u002Fsrc\u002Fmain\u002Fresources\u002Fgraphql\u002Frecommendations.graphqls",[194,1484,1485],{},"Related:",[203,1487,1488,1495,1501,1507,1513],{},[206,1489,1490,1491],{},"Analytics: ",[1492,1493,1494],"a",{"href":110},"Event tracking and Trino queries",[206,1496,1497,1498],{},"Segmentation: ",[1492,1499,1500],{"href":174},"Audience segments for targeting",[206,1502,1503,1504],{},"Search: ",[1492,1505,1506],{"href":67},"Meilisearch and vector similarity",[206,1508,1509,1510],{},"Profiles: ",[1492,1511,1512],{"href":71},"User profiles and attributes",[206,1514,1515,1516],{},"Scheduler: ",[1492,1517,1518],{"href":122},"Cron-based job scheduling",[1520,1521,1522],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":5,"searchDepth":698,"depth":698,"links":1524},[1525,1526,1529,1530,1531,1532,1538,1539,1544,1545],{"id":200,"depth":698,"text":201},{"id":257,"depth":698,"text":258,"children":1527},[1528],{"id":371,"depth":725,"text":372},{"id":429,"depth":698,"text":430},{"id":473,"depth":698,"text":474},{"id":512,"depth":698,"text":513},{"id":557,"depth":698,"text":558,"children":1533},[1534,1535,1536,1537],{"id":564,"depth":725,"text":129},{"id":576,"depth":725,"text":577},{"id":610,"depth":725,"text":611},{"id":641,"depth":725,"text":642},{"id":667,"depth":698,"text":668},{"id":902,"depth":698,"text":903,"children":1540},[1541,1542,1543],{"id":906,"depth":725,"text":907},{"id":1134,"depth":725,"text":1135},{"id":1170,"depth":725,"text":146},{"id":1401,"depth":698,"text":1402},{"id":1452,"depth":698,"text":1453},"Deliver personalized content recommendations powered by analytics, audience segments, and machine learning.","md",{},{"title":185,"description":1546},"VZPyBz08r_KJNzAOJTM6DE_bgiH9y_MfyDkvYOQYkg8",[1552,1554],{"title":181,"path":182,"stem":183,"description":1553,"children":-1},"Roll out features safely with targeted feature flags, A\u002FB test changes with conversion goals, and observe live distribution and statistical lift.",null,1778032440969]