Side topic : I didn’t see a serious article about prompt engineering for senior software development pop up on HN. Yet a lot of users here have their own techniques unshared with others
This is how I’ve been using Gemini and it’s the first time I’m really seeing consistent value.
I’ll get a context into a solid place with as much information as I can about a project. Usually getting up to 100k tokens.
Then I ask it to give me a summary I can use in a fresh chat, that will maintain the current context. This lets me reclaim space, bring responsiveness back to sane levels, have a baseline chat I use to spin up branches for marketing, design (it’s pretty helpful at trouble shooting Substance Designer graphs), etc.
I’ve found myself going into sub branches from there… like a marketing context that pushes branches into different marketing channels.
- Have an AI chat model come up with an answer to a problem.
- Have it write a report discussing the details of the problem and why it's answer is correct, directed at a person or AI model who has no knowledge of the initial problem or technical field.
- Have a second AI model with no knowledge of the problem grade the report, and write it's own report either (a) asking for clarification / more information about the problem that the original model didn't provide or (b) pointing out an inconsistency in the argument posed by the original model. Give this report back to the original model and ask it to write it's own report back with either the necessary information or changes.
- Repeat until either the second AI model is convinced by the first AI model's explanation or the first AI model has implemented all the changes requested by the second AI model.
It's super clunky but has given pretty good results in the cases where I tried it lol
You can email prompts directly to your ThreadWise address and get instant AI-powered responses, essentially an always available co-worker. Another great feature is the ability to schedule recurring tasks and since the AI has web access, you can get things like:
Daily mortgage rates or airfare price monitoring
Weather and news summaries
Sport scores, jokes, quote of the day
Pull data from public APIs (and more)
So you can essentially use it as a personal newsletter, crafted to your taste.
The free tier will let you test this out for free! I am looking for some feedback/criticism, testing, and additional ideas and I am open for collaboration if you have experience with sales. Also open to hearing which scheduled tasks people would find most useful.
Why I built it: I noticed a trend online, as well as with family/friends, that people would like to have a quick access to AI in instances where they couldn't always install apps or use browser-based tools (such as in remote/low bandwidth environments). This is when it him me, email clients already have all the features needed to interact with an AI (text + attachments) and I quickly got to work.
Some of the advantages are also that since there are no new apps, or browser tabs needed, the tool is ideal for companies who don't have the bandwidth to setup full fledged AI solutions on their own. The companies can choose either between public LLMs (e.g. OpenAI) or host everything on-premise with locally run models, so no data ever leaves the premises.
Had the dotcom bubble not burst I’d likely be an attorney. I’d accepted an offer at a law firm in San Francisco to work in their Securities practice, largely taking companies public or doing M&A.
In March of 2000, the firm called and said: “Good news bad news. Good news: you still have a job [unlike a lot of my law school classmates]. Bad news: we don’t need any more Securities lawyers, but we have lots of room in our Bankruptcy practice.”
Being a Bankruptcy lawyer didn’t sound like fun. A law professor’s brother was starting a B2B startup. He offered me a job. The startup was a colossal failure, but I was hooked on the idea of a group of people starting something from nothing.
Next ~8 years were painful with lots of ideas that went no where, but it all worked out. So, in the end, always remember that but for the dotcom bubble bursting, I’d be keeping track of my time in six minute increments.
I have tried a lot of local models. I have 656GB of them on my computer so I have experience with a diverse array of LLMs. Gemma has been nothing to write home about and has been disappointing every single time I have used it.
Models that are worth writing home about are;
EXAONE-3.5-7.8B-Instruct - It was excellent at taking podcast transcriptions and generating show notes and summaries.
Rocinante-12B-v2i - Fun for stories and D&D
Qwen2.5-Coder-14B-Instruct - Good for simple coding tasks
OpenThinker-7B - Good and fast reasoning
The Deepseek destills - Able to handle more complex task while still being fast
DeepHermes-3-Llama-3-8B - A really good vLLM
Medical-Llama3-v2 - Very interesting but be careful
I love the direction and attempt. What I think is needed to encourage good behavior is a system that scans company job postings, archives them (Internet Archive), performs analytics as to whether these jobs are being filled (compare to LinkedIn data as best as you can, there will always be leakage), and potentially report non compliance around salary transparency to whomever in each state regulates that. LinkedIn doesn’t care, state regulators aren’t going to do this.
Think in systems. If the desired outcome is more honest and transparent behavior from job posters, the way to get there is public data and analytics to suss out signal of undercurrent intent internally. It’s an observability platform at its core.
Consider partnering with the hiring.cafe folks (search HN for relevant threads) if you want to achieve scale wrt feedback capture from applicants to drive analytics.
CORS is a mechanism for servers to explicitly tell browsers which cross-origin requests can read responses. By default, browsers block cross-origin scripts from reading responses. Unless explicitly permitted, the response cannot be read by the requesting ___domain.
For example, a script on evil.com might send a request to bank.com/transactions to try and read the victim's transaction history. The browser allows the request to reach bank.com, but blocks evil.com from reading the response.
CSRF protection prevents malicious cross-origin requests from performing unauthorized actions on behalf of an authenticated user. If a script on evil.com sends a request to perform actions on bank.com (e.g., transferring money by requesting bank.com/transfer?from=victim&to=hacker), the server-side CSRF protection at bank.com rejects it (likely because the request because it doesn’t contains a secret CSRF token).
In other words, CSRF protection is about write protection, preventing unauthorized cross-origin actions, while CORS is about read protection, controlling who can read cross-origin responses.
I started Tirzepatide 3-4 weeks ago. (Mostly as an experiment to understand the hype around GLP's... I don't have diabetes and only very slightly overweight at 20% body fat). Even at the lowest 2.5mg starter dose which you're only allowed to stay on for 1 month:
- Extreme appetite suppression to the point where I've started calorie counting specifically to make sure that I'm eating enough. It's incredibly easy to forget to eat.
- No more feelings of hunger. At all. This is somewhat depressing. Eating is no longer enjoyable and feels like a chore. I woke up hungry for the first time in a while a couple days ago and was excited - jumped out of bed and ran to eat something just for the pure joy of it. I've only felt that a few times in the past few weeks, compared to every day off the drug.
- I completely stopped drinking. Have you ever been to a bar after eating a big meal at a restaurant, and had trouble drinking because you were too full from your meal? That's how I feel all the time. 1 or 2 beers and it becomes uncomfortable to have anymore.
- Normally I go grocery shopping and within 3-4 days, all the "good stuff" (snacks) I bought are eaten. Now, since I stopped snacking and eating much less, groceries simply last way longer. <-- $$ saved in groceries significantly offsets the monthly price of the medication
- My morning starbucks routine has changed from 2 food items to just 1, which alone saves me $200/mo (sorry starbucks).
- Haven't noticed anything regarding impulse control outside of food. No anecdata to share on that point...
After a few weeks on the drug, I'm 100% convinced that once this drug is widely available and cheap... being overweight will be a choice (choosing not to take the drug).
The most important aspect of the drug that makes it work so well is it forces you to change your habits, no will power required. It also punishes you for bad eating habits. (That late night trip to McDonalds will have you feeling like shit the next day).
I'm the kind of person that used to be able to order just about anything on a restaurant menu and clean my plate completely. Now I simply can't do that. It's actually kind of embarrassing being at a restaurant with friends and being completely uninterested in the food.
I just built something analogous using Shortcuts, Claude, and Logseq. The shortcut uses iOS dictation, sends the transcript with a system prompt to Claude, and the llm returns summarized markdown with TODO keywords if appropriate. Finally the shortcut appends the markdown to the local Logseq journal file, which then gets synchronized using git / Working Copy.
Aside from the other reasons already mentioned, fully public agencies would be astoundingly inefficient and ineffective. Government agencies are already subject to an intense amount of scrutiny (some sincere, some extremely bad faith) and if every email, bulletin, roadmap, etc. were public by default agencies would become even more catatonic than they already are. There needs to be a space for reasonable disagreement and problem-solving without the possibility of immense personal, professional, and political consequences.
It could also make accountability harder because it would encourage avoiding paper trails whenever possible, even when employees believe they are acting within the law.
Is FOIA the right amount of openness? I don't know, probably not, but it's definitely better than public-by-default.
Honeybee queens are the only honeybees with stingers that don't die when they sting. That's because the queen bee's stinger has no barbs, and the reason for that is that the queen must not die easily, and she must use her stinger, so if she's going to survive at all her stinger has to not have barbs. The queen almost certainly has to use her stinger when she exits her cocoon: to kill ther other queens that are about to hatch or have hatched already. She also has to possibly use her stinger when she goes out to mate (though she does go with attendants who will defend her if attacked).
I was surprised not to find mention of this in TFA.
> A honey bee dies when it stings you because its stinger is covered in barbs, causing its abdomen to get ripped out when it tries to fly away. And surviving with your guts spilling out everywhere is pretty bloody hard.
There's another interesting detail here: when the worker tries to fly off after stinging, she has to try really hard because the barbs hold the stinger in place, and trying hard causes two things to happen:
- noise that attracts other workers
to attack the same creature
- spreading of the dying bee's
distress pheromones that also
attract other workers to sting
the same creature
So when you get stung by a bee near other bees you will be in trouble. That's how you go from one sting to hundreds. And hundreds is enough to kill a human. That's why you don't go near a hive without protection. Being in or near a swarm is safer than being near a hive: the bees in a swarm don't have much (larvae, honey) to protect, so they don't attack.
Context: I was an early strategic technical hire by a director/manager/CTO 3 times to help execute process changes and lead new initiatives healthcare SaaS companies between 2014-2020 and then started working in strategic cloud consulting since then where I am brought in to get developer, operations and the “business” to be better aligned and/or to lead new initiatives.
I’m currently a “staff software architect” at a 3rd party cloud consulting company.
What not to do:
1. Disrespect current processes. What you call “legacy code” was done for a reason, is generating revenue, solving real world problems, and the reason you have a job
2. Make any suggestions about improving processes before you have been their at least 90 days and understand why the current system is like it is.
3. Suggest rewriting something or introducing new to the company technology until you have worked there 90 days. Especially don’t start doing resume driven development.
What to do:
1. Set up a meeting with sales and ask them to “sale you the value proposition of the product as if you are the customer”. Ask questions as if you were a potential customs and raise objections to the product as if you were customer. Sales is usually very good at answering those questions.
2. Talk to your manager and ask what are their 90 day and 1 year plans for your team and make sure your work is aligned with the goals.
3. Get to know the pecking order. The org chart will not show you who has the most influence in your department.
4. Setup “getting to know you” 1-1’s. What are people working on? What do they want to be working on? What are their biggest pain points? What would they improve if they had a magic wand?
5. Pick up small stories, bugs to get familiar with the development process.
6. Learn about pre-wiring a meeting when you are trying to suggest changes. Do a POC, talk to the person who might have the biggest objection or has the most influence and work collaboratively to address their objectives. Keep doing that for more people on your team. It helps get more people on your side.
>> Since graduating from undergraduate studies (which marks exactly one year as I write this post)
Author sounds young .. yes, absolutely try to consume less and create more, it's way more life-affirming than the opposite configuration, but:
Getting better at your job, like everything else in life, is just a function of time. Show up, and then show up consistently. Put in the time. Be patient. Lead with an open mind and an open heart -- opportunities go to those who are present way more often than those who aren't. Willingly take on shitty jobs, do them well, and you'll find yourself being trusted with bigger and better jobs. Learn when to be the worker bee and when to be the queen bee. Say "yes" until you're truly able to say "no". Try to accept that, at the end of the day, things don't matter as much as you think they might -- I'm talking about projects, stress, deadlines, shit that floods your veins with cortisol. The only thing people will truly remember is how you made them feel during a crisis, not the minutiae of what you actually contributed -- and those personal relationships will be the gasoline in the engine of your career.
I really believe people will go far if they focus on this kind of stuff, and way less on structured self-improvement, productivity hacking, finding "secrets", shortcuts via programs, seminars, coaches, and tools, and all that shallow, nutritionless baloney.
This guide (and most other guides) are missing a massive tip: Separate the crawling (finding urls and fetching the HTML content) from the scraping step (extracting structured data out of the HTML).
More than once, I wrote a scraper that did both of these steps together. Only later I realized that I forgot to extract some information that I need and had to do the costly task of re-crawling and scraping everything.
If you do this in two steps, you can always go back, change the scraper and quickly rerun it on historical data instead of re-crawling everything from scratch.
For anyone who hasn't tried local models because they think it's too complicated or their computer can't handle it, download a single llamafile and try it out in just moments.
They even have whisperfiles now, which is the same thing but for whisper.cpp, aka real-time voice transcription.
You can also take this a step further and use this exact setup for a local-only co-pilot style code autocomplete and chat using Twinny. I use this every day. It's free, private, and offline.
I made this bookmarklet, which will speak highlighted text in the browser regardless of platform. It also makes the initial letters of each word bold. This is the code:
javascript:void function(){ javascript:(function(){ var selection = window.getSelection().toString(); if (!selection) { alert("Please select some text on the page."); return; } var encodedSelection = document.createElement("div"); encodedSelection.textContent = selection; var processedContent = encodedSelection.innerHTML.replace(/\n/g, " <br></br> "); var words = processedContent.split(" "); var formattedText = ""; var speechContent = ""; for (var i = 0; i < words.length; i++) { var word = words[i]; var chunkSize = Math.floor(word.length / 3) + 1; var boldPart = "<span style='font-weight:bolder'>" + word.substring(0, chunkSize) + "</span>"; var lightPart = "<span style='font-weight:lighter'>" + word.substring(chunkSize, word.length) + "</span>"; var formattedWord = boldPart + lightPart; if (word.endsWith(".")) { formattedWord += "<span style='color:red'> *</span>"; } formattedText += formattedWord + " "; speechContent += word + " "; } var newWindow = window.open("", "_blank"); newWindow.document.write("<html><head><title>Spoken Content</title></head><body><input type='range' min='0.1' max='10' value='1' step='0.1' id='rate-slider'><p id='content' style='background-color:#EDD1B0;font-size:40;line-height:200%25;font-family:Arial'>"%20+%20formattedText%20+%20"</p></body></html>");%20var%20rateSlider%20=%20newWindow.document.getElementById("rate-slider");%20var%20utterance%20=%20new%20SpeechSynthesisUtterance(speechContent);%20rateSlider.addEventListener("input",%20function()%20{%20utterance.rate%20=%20rateSlider.value;%20window.speechSynthesis.cancel();%20window.speechSynthesis.speak(utterance);%20});%20window.speechSynthesis.speak(utterance);%20})();}();
I use an even simpler and more reliable system to avoid running out of toothpaste: brushing with plain water. Evidence suggests that brushing with toothpaste (called "dentifrice" in scientific papers) does not remove any more plaque than brushing without it. Here's a systematic review from 2016:
>Does dentifrice use help to remove plaque? A systematic review
"The cumulative evidence for this systematic review demonstrates that there is moderate certainty that toothbrushing with a dentifrice does not provide an added effect for the mechanical removal of dental plaque."
However, plaque removal is not the only purported function of toothpaste. It can also serve as a fluoride delivery system, and fluoride has strong evidence for strengthening teeth. I personally drink a lot of tea, which is a fluoride hyper-accumulator, so I'm more concerned with avoiding fluoride, but if you don't drink tea this might influence your decision to use toothpaste.
There are also some toothpastes with antimicrobial ingredients. Those also have strong evidence for actually doing something, although I'm personally skeptical that messing with your mouth's microbiome like that is a good idea.
Additionally, I believe that toothbrush wear is an underestimated factor in cleaning efficacy. Toothbrush bristles are manufactured with microscopic texturing that helps remove plaque. I can feel the difference when changing from a worn to a new toothbrush. Ben Krasnow of Applied Science has a video on Youtube with electron micrographs showing the difference:
Some of my peers are deep into running. I don’t get it. Running is sometimes fun for me but most often painful.
Then I overheard one of them (the fittest) say to a budding runner that he [should] do mostly easy sessions. Okay what’s easy to him? He said that so slow that it can feel awkward and unnatural. What?
Then I searched around and found out about Zone 2 and how you should do most of your work in that zone when building aerobic fitness. And that it is characterized by being able to hold a conversation, although strained.
I searched around and found atheletes like amateur ultrarunners say the same thing.
Then it hit me. I’ve probably been jogging a lot in Zone 3. Or higher? Because the harder you go the more benefit, right? That seems to be the basic logic for everything.[1] Relatively short, painful sessions. Have I been conditioning myself to associate cardio with more pain than is necessary for the average session?
So maybe I should just go on the stationary bike today, do a “conversatitional” (talk to myself) pace and listen to my audiobook for an hour? And try to not let my groin fall asleep.
[1] With nuances like go-to-failure for hypertrophy in weightlifting and more back-off-a-little for strength training.
Though the difficulty rating is surely wrong - this is one of the tricks you learn on the way to juggling 5 balls and by the time you've got to 552 you are almost there.
I used to practice this pattern obsessively - the 3 different heights of throws are hard to get right but when you do the pattern clicks in and it feels great!
The reason why it can't be abused the same way is because of the nature of the paired-one-way-encryption system.
A normal password is one-way encrypted. The algorithm makes it easy to turn an input string into encrypted gibberish, but virtually impossible to take encrypted gibberish and turn it into a suitable input string. Your password is run through this "hash" algorithm and stored. To prove your authenticity, you provide the password and the system encrypts it the same way. If the gibberish matches, you must have known the original password. The problem is that this is subject to several attacks, notably a dictionary attack where you just have a big long list of known passwords. The attack encrypts each one and see if you find one that generates the same gibberish. So, let's take the user generated password out of the loop.
The trick is that symmetrical, public-pair encryption creates two keys, such that:
* A key used to encrypt a string or sign a blob cannot be used to decrypt or verify it (one-way).
* A key's pair is the only one that can decrypt or verify a signature (symmetrical).
* A completely random initial value (aka password) starts the process, but after which is no longer relevant to use.
With this, we can create two keys: one we hold to ourselves (private) and one we hand out (public). When we want to authenticate, it goes something like:
Server: Here is a blob of data I generated and encrypted with your public key, prove to me you know what I did.
Client: Sure thing. (Decrypts blob with private key, wraps it with a private key signature, hands it back). Here ya' go!
Server: OH.. Nice. Only you could have decrypted it, and only you can sign the results that match the public key I have on file for you. You must be you.
If the public key is stolen, it doesn't do the attacker any good. Anything it encrypts is only good for you, and anything that it signs can only be verified by you. In theory, the attacker could get you to authenticate with them and that would show you are you. But, your password manager generates a new key for every site and authenticates with the key it knows. Even if the attacker uses one of your keys, it doesn't work unless it is for the site in question, meaning a man-in-the-middle attack. But, this isn't about stopping that. That is what DNS certificates are for. Passkey prevents having anyone but you ever knowing what the password was.
Personal responsibility. When I was younger I used to put the blame on many things on others or my upbringing.
Now I came to conclusion of extreme responsibility. Everything that happens or ever happened in my life was purely on me; whatever things may happen I and only I I'm solely responsible for that.
I also learned about my place in hierarchy. I know I don't really have anything to show in terms of IQ, so I'm doing my best not to harm others by wasting their time by staying as low profile as I may.
It’s fairly simple. In 2020 countries across the globe shutdown, and to keep economies “safe” governments printed money and handed it out more or less to people who were in economic danger - waitresses who could not work, though furlough schemes and the like.
USA printed basically 10 trillion (yes with a T). UK about 1 trillion. Germany, France, Spain, South Africa Japan and so on. Maybe 25 trillion? No one seems to have counted.
Under MMT (modern monetary theory) this is fine as long as government takes away the printed token (money) later on in form of tax
But they have not. The money has flowed from waitresses to landlords, to supermarket owners and their landlords and to share owners of supermarkets - basically it went from the poor to the middle class and then to the ultra wealthy.
The ultra wealthy now have an extra 25 trillion dollars. So they “invest”.
Real estate goes to stupid prices (see cost of a 4 bed house in London).
Stock market hits new highs.
But the rest of us have sold our nice middle class homes in suburbs for stupid amounts and moved … somewhere with less amenities.
Or are renting in cities at high rates and food prices going sky high.
The simplest answer is governments only did half the job - the next job is a uber wealth tax - holding of over say 20 million, 30 million, just get taxed, forcing sale of assets and return of assets to the flowing economy and then governments can afford things like welfare and investment again.
* SPF: Tell the world which servers are allowed to send email for your ___domain
* DKIM: Weak version of digitally signed email, add a header that only mailservers that have the private key you supply can generate. Tampering invalidates the signature (for example when an email gets relayed for a second time). The private key used counts for your whole ___domain.
* DMARC: Tells other mailservers what to do when the SPF and/or DKIM check fails, and also allows you to set an address where to send reports to. These reports contain counts of messages that failed the SPF and/or DKIM checks.
This guy again. I’m getting REALLY sick of this guy.
I’m the person that made the code, this guy and one other have been harassing me on every platform I’m on accusing me of “stealing” his MIT licensed code in public forums.
First it was Discord to a server of 1000 people. Then it was spam messages to all these people in the server. Then it was reddit. Then it was the chrome web store. Now it’s also HackerNews and GitHub!
1. I told you I was probably inspired by the idea. I make extensions daily, I always comment on and take inspiration from extensions and others ideas! But I was mostly inspired by the constant discussions about YouTube and adblockers all over the media. Your idea is not unique! You did not discover this method!
2. I already make tons of extensions, this is super low hanging fruit - so I made it. To figure out the basic functionality took 1 minute of investigating the DOM in YouTube. Inspect element of the video player, look at its properties, notice the playback rate property, toggle it, that’s it.
3. I wrote my own code because it’s as simple as setting the video playback rate to 16, doesn’t take a rocket scientist. I did not need to copy your code. It’s simple as hell. Anyone with half a brain cell would figure it out in 5 minutes. I even share my code below.
4. If I copied your code, why was my first iteration a bookmarklet and not an extension?! A bookmarklet which I mention in the original post, that I also shared with users in other forums I’m in. So tell me why I would bother with a bookmarklet if I could just copy your code as you said?
THE SAID BOOKMARKLET CODE:
javascript:(function(){ function clickButton() { const button = document.querySelector('#skip-button\\:5 > span > button'); if (button) { button.click(); } }
function adjustPlaybackForAds(target) {
if (target.classList.contains('ad-showing') || target.classList.contains('ad-interrupting')) {
const video = document.querySelector('video');
if (video) video.playbackRate = 16;
}
}
function waitForVideoAndObserve() {
const video = document.querySelector('video');
if (video) {
video.playbackRate = 16;
video.autoplay = true;
video.muted = true;
const player = document.querySelector('ytd-player #movie_player[aria-label="YouTube Video Player"]');
if (player) {
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
clickButton();
adjustPlaybackForAds(mutation.target);
}
});
});
observer.observe(player, { attributes: true });
}
} else {
setTimeout(waitForVideoAndObserve, 500);
}
}
waitForVideoAndObserve();
})();
4. Hard work. What a joke, this took me 4 hours tops to convert from idea to bookmarklet to extension . It’s about 60 lines of code in a content script that a monkey could write! I’m that monkey! And it only took that long because I had to keep pinging YouTube to get an ad to play! Wait for video element, then increase playback and mute! That’s it! Yet you are under the impression this is some arcane knowledge that must be copied to be believed.
5. I actually DID look at your code after thesr accusations appeared, I even posted both our code in the server for others to come to their own conclusions! Additionally you use background scripts and content scripts - I just use a content script because … why would you even need a background script? You don’t.
5. You are discussing legal advice - cute. Now HARASSMENT and slander, those are legal discussions
6. You and the other user who have been harassing me have been doing so with alt accounts, across platforms, now harassment does fall under legal eyes. Yes i have begun taking action on this.
7. This guy thought telling me my real name would scare me and all this stuff about “karma”. Ooo clever. He just got it from the license text by reverse engineering my extension, but it was meant to scare me. Yet he is the one with the very public profile and VERY easy to find information.
8. And then this guy and the other person started a defamation campaign against me on all these platforms, going so far as spamming every user on the server I run, that I put hard work into growing.
9. I also just looked at your “lessons”. I noticed we use completely different methods for detecting ads, and on completely different elements. Add to that, you set the playbackRate to 10, I set it to 16, copied?
10. And now to add to the fire you are continuing to slander me and share my usernames in this lessons thing on GitHub!
Should the prior art extensions who were already doing this exact function also be complaining against you?
I'll even share MY source code just to get this person to shut the fuck up and claiming all this crap:
// content-script.js (function () { function clickSkipButton(player) { const skipButton = player.querySelector( ".ytp-ad-skip-button-modern.ytp-button" ); if (skipButton) { skipButton.click(); } }
function adjustVideoPlayback(player, isAdPlaying) {
const video = player.querySelector("video");
if (video) {
if (isAdPlaying) {
video.playbackRate = 16; // Speed up the video
video.muted = true; // Mute the video
}
}
}
function observerCallback(mutations, observer) {
for (const mutation of mutations) {
if (
mutation.type === "attributes" &&
mutation.attributeName === "class"
) {
const player = mutation.target;
const isAdPlaying =
player.classList.contains("ad-showing") ||
player.classList.contains("ad-interrupting");
adjustVideoPlayback(player, isAdPlaying);
}
if (mutation.type === "childList" && mutation.addedNodes.length) {
clickSkipButton(mutation.target);
}
}
}
function setupObserver() {
const player = document.querySelector("#movie_player");
if (player) {
const observer = new MutationObserver(observerCallback);
observer.observe(player, {
attributes: true,
childList: true,
subtree: true,
});
// Initial checks
const isAdPlaying =
player.classList.contains("ad-showing") ||
player.classList.contains("ad-interrupting");
adjustVideoPlayback(player, isAdPlaying);
clickSkipButton(player);
} else {
setTimeout(setupObserver, 50);
}
}
setupObserver();
I think people (and the founder) are focusing on yearly profits as their remuneration and comparing it to a salary... but the reality is you're creating a company that should be valued (and eventually sell) for 7-15X Earnings - and you really should be looking at that increase in value vs your increase in profits. In reality your net worth went up by over $1.5 million in the last year, in addition to earning 236k - that is the actual value you created for yourself in the last year and not the 236k you cashflowed.
I find it redeeming that despite having a gift for development - software and hardware - the biggest factors affecting profitability and growth here are things that most MBAs would do in a business quite regularly (outsourcing design/packaging/fulfillment, streamlining costs, doing price elasticity experiments, polling customers and markets for product improvement).
I enjoyed seeing the inverted perspective that product/engineering is straightforward and low risk but things like optimizing fulfillment and operating costs is a new exciting endeavor.
One tip I suggest doing is leveraging google ads to figure out features that customers are willing to pay for before you build them... if they're clicking the ad they are searching for it and interested in buying it. Start a few very low cap campaigns calling out features you are thinking of building into the product, and see which one get's the most impressions and clicks per marketing dollar and focus on that. The added advantage is you know it will be easier to buy advertising for it once the feature is done.