Hacker Newsnew | past | comments | ask | show | jobs | submit | Bewelge's commentslogin

German here. That's not true. What crazy documentation do you require? An ID, proof of residence, and a business plan? (edit: you don't even need a business plan)

That being said, everything about the process is annoying and you always have the feeling that you're doing something wrong or forgetting something. Together with some ridiculously slow processing times, it's the perfect combination to frustrate you and I'm sure it ultimately reduces innovation.

But in reality, getting all the paperwork together is probably a couple of hours of work. You can buy services that do it for you for a couple of hundred Euros.


> ... and a business plan?

Why would the government need a business plan?

It's none of their business what you want to do with your company besides a general description as "software development" or "consulting services" or whatever.


> It's none of their business what you want to do with your company

There are plenty of European member states that want the ability to control very precisely what you do with "your company". You want to call yourself "a software engineer"? Ooops...

In the EU it seems particularly the German-speaking countries are borderline obsessed with a) titles, and b) whom may use those titles. See, for instance, https://news.ycombinator.com/item?id=34096464


> it seems particularly the German-speaking countries are borderline obsessed with a) titles

There is nothing borderline about that - the German cultural space (including very much the countries of former Habsburg Empire) is still completely obsessed with titles and formal positions despite many of them losing any practical importance in modern times.


I like that you know what an Engineer is in German, and not the 1000 BS Meanings it has in the US

Actually I think I might be mistaken that you are even required to make a business plan. It's listed as one of the steps on the states portal about founding. But it goes on to say that it's not technically required, just highlights its importance.

https://www.existenzgruendungsportal.de/Navigation/DE/So-geh...


Several sectors of economic activities have the potential for atrocious externalities and it's absolutely the government's business to know about these and make sure that you're following regulation to minimize these externalities. When you make your employees the neighbours sick (or straight up kill them) it's an enormous failure on the part of government. It's easy to be oblivious to that when you only think about software.

Exhibit A: https://www.ctvnews.ca/montreal/article/battery-facility-acc...


Except it seems that it's often large companies - typically those with lots of lawyers - who seem to get away with what I can only describe as "corporate misdeads" most regularly.

"Following regulation" sounds great until it's revealed that corporate lobbyists have been helping (co-)write regulations to make sure that fair competition is quashed.


It’s interesting how people can apply thinking like “there are problems, it’s not perfect, better not to try” to government, but also be pro starting businesses

I don't know much about corporations, but why business plans are needed at all? I mean, for EU citizens.

bank (loans), immigration and investors can be interested, but their interests are not covering every corporation out there.


There’s absolutely no need to have a business plan to start a company in Germany. You articles of incorporation and they state a company purpose, but this can be something as simple as “do IT consulting”.

Obviously, having a credible plan helps if you try to convince banks to loan you money or any such thing, but the act of registering a company requires no such thing.


It's basically a proof of "most basic effort" that you're serious. You could probably note down some stuff on a single A4 and get it approved, it doesn't have to be a 40 page dossier.

Kind of like fizzbuzz, just something really simple and most basic to get rid of the "easy scams" and so on.

Edit: So "easy scams" are probably the wrong word, I initially wrote "riffraff" because in my mothertoungue that isn't so... disparaging, but what I meant was that it's used as "bare minimum filter" basically.


That doesn't really sound like a barrier to the easy scams at all. It just sounds like something someone once thought would be a good idea and now everyone has to do it because that's the process.

ChatGPT, give me a convincing sounding business plans for starting a bussiness in Germany.

Done.


How would this get rid of easy scams?

Previous HN discussion about setting up a GmbH.

https://news.ycombinator.com/item?id=39959368


> business plan

This is the problem. Let me pivot. Let me fail. Let my investors (including myself) lose time and money in bad ideas.

All the bureaucracy in the world didn’t stop Wirecard, but it sure as heck demotivated people from trying something new in Germany.


There is no problem, because no business plan is required.

- We narrowed it down to the tool we used to flash the code.

- I downloaded the repository, jumped into codex, explained the symptoms and it found and fixed the bug in less than ten minutes.

Change the second step to: - I downloaded the repository, explained the symptoms, copied the relevant files into Claude Web and 10 minutes later it had provided me with the solution to the bug.

Now I definitely see the ergonomic improvement of Claude running directly in your directory, saving you copy/paste twice. But in my experience the hard parts are explaining the symptoms and deciding what goes into the context.

And let's face it, in both scenarios you fixed a bug in 10-15 minutes which might have taken you a whole hour/day/week before. It's safe to say that LLMs are an incredible technological advancement. But the discussion about tooling feels like vim vs emacs vs IDEs. Maybe you save a few minutes with one tool over the other, but that saving is often blown out of proportion. The speedup I gain from LLMs (on some tasks) is incredible. But it's certainly not due to the interface I use them in.

Also I do believe LLM/agent integrations in your IDE are the obvious future. But the current implementations still add enough friction that I don't use them as daily drivers.


I agree with your statement and perhaps my example is bad/too specific in this case.

Once I started working this way however, I found myself starting to adapt to it.

It's not unusual now to find myself with at least a couple of simultaneous coding sessions, which I couldn't see myself doing with the friction that using Claude Web/Codex web provides.

I also entirely agree that there's going to be a lot of innovation here.

IDEs imo will change to become increasingly focused on reading/reviewing code rather than writing, and in fact might look entirely different.


> It's not unusual now to find myself with at least a couple of simultaneous coding sessions, which I couldn't see myself doing with the friction that using Claude Web/Codex web provides.

I envy you for that. I'm not there yet. I also notice that actually writing the code helps me think through problems and now I sometimes struggle because you have to formulate problems up front. Still have some brain rewiring to do :)


I think DHH said it best recently when he stated

"I can literally feel competence draining out of my fingers"


Why would you copy files anywhere?

My daily process is like this:

Claude plans (Opus 4.5)

Claude implements (Opus at work, Sonnet at home - I only have the $20 plan personally :P )

After implementation the relevant files are staged

Then I start a codex tab, tell it to review the changes in the staged files

I read through the review, if it seems valid or has critical issues ->

Clear context on Claude, give it the review and ask it to evaluate if it's valid.

Contemplate on the diff of both responses (Codex is sometimes a bit pedantic or doesn't get the wider context of things) and tell Claude what to fix

If I'm at home and Claude's quota is full, I use ampcode's free tier to implement the fix.


I'm struggling to form a definitive statement about my thoughts here, but I'll give it a try:

Every (useful) abstraction that aims to make an action easier will have to be more complex inside than doing the action itself.

Would love for someone to challenge this or find better words. But honestly, if that's not the case, you end up with something like leftPad. Libraries also almost always cover more than one use case, which also leads to them being more complex than a simple tailored solution.


I think of it as: adding an abstraction relocates complexity away from what you want to make easy and moves it somewhere else. It does not eliminate complexity in total, it increases it. The best abstractions have a soft edge between using them and not using them. The worst are like black holes.

Great job! If it's all on client you should make a PWA out of it so it can be installed and used offline.

Built a client only webapp myself and offline usage is the main thing users ask about.


Yeah, I’ll do that. I have a Chrome extension that I’m planning to make paid, and I may also release a desktop version. I’m thinking of pricing it cheaply—around $2 for lifetime access

My immediate thought is if it’s only $2 it can’t be very good.

what you suggest what price we can sell for ?

With the number of awesome free pdf editing tools out there, the amount most people are willing to pay for a pdf editing chrome extension is $0.

>Food security is the last concern for Europe. How do you get that idea?

On the contrary, it is one of the main concerns of the EU. And has been since the beginning. The CAP still makes up 40% of the budget.

And frankly, for the first time I fully appreciate it. With the current state of the world it's nice that the EU isn't dependent on third parties for their food supply.


I really like https://phosphoricons.com/

But other than that, I also usually default to Material UI Icons.


Very cool! Love the simplicity of this. Built a similar mode in Midiano (also a midi webapp, but focused on playing MIDI files). But this is much cleaner for a quick exercise. Mine never really got past the prototype stage though. Safe to say, I'll be coming back to this thread for ideas when I do get around working on it again :)


Thanks Bewelge! I took a look at Midiano - it's very polished! Were you inspired by Synthesia? I know it has a combination of falling note + sheet notation as well~

https://synthesiagame.com


Definitely inspired by it - I had been using Synthesia myself to play piano. But it started more as a "Oh you can use MIDI on the web?"-realisation and grew from there


To all non-Germans who might get scared by this blogpost:

While there's valid issues to complain about, this blogpost is really hyperbole. And frankly, to someone who has lived in the area, it reads purposefully disingenuous.

Just enter the places he mentions on Google Maps. Everything in NRW is so close together that to travel between cities you can often choose between international trains, regional trains or even just public transport.

The connection he needed, is serviced several times per hour by several different train lines.

Why did he stay on that specific train when he heard his stop would be skipped? The only reason I can think of is to write this blogpost. Since he's local to the area he should have known better.

Also it's worth noting that driving that same route by car, at that time, just a couple of hours before everyone starts their Christmas dinner, might've taken even longer.

I'm not trying to deny common issues with the DB but the author tried to travel through the densest urban area in the whole of Europe during the busiest 2-hour window of the whole year. AND he made a bad judgement call. To leave the transportation hub, staying on a long distance train which was already being re-routed.

Funnily enough, the fact that every "Kuhdorf" needs to be connected by train is one of the difficulties the DB faces for which there is no easy solution. And if a long-distance train needs to decide between dropping some stops which can also be reached by short-distance trains or delaying the whole train, I think that dropping those short-distance stops is absolutely the correct choice.


> Why did he stay on that specific train when he heard his stop would be skipped? The only reason I can think of is to write this blogpost. Since he's local to the area he should have known better.

Because the train didn't stop?


Only the first few notes

(function () { function rateToDistance(rate) { const minR = 0.09; const maxR = 4.65; if (rate < minR) rate = minR; if (rate > maxR) rate = maxR; const t = (rate - minR) / (maxR - minR); return 400 * t; } function dispatchMouseEvent(type, target, clientX, clientY) { const event = new MouseEvent(type, { view: window, bubbles: true, cancelable: true, clientX, clientY, screenX: clientX + window.screenX, screenY: clientY + window.screenY, buttons: type === "mouseup" ? 0 : 1, button: 0, }); target.dispatchEvent(event); } const canvas = document.getElementById("canvas"); function triggerPull(distance) { const rect = canvas.getBoundingClientRect(); const startX = 266; const startY = 198; const startClientX = rect.left + startX; const startClientY = rect.top + startY; const endClientX = startClientX + distance; const endClientY = startClientY; return new Promise(resolve => { dispatchMouseEvent("mousedown", canvas, startClientX, startClientY); setTimeout(() => { dispatchMouseEvent("mousemove", canvas, endClientX, endClientY); setTimeout(() => { dispatchMouseEvent("mouseup", canvas, endClientX, endClientY); resolve(); }, 50); }, 50); }); } const semitones = 12; const notes = { G: Math.pow(4, -9 / semitones), A: Math.pow(4, -7 / semitones), B: Math.pow(4, -5 / semitones), C2: Math.pow(4, -4 / semitones), D2: Math.pow(4, -2 / semitones), E2: Math.pow(4, -0 / semitones), F2: Math.pow(4, 2 / semitones), G2: Math.pow(4, 4 / semitones), }; async function playWithPitch(rate) { const r = rateToDistance(rate); await triggerPull(r); } async function playScale() { const qrt = 200; const hlf = 400; const fll = 800; const pause = 15; const playNote = async (note, dur) => { await playWithPitch(note); await new Promise(res => setTimeout(res, dur)); }; const loop = async () => { await playNote(notes.E2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.E2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.E2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.C2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.G2, qrt); await playNote(notes.E2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.C2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.G2, qrt); await playNote(notes.E2, fll); await new Promise(res => setTimeout(res, pause)); await new Promise(res => setTimeout(res, pause)); await new Promise(res => setTimeout(res, pause)); }; await loop(); await loop(); await loop(); } playScale(); })();


Almost gave up getting this to work...

(function () { function rateToDistance(rate) { const minR = 0.09; const maxR = 4.65; if (rate < minR) rate = minR; if (rate > maxR) rate = maxR; const t = (rate - minR) / (maxR - minR); return 400 * t; } function dispatchMouseEvent(type, target, clientX, clientY) { const event = new MouseEvent(type, { view: window, bubbles: true, cancelable: true, clientX, clientY, screenX: clientX + window.screenX, screenY: clientY + window.screenY, buttons: type === "mouseup" ? 0 : 1, button: 0, }); target.dispatchEvent(event); } const canvas = document.getElementById("canvas"); function triggerPull(distance) { const rect = canvas.getBoundingClientRect(); const startX = 266; const startY = 198; const startClientX = rect.left + startX; const startClientY = rect.top + startY; const endClientX = startClientX + distance; const endClientY = startClientY; return new Promise(resolve => { dispatchMouseEvent("mousedown", canvas, startClientX, startClientY); setTimeout(() => { dispatchMouseEvent("mousemove", window, endClientX, endClientY); setTimeout(() => { dispatchMouseEvent("mouseup", window, endClientX, endClientY); resolve(); }, 50); }, 50); }); } const semitones = 12; const notes = { G: Math.pow(4, -9 / semitones), A: Math.pow(4, -7 / semitones), B: Math.pow(4, -5 / semitones), C2: Math.pow(4, -4 / semitones), D2: Math.pow(4, -2 / semitones), E2: Math.pow(4, -0 / semitones), F2: Math.pow(4, 2 / semitones), G2: Math.pow(4, 4 / semitones), }; async function playWithPitch(rate) { const r = rateToDistance(rate); await triggerPull(r); } async function playScale() { const qrt = 200; const hlf = 400; const fll = 800; const pause = 15; const playNote = async (note, dur) => { await playWithPitch(note); await new Promise(res => setTimeout(res, dur)); }; const loop = async () => { await playNote(notes.C2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.D2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.G, hlf); await new Promise(res => setTimeout(res, pause)); await playNote(notes.D2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.E2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.G2, qrt); await playNote(notes.F2, qrt); await playNote(notes.E2, qrt); await new Promise(res => setTimeout(res, pause)); await playNote(notes.C2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.D2, fll); await new Promise(res => setTimeout(res, pause)); await playNote(notes.G, fll); await new Promise(res => setTimeout(res, pause)); await new Promise(res => setTimeout(res, pause)); await playNote(notes.G, qrt); await playNote(notes.G, qrt); await playNote(notes.A, qrt); await playNote(notes.C2, qrt); await new Promise(res => setTimeout(res, pause)); await playNote(notes.C2, qrt); await new Promise(res => setTimeout(res, pause)); }; await loop(); await loop(); await loop(); } playScale(); })();


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: