[{"data":1,"prerenderedAt":1346},["ShallowReactive",2],{"posts-en":3},[4,1120],{"id":5,"title":6,"body":7,"date":1112,"desc":1113,"description":13,"edit":1112,"extension":1114,"meta":1115,"navigation":423,"path":1116,"seo":1117,"stem":1118,"__hash__":1119},"blog\u002Fblog\u002Fen\u002Fcf-network.md","How to Display the Current Cloudflare Network Used on a Website",{"type":8,"value":9,"toc":1108},"minimark",[10,14,21,27,32,40,146,157,160,163,170,175,178,193,377,380,384,394,397,1104],[11,12,13],"p",{},"Early this morning, I added a small feature to my personal website: displaying the current Cloudflare network in use.",[11,15,16],{},[17,18],"img",{"alt":19,"src":20},"","https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-preview.png",[22,23,24],"blockquote",{},[11,25,26],{},"Scroll to the bottom of this website, and you should see the actual display style.",[28,29,31],"h3",{"id":30},"implementation-approach","Implementation Approach",[11,33,34,35,39],{},"For websites proxied by Cloudflare, visiting ",[36,37,38],"code",{},"{domain}\u002Fcdn-cgi\u002Ftrace"," returns information about the Cloudflare network currently being used. Example output:",[41,42,46],"pre",{"className":43,"code":44,"language":45,"meta":19,"style":19},"language-plaintext shiki shiki-themes github-dark","fl=582f239\nh=kuriyona.com\nip=64.90.0.218\nts=1779555940.000\nvisit_scheme=https\nuag=Mozilla\u002F5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\u002F537.36 (KHTML, like Gecko) Chrome\u002F149.0.0.0 Safari\u002F537.36 Edg\u002F149.0.0.0\ncolo=HKG\nsliver=none\nhttp=http\u002F3\nloc=HK\ntls=TLSv1.3\nsni=plaintext\nwarp=off\ngateway=off\nrbi=off\nkex=X25519MLKEM768\n","plaintext",[36,47,48,56,62,68,74,80,86,92,98,104,110,116,122,128,134,140],{"__ignoreMap":19},[49,50,53],"span",{"class":51,"line":52},"line",1,[49,54,55],{},"fl=582f239\n",[49,57,59],{"class":51,"line":58},2,[49,60,61],{},"h=kuriyona.com\n",[49,63,65],{"class":51,"line":64},3,[49,66,67],{},"ip=64.90.0.218\n",[49,69,71],{"class":51,"line":70},4,[49,72,73],{},"ts=1779555940.000\n",[49,75,77],{"class":51,"line":76},5,[49,78,79],{},"visit_scheme=https\n",[49,81,83],{"class":51,"line":82},6,[49,84,85],{},"uag=Mozilla\u002F5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\u002F537.36 (KHTML, like Gecko) Chrome\u002F149.0.0.0 Safari\u002F537.36 Edg\u002F149.0.0.0\n",[49,87,89],{"class":51,"line":88},7,[49,90,91],{},"colo=HKG\n",[49,93,95],{"class":51,"line":94},8,[49,96,97],{},"sliver=none\n",[49,99,101],{"class":51,"line":100},9,[49,102,103],{},"http=http\u002F3\n",[49,105,107],{"class":51,"line":106},10,[49,108,109],{},"loc=HK\n",[49,111,113],{"class":51,"line":112},11,[49,114,115],{},"tls=TLSv1.3\n",[49,117,119],{"class":51,"line":118},12,[49,120,121],{},"sni=plaintext\n",[49,123,125],{"class":51,"line":124},13,[49,126,127],{},"warp=off\n",[49,129,131],{"class":51,"line":130},14,[49,132,133],{},"gateway=off\n",[49,135,137],{"class":51,"line":136},15,[49,138,139],{},"rbi=off\n",[49,141,143],{"class":51,"line":142},16,[49,144,145],{},"kex=X25519MLKEM768\n",[11,147,148,149,152,153,156],{},"By parsing the ",[36,150,151],{},"colo"," parameter, we can obtain the current Cloudflare network ID — in this example, ",[36,154,155],{},"HKG",".",[11,158,159],{},"Now that we have the network ID, we can display the corresponding Cloudflare network name.",[11,161,162],{},"Cloudflare Status provides a file that lists the current status information of all Cloudflare networks.",[22,164,165],{},[11,166,167],{},[36,168,169],{},"https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json",[11,171,172],{},[17,173],{"alt":19,"src":174},"https:\u002F\u002Fr2.kuriyona.com\u002Fstatic\u002F2026\u002F05\u002F24\u002Fcf-network-status-api.png",[11,176,177],{},"The file content is quite messy, so we need a simple script to extract the formatted information we need.",[11,179,180,181,184,185,188,189,192],{},"First, filter the ",[36,182,183],{},"name"," fields of network components using a simple regular expression (",[36,186,187],{},"^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$","), then simplify the data structure. (Here, we use the ",[36,190,191],{},"ky"," library to fetch data.)",[41,194,198],{"className":195,"code":196,"language":197,"meta":19,"style":19},"language-ts shiki shiki-themes github-dark","const res = await ky.get('https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json').json();\nconst result = res.components\n  .filter((c) => REGEX.test(c.name))\n  .map((n) => ({\n    name: n.name,\n    code: n.name.match(\u002F^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$\u002F)?.[1],\n  }));\n","ts",[36,199,200,240,252,284,303,308,372],{"__ignoreMap":19},[49,201,202,206,210,213,216,220,224,227,231,234,237],{"class":51,"line":52},[49,203,205],{"class":204},"snl16","const",[49,207,209],{"class":208},"sDLfK"," res",[49,211,212],{"class":204}," =",[49,214,215],{"class":204}," await",[49,217,219],{"class":218},"s95oV"," ky.",[49,221,223],{"class":222},"svObZ","get",[49,225,226],{"class":218},"(",[49,228,230],{"class":229},"sU2Wk","'https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json'",[49,232,233],{"class":218},").",[49,235,236],{"class":222},"json",[49,238,239],{"class":218},"();\n",[49,241,242,244,247,249],{"class":51,"line":58},[49,243,205],{"class":204},[49,245,246],{"class":208}," result",[49,248,212],{"class":204},[49,250,251],{"class":218}," res.components\n",[49,253,254,257,260,263,267,270,273,276,278,281],{"class":51,"line":64},[49,255,256],{"class":218},"  .",[49,258,259],{"class":222},"filter",[49,261,262],{"class":218},"((",[49,264,266],{"class":265},"s9osk","c",[49,268,269],{"class":218},") ",[49,271,272],{"class":204},"=>",[49,274,275],{"class":208}," REGEX",[49,277,156],{"class":218},[49,279,280],{"class":222},"test",[49,282,283],{"class":218},"(c.name))\n",[49,285,286,288,291,293,296,298,300],{"class":51,"line":70},[49,287,256],{"class":218},[49,289,290],{"class":222},"map",[49,292,262],{"class":218},[49,294,295],{"class":265},"n",[49,297,269],{"class":218},[49,299,272],{"class":204},[49,301,302],{"class":218}," ({\n",[49,304,305],{"class":51,"line":76},[49,306,307],{"class":218},"    name: n.name,\n",[49,309,310,313,316,318,321,324,327,330,334,337,340,344,346,349,352,355,358,361,363,366,369],{"class":51,"line":82},[49,311,312],{"class":218},"    code: n.name.",[49,314,315],{"class":222},"match",[49,317,226],{"class":218},[49,319,320],{"class":229},"\u002F",[49,322,323],{"class":204},"^",[49,325,326],{"class":208},"[A-Za-z\\s,]",[49,328,329],{"class":204},"+",[49,331,333],{"class":332},"sns5M","-",[49,335,336],{"class":208},"\\s",[49,338,339],{"class":204},"*",[49,341,343],{"class":342},"sRjNt","\\(",[49,345,226],{"class":332},[49,347,348],{"class":208},"[A-Z]",[49,350,351],{"class":204},"{3}",[49,353,354],{"class":332},")",[49,356,357],{"class":342},"\\)",[49,359,360],{"class":204},"$",[49,362,320],{"class":229},[49,364,365],{"class":218},")?.[",[49,367,368],{"class":208},"1",[49,370,371],{"class":218},"],\n",[49,373,374],{"class":51,"line":88},[49,375,376],{"class":218},"  }));\n",[11,378,379],{},"Combined with the network ID obtained earlier, we can now get the actual network node name.",[28,381,383],{"id":382},"code-implementation","Code Implementation",[11,385,386,387],{},"The actual code used on this site can be seen in ",[388,389,393],"a",{"href":390,"rel":391},"https:\u002F\u002Fgithub.com\u002FKuriyona\u002FKuriyona.com\u002Fblob\u002Fmain\u002Fapp\u002Fcomposables\u002FuseCloudflareStatus.ts",[392],"nofollow","useCloudflareStatus.ts",[11,395,396],{},"Below is a complete TypeScript implementation:",[41,398,400],{"className":195,"code":399,"language":197,"meta":19,"style":19},"import ky from 'ky';\n\nconst REGEX = \u002F^[A-Za-z\\s,]+-\\s*\\(([A-Z]{3})\\)$\u002F;\n\ninterface NodeInfo {\n  name: string;\n  code: string | undefined;\n}\n\ninterface TraceData {\n  colo?: string;\n  loc?: string;\n  [key: string]: string | undefined;\n}\n\ninterface CloudflareStatusResult {\n  nodesData: NodeInfo[] | undefined;\n  traceData: TraceData | undefined;\n  currentNodeName: string | undefined;\n  location: string | undefined;\n}\n\nexport async function getCloudflareStatus(): Promise\u003CCloudflareStatusResult> {\n  \u002F\u002F Fetch node data\n  const nodesResponse = await ky.get('https:\u002F\u002Fwww.cloudflarestatus.com\u002Fapi\u002Fv2\u002Fsummary.json').json();\n  const nodesData = nodesResponse.components\n    .filter((c) => REGEX.test(c.name))\n    .map((n) => ({\n      name: n.name,\n      code: n.name.match(REGEX)?.[1],\n    }));\n\n  \u002F\u002F Fetch trace data\n  const traceText = await ky.get('https:\u002F\u002Fkuriyona.com\u002Fcdn-cgi\u002Ftrace').text();\n  const traceData = Object.fromEntries(\n    traceText\n      .split('\\n')\n      .filter((line) => line.includes('='))\n      .map((line) => line.split('=')),\n  ) as TraceData;\n\n  console.log(traceData);\n\n  \u002F\u002F Determine current node name\n  const currentNodeName = nodesData.find((n) => n.code === traceData?.colo)?.name;\n\n  const location = traceData?.loc;\n\n  return {\n    nodesData,\n    traceData,\n    currentNodeName,\n    location,\n  };\n}\n",[36,401,402,419,425,466,470,481,494,511,516,520,529,541,552,577,581,585,594,614,630,646,662,667,672,704,711,738,751,775,792,798,817,823,828,834,862,881,887,909,938,964,977,982,994,999,1005,1038,1043,1056,1061,1069,1075,1081,1087,1093,1099],{"__ignoreMap":19},[49,403,404,407,410,413,416],{"class":51,"line":52},[49,405,406],{"class":204},"import",[49,408,409],{"class":218}," ky ",[49,411,412],{"class":204},"from",[49,414,415],{"class":229}," 'ky'",[49,417,418],{"class":218},";\n",[49,420,421],{"class":51,"line":58},[49,422,424],{"emptyLinePlaceholder":423},true,"\n",[49,426,427,429,431,433,436,438,440,442,444,446,448,450,452,454,456,458,460,462,464],{"class":51,"line":64},[49,428,205],{"class":204},[49,430,275],{"class":208},[49,432,212],{"class":204},[49,434,435],{"class":229}," \u002F",[49,437,323],{"class":204},[49,439,326],{"class":208},[49,441,329],{"class":204},[49,443,333],{"class":332},[49,445,336],{"class":208},[49,447,339],{"class":204},[49,449,343],{"class":342},[49,451,226],{"class":332},[49,453,348],{"class":208},[49,455,351],{"class":204},[49,457,354],{"class":332},[49,459,357],{"class":342},[49,461,360],{"class":204},[49,463,320],{"class":229},[49,465,418],{"class":218},[49,467,468],{"class":51,"line":70},[49,469,424],{"emptyLinePlaceholder":423},[49,471,472,475,478],{"class":51,"line":76},[49,473,474],{"class":204},"interface",[49,476,477],{"class":222}," NodeInfo",[49,479,480],{"class":218}," {\n",[49,482,483,486,489,492],{"class":51,"line":82},[49,484,485],{"class":265},"  name",[49,487,488],{"class":204},":",[49,490,491],{"class":208}," string",[49,493,418],{"class":218},[49,495,496,499,501,503,506,509],{"class":51,"line":88},[49,497,498],{"class":265},"  code",[49,500,488],{"class":204},[49,502,491],{"class":208},[49,504,505],{"class":204}," |",[49,507,508],{"class":208}," undefined",[49,510,418],{"class":218},[49,512,513],{"class":51,"line":94},[49,514,515],{"class":218},"}\n",[49,517,518],{"class":51,"line":100},[49,519,424],{"emptyLinePlaceholder":423},[49,521,522,524,527],{"class":51,"line":106},[49,523,474],{"class":204},[49,525,526],{"class":222}," TraceData",[49,528,480],{"class":218},[49,530,531,534,537,539],{"class":51,"line":112},[49,532,533],{"class":265},"  colo",[49,535,536],{"class":204},"?:",[49,538,491],{"class":208},[49,540,418],{"class":218},[49,542,543,546,548,550],{"class":51,"line":118},[49,544,545],{"class":265},"  loc",[49,547,536],{"class":204},[49,549,491],{"class":208},[49,551,418],{"class":218},[49,553,554,557,560,562,564,567,569,571,573,575],{"class":51,"line":124},[49,555,556],{"class":218},"  [",[49,558,559],{"class":265},"key",[49,561,488],{"class":204},[49,563,491],{"class":208},[49,565,566],{"class":218},"]",[49,568,488],{"class":204},[49,570,491],{"class":208},[49,572,505],{"class":204},[49,574,508],{"class":208},[49,576,418],{"class":218},[49,578,579],{"class":51,"line":130},[49,580,515],{"class":218},[49,582,583],{"class":51,"line":136},[49,584,424],{"emptyLinePlaceholder":423},[49,586,587,589,592],{"class":51,"line":142},[49,588,474],{"class":204},[49,590,591],{"class":222}," CloudflareStatusResult",[49,593,480],{"class":218},[49,595,597,600,602,604,607,610,612],{"class":51,"line":596},17,[49,598,599],{"class":265},"  nodesData",[49,601,488],{"class":204},[49,603,477],{"class":222},[49,605,606],{"class":218},"[] ",[49,608,609],{"class":204},"|",[49,611,508],{"class":208},[49,613,418],{"class":218},[49,615,617,620,622,624,626,628],{"class":51,"line":616},18,[49,618,619],{"class":265},"  traceData",[49,621,488],{"class":204},[49,623,526],{"class":222},[49,625,505],{"class":204},[49,627,508],{"class":208},[49,629,418],{"class":218},[49,631,633,636,638,640,642,644],{"class":51,"line":632},19,[49,634,635],{"class":265},"  currentNodeName",[49,637,488],{"class":204},[49,639,491],{"class":208},[49,641,505],{"class":204},[49,643,508],{"class":208},[49,645,418],{"class":218},[49,647,649,652,654,656,658,660],{"class":51,"line":648},20,[49,650,651],{"class":265},"  location",[49,653,488],{"class":204},[49,655,491],{"class":208},[49,657,505],{"class":204},[49,659,508],{"class":208},[49,661,418],{"class":218},[49,663,665],{"class":51,"line":664},21,[49,666,515],{"class":218},[49,668,670],{"class":51,"line":669},22,[49,671,424],{"emptyLinePlaceholder":423},[49,673,675,678,681,684,687,690,692,695,698,701],{"class":51,"line":674},23,[49,676,677],{"class":204},"export",[49,679,680],{"class":204}," async",[49,682,683],{"class":204}," function",[49,685,686],{"class":222}," getCloudflareStatus",[49,688,689],{"class":218},"()",[49,691,488],{"class":204},[49,693,694],{"class":222}," Promise",[49,696,697],{"class":218},"\u003C",[49,699,700],{"class":222},"CloudflareStatusResult",[49,702,703],{"class":218},"> {\n",[49,705,707],{"class":51,"line":706},24,[49,708,710],{"class":709},"sAwPA","  \u002F\u002F Fetch node data\n",[49,712,714,717,720,722,724,726,728,730,732,734,736],{"class":51,"line":713},25,[49,715,716],{"class":204},"  const",[49,718,719],{"class":208}," nodesResponse",[49,721,212],{"class":204},[49,723,215],{"class":204},[49,725,219],{"class":218},[49,727,223],{"class":222},[49,729,226],{"class":218},[49,731,230],{"class":229},[49,733,233],{"class":218},[49,735,236],{"class":222},[49,737,239],{"class":218},[49,739,741,743,746,748],{"class":51,"line":740},26,[49,742,716],{"class":204},[49,744,745],{"class":208}," nodesData",[49,747,212],{"class":204},[49,749,750],{"class":218}," nodesResponse.components\n",[49,752,754,757,759,761,763,765,767,769,771,773],{"class":51,"line":753},27,[49,755,756],{"class":218},"    .",[49,758,259],{"class":222},[49,760,262],{"class":218},[49,762,266],{"class":265},[49,764,269],{"class":218},[49,766,272],{"class":204},[49,768,275],{"class":208},[49,770,156],{"class":218},[49,772,280],{"class":222},[49,774,283],{"class":218},[49,776,778,780,782,784,786,788,790],{"class":51,"line":777},28,[49,779,756],{"class":218},[49,781,290],{"class":222},[49,783,262],{"class":218},[49,785,295],{"class":265},[49,787,269],{"class":218},[49,789,272],{"class":204},[49,791,302],{"class":218},[49,793,795],{"class":51,"line":794},29,[49,796,797],{"class":218},"      name: n.name,\n",[49,799,801,804,806,808,811,813,815],{"class":51,"line":800},30,[49,802,803],{"class":218},"      code: n.name.",[49,805,315],{"class":222},[49,807,226],{"class":218},[49,809,810],{"class":208},"REGEX",[49,812,365],{"class":218},[49,814,368],{"class":208},[49,816,371],{"class":218},[49,818,820],{"class":51,"line":819},31,[49,821,822],{"class":218},"    }));\n",[49,824,826],{"class":51,"line":825},32,[49,827,424],{"emptyLinePlaceholder":423},[49,829,831],{"class":51,"line":830},33,[49,832,833],{"class":709},"  \u002F\u002F Fetch trace data\n",[49,835,837,839,842,844,846,848,850,852,855,857,860],{"class":51,"line":836},34,[49,838,716],{"class":204},[49,840,841],{"class":208}," traceText",[49,843,212],{"class":204},[49,845,215],{"class":204},[49,847,219],{"class":218},[49,849,223],{"class":222},[49,851,226],{"class":218},[49,853,854],{"class":229},"'https:\u002F\u002Fkuriyona.com\u002Fcdn-cgi\u002Ftrace'",[49,856,233],{"class":218},[49,858,859],{"class":222},"text",[49,861,239],{"class":218},[49,863,865,867,870,872,875,878],{"class":51,"line":864},35,[49,866,716],{"class":204},[49,868,869],{"class":208}," traceData",[49,871,212],{"class":204},[49,873,874],{"class":218}," Object.",[49,876,877],{"class":222},"fromEntries",[49,879,880],{"class":218},"(\n",[49,882,884],{"class":51,"line":883},36,[49,885,886],{"class":218},"    traceText\n",[49,888,890,893,896,898,901,904,906],{"class":51,"line":889},37,[49,891,892],{"class":218},"      .",[49,894,895],{"class":222},"split",[49,897,226],{"class":218},[49,899,900],{"class":229},"'",[49,902,903],{"class":208},"\\n",[49,905,900],{"class":229},[49,907,908],{"class":218},")\n",[49,910,912,914,916,918,920,922,924,927,930,932,935],{"class":51,"line":911},38,[49,913,892],{"class":218},[49,915,259],{"class":222},[49,917,262],{"class":218},[49,919,51],{"class":265},[49,921,269],{"class":218},[49,923,272],{"class":204},[49,925,926],{"class":218}," line.",[49,928,929],{"class":222},"includes",[49,931,226],{"class":218},[49,933,934],{"class":229},"'='",[49,936,937],{"class":218},"))\n",[49,939,941,943,945,947,949,951,953,955,957,959,961],{"class":51,"line":940},39,[49,942,892],{"class":218},[49,944,290],{"class":222},[49,946,262],{"class":218},[49,948,51],{"class":265},[49,950,269],{"class":218},[49,952,272],{"class":204},[49,954,926],{"class":218},[49,956,895],{"class":222},[49,958,226],{"class":218},[49,960,934],{"class":229},[49,962,963],{"class":218},")),\n",[49,965,967,970,973,975],{"class":51,"line":966},40,[49,968,969],{"class":218},"  ) ",[49,971,972],{"class":204},"as",[49,974,526],{"class":222},[49,976,418],{"class":218},[49,978,980],{"class":51,"line":979},41,[49,981,424],{"emptyLinePlaceholder":423},[49,983,985,988,991],{"class":51,"line":984},42,[49,986,987],{"class":218},"  console.",[49,989,990],{"class":222},"log",[49,992,993],{"class":218},"(traceData);\n",[49,995,997],{"class":51,"line":996},43,[49,998,424],{"emptyLinePlaceholder":423},[49,1000,1002],{"class":51,"line":1001},44,[49,1003,1004],{"class":709},"  \u002F\u002F Determine current node name\n",[49,1006,1008,1010,1013,1015,1018,1021,1023,1025,1027,1029,1032,1035],{"class":51,"line":1007},45,[49,1009,716],{"class":204},[49,1011,1012],{"class":208}," currentNodeName",[49,1014,212],{"class":204},[49,1016,1017],{"class":218}," nodesData.",[49,1019,1020],{"class":222},"find",[49,1022,262],{"class":218},[49,1024,295],{"class":265},[49,1026,269],{"class":218},[49,1028,272],{"class":204},[49,1030,1031],{"class":218}," n.code ",[49,1033,1034],{"class":204},"===",[49,1036,1037],{"class":218}," traceData?.colo)?.name;\n",[49,1039,1041],{"class":51,"line":1040},46,[49,1042,424],{"emptyLinePlaceholder":423},[49,1044,1046,1048,1051,1053],{"class":51,"line":1045},47,[49,1047,716],{"class":204},[49,1049,1050],{"class":208}," location",[49,1052,212],{"class":204},[49,1054,1055],{"class":218}," traceData?.loc;\n",[49,1057,1059],{"class":51,"line":1058},48,[49,1060,424],{"emptyLinePlaceholder":423},[49,1062,1064,1067],{"class":51,"line":1063},49,[49,1065,1066],{"class":204},"  return",[49,1068,480],{"class":218},[49,1070,1072],{"class":51,"line":1071},50,[49,1073,1074],{"class":218},"    nodesData,\n",[49,1076,1078],{"class":51,"line":1077},51,[49,1079,1080],{"class":218},"    traceData,\n",[49,1082,1084],{"class":51,"line":1083},52,[49,1085,1086],{"class":218},"    currentNodeName,\n",[49,1088,1090],{"class":51,"line":1089},53,[49,1091,1092],{"class":218},"    location,\n",[49,1094,1096],{"class":51,"line":1095},54,[49,1097,1098],{"class":218},"  };\n",[49,1100,1102],{"class":51,"line":1101},55,[49,1103,515],{"class":218},[1105,1106,1107],"style",{},"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 pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sns5M, html code.shiki .sns5M{--shiki-default:#DBEDFF}html pre.shiki code .sRjNt, html code.shiki .sRjNt{--shiki-default:#85E89D;--shiki-default-font-weight:bold}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":19,"searchDepth":58,"depth":58,"links":1109},[1110,1111],{"id":30,"depth":64,"text":31},{"id":382,"depth":64,"text":383},"2026-05-24","By parsing Cloudflare's \u002Fcdn-cgi\u002Ftrace endpoint to obtain the current network node ID, and then matching the node name using Cloudflare Status's public API, you can dynamically display the name of the Cloudflare network that the visitor is using on your website.","md",{},"\u002Fblog\u002Fen\u002Fcf-network",{"title":6,"description":13},"blog\u002Fen\u002Fcf-network","LQ3eL7y80lms45shaXKZReya8ao1y2G7spOGbH6l6WA",{"id":1121,"title":1122,"body":1123,"date":1339,"desc":1340,"description":19,"edit":1339,"extension":1114,"meta":1341,"navigation":423,"path":1342,"seo":1343,"stem":1344,"__hash__":1345},"blog\u002Fblog\u002Fen\u002Fabout-name.md","About the Name of Weixi-chan",{"type":8,"value":1124,"toc":1333},[1125,1129,1137,1144,1148,1151,1162,1168,1217,1221,1224,1235,1240,1247,1254,1263,1266,1281,1291,1295,1301,1304,1309],[28,1126,1128],{"id":1127},"my-names","My Names",[11,1130,1131,1132,1136],{},"I go by ",[1133,1134,1135],"strong",{},"\"Kuriyona\""," – a nickname I chose for myself.",[11,1138,1139,1140,1143],{},"I am also called ",[1133,1141,1142],{},"\"Weixi\" (未晞)"," – the real name I gave myself after I confirmed my gender identity.",[28,1145,1147],{"id":1146},"about-kuriyona","About \"Kuriyona\"",[11,1149,1150],{},"It was born from the sounds of Japanese and the meanings of Chinese characters (kanji).",[11,1152,1153,1154,1158,1159,156],{},"\"Kuriyona\" is pronounced ",[1155,1156,1157],"em",{},"ku-ri-yo-na"," ",[36,1160,1161],{},"クリヨナ",[11,1163,1164,1165,156],{},"The name can be written with the kanji ",[1133,1166,1167],{},"「栗夜奈」",[1169,1170,1171,1184,1199],"ul",{},[1172,1173,1174,1158,1177,1158,1180,1183],"li",{},[1133,1175,1176],{},"「栗」",[1155,1178,1179],{},"kuri",[36,1181,1182],{},"クリ"," – This character symbolizes the nickname I used in the past and the moniker others have always called me by. It also shares the same pronunciation as my real-life family name.",[1172,1185,1186,1158,1189,1158,1192,1195,1196,156],{},[1133,1187,1188],{},"「夜」",[1155,1190,1191],{},"yo",[36,1193,1194],{},"ヨ"," – The meaning I wanted to add: ",[1133,1197,1198],{},"night",[1172,1200,1201,1158,1204,1158,1207,1210,1211,1214,1215,156],{},[1133,1202,1203],{},"「奈」",[1155,1205,1206],{},"na",[36,1208,1209],{},"ナ"," – A soft, lingering syllable, like a gentle particle. It replaces the masculine-sounding ",[1155,1212,1213],{},"ta"," in my old name with the feminine ",[1155,1216,1206],{},[28,1218,1220],{"id":1219},"about-weixi-未晞","About \"Weixi\" (未晞)",[11,1222,1223],{},"And \"Weixi\" (未晞) is the real name I gave myself.",[11,1225,1226,1227,1230,1231,1234],{},"It comes from a line in the ",[1155,1228,1229],{},"Classic of Poetry"," (",[1155,1232,1233],{},"Shijing","), in the section \"Qin Wind\" (秦风):",[22,1236,1237],{},[11,1238,1239],{},"「蒹葭萋萋，白露未晞」",[22,1241,1242],{},[11,1243,1244],{},[1155,1245,1246],{},"Jiān jiā qī qī, bái lù wèi xī",[22,1248,1249],{},[11,1250,1251],{},[1155,1252,1253],{},"\"Thick grows the reed; \u002F The white dew is not yet dried.\"",[11,1255,1256,1258,1259,1262],{},[1133,1257,1142],{}," means the morning dew ",[1133,1260,1261],{},"not yet dried by the sun"," – that moment just before dawn, when the air is still moist and everything is waking up, yet nothing is quite finished.",[11,1264,1265],{},"It carries the sense of:",[1169,1267,1268,1275],{},[1172,1269,1270,1271,1274],{},"the ",[1133,1272,1273],{},"last trace of dampness"," before sunrise,",[1172,1276,1270,1277,1280],{},[1133,1278,1279],{},"quietest light"," at the very beginning of new life.",[11,1282,1283,1284,1287,1288,1290],{},"After I came to fully recognize my gender identity,",[1285,1286],"br",{},"\nI chose these two characters",[1285,1289],{},"\nas a confirmation of my own authentic existence.",[28,1292,1294],{"id":1293},"a-short-note","A Short Note",[11,1296,1297,1298,1300],{},"\"Kuriyona\" was the small night where I once hid myself.",[1285,1299],{},"\n\"Weixi\" is the daybreak I finally welcomed.",[1302,1303],"hr",{},[11,1305,1306],{},[1155,1307,1308],{},"Note for English readers:",[1169,1310,1311,1317,1330],{},[1172,1312,1313,1314,1316],{},"The name ",[1133,1315,1135],{}," uses Japanese phonetics but carries layered meanings from kanji.",[1172,1318,1319,1321,1322,1325,1326,1329],{},[1133,1320,1142],{}," is a classical Chinese name. The character ",[1133,1323,1324],{},"\"晞\" (xī)"," specifically means \"to be dried by the sun\" – so ",[1155,1327,1328],{},"wèi xī"," literally means \"not yet dried,\" evoking the fresh, tender moment of early dawn.",[1172,1331,1332],{},"The original poem \"Jian Jia\" (蒹葭) is a famous piece about longing and elusive beauty; the line \"white dew not yet dried\" suggests a fleeting, precious moment just before it vanishes.",{"title":19,"searchDepth":58,"depth":58,"links":1334},[1335,1336,1337,1338],{"id":1127,"depth":64,"text":1128},{"id":1146,"depth":64,"text":1147},{"id":1219,"depth":64,"text":1220},{"id":1293,"depth":64,"text":1294},"2026-05-18","The origin of the name \"Weixi-chan\"",{},"\u002Fblog\u002Fen\u002Fabout-name",{"title":1122,"description":19},"blog\u002Fen\u002Fabout-name","nbnqlDr49eqFXQ5D43vViIxsWId5Z7j146sg2Vk6RPE",1779981581073]