The latter two have API differences from Chrome - e.g. using the `browser` namespace for extension APIs instead of `chrome`, and Promises instead of callbacks for async functionality - but for the sake of compatibility they also implement Chrome's version of these APIs [1][2], so if you just use the Chrome APIs and don't venture into the more browser-internal APIs such as bookmarks, the same extension code will likely run everywhere, with some specific differences/incompatibilities noted in the docs below.
If you were to create a new cross-browser extension today, one of the main issues would be that Chrome Web Store no longer accepts new MV2 extensions so you have to use MV3 for it, but MV3 in Firefox currently has some serious usability issues around permissions which are being addressed in upcoming releases [3] so you'll want to use MV2 for it, however this likely just means you'd need to have separate MV2 and MV3 manifest.json files which get bundled into different zip files for submission to the different browser extension stores.
[1] https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Web...
[2] https://developer.apple.com/documentation/safariservices/saf...
[3] https://blog.mozilla.org/addons/2024/05/14/manifest-v3-updat...
Yes it's pretty similar. There just some minor API differences. e.g
Chrome - chrome.tabs.query(queryInfo) Firefox - browser.tabs.query(queryInfo)
So you could easily port any firefox extension to chrome and vice-versa using the same codebase.
Perhaps I will look into developing more serious extensions in the future, it was actually a quite pleasant experience.
Is it fair to say that developing extensions for Chrome is comparable?