commit febcbfff3f98bea17315eebe16ead3d1c67f6a5b
parent 6d0ad1e02992c8ba4432547a7acbd2c5f65030aa
Author: Andrew Laack <andrew@laack.co>
Date: Fri, 28 Aug 2026 22:56:06 -0500
Merge branch 'master' of ssh://git.laack.co:/srv/git/blog
Diffstat:
12 files changed, 391 insertions(+), 0 deletions(-)
diff --git a/posts/wip/advertising.md b/posts/wip/advertising.md
@@ -0,0 +1,52 @@
+# Advertising
+
+I have always been detrimentally contrarian. This likely stems from a desire to feel in control of my choices, and by rejecting the propositions of others, it feels like I have control of my choices. Perhaps this may be incorrect, and I may be over-analyzing the root cause, but in any case, I have always been excessively contrarian, even now.
+
+## The Benefits of Advertising
+
+"If you build it, he will come" is an appealing notion, but likely not applicable to most endeavors. To some extent, gaining adoption of things requires telling others about them, not simply building it. Advertising is a common way to tell people about things. Advertising things that will help others is a win-win.
+
+## The Failures of Advertising
+
+I do agree it is a win-win if the builder and consumer both benefit from advertising, but this is so infrequently the case that I generally don't agree with it in practice. I used to see many advertisements, and they frequently felt like the following:
+
+> You _need_ to buy this thing because xyz.
+
+> We are the only people who can give this to you
+
+> You are incapable of doing this yourself
+
+This comes from reading between the lines, but no one advertises things that can be easily done by individuals. This is to say, advertisements sell solutions to your helplessness by first showing how helpless you are, and then telling you about their potion to solve it.
+
+Advertisements are not frequently this forward, but notionally this is what they are doing. Being excessively contrarian, having others tell me I am helpless and need them to do something for me is irritating. Sometimes my initial reaction is to do what they are selling without their help, but when so many advertisements are thrown my way, I would get stretched too thin.
+
+## Saying No
+
+I have stopped doing most things that will result in me being advertised to. There are certain things I believe are unavoidable advertisements, but in these cases I generally do two things:
+
+1. Be exceptionally rude about the advertisement
+2. Ensure I never support the advertiser in any way in the future
+
+The first is difficult because culturally advertising is acceptable, and confrontations are hard, but I so vehemently disagree with advertisements that I will express my discontentment face to face.
+
+The second is rather simple; any time you see an advertisement that you didn't implicitly agree to see by using an ad supported service or something akin, make a note of the company and ensure you never support them again. I was in San Francisco and saw Mullvad VPN advertisements on buses. At the time, I used their VPN because I perceived it as the best, and perhaps on merit it is still, but after seeing the advertisement I made sure to never use their services again, or recommend their services. If you want to use a VPN, use IVPN, Proton has similarly problematic advertising, or setup your own as I have taken to doing.
+
+## Acceptable and Unacceptable Advertisements
+
+Acceptable:
+
+- TV
+- Subscriptions that state they are ad supported
+- Services that are free with ads
+
+Unacceptable:
+
+- Advertisements visible to individuals who aren't partaking in a service supported by ads
+ - Billboards are not supporting roadways and by using the public roadways, I haven't consented to being advertised to
+- Public services
+ - Busses in SF are covered in advertisements, and simply walking on sidewalks forces them into my view
+ - SFO airport has lots of advertisements; that's a public place that has no business having random advertisements. If I see ads on a plane that's one thing (presumably my ticket was cheaper to facilitate that), but not in the airport itself
+ - Random events
+ - This is slightly different, but if I'm at something like defcon I'd expect not to be gratuitiously advertised to during talks. Stations are par for the course, but talks should be devoid of ulterior motationvs; be a human.
+
+A form of advertisement that bothers me is self-advertisement. People whoring theselves out to find a job at so-called "networking events" are one thing (simply don't attend), but if I'm at dinner with a group, I expect everyone to live in the moment, not try to get a job out of me or get me to work with / for them. It's annoying. I noticed this is especially bad in San Francisco, mostly because of how little I've noticed these annoyances in the midwest.
diff --git a/posts/wip/dissatisfaction.md b/posts/wip/dissatisfaction.md
@@ -0,0 +1,3 @@
+# Dissatisfaction
+
+It is quite dissatisfying to not feel in control. I feel this way when people try to advertise to me. "Buy our thing, it solves a problem for you, without us you'd never be able to solve it!", debilitating.
diff --git a/posts/wip/ideal-note-taking.md b/posts/wip/ideal-note-taking.md
@@ -0,0 +1,35 @@
+# Ideal Note Taking
+
+The ideal note taking setup supports the users' preferred note taking modalities. For me these are textual notes, frequently taken in reference to an information source alongside planning for subsequent notes, information sources, and time allotments.
+
+Additionally, it must not be built into a text editor. My text editor (vim) is for editing notes, not organizing them.
+
+I use git for managing persistent, non-binary data, and so my note taking program should work well with git, but it shouldn't have a git integration because that seems beyond the scope of what a note-taking program should do. Similarly, it should be simple to encrypt my notes, but CryFS[1] does this for me, and it is very clearly outside the scope of what a note-taking program should facilitate.
+
+## Specifics
+
+The above is a high-level, these are the specifics of what I want:
+
+- Multi-directory support
+ - I have notes in directories with different threat models, and they should remain logically separated
+- Terminal-based
+- No built-in backups / synchronization
+ - I don't want sync functionality because that's what git is for, or network shares, or unison, and these add both complexity and support silly use cases like taking notes from mobile devices
+- To-Do tracking
+ - When taking notes I frequently find related resources or think of related note-taking topic, and I'd like a list of these things.
+- Stable and performant
+ - Apart from mixing concerns and being proprietary, programs like Notion and Obsidian are both unacceptably unstable and slow.
+- Scriptability
+ - It should be easy to write scripts for programmatic invocations of the program.
+- Archiving
+ - When I take notes I often want to archive sources for future reference, this should be supported by the program.
+- Interoperable
+ - The resulting directory structures should be reasonable for use with SSGs and other tools that have sensible expectations.
+
+## Implementation
+
+I want this to be performant so it must be written in a language that can compile to a sane binary. I don't want to become suicidal from using an object oriented language so I am going to choose Go.
+
+# Citations
+
+[1] - [https://www.cryfs.org/](https://www.cryfs.org/)
diff --git a/posts/wip/just-because-youre-right-doesnt-mean-it-matters.md b/posts/wip/just-because-youre-right-doesnt-mean-it-matters.md
@@ -0,0 +1,8 @@
+# Just because you're right doesn't mean it matters
+
+- Free software
+ - yes, proprietary software will generally become crap, no that doesn't mean free software is necessarily the correct course of action
+- Yes, package managers will always be supply chain attack vectors, no it doesn't mean we definitively shouldn't use them
+ - This is just a consequence of them, not something that obviates their entire value prop
+
+basically, it is super easy to predict something bad will happen in the future. This doesn't mean the bad thing you predicted matters, and frequently predictions about bad things happening are outweighed by the positive short term benefits. The specifics of this are variable, and I do think free software is better than proprietary software, but it's not that useful to say stallman was right because of course he would be! Of course some prop software will become bad, this is super obvious to me. What's less obvious is his overall correctness, which I agree with, but is a bit more nuanced than a simple stallman was right because muh pdf viewer is crap now.
diff --git a/posts/wip/rent-seeking-software.md b/posts/wip/rent-seeking-software.md
@@ -0,0 +1,15 @@
+# Rent-Seeking Software
+
+## Learned Helplessness
+
+Rent-seeking behavior is when individuals manipulate policy and market conditions to amass wealth without providing value. In some contexts, like actual rent, such behaviors are quite logical; property is a scarce resource, there are laws around development, and so there is an incentive to manipulate these laws to amass wealth.
+
+The confusing part of this is why rent-seeking behavior exists in software. Instructure provides no value in their hosting of Canvas beyond what two sysadmins could manage with a VPS, the software is licensed under the AGPL so they are not peddling proprietary software, they have simply tricked people into believing they are helpless to do anything such that they have to pay for every service they want.
+
+Frequently people claim it is cheaper to outsource their software services, which I am highly suspicious of, and it decreases their exposure in the case of a cybersecurity incident. This is such an inconsiderate stance. If a crime is commited against your employees, your customers, or the public and your primary concern is how this will impact you financially you are failing morally.
+
+People selfhost services all the time. This isn't something that requires a high degree of sophistication, just the ability to read, and a couple of weekends. I find selfhosting to be more difficult than hosting commercial software because hosting commercial software generally comes with commercial resources whereas selfhosting frequently means running docker on a rasberry pi sitting on the floor, a much less resilient configuration.
+
+---
+
+This is sort of all over the place, but this is reactionary to the canvas / instructure breach which has impacted a fairly sizeable number of students who really shouldn't've been impacted by this because this was likely an instructure problem, not a canvas problem (shinyhunters seem to mostly do social engineering type stuff).
diff --git a/posts/wip/the-big-three-privacy-search-engines.md b/posts/wip/the-big-three-privacy-search-engines.md
@@ -0,0 +1,17 @@
+# The Big Three (Privacy) Search Engines
+
+The big three privacy search engines are 1) Brave Search 2) DuckDuckGo 3) Startpage. These are the most popular privacy search engines because they generally provide sensible enough results, have privacy policies that aren't anti-consumer, and make sensible technical decisions that are verifiable by looking at the requests browsers make to their search engines to minimize tracking.
+
+## Indices
+
+Brave Search uses its own index.
+
+DuckDuckGo primarily uses Bing.
+
+Startpage primarily uses Google.
+
+## Quality Comparison
+
+## IP Rotation and Browser Fingerprint
+
+Every day I switched exit nodes using the protonvpn cli. I also cleared all cached data from librewolf at the end of the day.
diff --git a/posts/wip/the-legality-of-summarization.md b/posts/wip/the-legality-of-summarization.md
@@ -0,0 +1,6 @@
+# The Legality of Summarization
+
+Warning: Discussion of AI Content
+Note: AI has **not** been used in the writing process, but I dislike reading things that discuss AI so be warned, this will discuss AI and related concepts.
+
+There have been prior court cases around using snippets of indexed web content in search engines, to set precendents about their usage wrt copyright holders. Given that these snippets don't impact the authors by subverting earnings potential, they were deemed acceptable. Does this precedent still apply for AI summaries?
diff --git a/posts/wip/your-gemini-search-engine.md b/posts/wip/your-gemini-search-engine.md
@@ -0,0 +1,5 @@
+# Your Gemini Search Engine
+
+The current Gemini search engines are decent. Given how small Geminispace is, I wondered how reasonable it would be for anyone to create and run their own search engine. Modern computers are quite performant and all that. This is my exploration of that idea.
+
+##
diff --git a/python/search-engines/graph.py b/python/search-engines/graph.py
@@ -0,0 +1,63 @@
+import matplotlib.pyplot as plt
+import pandas as pd
+import numpy as np
+
+df = pd.read_csv('search.csv')
+
+engines = {
+ 'startpage': 'blue',
+ 'ddg': 'yellow',
+ 'brave_search': 'red',
+}
+
+# query,engine,time,captcha_hit,captcha_time,pow_captcha,slop_sites_top_5,answer_index,unrelated_sites
+records = df.to_records(index=False).tolist()
+
+means = {}
+
+for record in records:
+ engine = record[1]
+ slop_sites = record[6]
+ answer_index = record[7]
+ unrelated_sites = record[8]
+
+
+ # if unrealted sites is nan, skip
+ if np.isnan(unrelated_sites):
+ continue
+
+ if engine not in means:
+ means[engine] = {
+ 'slop_sites': 0,
+ 'answer_index': 0,
+ 'unrelated_sites': 0,
+ 'count' : 0
+ }
+
+ means[engine]["count"] += 1
+ means[engine]["slop_sites"] += slop_sites
+ means[engine]["answer_index"] += answer_index
+ means[engine]["unrelated_sites"] += unrelated_sites
+
+for engine in means:
+ means[engine]["slop_sites"] /= means[engine]["count"]
+ means[engine]["answer_index"] /= means[engine]["count"]
+ means[engine]["unrelated_sites"] /= means[engine]["count"]
+
+
+plt.bar(means.keys(), [means[engine]["slop_sites"] for engine in means], color=[engines[engine] for engine in means], label='Slop Sites')
+plt.title('Slop Sites')
+plt.show()
+
+plt.bar(means.keys(), [means[engine]["answer_index"] for engine in means], color=[engines[engine] for engine in means], label='Answer Index')
+plt.title('Answer Index')
+plt.show()
+
+plt.bar(means.keys(), [means[engine]["unrelated_sites"] for engine in means], color=[engines[engine] for engine in means])
+plt.title('Unrelated Sites')
+plt.show()
+
+
+print(means['startpage'])
+print(means['brave_search'])
+print(means['ddg'])
diff --git a/python/search-engines/notes.md b/python/search-engines/notes.md
@@ -0,0 +1,25 @@
+# Brave
+
+Seems very bad for dorks. Also, when I used a inurl:"" dork it gave me a captcha which was a slider one to cover a dot. Relatively easy atk, interesting that dorks seem to increase the rate of captchas. Also, the results are kind of awful wrt dorks, it doesn't seem to respect them, at least not inurl.
+
+# Startpage
+
+Hit captchas the most here. They are fairly simple, typing in a few lower + upper alphanumeric characters that are relatively easy to read. Nothing compared to the BS that are google's captchas.
+
+# DDG
+
+Do they ever show captchas? Also, seems like it frequently shows slop sites
+
+ddg had more diverse sources when searching for tlgs.one... like I didn't see the github results in any of the other search results even though ddg had some slop and unrelated seo sites.
+
+Frequently shows "deepwiki" which is some ai slop wiki site thing for so-called "agents".
+
+# Google
+
+Why the fuck is google the only search engine (i've found) that shows the citation count before research papers; this is an absolutely essential feature. This is the only reason I ever want to use google.
+
+Where else can I get this? DDB, brave, startpage don't do this.
+
+---
+
+I disagree with the use of AI. Duck.ai works through protonvpn (haven't seen any captchas in a few uses). this is rather interesting.
diff --git a/python/search-engines/query.py b/python/search-engines/query.py
@@ -0,0 +1,68 @@
+import csv
+import os
+from enum import Enum
+import time
+
+
+# list of search engines
+class Engine(Enum):
+ STARTPAGE = 'startpage'
+ BRAVE_SEARCH = 'brave_search'
+ DDG = 'ddg'
+
+class Query:
+ query_message: str
+ engine: Engine
+ time: str
+ captcha_hit: bool
+ captcha_time: float
+ pow_captcha: bool
+ answer_index: int
+ slop_sites_top_5: int
+ unrelated_sites : int
+
+
+def create_query():
+ current = time.time()
+ query_message = input("Enter a search query: ")
+ query = Query()
+ query.query_message = query_message
+ query.time = current
+ return query
+
+
+def ensure_csv():
+ if not os.path.exists('search.csv') or os.path.getsize('search.csv') == 0:
+ with open('search.csv', 'w', newline='') as f:
+ f.write('query,engine,time,captcha_hit,captcha_time,pow_captcha,slop_sites_top_5,answer_index,unrelated_sites\n')
+
+def write_query(query):
+ f = open('search.csv', 'a')
+ csvwriter = csv.writer(f)
+ csvwriter.writerow([query.query_message, query.engine.value, query.time, query.captcha_hit, query.captcha_time, query.pow_captcha, query.slop_sites_top_5, query.answer_index, query.unrelated_sites])
+ f.close()
+
+ensure_csv()
+query = create_query()
+
+for engine in Engine:
+ query.engine = engine
+ print("Searching for " + query.query_message + " with " + engine.value + "")
+
+ captcha = input("Did you see a captcha? (y/n): ")
+
+ if captcha == 'y':
+ query.captcha_time = float(input("How many seconds did it take to solve (6 means failed to solve): "))
+ query.captcha_hit = True
+ query.pow_captcha = input("Was the captcha a PoW captcha? (y/n): ") == "y"
+ else:
+ query.pow_captcha = False
+ query.captcha_hit = False
+ query.captcha_time = 0
+
+ query.slop_sites_top_5 = int(input("Slop sites / SEO site count in the top 5: "))
+ query.answer_index = int(input("First index containing the answer (-1 means no answer on first page of results): "))
+ query.unrelated_sites = int(input("Unrelated site count: "))
+ print()
+
+ write_query(query)
diff --git a/python/search-engines/search.csv b/python/search-engines/search.csv
@@ -0,0 +1,94 @@
+query,engine,time,captcha_hit,captcha_time,pow_captcha,slop_sites_top_5,answer_index,unrelated_sites
+"fim language models ""open weight"" code completion",startpage,1780355824.6081214,False,0,False,0,2
+"fim language models ""open weight"" code completion",brave_search,1780355824.6081214,False,0,False,0,6
+"fim language models ""open weight"" code completion",ddg,1780355824.6081214,False,0,False,0,6
+Granite4.0 code completion model,startpage,1780356056.7660637,False,0,False,0,1
+Granite4.0 code completion model,brave_search,1780356056.7660637,False,0,False,0,1
+Granite4.0 code completion model,ddg,1780356056.7660637,False,0,False,0,1
+mellum fim vs qwen2.5-coder-3b code completion model benchmarks,startpage,1780356578.8307145,False,0,False,0,2
+mellum fim vs qwen2.5-coder-3b code completion model benchmarks,brave_search,1780356578.8307145,False,0,False,1,5
+mellum fim vs qwen2.5-coder-3b code completion model benchmarks,ddg,1780356578.8307145,False,0,False,2,6
+supermaven / cursor models vs mellum,startpage,1780357180.0816693,False,0,False,1,6
+supermaven / cursor models vs mellum,brave_search,1780357180.0816693,False,0,False,2,6
+supermaven / cursor models vs mellum,ddg,1780357180.0816693,False,0,False,4,6
+code completion models economic impact,startpage,1780357606.6343193,False,0,False,1,1
+code completion models economic impact,brave_search,1780357606.6343193,False,0,False,0,6
+code completion models economic impact,ddg,1780357606.6343193,False,0,False,2,6
+tagging markdown files,startpage,1780367477.1498914,False,0,False,1,1
+tagging markdown files,brave_search,1780367477.1498914,False,0,False,2,1
+tagging markdown files,ddg,1780367477.1498914,False,0,False,1,3
+mediawiki markdown syntax,startpage,1780367771.9564865,False,0,False,0,1
+mediawiki markdown syntax,brave_search,1780367771.9564865,False,0,False,0,1
+mediawiki markdown syntax,ddg,1780367771.9564865,False,0,False,0,1
+vimwiki syntax,startpage,1780367936.4018636,False,0,False,0,1
+vimwiki syntax,brave_search,1780367936.4018636,False,0,False,0,1
+vimwiki syntax,ddg,1780367936.4018636,False,0,False,0,1
+wiki.vim,startpage,1780368340.5770388,False,0,False,0,1,2
+wiki.vim,brave_search,1780368340.5770388,False,0,False,0,1,1
+wiki.vim,ddg,1780368340.5770388,False,0,False,1,1,4
+mellum 2,startpage,1780414675.3085477,False,0,False,0,1,0
+mellum 2,brave_search,1780414675.3085477,False,0,False,0,1,1
+mellum 2,ddg,1780414675.3085477,False,0,False,1,1,0
+jetbrains coding models,startpage,1780424305.6205204,False,0,False,0,2,0
+jetbrains coding models,brave_search,1780424305.6205204,False,0,False,0,3,0
+jetbrains coding models,ddg,1780424305.6205204,False,0,False,2,2,0
+jetbrains valuation,startpage,1780425787.8044605,False,0,False,2,6,0
+jetbrains valuation,brave_search,1780425787.8044605,False,0,False,3,6,0
+jetbrains valuation,ddg,1780425787.8044605,False,0,False,2,6,0
+don't call iti freedom,startpage,1780426156.7134058,False,0,False,3,6,5
+don't call iti freedom,brave_search,1780426156.7134058,False,0,False,2,6,5
+don't call iti freedom,ddg,1780426156.7134058,False,0,False,1,1,3
+"inference cost for running small LLMs (""4b""|""8b""|""3b""|""1.5b"")",startpage,1780437841.4090471,False,0,False,1,2,4
+"inference cost for running small LLMs (""4b""|""8b""|""3b""|""1.5b"")",brave_search,1780437841.4090471,False,0,False,2,1,4
+"inference cost for running small LLMs (""4b""|""8b""|""3b""|""1.5b"")",ddg,1780437841.4090471,False,0,False,2,6,5
+code-completion-infill benchmarks,startpage,1780440226.2587073,False,0,False,0,1,0
+code-completion-infill benchmarks,brave_search,1780440226.2587073,False,0,False,0,1,0
+code-completion-infill benchmarks,ddg,1780440226.2587073,False,0,False,2,2,2
+CrossCodeEval,startpage,1780440883.7155557,False,0,False,0,1,0
+CrossCodeEval,brave_search,1780440883.7155557,False,0,False,0,1,0
+CrossCodeEval,ddg,1780440883.7155557,False,0,False,1,1,0
+"llm productivity inurl:""arxiv""",startpage,1780455927.7787466,True,6.0,False,0,1,0
+"llm productivity inurl:""arxiv""",brave_search,1780455927.7787466,True,6.0,False,2,5,2
+"llm productivity inurl:""arxiv""",ddg,1780455927.7787466,False,0,False,3,3,4
+anthropic python library productivity paper january,startpage,1780456663.2637553,False,0,False,1,1,0
+anthropic python library productivity paper january,brave_search,1780456663.2637553,False,0,False,1,1,0
+anthropic python library productivity paper january,ddg,1780456663.2637553,False,0,False,1,1,1
+librewolf anti-fingerprinting,startpage,1780499870.63678,False,0,False,1,2,0
+librewolf anti-fingerprinting,brave_search,1780499870.63678,False,0,False,0,1,0
+librewolf anti-fingerprinting,ddg,1780499870.63678,False,0,False,3,1,3
+browser fingerprinting privacy guides,startpage,1780500464.2163224,False,0,False,1,1,1
+browser fingerprinting privacy guides,brave_search,1780500464.2163224,False,0,False,2,2,3
+browser fingerprinting privacy guides,ddg,1780500464.2163224,False,0,False,1,2,1
+context length qwen 2.5 coder 7b,startpage,1780551836.1093357,True,6.0,False,0,1,0
+context length qwen 2.5 coder 7b,brave_search,1780551836.1093357,False,0,False,0,1,0
+context length qwen 2.5 coder 7b,ddg,1780551836.1093357,False,0,False,2,1,0
+Waiting to connect to bluetoothd...Unable to open mgmt_socket,startpage,1780590614.6859138,False,0,False,0,1,0
+Waiting to connect to bluetoothd...Unable to open mgmt_socket,brave_search,1780590614.6859138,False,0,False,0,2,1
+Waiting to connect to bluetoothd...Unable to open mgmt_socket,ddg,1780590614.6859138,False,0,False,0,1,3
+"tfidf inurl:""wikipedia""",startpage,1780592870.0166144,True,3.0,False,0,1,1
+"tfidf inurl:""wikipedia""",brave_search,1780592870.0166144,True,5.0,False,0,-1,0
+"tfidf inurl:""wikipedia""",ddg,1780592870.0166144,False,0,False,0,1,0
+tlgs.one,startpage,1780681820.9429972,False,0,False,1,1,1
+tlgs.one,brave_search,1780681820.9429972,False,0,False,0,1,0
+tlgs.one,ddg,1780681820.9429972,False,0,False,2,1,2
+floating point mathematical operations x86_64 number of cycles,startpage,1780683449.9539669,False,0,False,1,1,0
+floating point mathematical operations x86_64 number of cycles,brave_search,1780683449.9539669,False,0,False,0,1,0
+floating point mathematical operations x86_64 number of cycles,ddg,1780683449.9539669,False,0,False,1,1,1
+local whisper models,startpage,1780763965.4994085,False,0,False,0,1,0
+local whisper models,brave_search,1780763965.4994085,False,0,False,3,3,0
+local whisper models,ddg,1780763965.4994085,False,0,False,4,5,0
+helium browser,startpage,1780768205.453414,False,0,False,1,1,1
+helium browser,brave_search,1780768205.453414,False,0,False,0,1,0
+helium browser,ddg,1780768205.453414,False,0,False,1,1,1
+matrix authentication service,startpage,1780858918.8024244,False,0,False,0,1,0
+matrix authentication service,brave_search,1780858918.8024244,False,0,False,0,1,0
+matrix authentication service,ddg,1780858918.8024244,False,0,False,1,1,0
+xmpp federation,startpage,1780859226.496237,False,0,False,0,3,0
+xmpp federation,brave_search,1780859226.496237,False,0,False,0,1,0
+xmpp federation,ddg,1780859226.496237,False,0,False,0,1,0
+degoog vs searxng,startpage,1780944913.4894233,False,0,False,0,4,0
+degoog vs searxng,brave_search,1780944913.4894233,False,0,False,1,2,0
+degoog vs searxng,ddg,1780944913.4894233,False,0,False,3,-1,1
+code completion model intelligence,startpage,1780963578.2915564,False,0,False,0,-1,0
+code completion model intelligence,brave_search,1780963578.2915564,False,0,False,3,-1,0
+code completion model intelligence,ddg,1780963578.2915564,False,0,False,0,1,0