Announcing the Universal Metadata Tool Beta

Last year I prototyped a browser extension that created buttons to add observation fields to observations on the Identify page in one click. I ran into some stability and reliability issues and wanted to add some more flexible setup features that I didn’t have the time or skills to achieve at the time, so I put it aside during the school year.

I’m happy to announce that this summer, with the very considerable help of Claude Sonnet 3.5, I was able to make all of those improvements in the last 2 weeks. The extension now exists as a ~feature-complete, ~bug-tested beta version. It is already fully usable and will already save many of you a considerable amount of headache in adding Observation Fields and Annotations, but I’m going to hold off on pushing it through the extension stores until I get a little more beta feedback. Please install and use the extension and let me know what issues come up.

Use instructions:

Once you have the extension installed, you need to click on the extension in the extension menu (puzzle piece on the right side of the browser) to open the options page and make yourself some buttons.


Note that each button can perform any number of any combination of annotations and OFs!

Once you’ve made some buttons you like, export the configuration to save them so you don’t have to replace them manually if they get deleted somehow. Otherwise, they’re just saved in the browser cache.

To use the buttons you made, open any iNat Identify page. If you make changes after opening the page, you will have to refresh the tab to see them reflected (and the extension should remind you of this). By default, the buttons appear in the bottom right corner of the screen, but you can move them around with the alt-n shortcut.

In order to apply a button, you need to select an observation. You’ll know this has worked because a new field will appear (by default) in the lower left corner. Click the button or apply your selected keyboard shortcut and the extension will add all of the corresponding Observation Fields and Annotations to that observation. Note that this WILL override existing values in any Observation Field but will NOT override existing annotations (this is the way iNat has these configured, not my choice).


If you need the buttons out of the way, you can hide them with shift-b.

By default, the extension uses the previous/next buttons to refresh the observation after a button press to show you that the info as been applied correctly. However, this causes a slight flicker and doesn’t work as intended on the first observation of the page; if you want to turn this off, you can use ctrl-shift-r to do so.

Once you have created a button, you can hide it but leave the shortcut active, or disable it entirely, by selecting it on the options page and checking the corresponding box. You can also make changes to an existing button or duplicate it to create a similar one with slight differences.

Installation instructions:

Open this link; it should download the extension as a zip file automatically

Unzip that folder

Installing in Chrome:
Open Chrome and go to chrome://extensions/
Enable “Developer mode” in the top right corner
Click “Load unpacked” on the top left
Navigate to and select the unzipped extension folder
The extension should now appear in your list of extensions

Installing in Edge:
Open Edge and go to edge://extensions/
Turn on “Developer mode” using the toggle on the left sidebar
Click “Load unpacked” on the top right Navigate to and select the unzipped extension folder
The extension should now appear in your list of extensions

Installing in Firefox:
Open Firefox and go to about:debugging
Click “This Firefox” on the left sidebar
Click “Load Temporary Add-on” on the right
Navigate to the unzipped extension folder and select the manifest.json file
The extension should now appear in your list of temporary add-ons

NOTE: in Firefox, when you close the browser, the extension is removed (and all your saved buttons will be deleted–export them to be safe!) unless you change that setting:
Open Firefox and type “about:config” in the address bar
Accept the warning about changing advanced settings
Search for “xpinstall.signatures.required” and set it to “false”
Go to “about:addons”
Click the gear icon and select “Install Add-on From File”
Navigate to your extension folder and select the manifest.json file


EDIT: I read the original thread and answered my workflow question. This is for the Identify window. The extension seems to work - if I click “Shift B” the button appears (though somewhat unexpectedly in the lower right).


I just installed the extension, but it’s not working. It might be that I don’t understand the expected user workflow. Or perhaps I didn’t install it and configure it correctly. Or perhaps it’s just not working.

I’m using the latest chrome (on windows at the moment), and followed the instructions. Upon initial load/install of the extention, I had two non-blocking errors:

  1. ‘background.scripts’ requires manifest version of 2 or lower.
  2. Unrecognized manifest key ‘browser_specific_settings’.

I say non-blocking because the extension was still allowed to be installed (unlike if there was a syntax issue or missing core functions, for example).

I proceeded to create a test button with the action of setting the “evidence of presence” annotation to “Gall”. I saved it (and exported it for future use if needed).

I restarted chrome (not sure if this is needed but trying to be safe). The button was still showing in the configuration.

However, I do not see the button on the iNat page. I’m not sure where I should see the button - on initial import of the observation? Or on an already submitted observation? Somewhere else?

I see there are general shortcuts such as “Shift + B: Toggle button visibility”, but that didn’t do anything that I could see.

Perhaps some information (screenshot and/or description) of the expected user workflow would be helpful.

Ah whoops yeah sorry I have been working on it too long and got tunnel vision. Added some instructions. This is specifically for the Identify page, when the modal is open. In theory it could easily also be extended to observation pages; let me know if this is something you’d use.

The non-blocking errors you mentioned are only there because I am using the same code for the firefox and Edge/Chrome versions; in the production version of the extension those will not appear. They don’t hurt anything, as you noted.

Thanks for the feedback!

You shouldn’t need to hit shift-b for the buttons to appear in the first place; they display by default and hide when you hit shift-b. Maybe you just didn’t see it before you hid it?

1 Like

You are correct - it does show up by default. Thanks for doing this! I’ll try to play with it more soon.

This is awesome so far. I’ll keep messing around and see if I come up with any notes. Love that Claude 3.5 helped you out.


this extension sounds great, but personally I’ll wait for the release version.

My main use would be on the observation/observation edit to add items. I would particularly like to be able to add a number of Observation fields and add to a project.

Many thanks for your work.

Adding observations to projects didn’t even occur to me but I just implemented it.

Are there any other actions people would like to see included?


Great tool.
Just one small niggle: your buttons need their own private class style. At the moment they use your definition of ‘button’ which then overrides the width of the brightness control buttons. Change that to ‘.button-ph’ and add it to the newly created button’s class list and all is well.

1 Like

Had considered trying out the plug-in but then got a message about allowing access to a bulk OF tool. clicked “deny” but now that page keeps popping up randomly when using iNat.

Even though I clicked “deny”, I can use the plug-in to add an observation field.

<img src=“upload://yH0O9jkCZBBmGdSUBE3LF6se49b.png”>

when i click “deny”, i get this…

<img src=“upload://ydd0dhxH3LadxKKrkT1OM0T2jzg.png”>

Thanks for flagging this, should be a very easy change.
ETA: this is implemented now. Thanks again!

1 Like

Very glad you brought this to my attention. Honestly I don’t think I ever tested what happens if you Deny so I think it makes sense that the behavior isn’t well handled. But it’s more concerning to me that you don’t even need the approval to successfully use the extension. If I can cut that whole step out without losing functionality I would love to do that. I’ll investigate soon.

fwiw I love the idea of the extension. the “authorize bulk OF” warning seemed ominous enough that I chose “deny”… just to think about it a little more. i’m assuming the warning is just an indication that iNat doesn’t necessarily know what each individual custom extension might be intended for and some might be doing more aggressive updating than others. I realize that yours is extremely low risk for what the warning talks about. I’ll probably re-install and hit “authorize”. I have something in mind that I might use it for in the future. it’s a good idea.

All it’s doing is giving the extension permission to send API calls from your iNat account, so it can replicate what it would do if you clicked the button in the normal interface.


if I used it to bulk add observation fields, and many of the obs were by the same user, would they get notified for each observation field added to each obs?

I believe it generates a notification every time but I’m not certain of that.

1 Like

This feedback pushed me to take some good advice from @pisum and I dramatically simplified the whole authentication process. The user is no longer involved at all; the extension just piggybacks on the existing login you’re using to make changes on the Identify page.


@thomaseverest @SteveMcBill @juliaaboyle @schizoform you’d expressed interest in this the first time I announced it; just a heads up that it’s more or less real now. Thanks again for your encouragement last year!


Would you consider making it so that when you hover over your ‘buttons’ on the Identify page it shows the hotkey config for each? I’m writing the buttons into my Button name right now to remember them.

1 Like

I bet I could make that happen pretty easily. For what it’s worth, I did foresee this and there is a solution to it (alt-h to show the current list of shortcuts) but your idea would be good to add too.


This feature is implemented now.