https://wiki.openfoodfacts.org/api.php?action=feedcontributions&user=Vaiton&feedformat=atomOpen Food Facts wiki - User contributions [en]2024-03-28T15:35:08ZUser contributionsMediaWiki 1.35.2https://wiki.openfoodfacts.org/index.php?title=Template_talk:FR:Box&diff=19735Template talk:FR:Box2023-06-13T18:20:52Z<p>Vaiton: /* Removal in favor of Template:Box */</p>
<hr />
<div>== Removal in favor of Template:Box ==<br />
<br />
Is there any reason why we need both? Can't we use the Template:Box everywhere? --[[User:Vaiton|Vaiton]] ([[User talk:Vaiton|talk]]) 18:20, 13 June 2023 (UTC)</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Template_talk:FR:Box&diff=19734Template talk:FR:Box2023-06-13T18:20:40Z<p>Vaiton: /* Removal in favor of Template:Box */ new section</p>
<hr />
<div>== Removal in favor of Template:Box ==<br />
<br />
Is there any reason why we need both? Can't we use the Template:Box everywhere?</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Main_Page&diff=19733Main Page2023-06-13T18:19:45Z<p>Vaiton: Blank edit for template refresh</p>
<hr />
<div>{{otherlang<br />
| es=ES:Página_principal<br />
| fr=FR:Accueil<br />
| de=DE:Hauptseite<br />
}}<br />
__NOTOC__<br />
Welcome to the [https://openfoodfacts.org Open Food Facts] wiki! This wiki is a collaborative space for contributors to the Open Food Facts project.<br />
We can use it to share and discuss ideas about the project and its sub-projects, to implement them and to document them.<br />
<br />
{| width="100%" cellspacing="0" cellpadding="0"<br />
| colspan="2" |<br />
|-<br />
| width="50%" style="vertical-align:top;" |<br />
<br />
{{Box|About Open Food Facts|<br />
*[https://en.openfoodfacts.org/who-we-are team] / [https://en.blog.openfoodfacts.org/ blog] / [https://slack.openfoodfacts.org/ Come and discuss on Open Food Facts' Slack] / [https://github.com/openfoodfacts/ GitHub]<br />
}}<br />
<br />
{{Box|Log in|<br />
To edit and contribute to pages, first log in on [https://en.openfoodfacts.org Open Food Facts] with your account and then come back here and refresh the page: you will then be automatically signed in.<br />
}}<br />
<br />
{{Box|Contributing|<br />
*[[How to help]]: there are different ways (improving the database, community management, software development...)<br />
*[[Projects homepage]]: projects synthesised (ongoing projects, future projects, past ones...) <br />
*[[Data fields]] explained, and how to fill them<br />
*[[Ingredients]] : projects, tools & how to help<br />
*[https://world.openfoodfacts.org/state/to-be-completed Products to be completed]<br />
*[https://world.openfoodfacts.org/states All states]<br />
*[[Quality]]: how to help<br />
*[[Tech Team|Software Development]] (Scroll down to the Help technically section)<br />
*[[Documentation]]<br />
*[[Design]]<br />
* Help to get [[Producers' data]]<br />
*[[Artificial Intelligence]]<br />
*How to contribute on [[Environment]]<br />
}}<br />
<br />
{{Box|Teams|<br />
*[[Development Team|Development]]<br />
*[[Communication Team|Communication]]<br />
*[[Local_Communities|Local Communities]]<br />
*[[Moderation Team|Moderation]]<br />
}}<br />
<br />
{{Box|Contacts|<br />
* [https://slack.openfoodfacts.org/ Chat on Slack] / Facebook [https://www.facebook.com/OpenFoodFacts Global Page] - [https://www.facebook.com/groups/openfoodfacts.fr/ French Group] / Twitter ([https://twitter.com/openfoodfacts Global], [https://twitter.com/openfoodfactsfr FR], [https://twitter.com/openfoodfactsde DE]…) / [https://en.blog.openfoodfacts.org/ Blog] / [[Forum]]<br />
}}<br />
<br />
{{Box|Help the project get local|<br />
*[[Translations]] (Website, Categories, Marketing assets…) for information, corrections and improvements.<br />
*[[Internationalization]] & [[Global taxonomies]]<br />
}}<br />
<br />
{{Box|Help market the project|<br />
*[[Communication Team|Communication]] / [[Raw blog]] / [[Images and presentations]]<br />
*[[Public Relations]] ([[Public Relations/Press Kit|presskit]], [[Public Relations/Social Media|social media]] and [[Public Relations/Media monitoring|media monitoring]])<br />
*[[Presentation Kit]]<br />
}}<br />
<br />
{{Box|Help technically|<br />
*[https://github.com/openfoodfacts/ Overview of all the things you can help technically on]<br />
}}<br />
<br />
{{Box|Misc.|<br />
*[https://world.openfoodfacts.org/legal Legal] & [https://world.openfoodfacts.org/terms-of-use Terms of use]<br />
*[[FAQs|FAQ]] / [https://world.openfoodfacts.org/press Press]<br />
*[[Mission ideas]]<br />
}}<br />
<br />
| style="vertical-align:top;" width="50%" |<br />
<br />
<!-- we need named parameters (1=...|2=....) to be able to use "=" inside template content --><br />
{{Box|1=News|2=<br />
<br />
== 2023-05 ==<br />
<br />
<br />
* {{date|2023-05-02}} - [https://www.ow2con.org/view/2023/Program OW2con'23 official program] was published and will feature a talk about Open Food Facts on 2023-06-14 16:30 (CET)<br />
* {{date|2023-05-02}} - 🗣📱Join the '''conversation about how to create a more impactful mobile app''' : the 2nd creative meeting is on the '''2nd of May at 18-19h CET''': we'll organise the ideas from last week's brainstorm (note: you are welcome to join even if you were not there), give positive & negative criticism on the assembled ideas & to add a few more ideas, if time allows. You can also add your ideas on [https://forum.openfoodfacts.org/t/towards-1-million-users-and-beyond-for-open-food-facts-mobile-app/190 the forum post] ahead of the meeting (they'll be added to the Excalidraw board used in the call). Link to call: https://meet.google.com/hkx-yvux-dfg<br />
<br />
== 2023-04 ==<br />
<br />
* {{date|2023-04-26}} - Our monthly '''[https://meet.google.com/vho-oxnz-weu 👋 Welcome & 💡Open Class] community call''' on the 26th April from 6-7 pm [https://www.worldtimebuddy.com/?qm=1&lid=5,2988507,2643743&h=5&date=2023-3-20&sln=13-15&hf=1 CET (GMT+1)]: whether you're new or not, come hang out with us. The second part of the hour will be a tutorial by Alex on the Packaging operation & ways to tackle food packaging data ! <br />
* {{date|2023-04-10}} - '''The community needs you 🧠 !''' We are inviting you to help us build TOGETHER a vision for the Open Food Facts app & collectively decide how we should try to reach this goal. ''What should Open Food Facts app — or even apps — look like to reach a maximum of people?'' Head to our forum where you will find the detailed process & calendar : https://bit.ly/3nVg3Um . Let's make it App'n 😉📲 !<br />
* {{date|2023-04-04}} - We're launching the very first '''[https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=NjRuZDV0NmtoaWE2YmJvN3NpYmh2MTR1N2tfMjAyMzA0MDRUMTIwMDAwWiBtYW5vbkBvcGVuZm9vZGZhY3RzLm9yZw&tmsrc=manon%40openfoodfacts.org Workshop for Producers!] 💬''' Every other Tuesday at 2 pm [https://www.worldtimebuddy.com/?qm=1&lid=2643743,360630,524901,2988507&h=2643743&date=2023-4-4&sln=13-14&hf=1 CET (GMT+1)] Join us for an open discussion about your use of the [https://world.pro.openfoodfacts.org/ Pro platform]: we're here to better understand your needs and answer your questions.<br />
<br />
-------<br />
*[[News|Older news...]]<br />
*[[Upcoming Events]]: to list meetups, conferences and other events that we could participate in<br />
}}<br />
<br />
{{Box|Product lists|<br />
*[[Noteworthy Products]]: to link to the pages of special products. e.g. interesting or exotic codes.<br />
*[https://world.openfoodfacts.org/state/to-be-checked Products to check]: products that have dubious data.<br />
*[https://world.openfoodfacts.org/state/to-be-deleted Products to delete]: products that are not food products.<br />
}}<br />
<br />
{{Box|Food-specific projects|<br />
*[[Project:What's in my yogurt?|What's in my yogurt?]] / [[Alcohol/Beers|Beers]] ([[Alcohol/Beers/Best practices|best practices]]), [[Alcohol/Wine|Wine]] & [[Alcohol/Spirits|Spirits]]<br />
*[[Project:Petfood]] / [[Restaurants/Fast Food|Mapping fast food]]<br />
}}<br />
<br />
{{Box|Data reuse|<br />
*[[Reusing Open Food Facts Data]]: where? how?<br />
*[[Open Food Facts and Science]]: what? who? how?<br />
* API ([https://openfoodfacts.github.io/api-documentation/ new version] - currently hangs with Firefox - [https://github.com/openfoodfacts/api-documentation Help with the doc])<br />
*Location ([[Project:Food establishments|Food establishments]] & [[Made Near Me]])<br />
}}<br />
<br />
{{Box|On-going Projects|<br />
*[[Project:ProductOpener|Server (Product Opener)]] (incl. [[Mobile Web version|Mobile web]])<br />
*[[Mobile Apps]] / [[Project Smoothie]] (The new Open Food Facts app, in Flutter)<br />
*[[Project:Personalized Search|Personalized Search]]<br />
*[[Project:Data Quality|Data quality]] & [[Project:Error detection|Error detection]]<br />
*[[Folksonomy Engine]]<br />
}}<br />
<br />
{{Box|Projects|<br />
*[[Project:Redesign|Re-design]]<br />
*[[Project:Archeology|Food archeology]]: Add VERY old products to Open Food Facts :-) <br />
* Accessibility ([[Accessibility/Blind_people|Blindness]],…)<br />
*[[Project:Community portal|Community portal]]<br />
*[[Project:Contribute Back|Contribute back]]<br />
*[[Project:Diets|Diets]]<br />
*[[Structured Data]] ([[Structured Data/Wikidata|Wikidata linking]])<br />
*[[Gamification/Roadmap|Gamifying OFF]]<br />
* Experiments: [[Experiments/Microwave|Microwaves]], [[Experiments/Google Glass|AR]] and [[Experiments/3D|3D]]<br />
*[[Barcodes]] ([[Barcodes/Non Standard Barcodes|Non Standard Barcodes]], [[Barcodes/Blacklist|Blacklist]], [[Barcodes/False positives|False positives]], [[Barcodes/Countries|Countries]])<br />
*[[OCR]]<br />
*[[Project:Public Data|Public data]]<br />
*[[Project:Roadmap|Roadmap]]<br />
*[[Project:EU Project Citizen Observatories]]<br />
*[[Project:Ingredients ontology|Ingredients ontology]]<br />
*[[Project:Food additives|Food additives]]<br />
*[[Project:Multilingual products|Multilingual products]]<br />
*[[Project:Product versions and history|Product versions and history]]<br />
*[[Project:Product issues dropdown list|Product issues dropdown list]]<br />
*[[Project:SvelteKit_Frontend|SvelteKit Frontend]]<br />
}}<br />
<br />
|}</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Template:Box&diff=19732Template:Box2023-06-13T18:19:25Z<p>Vaiton: </p>
<hr />
<div><div><br />
{| width="100%"<br />
! style="border:0px;background-color:#F7F7F7;text-align:left;font-weight: normal;padding: 0em;" |<br />
<div><br />
{| width="100%"<br />
! style="border:0px;background-color:black;background:black;color:#fff;font-size: 1.4em;padding:0.3em;" | {{{1}}}<br />
|}<br />
</div><br />
<div style="padding-left:0.5rem"><br />
{{{2}}}<br />
</div><br />
|}<br />
</div></div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Main_Page&diff=19731Main Page2023-06-13T18:16:37Z<p>Vaiton: </p>
<hr />
<div>{{otherlang<br />
| es=ES:Página_principal<br />
| fr=FR:Accueil<br />
| de=DE:Hauptseite<br />
}}<br />
__NOTOC__<br />
Welcome to the [https://openfoodfacts.org Open Food Facts] wiki! This wiki is a collaborative space for contributors to the Open Food Facts project.<br />
We can use it to share and discuss ideas about the project and its sub-projects, to implement them and to document them.<br />
<br />
{| width="100%" cellspacing="0" cellpadding="0"<br />
| colspan="2" |<br />
|-<br />
| width="50%" style="vertical-align:top;" |<br />
<br />
{{Box|About Open Food Facts|<br />
*[https://en.openfoodfacts.org/who-we-are team] / [https://en.blog.openfoodfacts.org/ blog] / [https://slack.openfoodfacts.org/ Come and discuss on Open Food Facts' Slack] / [https://github.com/openfoodfacts/ GitHub]<br />
}}<br />
<br />
{{Box|Log in|<br />
To edit and contribute to pages, first log in on [https://en.openfoodfacts.org Open Food Facts] with your account and then come back here and refresh the page: you will then be automatically signed in.<br />
}}<br />
<br />
{{Box|Contributing|<br />
*[[How to help]]: there are different ways (improving the database, community management, software development...)<br />
*[[Projects homepage]]: projects synthesised (ongoing projects, future projects, past ones...) <br />
*[[Data fields]] explained, and how to fill them<br />
*[[Ingredients]] : projects, tools & how to help<br />
*[https://world.openfoodfacts.org/state/to-be-completed Products to be completed]<br />
*[https://world.openfoodfacts.org/states All states]<br />
*[[Quality]]: how to help<br />
*[[Tech Team|Software Development]] (Scroll down to the Help technically section)<br />
*[[Documentation]]<br />
*[[Design]]<br />
* Help to get [[Producers' data]]<br />
*[[Artificial Intelligence]]<br />
*How to contribute on [[Environment]]<br />
}}<br />
<br />
{{Box|Teams|<br />
*[[Development Team|Development]]<br />
*[[Communication Team|Communication]]<br />
*[[Local_Communities|Local Communities]]<br />
*[[Moderation Team|Moderation]]<br />
}}<br />
<br />
{{Box|Contacts|<br />
* [https://slack.openfoodfacts.org/ Chat on Slack] / Facebook [https://www.facebook.com/OpenFoodFacts Global Page] - [https://www.facebook.com/groups/openfoodfacts.fr/ French Group] / Twitter ([https://twitter.com/openfoodfacts Global], [https://twitter.com/openfoodfactsfr FR], [https://twitter.com/openfoodfactsde DE]…) / [https://en.blog.openfoodfacts.org/ Blog] / [[Forum]]<br />
}}<br />
<br />
{{Box|Help the project get local|<br />
*[[Translations]] (Website, Categories, Marketing assets…) for information, corrections and improvements.<br />
*[[Internationalization]] & [[Global taxonomies]]<br />
}}<br />
<br />
{{Box|Help market the project|<br />
*[[Communication Team|Communication]] / [[Raw blog]] / [[Images and presentations]]<br />
*[[Public Relations]] ([[Public Relations/Press Kit|presskit]], [[Public Relations/Social Media|social media]] and [[Public Relations/Media monitoring|media monitoring]])<br />
*[[Presentation Kit]]<br />
}}<br />
<br />
{{Box|Help technically|<br />
*[https://github.com/openfoodfacts/ Overview of all the things you can help technically on]<br />
}}<br />
<br />
{{Box|Misc.|<br />
*[https://world.openfoodfacts.org/legal Legal] & [https://world.openfoodfacts.org/terms-of-use Terms of use]<br />
*[[FAQs|FAQ]] / [https://world.openfoodfacts.org/press Press]<br />
*[[Mission ideas]]<br />
}}<br />
<br />
| style="vertical-align:top;" width="50%" |<br />
<br />
<!-- we need named parameters (1=...|2=....) to be able to use "=" inside template content --><br />
{{Box|1=News|2=<br />
<br />
== 2023-05 ==<br />
<br />
* {{date|2023-05-02}} - [https://www.ow2con.org/view/2023/Program OW2con'23 official program] was published and will feature a talk about Open Food Facts on 2023-06-14 16:30 (CET)<br />
* {{date|2023-05-02}} - 🗣📱Join the '''conversation about how to create a more impactful mobile app''' : the 2nd creative meeting is on the '''2nd of May at 18-19h CET''': we'll organise the ideas from last week's brainstorm (note: you are welcome to join even if you were not there), give positive & negative criticism on the assembled ideas & to add a few more ideas, if time allows. You can also add your ideas on [https://forum.openfoodfacts.org/t/towards-1-million-users-and-beyond-for-open-food-facts-mobile-app/190 the forum post] ahead of the meeting (they'll be added to the Excalidraw board used in the call). Link to call: https://meet.google.com/hkx-yvux-dfg<br />
<br />
== 2023-04 ==<br />
<br />
* {{date|2023-04-26}} - Our monthly '''[https://meet.google.com/vho-oxnz-weu 👋 Welcome & 💡Open Class] community call''' on the 26th April from 6-7 pm [https://www.worldtimebuddy.com/?qm=1&lid=5,2988507,2643743&h=5&date=2023-3-20&sln=13-15&hf=1 CET (GMT+1)]: whether you're new or not, come hang out with us. The second part of the hour will be a tutorial by Alex on the Packaging operation & ways to tackle food packaging data ! <br />
* {{date|2023-04-10}} - '''The community needs you 🧠 !''' We are inviting you to help us build TOGETHER a vision for the Open Food Facts app & collectively decide how we should try to reach this goal. ''What should Open Food Facts app — or even apps — look like to reach a maximum of people?'' Head to our forum where you will find the detailed process & calendar : https://bit.ly/3nVg3Um . Let's make it App'n 😉📲 !<br />
* {{date|2023-04-04}} - We're launching the very first '''[https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=NjRuZDV0NmtoaWE2YmJvN3NpYmh2MTR1N2tfMjAyMzA0MDRUMTIwMDAwWiBtYW5vbkBvcGVuZm9vZGZhY3RzLm9yZw&tmsrc=manon%40openfoodfacts.org Workshop for Producers!] 💬''' Every other Tuesday at 2 pm [https://www.worldtimebuddy.com/?qm=1&lid=2643743,360630,524901,2988507&h=2643743&date=2023-4-4&sln=13-14&hf=1 CET (GMT+1)] Join us for an open discussion about your use of the [https://world.pro.openfoodfacts.org/ Pro platform]: we're here to better understand your needs and answer your questions.<br />
<br />
-------<br />
*[[News|Older news...]]<br />
*[[Upcoming Events]]: to list meetups, conferences and other events that we could participate in<br />
}}<br />
<br />
{{Box|Product lists|<br />
*[[Noteworthy Products]]: to link to the pages of special products. e.g. interesting or exotic codes.<br />
*[https://world.openfoodfacts.org/state/to-be-checked Products to check]: products that have dubious data.<br />
*[https://world.openfoodfacts.org/state/to-be-deleted Products to delete]: products that are not food products.<br />
}}<br />
<br />
{{Box|Food-specific projects|<br />
*[[Project:What's in my yogurt?|What's in my yogurt?]] / [[Alcohol/Beers|Beers]] ([[Alcohol/Beers/Best practices|best practices]]), [[Alcohol/Wine|Wine]] & [[Alcohol/Spirits|Spirits]]<br />
*[[Project:Petfood]] / [[Restaurants/Fast Food|Mapping fast food]]<br />
}}<br />
<br />
{{Box|Data reuse|<br />
*[[Reusing Open Food Facts Data]]: where? how?<br />
*[[Open Food Facts and Science]]: what? who? how?<br />
* API ([https://openfoodfacts.github.io/api-documentation/ new version] - currently hangs with Firefox - [https://github.com/openfoodfacts/api-documentation Help with the doc])<br />
*Location ([[Project:Food establishments|Food establishments]] & [[Made Near Me]])<br />
}}<br />
<br />
{{Box|On-going Projects|<br />
*[[Project:ProductOpener|Server (Product Opener)]] (incl. [[Mobile Web version|Mobile web]])<br />
*[[Mobile Apps]] / [[Project Smoothie]] (The new Open Food Facts app, in Flutter)<br />
*[[Project:Personalized Search|Personalized Search]]<br />
*[[Project:Data Quality|Data quality]] & [[Project:Error detection|Error detection]]<br />
*[[Folksonomy Engine]]<br />
}}<br />
<br />
{{Box|Projects|<br />
*[[Project:Redesign|Re-design]]<br />
*[[Project:Archeology|Food archeology]]: Add VERY old products to Open Food Facts :-) <br />
* Accessibility ([[Accessibility/Blind_people|Blindness]],…)<br />
*[[Project:Community portal|Community portal]]<br />
*[[Project:Contribute Back|Contribute back]]<br />
*[[Project:Diets|Diets]]<br />
*[[Structured Data]] ([[Structured Data/Wikidata|Wikidata linking]])<br />
*[[Gamification/Roadmap|Gamifying OFF]]<br />
* Experiments: [[Experiments/Microwave|Microwaves]], [[Experiments/Google Glass|AR]] and [[Experiments/3D|3D]]<br />
*[[Barcodes]] ([[Barcodes/Non Standard Barcodes|Non Standard Barcodes]], [[Barcodes/Blacklist|Blacklist]], [[Barcodes/False positives|False positives]], [[Barcodes/Countries|Countries]])<br />
*[[OCR]]<br />
*[[Project:Public Data|Public data]]<br />
*[[Project:Roadmap|Roadmap]]<br />
*[[Project:EU Project Citizen Observatories]]<br />
*[[Project:Ingredients ontology|Ingredients ontology]]<br />
*[[Project:Food additives|Food additives]]<br />
*[[Project:Multilingual products|Multilingual products]]<br />
*[[Project:Product versions and history|Product versions and history]]<br />
*[[Project:Product issues dropdown list|Product issues dropdown list]]<br />
*[[Project:SvelteKit_Frontend|SvelteKit Frontend]]<br />
}}<br />
<br />
|}</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Main_Page&diff=19730Main Page2023-06-13T18:16:19Z<p>Vaiton: </p>
<hr />
<div>{{otherlang<br />
| es=ES:Página_principal<br />
| fr=FR:Accueil<br />
| de=DE:Hauptseite<br />
}}<br />
__NOTOC__<br />
Welcome to the [https://openfoodfacts.org Open Food Facts] wiki! This wiki is a collaborative space for contributors to the Open Food Facts project.<br />
We can use it to share and discuss ideas about the project and its sub-projects, to implement them and to document them.<br />
<br />
{| width="100%" cellspacing="0" cellpadding="0"<br />
| colspan="2" |<br />
|-<br />
| width="50%" style="vertical-align:top;" |<br />
<br />
{{Box|About Open Food Facts|<br />
*[https://en.openfoodfacts.org/who-we-are team] / [https://en.blog.openfoodfacts.org/ blog] / [https://slack.openfoodfacts.org/ Come and discuss on Open Food Facts' Slack] / [https://github.com/openfoodfacts/ GitHub]<br />
}}<br />
<br />
{{Box|Log in|<br />
To edit and contribute to pages, first log in on [https://en.openfoodfacts.org Open Food Facts] with your account and then come back here and refresh the page: you will then be automatically signed in.<br />
}}<br />
<br />
{{Box|Contributing|<br />
*[[How to help]]: there are different ways (improving the database, community management, software development...)<br />
*[[Projects homepage]]: projects synthesised (ongoing projects, future projects, past ones...) <br />
*[[Data fields]] explained, and how to fill them<br />
*[[Ingredients]] : projects, tools & how to help<br />
*[https://world.openfoodfacts.org/state/to-be-completed Products to be completed]<br />
*[https://world.openfoodfacts.org/states All states]<br />
*[[Quality]]: how to help<br />
*[[Tech Team|Software Development]] (Scroll down to the Help technically section)<br />
*[[Documentation]]<br />
*[[Design]]<br />
* Help to get [[Producers' data]]<br />
*[[Artificial Intelligence]]<br />
*How to contribute on [[Environment]]<br />
}}<br />
<br />
{{Box|Teams|<br />
*[[Development Team|Development]]<br />
*[[Communication Team|Communication]]<br />
*[[Local_Communities|Local Communities]]<br />
*[[Moderation Team|Moderation]]<br />
}}<br />
<br />
{{Box|Contacts|<br />
* [https://slack.openfoodfacts.org/ Chat on Slack] / Facebook [https://www.facebook.com/OpenFoodFacts Global Page] - [https://www.facebook.com/groups/openfoodfacts.fr/ French Group] / Twitter ([https://twitter.com/openfoodfacts Global], [https://twitter.com/openfoodfactsfr FR], [https://twitter.com/openfoodfactsde DE]…) / [https://en.blog.openfoodfacts.org/ Blog] / [[Forum]]<br />
}}<br />
<br />
{{Box|Help the project get local|<br />
*[[Translations]] (Website, Categories, Marketing assets…) for information, corrections and improvements.<br />
*[[Internationalization]] & [[Global taxonomies]]<br />
}}<br />
<br />
{{Box|Help market the project|<br />
*[[Communication Team|Communication]] / [[Raw blog]] / [[Images and presentations]]<br />
*[[Public Relations]] ([[Public Relations/Press Kit|presskit]], [[Public Relations/Social Media|social media]] and [[Public Relations/Media monitoring|media monitoring]])<br />
*[[Presentation Kit]]<br />
}}<br />
<br />
{{Box|Help technically|<br />
*[https://github.com/openfoodfacts/ Overview of all the things you can help technically on]<br />
}}<br />
<br />
{{Box|Misc.|<br />
*[https://world.openfoodfacts.org/legal Legal] & [https://world.openfoodfacts.org/terms-of-use Terms of use]<br />
*[[FAQs|FAQ]] / [https://world.openfoodfacts.org/press Press]<br />
*[[Mission ideas]]<br />
}}<br />
<br />
| style="vertical-align:top;" width="50%" |<br />
<br />
<!-- we need named parameters (1=...|2=....) to be able to use "=" inside template content --><br />
{{Box|1=News|2=<br />
<br />
== 2023-05 ==<br />
<br />
* {{date|2023-05-02}} - [https://www.ow2con.org/view/2023/Program OW2con'23 official program] was published and will feature a talk about Open Food Facts on 2023-06-14 16:30 (CET)<br />
* {{date|2023-05-02}} - 🗣📱Join the '''conversation about how to create a more impactful mobile app''' : the 2nd creative meeting is on the '''2nd of May at 18-19h CET''': we'll organise the ideas from last week's brainstorm (note: you are welcome to join even if you were not there), give positive & negative criticism on the assembled ideas & to add a few more ideas, if time allows. You can also add your ideas on [https://forum.openfoodfacts.org/t/towards-1-million-users-and-beyond-for-open-food-facts-mobile-app/190 the forum post] ahead of the meeting (they'll be added to the Excalidraw board used in the call). Link to call: https://meet.google.com/hkx-yvux-dfg<br />
<br />
== 2023-04 ==<br />
<br />
* {{date|2023-04-26}} - Our monthly '''[https://meet.google.com/vho-oxnz-weu 👋 Welcome & 💡Open Class] community call''' on the 26th April from 6-7 pm [https://www.worldtimebuddy.com/?qm=1&lid=5,2988507,2643743&h=5&date=2023-3-20&sln=13-15&hf=1 CET (GMT+1)]: whether you're new or not, come hang out with us. The second part of the hour will be a tutorial by Alex on the Packaging operation & ways to tackle food packaging data ! <br />
* {{date|2023-04-10}} - '''The community needs you 🧠 !''' We are inviting you to help us build TOGETHER a vision for the Open Food Facts app & collectively decide how we should try to reach this goal. ''What should Open Food Facts app — or even apps — look like to reach a maximum of people?'' Head to our forum where you will find the detailed process & calendar : https://bit.ly/3nVg3Um . Let's make it App'n 😉📲 !<br />
* {{date|2023-04-04}} - We're launching the very first '''[https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=NjRuZDV0NmtoaWE2YmJvN3NpYmh2MTR1N2tfMjAyMzA0MDRUMTIwMDAwWiBtYW5vbkBvcGVuZm9vZGZhY3RzLm9yZw&tmsrc=manon%40openfoodfacts.org Workshop for Producers!] 💬''' Every other Tuesday at 2 pm [https://www.worldtimebuddy.com/?qm=1&lid=2643743,360630,524901,2988507&h=2643743&date=2023-4-4&sln=13-14&hf=1 CET (GMT+1)] Join us for an open discussion about your use of the [https://world.pro.openfoodfacts.org/ Pro platform]: we're here to better understand your needs and answer your questions.<br />
<br />
-------<br />
*[[News|Older news...]]<br />
*[[Upcoming Events]]: to list meetups, conferences and other events that we could participate in<br />
}}<br />
<br />
{{Box|Product lists|<br />
*[[Noteworthy Products]]: to link to the pages of special products. e.g. interesting or exotic codes.<br />
*[https://world.openfoodfacts.org/state/to-be-checked Products to check]: products that have dubious data.<br />
*[https://world.openfoodfacts.org/state/to-be-deleted Products to delete]: products that are not food products.<br />
}}<br />
<br />
{{Box|Food-specific projects|<br />
*[[Project:What's in my yogurt?|What's in my yogurt?]] / [[Alcohol/Beers|Beers]] ([[Alcohol/Beers/Best practices|best practices]]), [[Alcohol/Wine|Wine]] & [[Alcohol/Spirits|Spirits]]<br />
*[[Project:Petfood]] / [[Restaurants/Fast Food|Mapping fast food]]<br />
}}<br />
<br />
{{Box|Data reuse|<br />
*[[Reusing Open Food Facts Data]]: where? how?<br />
*[[Open Food Facts and Science]]: what? who? how?<br />
* API ([https://openfoodfacts.github.io/api-documentation/ new version] - currently hangs with Firefox - [https://github.com/openfoodfacts/api-documentation Help with the doc])<br />
*Location ([[Project:Food establishments|Food establishments]] & [[Made Near Me]])<br />
}}<br />
<br />
{{Box|On-going Projects|<br />
*[[Project:ProductOpener|Server (Product Opener)]] (incl. [[Mobile Web version|Mobile web]])<br />
*[[Mobile Apps]] / [[Project Smoothie]] (The new Open Food Facts app, in Flutter)<br />
*[[Project:Personalized Search|Personalized Search]]<br />
*[[Project:Data Quality|Data quality]] & [[Project:Error detection|Error detection]]<br />
*[[Folksonomy Engine]]<br />
}}<br />
<br />
{{Box|Projects|<br />
*[[Project:Redesign|Re-design]]<br />
*[[Project:Archeology|Food archeology]]: Add VERY old products to Open Food Facts :-) <br />
* Accessibility ([[Accessibility/Blind_people|Blindness]],…)<br />
*[[Project:Community portal|Community portal]]<br />
*[[Project:Contribute Back|Contribute back]]<br />
*[[Project:Diets|Diets]]<br />
*[[Structured Data]] ([[Structured Data/Wikidata|Wikidata linking]])<br />
*[[Gamification/Roadmap|Gamifying OFF]]<br />
* Experiments: [[Experiments/Microwave|Microwaves]], [[Experiments/Google Glass|AR]] and [[Experiments/3D|3D]]<br />
*[[Barcodes]] ([[Barcodes/Non Standard Barcodes|Non Standard Barcodes]], [[Barcodes/Blacklist|Blacklist]], [[Barcodes/False positives|False positives]], [[Barcodes/Countries|Countries]])<br />
*[[OCR]]<br />
*[[Project:Public Data|Public data]]<br />
*[[Project:Roadmap|Roadmap]]<br />
*[[Project:EU Project Citizen Observatories]]<br />
*[[Project:Ingredients ontology|Ingredients ontology]]<br />
*[[Project:Food additives|Food additives]]<br />
*[[Project:Multilingual products|Multilingual products]]<br />
*[[Project:Product versions and history|Product versions and history]]<br />
*[[Project:Product issues dropdown list|Product issues dropdown list]]<br />
*[[Project:SvelteKit_Frontend]]<br />
}}<br />
<br />
|}</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=SvelteKit_Frontend&diff=19729SvelteKit Frontend2023-06-13T18:16:04Z<p>Vaiton: Vaiton moved page SvelteKit Frontend to Project:SvelteKit Frontend</p>
<hr />
<div>#REDIRECT [[Project:SvelteKit Frontend]]</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Project:SvelteKit_Frontend&diff=19728Project:SvelteKit Frontend2023-06-13T18:16:04Z<p>Vaiton: Vaiton moved page SvelteKit Frontend to Project:SvelteKit Frontend</p>
<hr />
<div>=== Introduction ===<br />
I (VaiTon) started the project to try to build a prototype of frontend, completely decoupled from the backend. <br />
<br />
This way, we could (one day hopefully) iterate much more quicker on the frontend side of things and use the latest javascript technology available (TypeScript, Vite, ESM, etc...).<br />
<br />
For the prototype I chose [https://kit.svelte.dev/ SvelteKit].<br />
<br />
=== Development ===<br />
* GitHub Repository: https://github.com/VaiTon/openfoodfacts-explorer<br />
* Deployment: https://openfoodfacts-explorer.vercel.app/<br />
<br />
=== Logging in ===<br />
<br />
==== Security concerns ====<br />
As we still don't have an OpenID compatible way of logging in, at the moment the web app stores the user credential in the <code>localStorage</code>, which is UNSAFE as it is exposed to XSS attacks. Another way would be serving the project from a subdomain, but we're not there yet.<br />
<br />
==== How to ====<br />
To ''log in'' (there is not really a log in, more like sending credentials with every request), go to https://openfoodfacts-explorer.vercel.app/settings and enter your credentials.<br />
<br />
=== Editing products ===<br />
'''You need to be logged in to edit products! See the [[SvelteKit Frontend#Logging in|''Logging in'' section]] for more information.'''<br />
<br />
* Open the product page you'd like to edit<br />
* Click on the "edit" button</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Main_Page&diff=19727Main Page2023-06-13T18:14:58Z<p>Vaiton: </p>
<hr />
<div>{{otherlang<br />
| es=ES:Página_principal<br />
| fr=FR:Accueil<br />
| de=DE:Hauptseite<br />
}}<br />
__NOTOC__<br />
Welcome to the [https://openfoodfacts.org Open Food Facts] wiki! This wiki is a collaborative space for contributors to the Open Food Facts project.<br />
We can use it to share and discuss ideas about the project and its sub-projects, to implement them and to document them.<br />
<br />
{| width="100%" cellspacing="0" cellpadding="0"<br />
| colspan="2" |<br />
|-<br />
| width="50%" style="vertical-align:top;" |<br />
<br />
{{Box|About Open Food Facts|<br />
*[https://en.openfoodfacts.org/who-we-are team] / [https://en.blog.openfoodfacts.org/ blog] / [https://slack.openfoodfacts.org/ Come and discuss on Open Food Facts' Slack] / [https://github.com/openfoodfacts/ GitHub]<br />
}}<br />
<br />
{{Box|Log in|<br />
To edit and contribute to pages, first log in on [https://en.openfoodfacts.org Open Food Facts] with your account and then come back here and refresh the page: you will then be automatically signed in.<br />
}}<br />
<br />
{{Box|Contributing|<br />
*[[How to help]]: there are different ways (improving the database, community management, software development...)<br />
*[[Projects homepage]]: projects synthesised (ongoing projects, future projects, past ones...) <br />
*[[Data fields]] explained, and how to fill them<br />
*[[Ingredients]] : projects, tools & how to help<br />
*[https://world.openfoodfacts.org/state/to-be-completed Products to be completed]<br />
*[https://world.openfoodfacts.org/states All states]<br />
*[[Quality]]: how to help<br />
*[[Tech Team|Software Development]] (Scroll down to the Help technically section)<br />
*[[Documentation]]<br />
*[[Design]]<br />
* Help to get [[Producers' data]]<br />
*[[Artificial Intelligence]]<br />
*How to contribute on [[Environment]]<br />
}}<br />
<br />
{{Box|Teams|<br />
*[[Development Team|Development]]<br />
*[[Communication Team|Communication]]<br />
*[[Local_Communities|Local Communities]]<br />
*[[Moderation Team|Moderation]]<br />
}}<br />
<br />
{{Box|Contacts|<br />
* [https://slack.openfoodfacts.org/ Chat on Slack] / Facebook [https://www.facebook.com/OpenFoodFacts Global Page] - [https://www.facebook.com/groups/openfoodfacts.fr/ French Group] / Twitter ([https://twitter.com/openfoodfacts Global], [https://twitter.com/openfoodfactsfr FR], [https://twitter.com/openfoodfactsde DE]…) / [https://en.blog.openfoodfacts.org/ Blog] / [[Forum]]<br />
}}<br />
<br />
{{Box|Help the project get local|<br />
*[[Translations]] (Website, Categories, Marketing assets…) for information, corrections and improvements.<br />
*[[Internationalization]] & [[Global taxonomies]]<br />
}}<br />
<br />
{{Box|Help market the project|<br />
*[[Communication Team|Communication]] / [[Raw blog]] / [[Images and presentations]]<br />
*[[Public Relations]] ([[Public Relations/Press Kit|presskit]], [[Public Relations/Social Media|social media]] and [[Public Relations/Media monitoring|media monitoring]])<br />
*[[Presentation Kit]]<br />
}}<br />
<br />
{{Box|Help technically|<br />
*[https://github.com/openfoodfacts/ Overview of all the things you can help technically on]<br />
}}<br />
<br />
{{Box|Misc.|<br />
*[https://world.openfoodfacts.org/legal Legal] & [https://world.openfoodfacts.org/terms-of-use Terms of use]<br />
*[[FAQs|FAQ]] / [https://world.openfoodfacts.org/press Press]<br />
*[[Mission ideas]]<br />
}}<br />
<br />
| style="vertical-align:top;" width="50%" |<br />
<br />
<!-- we need named parameters (1=...|2=....) to be able to use "=" inside template content --><br />
{{Box|1=News|2=<br />
<br />
== 2023-05 ==<br />
<br />
* {{date|2023-05-02}} - [https://www.ow2con.org/view/2023/Program OW2con'23 official program] was published and will feature a talk about Open Food Facts on 2023-06-14 16:30 (CET)<br />
* {{date|2023-05-02}} - 🗣📱Join the '''conversation about how to create a more impactful mobile app''' : the 2nd creative meeting is on the '''2nd of May at 18-19h CET''': we'll organise the ideas from last week's brainstorm (note: you are welcome to join even if you were not there), give positive & negative criticism on the assembled ideas & to add a few more ideas, if time allows. You can also add your ideas on [https://forum.openfoodfacts.org/t/towards-1-million-users-and-beyond-for-open-food-facts-mobile-app/190 the forum post] ahead of the meeting (they'll be added to the Excalidraw board used in the call). Link to call: https://meet.google.com/hkx-yvux-dfg<br />
<br />
== 2023-04 ==<br />
<br />
* {{date|2023-04-26}} - Our monthly '''[https://meet.google.com/vho-oxnz-weu 👋 Welcome & 💡Open Class] community call''' on the 26th April from 6-7 pm [https://www.worldtimebuddy.com/?qm=1&lid=5,2988507,2643743&h=5&date=2023-3-20&sln=13-15&hf=1 CET (GMT+1)]: whether you're new or not, come hang out with us. The second part of the hour will be a tutorial by Alex on the Packaging operation & ways to tackle food packaging data ! <br />
* {{date|2023-04-10}} - '''The community needs you 🧠 !''' We are inviting you to help us build TOGETHER a vision for the Open Food Facts app & collectively decide how we should try to reach this goal. ''What should Open Food Facts app — or even apps — look like to reach a maximum of people?'' Head to our forum where you will find the detailed process & calendar : https://bit.ly/3nVg3Um . Let's make it App'n 😉📲 !<br />
* {{date|2023-04-04}} - We're launching the very first '''[https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=NjRuZDV0NmtoaWE2YmJvN3NpYmh2MTR1N2tfMjAyMzA0MDRUMTIwMDAwWiBtYW5vbkBvcGVuZm9vZGZhY3RzLm9yZw&tmsrc=manon%40openfoodfacts.org Workshop for Producers!] 💬''' Every other Tuesday at 2 pm [https://www.worldtimebuddy.com/?qm=1&lid=2643743,360630,524901,2988507&h=2643743&date=2023-4-4&sln=13-14&hf=1 CET (GMT+1)] Join us for an open discussion about your use of the [https://world.pro.openfoodfacts.org/ Pro platform]: we're here to better understand your needs and answer your questions.<br />
<br />
-------<br />
*[[News|Older news...]]<br />
*[[Upcoming Events]]: to list meetups, conferences and other events that we could participate in<br />
}}<br />
<br />
{{Box|Product lists|<br />
*[[Noteworthy Products]]: to link to the pages of special products. e.g. interesting or exotic codes.<br />
*[https://world.openfoodfacts.org/state/to-be-checked Products to check]: products that have dubious data.<br />
*[https://world.openfoodfacts.org/state/to-be-deleted Products to delete]: products that are not food products.<br />
}}<br />
<br />
{{Box|Food-specific projects|<br />
*[[Project:What's in my yogurt?|What's in my yogurt?]] / [[Alcohol/Beers|Beers]] ([[Alcohol/Beers/Best practices|best practices]]), [[Alcohol/Wine|Wine]] & [[Alcohol/Spirits|Spirits]]<br />
*[[Project:Petfood]] / [[Restaurants/Fast Food|Mapping fast food]]<br />
}}<br />
<br />
{{Box|Data reuse|<br />
*[[Reusing Open Food Facts Data]]: where? how?<br />
*[[Open Food Facts and Science]]: what? who? how?<br />
* API ([https://openfoodfacts.github.io/api-documentation/ new version] - currently hangs with Firefox - [https://github.com/openfoodfacts/api-documentation Help with the doc])<br />
*Location ([[Project:Food establishments|Food establishments]] & [[Made Near Me]])<br />
}}<br />
<br />
{{Box|On-going Projects|<br />
*[[Project:ProductOpener|Server (Product Opener)]] (incl. [[Mobile Web version|Mobile web]])<br />
*[[Mobile Apps]] / [[Project Smoothie]] (The new Open Food Facts app, in Flutter)<br />
*[[Project:Personalized Search|Personalized Search]]<br />
*[[Project:Data Quality|Data quality]] & [[Project:Error detection|Error detection]]<br />
*[[Folksonomy Engine]]<br />
}}<br />
<br />
{{Box|Projects|<br />
*[[Project:Redesign|Re-design]]<br />
*[[Project:Archeology|Food archeology]]: Add VERY old products to Open Food Facts :-) <br />
* Accessibility ([[Accessibility/Blind_people|Blindness]],…)<br />
*[[Project:Community portal|Community portal]]<br />
*[[Project:Contribute Back|Contribute back]]<br />
*[[Project:Diets|Diets]]<br />
*[[Structured Data]] ([[Structured Data/Wikidata|Wikidata linking]])<br />
*[[Gamification/Roadmap|Gamifying OFF]]<br />
* Experiments: [[Experiments/Microwave|Microwaves]], [[Experiments/Google Glass|AR]] and [[Experiments/3D|3D]]<br />
*[[Barcodes]] ([[Barcodes/Non Standard Barcodes|Non Standard Barcodes]], [[Barcodes/Blacklist|Blacklist]], [[Barcodes/False positives|False positives]], [[Barcodes/Countries|Countries]])<br />
*[[OCR]]<br />
*[[Project:Public Data|Public data]]<br />
*[[Project:Roadmap|Roadmap]]<br />
*[[Project:EU Project Citizen Observatories]]<br />
*[[Project:Ingredients ontology|Ingredients ontology]]<br />
*[[Project:Food additives|Food additives]]<br />
*[[Project:Multilingual products|Multilingual products]]<br />
*[[Project:Product versions and history|Product versions and history]]<br />
*[[Project:Product issues dropdown list|Product issues dropdown list]]<br />
}}<br />
<br />
|}</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Main_Page&diff=19726Main Page2023-06-13T18:13:57Z<p>Vaiton: </p>
<hr />
<div>{{otherlang<br />
| es=ES:Página_principal<br />
| fr=FR:Accueil<br />
| de=DE:Hauptseite<br />
}}<br />
__NOTOC__<br />
Welcome to the [https://openfoodfacts.org Open Food Facts] wiki! This wiki is a collaborative space for contributors to the Open Food Facts project.<br />
We can use it to share and discuss ideas about the project and its sub-projects, to implement them and to document them.<br />
<br />
{| width="100%" cellspacing="0" cellpadding="0"<br />
| colspan="2" |<br />
|-<br />
| width="50%" style="vertical-align:top;" |<br />
<br />
{{Box|About Open Food Facts|<br />
*[https://en.openfoodfacts.org/who-we-are team] / [https://en.blog.openfoodfacts.org/ blog] / [https://slack.openfoodfacts.org/ Come and discuss on Open Food Facts' Slack] / [https://github.com/openfoodfacts/ GitHub]<br />
}}<br />
<br />
{{Box|Log in|<br />
To edit and contribute to pages, first log in on [https://en.openfoodfacts.org Open Food Facts] with your account and then come back here and refresh the page: you will then be automatically signed in.<br />
}}<br />
<br />
{{Box|Contributing|<br />
*[[How to help]]: there are different ways (improving the database, community management, software development...)<br />
*[[Projects homepage]]: projects synthesised (ongoing projects, future projects, past ones...) <br />
*[[Data fields]] explained, and how to fill them<br />
*[[Ingredients]] : projects, tools & how to help<br />
*[https://world.openfoodfacts.org/state/to-be-completed Products to be completed]<br />
*[https://world.openfoodfacts.org/states All states]<br />
*[[Quality]]: how to help<br />
*[[Tech Team|Software Development]] (Scroll down to the Help technically section)<br />
*[[Documentation]]<br />
*[[Design]]<br />
* Help to get [[Producers' data]]<br />
*[[Artificial Intelligence]]<br />
*How to contribute on [[Environment]]<br />
}}<br />
<br />
{{Box|Teams|<br />
*[[Development Team|Development]] / [[Communication Team|Communication]] / [[Local_Communities|Local Communities]] / [[Moderation Team|Moderation]]<br />
}}<br />
<br />
{{Box|Contacts|<br />
* [https://slack.openfoodfacts.org/ Chat on Slack] / Facebook [https://www.facebook.com/OpenFoodFacts Global Page] - [https://www.facebook.com/groups/openfoodfacts.fr/ French Group] / Twitter ([https://twitter.com/openfoodfacts Global], [https://twitter.com/openfoodfactsfr FR], [https://twitter.com/openfoodfactsde DE]…) / [https://en.blog.openfoodfacts.org/ Blog] / [[Forum]]<br />
}}<br />
<br />
{{Box|Help the project get local|<br />
*[[Translations]] (Website, Categories, Marketing assets…) for information, corrections and improvements.<br />
*[[Internationalization]] & [[Global taxonomies]]<br />
}}<br />
<br />
{{Box|Help market the project|<br />
*[[Communication Team|Communication]] / [[Raw blog]] / [[Images and presentations]]<br />
*[[Public Relations]] ([[Public Relations/Press Kit|presskit]], [[Public Relations/Social Media|social media]] and [[Public Relations/Media monitoring|media monitoring]])<br />
*[[Presentation Kit]]<br />
}}<br />
<br />
{{Box|Help technically|<br />
*[https://github.com/openfoodfacts/ Overview of all the things you can help technically on]<br />
}}<br />
<br />
{{Box|Misc.|<br />
*[https://world.openfoodfacts.org/legal Legal] & [https://world.openfoodfacts.org/terms-of-use Terms of use]<br />
*[[FAQs|FAQ]] / [https://world.openfoodfacts.org/press Press]<br />
*[[Mission ideas]]<br />
}}<br />
<br />
| style="vertical-align:top;" width="50%" |<br />
<br />
<!-- we need named parameters (1=...|2=....) to be able to use "=" inside template content --><br />
{{Box|1=News|2=<br />
<br />
== 2023-05 ==<br />
<br />
* {{date|2023-05-02}} - [https://www.ow2con.org/view/2023/Program OW2con'23 official program] was published and will feature a talk about Open Food Facts on 2023-06-14 16:30 (CET)<br />
* {{date|2023-05-02}} - 🗣📱Join the '''conversation about how to create a more impactful mobile app''' : the 2nd creative meeting is on the '''2nd of May at 18-19h CET''': we'll organise the ideas from last week's brainstorm (note: you are welcome to join even if you were not there), give positive & negative criticism on the assembled ideas & to add a few more ideas, if time allows. You can also add your ideas on [https://forum.openfoodfacts.org/t/towards-1-million-users-and-beyond-for-open-food-facts-mobile-app/190 the forum post] ahead of the meeting (they'll be added to the Excalidraw board used in the call). Link to call: https://meet.google.com/hkx-yvux-dfg<br />
<br />
== 2023-04 ==<br />
<br />
* {{date|2023-04-26}} - Our monthly '''[https://meet.google.com/vho-oxnz-weu 👋 Welcome & 💡Open Class] community call''' on the 26th April from 6-7 pm [https://www.worldtimebuddy.com/?qm=1&lid=5,2988507,2643743&h=5&date=2023-3-20&sln=13-15&hf=1 CET (GMT+1)]: whether you're new or not, come hang out with us. The second part of the hour will be a tutorial by Alex on the Packaging operation & ways to tackle food packaging data ! <br />
* {{date|2023-04-10}} - '''The community needs you 🧠 !''' We are inviting you to help us build TOGETHER a vision for the Open Food Facts app & collectively decide how we should try to reach this goal. ''What should Open Food Facts app — or even apps — look like to reach a maximum of people?'' Head to our forum where you will find the detailed process & calendar : https://bit.ly/3nVg3Um . Let's make it App'n 😉📲 !<br />
* {{date|2023-04-04}} - We're launching the very first '''[https://calendar.google.com/calendar/event?action=TEMPLATE&tmeid=NjRuZDV0NmtoaWE2YmJvN3NpYmh2MTR1N2tfMjAyMzA0MDRUMTIwMDAwWiBtYW5vbkBvcGVuZm9vZGZhY3RzLm9yZw&tmsrc=manon%40openfoodfacts.org Workshop for Producers!] 💬''' Every other Tuesday at 2 pm [https://www.worldtimebuddy.com/?qm=1&lid=2643743,360630,524901,2988507&h=2643743&date=2023-4-4&sln=13-14&hf=1 CET (GMT+1)] Join us for an open discussion about your use of the [https://world.pro.openfoodfacts.org/ Pro platform]: we're here to better understand your needs and answer your questions.<br />
<br />
-------<br />
*[[News|Older news...]]<br />
*[[Upcoming Events]]: to list meetups, conferences and other events that we could participate in<br />
}}<br />
<br />
{{Box|Product lists|<br />
*[[Noteworthy Products]]: to link to the pages of special products. e.g. interesting or exotic codes.<br />
*[https://world.openfoodfacts.org/state/to-be-checked Products to check]: products that have dubious data.<br />
*[https://world.openfoodfacts.org/state/to-be-deleted Products to delete]: products that are not food products.<br />
}}<br />
<br />
{{Box|Food-specific projects|<br />
*[[Project:What's in my yogurt?|What's in my yogurt?]] / [[Alcohol/Beers|Beers]] ([[Alcohol/Beers/Best practices|best practices]]), [[Alcohol/Wine|Wine]] & [[Alcohol/Spirits|Spirits]]<br />
*[[Project:Petfood]] / [[Restaurants/Fast Food|Mapping fast food]]<br />
}}<br />
<br />
{{Box|Data reuse|<br />
*[[Reusing Open Food Facts Data]]: where? how?<br />
*[[Open Food Facts and Science]]: what? who? how?<br />
* API ([https://openfoodfacts.github.io/api-documentation/ new version] - currently hangs with Firefox - [https://github.com/openfoodfacts/api-documentation Help with the doc])<br />
*Location ([[Project:Food establishments|Food establishments]] & [[Made Near Me]])<br />
}}<br />
<br />
{{Box|On-going Projects|<br />
*[[Project:ProductOpener|Server (Product Opener)]] (incl. [[Mobile Web version|Mobile web]])<br />
*[[Mobile Apps]] / [[Project Smoothie]] (The new Open Food Facts app, in Flutter)<br />
*[[Project:Personalized Search|Personalized Search]]<br />
*[[Project:Data Quality|Data quality]] & [[Project:Error detection|Error detection]]<br />
*[[Folksonomy Engine]]<br />
}}<br />
<br />
{{Box|Projects|<br />
*[[Project:Redesign|Re-design]]<br />
*[[Project:Archeology|Food archeology]]: Add VERY old products to Open Food Facts :-) <br />
* Accessibility ([[Accessibility/Blind_people|Blindness]],…)<br />
*[[Project:Community portal|Community portal]]<br />
*[[Project:Contribute Back|Contribute back]]<br />
*[[Project:Diets|Diets]]<br />
*[[Structured Data]] ([[Structured Data/Wikidata|Wikidata linking]])<br />
*[[Gamification/Roadmap|Gamifying OFF]]<br />
* Experiments: [[Experiments/Microwave|Microwaves]], [[Experiments/Google Glass|AR]] and [[Experiments/3D|3D]]<br />
*[[Barcodes]] ([[Barcodes/Non Standard Barcodes|Non Standard Barcodes]], [[Barcodes/Blacklist|Blacklist]], [[Barcodes/False positives|False positives]], [[Barcodes/Countries|Countries]])<br />
*[[OCR]]<br />
*[[Project:Public Data|Public data]]<br />
*[[Project:Roadmap|Roadmap]]<br />
*[[Project:EU Project Citizen Observatories]]<br />
*[[Project:Ingredients ontology|Ingredients ontology]]<br />
*[[Project:Food additives|Food additives]]<br />
*[[Project:Multilingual products|Multilingual products]]<br />
*[[Project:Product versions and history|Product versions and history]]<br />
*[[Project:Product issues dropdown list|Product issues dropdown list]]<br />
}}<br />
<br />
|}</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Template:Date&diff=19725Template:Date2023-06-13T18:13:08Z<p>Vaiton: From https://en.wikipedia.org/wiki/Template:Date</p>
<hr />
<div>{{safesubst:<noinclude/>#switch:none<br />
|{{safesubst:<noinclude/>#iferror: {{safesubst:<noinclude/>#time:Y_M_d|{{{1|}}} }} | none }} <noinclude><!-- #time: can't handle --></noinclude><br />
|{{safesubst:<noinclude/>#iferror: {{safesubst:<noinclude/>#expr: {{{1|}}}+0 }}<br />
|<noinclude><!--not a pure number--></noinclude><br />
|{{safesubst:<noinclude/>#ifexpr: {{{1|}}}+0 > 10000000000000<br />
|<noinclude><!-- a yyyymmddhhmmss timestamp --></noinclude><br />
|{{safesubst:<noinclude/>#ifeq: {{safesubst:<noinclude/>#expr:{{{1|}}}+0}} | {{{1|}}}<br />
| none <noinclude><!-- pure number eg 123.456 --></noinclude><br />
| <noinclude><!-- assume yy-mm-dd --></noinclude><br />
}}<br />
}}<br />
}}<br />
|{{safesubst:<noinclude/>#switch: {{safesubst:<noinclude/>lc:{{{2|}}}}} | none | asis | link | lnone =none }}<br />
|{{safesubst:<noinclude/>#ifexpr: {{safesubst:<noinclude/>#time:Y|{{{1|}}} }} < 1000 | none }}<br />
|{{safesubst:<noinclude/>#switch: {{safesubst:<noinclude/>#time:Ynj|{{{1|}}} }}|100031|110031|130031|140031|150031=none}}<br />
|= {{safesubst:<noinclude/>#if:{{{1|}}}<br />
|{{safesubst:<noinclude/>#switch:{{{2}}}<br />
|link|lnone|l=[[{{{1}}}]]<br />
|{{{1}}}<br />
}}<br />
}}<noinclude><!-- error or "none", so no formatting --></noinclude><br />
|<noinclude><!-- continue with formatting --></noinclude><br />
{{safesubst:<noinclude/>#ifeq:<noinclude><!--<br />
--></noinclude>{{safesubst:<noinclude/>#time:Y|{{{1}}} 2008}}<noinclude><!--<br />
--></noinclude>{{safesubst:<noinclude/>#iferror: {{safesubst:<noinclude/>#ifexpr: {{{1}}}>10000000000000 | no }} | }}<noinclude><!--<br />
--></noinclude>{{safesubst:<noinclude/>#time:Y|{{{1}}} 2004}}<br />
|20082004<br />
|<noinclude><!-- no year --></noinclude><br />
{{safesubst:<noinclude/>#ifeq:{{safesubst:<noinclude/>#time:d|{{{1}}} 2036}}|{{safesubst:<noinclude/>#time:d|{{{1}}} }}<br />
|<noinclude><!-- month+day --></noinclude>{{safesubst:<noinclude/>#time:<br />
{{safesubst:<noinclude/>#switch: {{safesubst:<noinclude/>lc: {{safesubst:<noinclude/>#ifeq:{{{3|}}}|y|L}}{{{2|}}} }}<br />
| lmdy | liso | lymd = [[:F j]]<br />
| mdy | iso | ymd = F j<br />
| ldmy | l = [[:j F]]<br />
| #default = j F<br />
}}|{{{1}}} 2000 }}<noinclude><!-- default='dmy' or null or "" or unsupported option --></noinclude><br />
|<noinclude><!-- month only --></noinclude>{{safesubst:<noinclude/>#time:<br />
{{safesubst:<noinclude/>#switch: {{safesubst:<noinclude/>lc: {{safesubst:<noinclude/>#ifeq:{{{3|}}}|y|L}}{{{2|}}} }}<br />
| lmdy | liso | lymd <br />
| ldmy | l = [[F]]<br />
| #default = F<br />
}}|{{{1}}} 2000 }}<noinclude><!-- default='dmy'/'mdy'/'ymd'/'iso'/null/""/unsupported opt --></noinclude><br />
}}<br />
|<noinclude><!-- with year--></noinclude><br />
{{safesubst:<noinclude/>#if: {{safesubst:<noinclude/>#iferror:{{safesubst:<noinclude/>#time:j|2 {{{1|}}}}}|*D*|{{safesubst:<noinclude/>#iferror:{{safesubst:<noinclude/>#time:j|2000 {{{1|}}}}}|*D*| }}}}<br />
|<noinclude><!-- day+month+year --></noinclude>{{safesubst:<noinclude/>#time:<br />
{{safesubst:<noinclude/>#switch: {{safesubst:<noinclude/>lc: {{safesubst:<noinclude/>#ifeq:{{{3|}}}|y|L}}{{{2|}}} }}<br />
| lmdy = [[:F j]], [[Y]]<br />
| mdy = F j, Y<br />
| liso = [[Y|Y-]][[F j|m-d]]<noinclude><!-- i.e. [[Y-m-d]] --></noinclude><br />
| iso = Y-m-d<br />
| lymd = [[Y]] [[:F j]]<br />
| ymd = Y F j<br />
| ldmy | l = [[:j F]] [[Y]]<br />
| #default = j F Y<br />
}}|{{{1|}}} }}<noinclude><!-- #default='dmy' or null or "" or unsupported option --></noinclude><br />
|<noinclude><!-- month+year --></noinclude>{{safesubst:<noinclude/>#time:<br />
{{safesubst:<noinclude/>#switch: {{safesubst:<noinclude/>lc: {{safesubst:<noinclude/>#ifeq:{{{3|}}}|y|L}}{{{2|}}} }}<br />
| lmdy | liso | lymd | ldmy | l = [[:F Y]]<br />
| #default = F Y<br />
}}|{{{1|}}} }}<noinclude><!-- default='dmy'/'iso'/'mdy'/null/""/unsupported option --></noinclude><br />
}}<br />
}} <br />
}}<noinclude><br />
{{documentation}}<br />
</noinclude></div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Template:Box&diff=19724Template:Box2023-06-13T18:10:13Z<p>Vaiton: </p>
<hr />
<div><div><br />
{| width="100%"<br />
! style="border:0px;background-color:#F7F7F7;text-align:left;font-weight: normal;padding: 0em;" |<br />
<div><br />
{| width="100%"<br />
! style="border:0px;background-color:black;background:black;color:#fff;font-size: 1.4em;padding:0.3em;" | {{{1}}}<br />
|}<br />
</div><br />
<div style="padding-left:0.5rem">{{{2}}}</div><br />
|}<br />
</div></div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Project:SvelteKit_Frontend&diff=19631Project:SvelteKit Frontend2023-06-04T13:30:38Z<p>Vaiton: /* Editing products */</p>
<hr />
<div>=== Introduction ===<br />
I (VaiTon) started the project to try to build a prototype of frontend, completely decoupled from the backend. <br />
<br />
This way, we could (one day hopefully) iterate much more quicker on the frontend side of things and use the latest javascript technology available (TypeScript, Vite, ESM, etc...).<br />
<br />
For the prototype I chose [https://kit.svelte.dev/ SvelteKit].<br />
<br />
=== Development ===<br />
* GitHub Repository: https://github.com/VaiTon/openfoodfacts-explorer<br />
* Deployment: https://openfoodfacts-explorer.vercel.app/<br />
<br />
=== Logging in ===<br />
<br />
==== Security concerns ====<br />
As we still don't have an OpenID compatible way of logging in, at the moment the web app stores the user credential in the <code>localStorage</code>, which is UNSAFE as it is exposed to XSS attacks. Another way would be serving the project from a subdomain, but we're not there yet.<br />
<br />
==== How to ====<br />
To ''log in'' (there is not really a log in, more like sending credentials with every request), go to https://openfoodfacts-explorer.vercel.app/settings and enter your credentials.<br />
<br />
=== Editing products ===<br />
'''You need to be logged in to edit products! See the [[SvelteKit Frontend#Logging in|''Logging in'' section]] for more information.'''<br />
<br />
* Open the product page you'd like to edit<br />
* Click on the "edit" button</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Project:SvelteKit_Frontend&diff=19630Project:SvelteKit Frontend2023-06-04T13:28:58Z<p>Vaiton: </p>
<hr />
<div>=== Introduction ===<br />
I (VaiTon) started the project to try to build a prototype of frontend, completely decoupled from the backend. <br />
<br />
This way, we could (one day hopefully) iterate much more quicker on the frontend side of things and use the latest javascript technology available (TypeScript, Vite, ESM, etc...).<br />
<br />
For the prototype I chose [https://kit.svelte.dev/ SvelteKit].<br />
<br />
=== Development ===<br />
* GitHub Repository: https://github.com/VaiTon/openfoodfacts-explorer<br />
* Deployment: https://openfoodfacts-explorer.vercel.app/<br />
<br />
=== Logging in ===<br />
<br />
==== Security concerns ====<br />
As we still don't have an OpenID compatible way of logging in, at the moment the web app stores the user credential in the <code>localStorage</code>, which is UNSAFE as it is exposed to XSS attacks. Another way would be serving the project from a subdomain, but we're not there yet.<br />
<br />
==== How to ====<br />
To ''log in'' (there is not really a log in, more like sending credentials with every request), go to https://openfoodfacts-explorer.vercel.app/settings and enter your credentials.<br />
<br />
=== Editing products ===<br />
<br />
* Open the product page you'd like to edit<br />
* Click on the "edit" button</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Project:SvelteKit_Frontend&diff=19629Project:SvelteKit Frontend2023-06-04T13:25:02Z<p>Vaiton: </p>
<hr />
<div>=== Introduction ===<br />
I (VaiTon) started the project to try to build a prototype of frontend, completely decoupled from the backend. <br />
<br />
This way, we could (one day hopefully) iterate much more quicker on the frontend side of things and use the latest javascript technology available (TypeScript, Vite, ESM, etc...).<br />
<br />
For the prototype I chose [https://kit.svelte.dev/ SvelteKit].<br />
<br />
=== Development ===<br />
* GitHub Repository: https://github.com/VaiTon/openfoodfacts-explorer<br />
* Deployment: https://openfoodfacts-explorer.vercel.app/</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Project:SvelteKit_Frontend&diff=19628Project:SvelteKit Frontend2023-06-04T13:24:35Z<p>Vaiton: </p>
<hr />
<div>=== Introduction ===<br />
I started the project to try to build a prototype of frontend, completely decoupled from the backend. This way, we could (one day hopefully) iterate much more quicker on the frontend side of things and use the latest javascript technology available (TypeScript, Vite, ESM, etc...).<br />
<br />
For the prototype I chose [https://kit.svelte.dev/ SvelteKit].<br />
<br />
=== Development ===<br />
* GitHub Repository: https://github.com/VaiTon/openfoodfacts-explorer<br />
* Deployment: https://openfoodfacts-explorer.vercel.app/</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Project:SvelteKit_Frontend&diff=19627Project:SvelteKit Frontend2023-06-04T13:24:19Z<p>Vaiton: Created page with "== Introduction I started the project to try to build a prototype of frontend, completely decoupled from the backend. This way, we could (one day hopefully) iterate much more..."</p>
<hr />
<div>== Introduction<br />
<br />
I started the project to try to build a prototype of frontend, completely decoupled from the backend. This way, we could (one day hopefully) iterate much more quicker on the frontend side of things and use the latest javascript technology available (TypeScript, Vite, ESM, etc...).<br />
<br />
For the prototype I chose [https://kit.svelte.dev/ SvelteKit].<br />
<br />
== Development<br />
* GitHub Repository: https://github.com/VaiTon/openfoodfacts-explorer<br />
* Deployment: https://openfoodfacts-explorer.vercel.app/</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Events&diff=19413Events2023-04-06T18:06:20Z<p>Vaiton: </p>
<hr />
<div>=== Community Calendar ===<br />
* [https://calendar.google.com/calendar/embed?src=c_9d0e7fc68f19f64fd91f60ac1936a0364750ec868272cefeb57464dba0ef906c%40group.calendar.google.com&ctz=Europe%2FParis Calendar web] (with a button for Google Calendar users)<br />
* [https://calendar.google.com/calendar/ical/c_9d0e7fc68f19f64fd91f60ac1936a0364750ec868272cefeb57464dba0ef906c%40group.calendar.google.com/public/basic.ics Calendar iCal] (right click to copy this URL, and use "Add by URL" in your favorite Calendar app.<br />
<br />
=== Upcoming events ===<br />
* [[Events/Presentation Kit]]<br />
* [[Events/Upcoming]]<br />
Note: To make a calendar event public, invite <code>c_9d0e7fc68f19f64fd91f60ac1936a0364750ec868272cefeb57464dba0ef906c@group.calendar.google.com</code></div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Metrics&diff=18830Metrics2023-01-09T15:55:11Z<p>Vaiton: Added code tags for literals</p>
<hr />
<div>An InfluxDB/Grafana stack has been set up to allow Open Food Facts team to be able to follow essential metrics. The dashboards can be viewed at https://metrics.openfoodfacts.org. <br />
<br />
There is a read-only account, you can access the credentials on Slack to have access to it. <br />
<br />
Metrics is different from monitoring (https://monitoring.openfoodfacts.org), we don't store on metrics.openfoodfacts.org infrastructure-related data.<br />
<br />
We have a single [https://en.wikipedia.org/wiki/InfluxDB InfluxDB] bucket (=similar to SQL database) ''<code>off_metrics</code>''. There are two measurements (=similar to SQL table): ''<code>facets</code>'' and ''<code>insights</code>''.<br />
<br />
=== <code>insights</code> ===<br />
<br />
Save metrics about Robotoff <code>product_insight</code> PostgreSQL table. The export is performed daily at night time by Robotoff.<br />
<br />
Columns:<br />
* <code>annotation</code>: annotation status of the insight, either 0, -1, 1 or <nil>.<br />
* <code>automatic_processing</code>: whether the insight will be (or has been) automatically processed, either "True" or "False".<br />
* <code>predictor</code>: the predictor of the insight (=model or method that generated the insight)<br />
* <code>reserved_barcode</code>: either "False" or "True", if True the product barcode is a reserved barcode, mostly used for variable weight products<br />
* <code>type</code>: the insight type, see [https://github.com/openfoodfacts/robotoff/blob/9598d29cc2a23b802ef6eff1c7c154607a6ccc93/robotoff/types.py#L51 InsightType] class in Robotoff codebase for a complete list.<br />
* <code>count</code>: the number of insights with the previous characteristics.<br />
* <code>percent</code>: the % of insights with the previous characteristics, over the total number of insights.<br />
<br />
=== <code>facets</code> ===<br />
Save metrics about Product Opener facets, using public facet API. The export is performed daily at night time by Robotoff by calling Product Opener API.<br />
<br />
Current saved facets:<br />
<br />
* <code>ingredients-analysis</code><br />
* <code>data-quality</code><br />
* <code>ingredients</code><br />
* <code>states</code><br />
* <code>misc</code><br />
<br />
Columns:<br />
<br />
* <code>country</code>: the ISO 2-letter code of the country (ISO_3166-1 alpha-2), or "world" for metrics on the full database. Only a selected subset of country is available.<br />
* <code>facet</code>: the name of the facet, it's the lower-case facet name with '-' replaced with '_' (ex: `data_quality` instead of `data-quality`)<br />
* <code>tag_name</code>: name of the tag<br />
* <code>tag_id</code>: identifier of the tag (ex: <code>en:alcoholic-beverages-category-without-alcohol-value</code>), this is the field you will probably have to use<br />
* <code>products</code>: number of products with the given tag<br />
* <code>percent</code>: % of products with the given tag over the total number of product for the country</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Folksonomy/Property/conservation:date_type&diff=17548Folksonomy/Property/conservation:date type2021-11-12T22:39:13Z<p>Vaiton: </p>
<hr />
<div>Type of shelf life date for the product:<br />
<br />
* '''sell-by''' : the product needs to be sold '''no later than''' the date printed on the packaging.<br />
* '''use-by''' : the product needs to be consumed '''no later than''' the date printed on the packaging.<br />
* '''best-before''': the product can be sold or consumed '''after''' the date printed on the packaging.<br />
<br />
==== France: ====<br />
<br />
* A consommer avant = '''use-by''' (la vente n'est plus non plus possible après cette date)<br />
* A consommer de préférence avant = '''best-before'''<br />
<br />
==== Italy: ====<br />
<br />
* Da consumare entro = '''use-by'''<br />
* Da consumare preferibilmente entro = '''best-before'''<br />
<br />
[https://fr.openfoodfacts.org/property/conservation:date_type List products with this tag]</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Tech_Team&diff=17281Tech Team2021-09-05T14:46:17Z<p>Vaiton: </p>
<hr />
<div>The Open Food Facts software is developed collaboratively by hackers from all around the world. <br />
<br />
All developement happens on '''GitHub''': https://github.com/openfoodfacts/<br />
<br />
We have a lot of development work to do:<br />
<br />
=== Project we're working on ===<br />
* Server backend (Perl and MongoDB);<br />
* Web site (HTML5, JS, Foundation, within the backend code as templates);<br />
* iOS native (Swift);<br />
* Android native (Kotlin);<br />
* Robotoff, our machine learning service (Python);<br />
* Hunger Games, our annotation web app (VueJS);<br />
* Our various SDKs (Python, Ruby, Dart, PHP…);<br />
* ''... your idea ...''<br />
<br />
=== Topics you can work on ===<br />
*[https://github.com/openfoodfacts/openfoodfacts-androidapp/issues/4169 Android app (Kotlin)]<br />
*[https://github.com/openfoodfacts/openfoodfacts-ios/issues/912 iPhone app (Swift)]<br />
*[https://github.com/openfoodfacts/smooth-app/issues/525 Flutter app (Dart)]<br />
*[https://github.com/openfoodfacts/openfoodfacts-dart/issues/218 Dart package]<br />
*[https://github.com/openfoodfacts/api-documentation/issues/23 API Documentation (Familiarity with APIs, good pedagogy and writing skills)]<br />
*[https://github.com/openfoodfacts/robotoff/issues/374 Robotoff (Python)]<br />
*[https://github.com/openfoodfacts/openfoodfacts-server/issues/5529 Server (HTML,CSS, JS + Perl)]<br />
*[https://github.com/openfoodfacts/openfoodfacts-hungergames/issues/234 Hunger Games (VueJS)]<br />
<br />
''Software development page on the website: https://world.openfoodfacts.org/development''<br />
<br />
== Needs ==<br />
<br />
There is many issues, categorized by topics, see:<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/issues Website, backend and API issues]<br />
** For beginners see [https://github.com/openfoodfacts/openfoodfacts-server/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22 First Good Issue] category<br />
** For those who love i18n see [https://github.com/openfoodfacts/openfoodfacts-server/issues?q=is%3Aopen+is%3Aissue+label%3Ai18n translations] category<br />
** See [https://github.com/openfoodfacts/openfoodfacts-server/labels all the categories]<br />
* [https://github.com/openfoodfacts/openfoodfacts-androidapp/issues Android app issues]<br />
* [https://github.com/openfoodfacts/openfoodfacts-ios/issues iOS app issues]<br />
* [https://github.com/openfoodfacts/openfoodfacts-ai/issues Open Food Facts AI issues]<br />
<br />
== Principles ==<br />
<br />
Our goal is to follow and keep few and simple guidelines.<br />
<br />
# '''Discuss the topics or issues or functionalities you want to work on'''. The [http://slack.openfoodfacts.org/ slack workspace] is the best choice for it.<br />
# If not already done, '''open an issue''' on Github to explain the problem you want to solve or the functionality you want to work on.<br />
# If you want to work on an existing issue, '''tell everyone in the issue's Github comments'''.<br />
# Fork the project and '''create one branch per issue or functionality you want to work on'''.<br />
#* It's cool to name a branch: ''<code>issue/[issue_number]-[name]</code>''; ex.: ''<code>issue/1630-name-of-the-issue</code>''<br />
#* When you're ready to propose something, send a '''Pull Request'''. Be patient, sometimes it takes time to the core team to review PRs.<br />
# The '''coding style''' is defined in the <code>[https://github.com/openfoodfacts/openfoodfacts-server/blob/master/.editorconfig .editorconfig]</code> file. Many editors support EditorConfig, check yours: https://editorconfig.org<br />
<br />
== Inspirations ==<br />
<br />
* https://www.mediawiki.org/wiki/How_to_contribute<br />
* Inspirations from https://www.mediawiki.org/wiki/How_to_become_a_MediaWiki_hacker<br />
* Wikimedia makes a difference between:<br />
** policies, what people MUST do: https://www.mediawiki.org/wiki/Development_policy<br />
** guidelines, what people SHOULD do: https://www.mediawiki.org/wiki/Development_guideline</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Tech_Team&diff=17280Tech Team2021-09-05T14:46:02Z<p>Vaiton: </p>
<hr />
<div>The Open Food Facts software is developed collaboratively by hackers from all around the world. <br />
<br />
All developement happens on '''GitHub''': https://github.com/openfoodfacts/<br />
<br />
We have a lot of development work to do:<br />
<br />
=== Project we're working on: ===<br />
* Server backend (Perl and MongoDB);<br />
* Web site (HTML5, JS, Foundation, within the backend code as templates);<br />
* iOS native (Swift);<br />
* Android native (Kotlin);<br />
* Robotoff, our machine learning service (Python);<br />
* Hunger Games, our annotation web app (VueJS);<br />
* Our various SDKs (Python, Ruby, Dart, PHP…);<br />
* ''... your idea ...''<br />
<br />
=== Topics you can work on ===<br />
*[https://github.com/openfoodfacts/openfoodfacts-androidapp/issues/4169 Android app (Kotlin)]<br />
*[https://github.com/openfoodfacts/openfoodfacts-ios/issues/912 iPhone app (Swift)]<br />
*[https://github.com/openfoodfacts/smooth-app/issues/525 Flutter app (Dart)]<br />
*[https://github.com/openfoodfacts/openfoodfacts-dart/issues/218 Dart package]<br />
*[https://github.com/openfoodfacts/api-documentation/issues/23 API Documentation (Familiarity with APIs, good pedagogy and writing skills)]<br />
*[https://github.com/openfoodfacts/robotoff/issues/374 Robotoff (Python)]<br />
*[https://github.com/openfoodfacts/openfoodfacts-server/issues/5529 Server (HTML,CSS, JS + Perl)]<br />
*[https://github.com/openfoodfacts/openfoodfacts-hungergames/issues/234 Hunger Games (VueJS)]<br />
<br />
''Software development page on the website: https://world.openfoodfacts.org/development''<br />
<br />
== Needs ==<br />
<br />
There is many issues, categorized by topics, see:<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/issues Website, backend and API issues]<br />
** For beginners see [https://github.com/openfoodfacts/openfoodfacts-server/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22 First Good Issue] category<br />
** For those who love i18n see [https://github.com/openfoodfacts/openfoodfacts-server/issues?q=is%3Aopen+is%3Aissue+label%3Ai18n translations] category<br />
** See [https://github.com/openfoodfacts/openfoodfacts-server/labels all the categories]<br />
* [https://github.com/openfoodfacts/openfoodfacts-androidapp/issues Android app issues]<br />
* [https://github.com/openfoodfacts/openfoodfacts-ios/issues iOS app issues]<br />
* [https://github.com/openfoodfacts/openfoodfacts-ai/issues Open Food Facts AI issues]<br />
<br />
== Principles ==<br />
<br />
Our goal is to follow and keep few and simple guidelines.<br />
<br />
# '''Discuss the topics or issues or functionalities you want to work on'''. The [http://slack.openfoodfacts.org/ slack workspace] is the best choice for it.<br />
# If not already done, '''open an issue''' on Github to explain the problem you want to solve or the functionality you want to work on.<br />
# If you want to work on an existing issue, '''tell everyone in the issue's Github comments'''.<br />
# Fork the project and '''create one branch per issue or functionality you want to work on'''.<br />
#* It's cool to name a branch: ''<code>issue/[issue_number]-[name]</code>''; ex.: ''<code>issue/1630-name-of-the-issue</code>''<br />
#* When you're ready to propose something, send a '''Pull Request'''. Be patient, sometimes it takes time to the core team to review PRs.<br />
# The '''coding style''' is defined in the <code>[https://github.com/openfoodfacts/openfoodfacts-server/blob/master/.editorconfig .editorconfig]</code> file. Many editors support EditorConfig, check yours: https://editorconfig.org<br />
<br />
== Inspirations ==<br />
<br />
* https://www.mediawiki.org/wiki/How_to_contribute<br />
* Inspirations from https://www.mediawiki.org/wiki/How_to_become_a_MediaWiki_hacker<br />
* Wikimedia makes a difference between:<br />
** policies, what people MUST do: https://www.mediawiki.org/wiki/Development_policy<br />
** guidelines, what people SHOULD do: https://www.mediawiki.org/wiki/Development_guideline</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Nutrients_handling_in_Open_Food_Facts&diff=15402Nutrients handling in Open Food Facts2020-06-03T10:35:22Z<p>Vaiton: /* Data display */</p>
<hr />
<div>== Summary ==<br />
<br />
This page describes how nutrients are stored in Open Food Facts and how they can be read or written through the API.<br />
<br />
== Why it's more complex that you might think ==<br />
<br />
* Nutrients lists are different depending on countries<br />
* Nutrients list are different depending on time (evolutions in the law)<br />
** e.g. in 2013 in Europe, the main unit for energy became kJ instead of kcal, and salt replaced sodium, with salt = 2.5 x sodium<br />
* Nutrients on labels may be in different units<br />
** e.g. sodium could be listed in mg or in g<br />
** US uses calories (kcal), EU uses kJ + kcal<br />
* Nutrients may be specified per 100g, per 100ml (which may be different than per 100g), per serving, or both<br />
* Nutrients may be specified for the product sold as-is, or prepared (with water, milk or something else), or both<br />
* Some apps, producers, databases etc. may give us values in a specific unit which is not the one that is on the label<br />
<br />
== How it works ==<br />
<br />
=== Data input ===<br />
<br />
==== Fields sent to the write API ====<br />
<br />
Apps (+ the OFF web site edit form) send:<br />
<br />
* <code>nutrition_data_per</code>: <code>100g</code> or <code>serving</code><br />
* <code>serving_size</code>: (optional, but very useful, in particular if the nutrition facts are specified per serving)<br />
* For each nutrient:<br />
** <code>{nutrient-id}</code> (e.g. <code>saturated-fat</code>, <code>energy-kcal</code>): value for the nutrient, for the size specified in the field <code>nutrition_data_per</code>. This is a string made of the modifier ("<", ">" or "") and the value without unit ("17.8", "34,7", "< 0.1", etc).<br />
** <code>{nutrient-id}_unit</code> (e.g. saturated-fat_unit, energy-kcal_unit): the unit of the value passed (e.g. "g", "mg", "kcal", "kJ", "%", "")<br />
<br />
Notes about the energy fields:<br />
* Energy on labels can be written in kcal, kJ or both<br />
* When the energy is written in both, there is no universally defined conversion ratio between kcal and kJ.<br />
** This is because labelling laws in EU, US, CA etc. specify that the energy fields can (or must) be computed by multiplying and summing values for carbohydrates, proteins, fat etc.<br />
** That's why we now store 2 energy fields, and not just one<br />
** See https://esha.com/calorie-calculation-country/ for details<br />
* <code>energy-kj</code> and <code>energy-kcal</code> are the identifiers (<code>{nutrient-id}</code>) of the "Energy in kJ" and "Energy in kcal" fields.<br />
* Old apps used to pass energy (as we had only one energy field instead of energy-kcal + energy-kj)<br />
** For those apps, the <code>energy_unit</code> field is used to populate the corresponding <code>energy-kj</code> or <code>energy-kcal</code> field<br />
<br />
==== Fields entered and computed by the OFF backend (Product Opener) ====<br />
<br />
* <code>{nutrient-id}_value</code>: what was entered and passed in the nutrient-id field.<br />
* <code>{nutrient-id}_unit</code>: what was entered and passed in the nutrient-id_unit field.<br />
* <code>{nutrient-id}</code>: the value converted in the default unit (currently kJ for all energy fields (including energy-kcal), otherwise gram).<br />
* <code>{nutrient-id}_(100g|serving)</code>: is set to <code>{nutrient-id}</code> (e.g. if <code>nutrition_data_per = 100g</code>, the value of <code>sugars_100g</code> is set to the value of sugars.<br />
* If the serving size is known, we compute the value for the other field (nutrient-id_100g or nutrient-id_serving) in default unit.<br />
<br />
=== Data display ===<br />
<br />
The OFF web site, and apps, '''should only use these OFF processed fields''' to display the nutrition data:<br />
<br />
* <code>{nutrient-id}_100g</code> or <code>{nutrient-id}_serving</code> (depending on the value of the value of <code>nutrition_data_per</code>): value in g or in kJ. The values are passed as float/double???<br />
* <code>{nutrient-id}_modifier</code> to get the value modifier ("<", ">", "~")<br />
* <code>{nutrient-id}_value</code>: to show the original entered/passed data.<br />
<br />
The web site and apps '''must''':<br />
* Indicate if the nutrition facts are per 100g or per serving.<br />
* Convert the value from g or kJ to the desired unit.<br />
<br />
Notes:<br />
* Don't use the <code>{nutrient-id}_value</code> and <code>{nutrient-id}_unit</code> fields<br />
** The <code>{nutrient-id}</code> may be empty as some apps don't pass a unit, and we use a default unit for the field<br />
** The value may be per 100g or per serving<br />
<br />
=== Data edit ===<br />
<br />
The web site and apps that allow editing the nutrition facts must populate the table with the same rules than for data display.<br />
<br />
(What does this mean? only allow editing of the off processed field)???<br />
<br />
== Possible improvements to make things (a bit) simpler ==<br />
<br />
* In the API, rename the <code>{nutrient-id}</code> fields (such as <code>energy-kj</code>, <code>saturated-fat</code>) to <code>{nutrient-id}_value</code>, so that it matches the name of the field stored. It also makes clearer where the value is coded.<br />
* Store the <code>energy-kcal</code> values in kcal, without converting them to kJ<br />
** This is probably what people intuitively expect<br />
** It removes unnecessary conversions from kcal to kJ and back (which is not trivial, as some people/apps may choose a different conversion factor, such as 4.2 or 4.185)<br />
** This would be a breaking change if some apps use the energy-kcal_100g/serving or energy-kj_100g/serving fields<br />
* Expose only the recommended fields (see [[Nutrients_handling_in_Open_Food_Facts#Data_display|data display]])<br />
<br />
== Possible improvements to make things (a bit) more complex ==<br />
<br />
The current API does not allow to store values for the prepared product, but it can be done on the OFF web site.<br />
<br />
We should extend the API to allow to write nutrition facts for the prepared product.<br />
<br />
The fields for the prepared product are the same than for the as-sold product, except "_prepared" is appended to the nutrient-id.<br />
<br />
e.g. saturated-fat_prepared_100g, saturated-fat_prepared_value etc.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Nutrients_handling_in_Open_Food_Facts&diff=15401Nutrients handling in Open Food Facts2020-06-03T10:33:49Z<p>Vaiton: /* Possible improvements to make things (a bit) simpler */</p>
<hr />
<div>== Summary ==<br />
<br />
This page describes how nutrients are stored in Open Food Facts and how they can be read or written through the API.<br />
<br />
== Why it's more complex that you might think ==<br />
<br />
* Nutrients lists are different depending on countries<br />
* Nutrients list are different depending on time (evolutions in the law)<br />
** e.g. in 2013 in Europe, the main unit for energy became kJ instead of kcal, and salt replaced sodium, with salt = 2.5 x sodium<br />
* Nutrients on labels may be in different units<br />
** e.g. sodium could be listed in mg or in g<br />
** US uses calories (kcal), EU uses kJ + kcal<br />
* Nutrients may be specified per 100g, per 100ml (which may be different than per 100g), per serving, or both<br />
* Nutrients may be specified for the product sold as-is, or prepared (with water, milk or something else), or both<br />
* Some apps, producers, databases etc. may give us values in a specific unit which is not the one that is on the label<br />
<br />
== How it works ==<br />
<br />
=== Data input ===<br />
<br />
==== Fields sent to the write API ====<br />
<br />
Apps (+ the OFF web site edit form) send:<br />
<br />
* <code>nutrition_data_per</code>: <code>100g</code> or <code>serving</code><br />
* <code>serving_size</code>: (optional, but very useful, in particular if the nutrition facts are specified per serving)<br />
* For each nutrient:<br />
** <code>{nutrient-id}</code> (e.g. <code>saturated-fat</code>, <code>energy-kcal</code>): value for the nutrient, for the size specified in the field <code>nutrition_data_per</code>. This is a string made of the modifier ("<", ">" or "") and the value without unit ("17.8", "34,7", "< 0.1", etc).<br />
** <code>{nutrient-id}_unit</code> (e.g. saturated-fat_unit, energy-kcal_unit): the unit of the value passed (e.g. "g", "mg", "kcal", "kJ", "%", "")<br />
<br />
Notes about the energy fields:<br />
* Energy on labels can be written in kcal, kJ or both<br />
* When the energy is written in both, there is no universally defined conversion ratio between kcal and kJ.<br />
** This is because labelling laws in EU, US, CA etc. specify that the energy fields can (or must) be computed by multiplying and summing values for carbohydrates, proteins, fat etc.<br />
** That's why we now store 2 energy fields, and not just one<br />
** See https://esha.com/calorie-calculation-country/ for details<br />
* <code>energy-kj</code> and <code>energy-kcal</code> are the identifiers (<code>{nutrient-id}</code>) of the "Energy in kJ" and "Energy in kcal" fields.<br />
* Old apps used to pass energy (as we had only one energy field instead of energy-kcal + energy-kj)<br />
** For those apps, the <code>energy_unit</code> field is used to populate the corresponding <code>energy-kj</code> or <code>energy-kcal</code> field<br />
<br />
==== Fields entered and computed by the OFF backend (Product Opener) ====<br />
<br />
* <code>{nutrient-id}_value</code>: what was entered and passed in the nutrient-id field.<br />
* <code>{nutrient-id}_unit</code>: what was entered and passed in the nutrient-id_unit field.<br />
* <code>{nutrient-id}</code>: the value converted in the default unit (currently kJ for all energy fields (including energy-kcal), otherwise gram).<br />
* <code>{nutrient-id}_(100g|serving)</code>: is set to <code>{nutrient-id}</code> (e.g. if <code>nutrition_data_per = 100g</code>, the value of <code>sugars_100g</code> is set to the value of sugars.<br />
* If the serving size is known, we compute the value for the other field (nutrient-id_100g or nutrient-id_serving) in default unit.<br />
<br />
=== Data display ===<br />
<br />
The OFF web site, and apps, '''should only use these OFF processed fields''' to display the nutrition data:<br />
<br />
* <code>{nutrient-id}_100g</code> or <code>{nutrient-id}_serving</code> (depending on the value of nutrition_data_per): value in g or in kJ. The values are passed as float/double???<br />
* <code>{nutrient-id}_value</code>: to show the original entered/passed data (useful for characters as "<" or "~").<br />
<br />
The web site and apps '''must''':<br />
* Indicate if the nutrition facts are per 100g or per serving.<br />
* Convert the value from g or kJ to the desired unit.<br />
<br />
Notes:<br />
* Don't use the <code>{nutrient-id}_value</code> and <code>{nutrient-id}_unit</code> fields<br />
** The <code>{nutrient-id}</code> may be empty as some apps don't pass a unit, and we use a default unit for the field<br />
** The value may be per 100g or per serving<br />
<br />
=== Data edit ===<br />
<br />
The web site and apps that allow editing the nutrition facts must populate the table with the same rules than for data display.<br />
<br />
(What does this mean? only allow editing of the off processed field)???<br />
<br />
== Possible improvements to make things (a bit) simpler ==<br />
<br />
* In the API, rename the <code>{nutrient-id}</code> fields (such as <code>energy-kj</code>, <code>saturated-fat</code>) to <code>{nutrient-id}_value</code>, so that it matches the name of the field stored. It also makes clearer where the value is coded.<br />
* Store the <code>energy-kcal</code> values in kcal, without converting them to kJ<br />
** This is probably what people intuitively expect<br />
** It removes unnecessary conversions from kcal to kJ and back (which is not trivial, as some people/apps may choose a different conversion factor, such as 4.2 or 4.185)<br />
** This would be a breaking change if some apps use the energy-kcal_100g/serving or energy-kj_100g/serving fields<br />
* Expose only the recommended fields (see [[Nutrients_handling_in_Open_Food_Facts#Data_display|data display]])<br />
<br />
== Possible improvements to make things (a bit) more complex ==<br />
<br />
The current API does not allow to store values for the prepared product, but it can be done on the OFF web site.<br />
<br />
We should extend the API to allow to write nutrition facts for the prepared product.<br />
<br />
The fields for the prepared product are the same than for the as-sold product, except "_prepared" is appended to the nutrient-id.<br />
<br />
e.g. saturated-fat_prepared_100g, saturated-fat_prepared_value etc.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Nutrients_handling_in_Open_Food_Facts&diff=15393Nutrients handling in Open Food Facts2020-06-02T12:50:26Z<p>Vaiton: /* Fields sent to the write API */</p>
<hr />
<div>== Summary ==<br />
<br />
This page describes how nutrients are stored in Open Food Facts and how they can be read or written through the API.<br />
<br />
== Why it's more complex that you might think ==<br />
<br />
* Nutrients lists are different depending on countries<br />
* Nutrients list are different depending on time (evolutions in the law)<br />
** e.g. in 2013 in Europe, the main unit for energy became kJ instead of kcal, and salt replaced sodium, with salt = 2.5 x sodium<br />
* Nutrients on labels may be in different units<br />
** e.g. sodium could be listed in mg or in g<br />
** US uses calories (kcal), EU uses kJ + kcal<br />
* Nutrients may be specified per 100g, per 100ml (which may be different than per 100g), per serving, or both<br />
* Nutrients may be specified for the product sold as-is, or prepared (with water, milk or something else), or both<br />
* Some apps, producers, databases etc. may give us values in a specific unit which is not the one that is on the label<br />
<br />
== How it works ==<br />
<br />
=== Data input ===<br />
<br />
==== Fields sent to the write API ====<br />
<br />
Apps (+ the OFF web site edit form) send:<br />
<br />
* <code>nutrition_data_per</code>: <code>100g</code> or <code>serving</code><br />
* <code>serving_size</code>: (optional, but very useful, in particular if the nutrition facts are specified per serving)<br />
* For each nutrient:<br />
** <code>{nutrient-id}</code> (e.g. <code>saturated-fat</code>, <code>energy-kcal</code>): value for the nutrient, for the size specified in the field <code>nutrition_data_per</code>. This is a string made of the modifier ("<", ">" or "") and the value without unit ("17.8", "34,7", "< 0.1", etc).<br />
** <code>{nutrient-id}_unit</code> (e.g. saturated-fat_unit, energy-kcal_unit): the unit of the value passed (e.g. "g", "mg", "kcal", "kJ", "%", "")<br />
<br />
Notes about the energy fields:<br />
* Energy on labels can be written in kcal, kJ or both<br />
* When the energy is written in both, there is no universally defined conversion ratio between kcal and kJ.<br />
** This is because labelling laws in EU, US, CA etc. specify that the energy fields can (or must) be computed by multiplying and summing values for carbohydrates, proteins, fat etc.<br />
** That's why we now store 2 energy fields, and not just one<br />
** See https://esha.com/calorie-calculation-country/ for details<br />
* <code>energy-kj</code> and <code>energy-kcal</code> are the identifiers (<code>{nutrient-id}</code>) of the "Energy in kJ" and "Energy in kcal" fields.<br />
* Old apps used to pass energy (as we had only one energy field instead of energy-kcal + energy-kj)<br />
** For those apps, the <code>energy_unit</code> field is used to populate the corresponding <code>energy-kj</code> or <code>energy-kcal</code> field<br />
<br />
==== Fields entered and computed by the OFF backend (Product Opener) ====<br />
<br />
* <code>{nutrient-id}_value</code>: what was entered and passed in the nutrient-id field.<br />
* <code>{nutrient-id}_unit</code>: what was entered and passed in the nutrient-id_unit field.<br />
* <code>{nutrient-id}</code>: the value converted in the default unit (currently kJ for all energy fields (including energy-kcal), otherwise gram).<br />
* <code>{nutrient-id}_(100g|serving)</code>: is set to <code>{nutrient-id}</code> (e.g. if <code>nutrition_data_per = 100g</code>, the value of <code>sugars_100g</code> is set to the value of sugars.<br />
* If the serving size is known, we compute the value for the other field (nutrient-id_100g or nutrient-id_serving) in default unit.<br />
<br />
=== Data display ===<br />
<br />
The OFF web site, and apps, '''should only use these OFF processed fields''' to display the nutrition data:<br />
<br />
* <code>{nutrient-id}_100g</code> or <code>{nutrient-id}_serving</code> (depending on the value of nutrition_data_per): value in g or in kJ. The values are passed as float/double???<br />
* <code>{nutrient-id}_value</code>: to show the original entered/passed data (useful for characters as "<" or "~").<br />
<br />
The web site and apps '''must''':<br />
* Indicate if the nutrition facts are per 100g or per serving.<br />
* Convert the value from g or kJ to the desired unit.<br />
<br />
Notes:<br />
* Don't use the <code>{nutrient-id}_value</code> and <code>{nutrient-id}_unit</code> fields<br />
** The <code>{nutrient-id}</code> may be empty as some apps don't pass a unit, and we use a default unit for the field<br />
** The value may be per 100g or per serving<br />
<br />
=== Data edit ===<br />
<br />
The web site and apps that allow editing the nutrition facts must populate the table with the same rules than for data display.<br />
<br />
(What does this mean? only allow editing of the off processed field)???<br />
<br />
== Possible improvements to make things (a bit) simpler ==<br />
<br />
* In the API, rename the "nutrient-id" fields (such as energy-kj, saturated-fat) to "nutrient-id_value", so that it matches the name of the field stored. It also makes clearer where the value is coded.<br />
* Store the energy-kcal values in kcal, without converting them to kJ<br />
** This is probably what people intuitively expect<br />
** It removes unnecessary conversions from kcal to kJ and back (which is not trivial, as some people/apps may choose a different conversion factor, such as 4.2 or 4.185)<br />
** This would be a breaking change if some apps use the energy-kcal_100g/serving or energy-kj_100g/serving fields<br />
<br />
== Possible improvements to make things (a bit) more complex ==<br />
<br />
The current API does not allow to store values for the prepared product, but it can be done on the OFF web site.<br />
<br />
We should extend the API to allow to write nutrition facts for the prepared product.<br />
<br />
The fields for the prepared product are the same than for the as-sold product, except "_prepared" is appended to the nutrient-id.<br />
<br />
e.g. saturated-fat_prepared_100g, saturated-fat_prepared_value etc.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Nutrients_handling_in_Open_Food_Facts&diff=15392Nutrients handling in Open Food Facts2020-06-02T12:49:06Z<p>Vaiton: </p>
<hr />
<div>== Summary ==<br />
<br />
This page describes how nutrients are stored in Open Food Facts and how they can be read or written through the API.<br />
<br />
== Why it's more complex that you might think ==<br />
<br />
* Nutrients lists are different depending on countries<br />
* Nutrients list are different depending on time (evolutions in the law)<br />
** e.g. in 2013 in Europe, the main unit for energy became kJ instead of kcal, and salt replaced sodium, with salt = 2.5 x sodium<br />
* Nutrients on labels may be in different units<br />
** e.g. sodium could be listed in mg or in g<br />
** US uses calories (kcal), EU uses kJ + kcal<br />
* Nutrients may be specified per 100g, per 100ml (which may be different than per 100g), per serving, or both<br />
* Nutrients may be specified for the product sold as-is, or prepared (with water, milk or something else), or both<br />
* Some apps, producers, databases etc. may give us values in a specific unit which is not the one that is on the label<br />
<br />
== How it works ==<br />
<br />
=== Data input ===<br />
<br />
==== Fields sent to the write API ====<br />
<br />
Apps (+ the OFF web site edit form) send:<br />
<br />
* <code>nutrition_data_per</code>: <code>100g</code> or <code>serving</code><br />
* <code>serving_size</code>: (optional, but very useful, in particular if the nutrition facts are specified per serving)<br />
* for each nutrient:<br />
** <code>{nutrient-id}</code> (e.g. <code>saturated-fat</code>, <code>energy-kcal</code>): value for the nutrient, for the size specified in the field <code>nutrition_data_per</code>. This is a string made of the modifier ("<", ">" or "") and the value without unit ("17.8", "34,7", "< 0.1", etc).<br />
** <code>{nutrient-id}_unit</code> (e.g. saturated-fat_unit, energy-kcal_unit): the unit of the value passed (e.g. "g", "mg", "kcal", "kJ", "%", "")<br />
<br />
Notes about the energy fields:<br />
* Energy on labels can be written in kcal, kJ or both<br />
* When the energy is written in both, there is no universally defined conversion ratio between kcal and kJ.<br />
** This is because labelling laws in EU, US, CA etc. specify that the energy fields can (or must) be computed by multiplying and summing values for carbohydrates, proteins, fat etc.<br />
** That's why we now store 2 energy fields, and not just one<br />
** See https://esha.com/calorie-calculation-country/ for details<br />
* <code>energy-kj</code> and <code>energy-kcal</code> are the identifiers (<code>{nutrient-id}</code>) of the "Energy in kJ" and "Energy in kcal" fields.<br />
* Old apps used to pass energy (as we had only one energy field instead of energy-kcal + energy-kj)<br />
** For those apps, the <code>energy_unit</code> field is used to populate the corresponding <code>energy-kj</code> or <code>energy-kcal</code> field<br />
<br />
==== Fields entered and computed by the OFF backend (Product Opener) ====<br />
<br />
* <code>{nutrient-id}_value</code>: what was entered and passed in the nutrient-id field.<br />
* <code>{nutrient-id}_unit</code>: what was entered and passed in the nutrient-id_unit field.<br />
* <code>{nutrient-id}</code>: the value converted in the default unit (currently kJ for all energy fields (including energy-kcal), otherwise gram).<br />
* <code>{nutrient-id}_(100g|serving)</code>: is set to <code>{nutrient-id}</code> (e.g. if <code>nutrition_data_per = 100g</code>, the value of <code>sugars_100g</code> is set to the value of sugars.<br />
* If the serving size is known, we compute the value for the other field (nutrient-id_100g or nutrient-id_serving) in default unit.<br />
<br />
=== Data display ===<br />
<br />
The OFF web site, and apps, '''should only use these OFF processed fields''' to display the nutrition data:<br />
<br />
* <code>{nutrient-id}_100g</code> or <code>{nutrient-id}_serving</code> (depending on the value of nutrition_data_per): value in g or in kJ. The values are passed as float/double???<br />
* <code>{nutrient-id}_value</code>: to show the original entered/passed data (useful for characters as "<" or "~").<br />
<br />
The web site and apps '''must''':<br />
* Indicate if the nutrition facts are per 100g or per serving.<br />
* Convert the value from g or kJ to the desired unit.<br />
<br />
Notes:<br />
* Don't use the <code>{nutrient-id}_value</code> and <code>{nutrient-id}_unit</code> fields<br />
** The <code>{nutrient-id}</code> may be empty as some apps don't pass a unit, and we use a default unit for the field<br />
** The value may be per 100g or per serving<br />
<br />
=== Data edit ===<br />
<br />
The web site and apps that allow editing the nutrition facts must populate the table with the same rules than for data display.<br />
<br />
(What does this mean? only allow editing of the off processed field)???<br />
<br />
== Possible improvements to make things (a bit) simpler ==<br />
<br />
* In the API, rename the "nutrient-id" fields (such as energy-kj, saturated-fat) to "nutrient-id_value", so that it matches the name of the field stored. It also makes clearer where the value is coded.<br />
* Store the energy-kcal values in kcal, without converting them to kJ<br />
** This is probably what people intuitively expect<br />
** It removes unnecessary conversions from kcal to kJ and back (which is not trivial, as some people/apps may choose a different conversion factor, such as 4.2 or 4.185)<br />
** This would be a breaking change if some apps use the energy-kcal_100g/serving or energy-kj_100g/serving fields<br />
<br />
== Possible improvements to make things (a bit) more complex ==<br />
<br />
The current API does not allow to store values for the prepared product, but it can be done on the OFF web site.<br />
<br />
We should extend the API to allow to write nutrition facts for the prepared product.<br />
<br />
The fields for the prepared product are the same than for the as-sold product, except "_prepared" is appended to the nutrient-id.<br />
<br />
e.g. saturated-fat_prepared_100g, saturated-fat_prepared_value etc.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Nutrients_handling_in_Open_Food_Facts&diff=15391Nutrients handling in Open Food Facts2020-06-02T12:45:02Z<p>Vaiton: /* Fields entered and computed by the OFF backend (Product Opener) */</p>
<hr />
<div>== Summary ==<br />
<br />
This page describes how nutrients are stored in Open Food Facts and how they can be read or written through the API.<br />
<br />
== Why it's more complex that you might think ==<br />
<br />
* Nutrients lists are different depending on countries<br />
* Nutrients list are different depending on time (evolutions in the law)<br />
** e.g. in 2013 in Europe, the main unit for energy became kJ instead of kcal, and salt replaced sodium, with salt = 2.5 x sodium<br />
* Nutrients on labels may be in different units<br />
** e.g. sodium could be listed in mg or in g<br />
** US uses calories (kcal), EU uses kJ + kcal<br />
* Nutrients may be specified per 100g, per 100ml (which may be different than per 100g), per serving, or both<br />
* Nutrients may be specified for the product sold as-is, or prepared (with water, milk or something else), or both<br />
* Some apps, producers, databases etc. may give us values in a specific unit which is not the one that is on the label<br />
<br />
== How it works ==<br />
<br />
=== Data input ===<br />
<br />
==== Fields sent to the write API ====<br />
<br />
Apps (+ the OFF web site edit form) send:<br />
<br />
* <code>nutrition_data_per</code>: <code>100g</code> or <code>serving</code><br />
* <code>serving_size</code>: (optional, but very useful, in particular if the nutrition facts are specified per serving)<br />
* for each nutrient:<br />
** <code>{nutrient-id}</code> (e.g. <code>saturated-fat</code>, <code>energy-kcal</code>): value for the nutrient, for the size specified in the field <code>nutrition_data_per</code>. This is a string made of the modifier ("<", ">" or "") and the value without unit ("17.8", "34,7", "< 0.1", etc).<br />
** <code>{nutrient-id}_unit</code> (e.g. saturated-fat_unit, energy-kcal_unit): the unit of the value passed (e.g. "g", "mg", "kcal", "kJ", "%", "")<br />
<br />
Notes about the energy fields:<br />
* Energy on labels can be written in kcal, kJ or both<br />
* when the energy is written in both, there is no simple conversion ratio between kcal and kJ<br />
** This is because labelling laws in EU, US, CA etc. specify that the energy fields can (or must) be computed by multiplying and summing values for carbohydrates, proteins, fat etc.<br />
** That's why we now store 2 energy fields, and not just one<br />
** see https://esha.com/calorie-calculation-country/ for details<br />
* energy-kj and energy-kcal are the identifiers (nutrient-id) of the "Energy in kJ" and "Energy in kcal" fields.<br />
* old apps used to pass energy (as we had only one energy field instead of energy-kcal + energy-kj)<br />
** for those apps, the energy_unit field is used to populate the corresponding energy-kj or energy-kcal field<br />
<br />
==== Fields entered and computed by the OFF backend (Product Opener) ====<br />
<br />
* <code>{nutrient-id}_value</code>: what was entered and passed in the nutrient-id field.<br />
* <code>{nutrient-id}_unit</code>: what was entered and passed in the nutrient-id_unit field.<br />
* <code>{nutrient-id}</code>: the value converted in the default unit (currently kJ for all energy fields (including energy-kcal), otherwise gram).<br />
* <code>{nutrient-id}_(100g|serving)</code>: is set to <code>{nutrient-id}</code> (e.g. if <code>nutrition_data_per = 100g</code>, the value of <code>sugars_100g</code> is set to the value of sugars.<br />
* If the serving size is known, we compute the value for the other field (nutrient-id_100g or nutrient-id_serving) in default unit.<br />
<br />
=== Data display ===<br />
<br />
The OFF web site, and apps, should only use these OFF processed fields to display the nutrition data:<br />
<br />
* <code>{nutrient-id}_100g</code> or <code>{nutrient-id}_serving</code> (depending on the value of nutrition_data_per): value in g or in kJ. The values are passed as float/double???<br />
* <code>{nutrient-id}_value</code>: to show the original entered/passed data (useful for characters as "<" or "~").<br />
<br />
The web site and apps '''must''':<br />
* Indicate if the nutrition facts are per 100g or per serving.<br />
* Convert the value in g or in kJ to the desired unit.<br />
<br />
Notes:<br />
* Don't use the <code>{nutrient-id}_value</code> and <code>{nutrient-id}_unit</code> fields<br />
** The nutrient-id may be empty as some apps don't pass a unit, and we use a default unit for the field<br />
** The value may be per 100g or per serving<br />
<br />
=== Data edit ===<br />
<br />
The web site and apps that allow editing the nutrition facts must populate the table with the same rules than for data display.<br />
<br />
(What does this mean? only allow editing of the off processed field)???<br />
<br />
== Possible improvements to make thing (a bit) simpler ==<br />
<br />
* In the API, rename the "nutrient-id" fields (such as energy-kj, saturated-fat) to "nutrient-id_value", so that it matches the name of the field stored. It also makes clearer where the value is coded.<br />
* Store the energy-kcal values in kcal, without converting them to kJ<br />
** This is probably what people intuitively expect<br />
** It removes unnecessary conversions from kcal to kJ and back (which is not trivial, as some people/apps may choose a different conversion factor, such as 4.2 or 4.185)<br />
** This would be a breaking change if some apps use the energy-kcal_100g/serving or energy-kj_100g/serving fields<br />
<br />
== Possible improvements to make thing (a bit) more complex ==<br />
<br />
The current API does not allow to store values for the prepared product, but it can be done on the OFF web site.<br />
<br />
We should extend the API to allow to write nutrition facts for the prepared product.<br />
<br />
The fields for the prepared product are the same than for the as-sold product, except "_prepared" is appended to the nutrient-id.<br />
<br />
e.g. saturated-fat_prepared_100g, saturated-fat_prepared_value etc.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Nutrients_handling_in_Open_Food_Facts&diff=15390Nutrients handling in Open Food Facts2020-06-02T12:40:46Z<p>Vaiton: /* Data display */</p>
<hr />
<div>== Summary ==<br />
<br />
This page describes how nutrients are stored in Open Food Facts and how they can be read or written through the API.<br />
<br />
== Why it's more complex that you might think ==<br />
<br />
* Nutrients lists are different depending on countries<br />
* Nutrients list are different depending on time (evolutions in the law)<br />
** e.g. in 2013 in Europe, the main unit for energy became kJ instead of kcal, and salt replaced sodium, with salt = 2.5 x sodium<br />
* Nutrients on labels may be in different units<br />
** e.g. sodium could be listed in mg or in g<br />
** US uses calories (kcal), EU uses kJ + kcal<br />
* Nutrients may be specified per 100g, per 100ml (which may be different than per 100g), per serving, or both<br />
* Nutrients may be specified for the product sold as-is, or prepared (with water, milk or something else), or both<br />
* Some apps, producers, databases etc. may give us values in a specific unit which is not the one that is on the label<br />
<br />
== How it works ==<br />
<br />
=== Data input ===<br />
<br />
==== Fields sent to the write API ====<br />
<br />
Apps (+ the OFF web site edit form) send:<br />
<br />
* <code>nutrition_data_per</code>: <code>100g</code> or <code>serving</code><br />
* <code>serving_size</code>: (optional, but very useful, in particular if the nutrition facts are specified per serving)<br />
* for each nutrient:<br />
** <code>{nutrient-id}</code> (e.g. <code>saturated-fat</code>, <code>energy-kcal</code>): value for the nutrient, for the size specified in the field <code>nutrition_data_per</code>. This is a string made of the modifier ("<", ">" or "") and the value without unit ("17.8", "34,7", "< 0.1", etc).<br />
** <code>{nutrient-id}_unit</code> (e.g. saturated-fat_unit, energy-kcal_unit): the unit of the value passed (e.g. "g", "mg", "kcal", "kJ", "%", "")<br />
<br />
Notes about the energy fields:<br />
* Energy on labels can be written in kcal, kJ or both<br />
* when the energy is written in both, there is no simple conversion ratio between kcal and kJ<br />
** This is because labelling laws in EU, US, CA etc. specify that the energy fields can (or must) be computed by multiplying and summing values for carbohydrates, proteins, fat etc.<br />
** That's why we now store 2 energy fields, and not just one<br />
** see https://esha.com/calorie-calculation-country/ for details<br />
* energy-kj and energy-kcal are the identifiers (nutrient-id) of the "Energy in kJ" and "Energy in kcal" fields.<br />
* old apps used to pass energy (as we had only one energy field instead of energy-kcal + energy-kj)<br />
** for those apps, the energy_unit field is used to populate the corresponding energy-kj or energy-kcal field<br />
<br />
==== Fields entered and computed by the OFF backend (Product Opener) ====<br />
<br />
* nutrient-id_value : what was entered and passed in the nutrient-id field<br />
* nutrient-id_unit : what was entered and passed in the nutrient-id_unit field<br />
* nutrient-id : the value converted in the default unit (currently kJ for all energy fields (including energy-kcal), otherwise gram)<br />
* nutrient-id_[value of nutrition_data_per) is set to nutrient-id (e.g. if nutrition_data_per is "100g", the value of sugars_100g is set to the value of sugars<br />
* if the serving size is known, we compute the value for the other field (nutrient-id_100g or nutrient-id_serving) in default unit<br />
<br />
=== Data display ===<br />
<br />
The OFF web site, and apps, should only use these OFF processed fields to display the nutrition data:<br />
<br />
* <code>{nutrient-id}_100g</code> or <code>{nutrient-id}_serving</code> (depending on the value of nutrition_data_per): value in g or in kJ. The values are passed as float/double???<br />
* <code>{nutrient-id}_value</code>: to show the original entered/passed data (useful for characters as "<" or "~").<br />
<br />
The web site and apps '''must''':<br />
* Indicate if the nutrition facts are per 100g or per serving.<br />
* Convert the value in g or in kJ to the desired unit.<br />
<br />
Notes:<br />
* Don't use the <code>{nutrient-id}_value</code> and <code>{nutrient-id}_unit</code> fields<br />
** The nutrient-id may be empty as some apps don't pass a unit, and we use a default unit for the field<br />
** The value may be per 100g or per serving<br />
<br />
=== Data edit ===<br />
<br />
The web site and apps that allow editing the nutrition facts must populate the table with the same rules than for data display.<br />
<br />
(What does this mean? only allow editing of the off processed field)???<br />
<br />
== Possible improvements to make thing (a bit) simpler ==<br />
<br />
* In the API, rename the "nutrient-id" fields (such as energy-kj, saturated-fat) to "nutrient-id_value", so that it matches the name of the field stored. It also makes clearer where the value is coded.<br />
* Store the energy-kcal values in kcal, without converting them to kJ<br />
** This is probably what people intuitively expect<br />
** It removes unnecessary conversions from kcal to kJ and back (which is not trivial, as some people/apps may choose a different conversion factor, such as 4.2 or 4.185)<br />
** This would be a breaking change if some apps use the energy-kcal_100g/serving or energy-kj_100g/serving fields<br />
<br />
== Possible improvements to make thing (a bit) more complex ==<br />
<br />
The current API does not allow to store values for the prepared product, but it can be done on the OFF web site.<br />
<br />
We should extend the API to allow to write nutrition facts for the prepared product.<br />
<br />
The fields for the prepared product are the same than for the as-sold product, except "_prepared" is appended to the nutrient-id.<br />
<br />
e.g. saturated-fat_prepared_100g, saturated-fat_prepared_value etc.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Nutrients_handling_in_Open_Food_Facts&diff=15389Nutrients handling in Open Food Facts2020-06-02T12:38:40Z<p>Vaiton: /* Data display */</p>
<hr />
<div>== Summary ==<br />
<br />
This page describes how nutrients are stored in Open Food Facts and how they can be read or written through the API.<br />
<br />
== Why it's more complex that you might think ==<br />
<br />
* Nutrients lists are different depending on countries<br />
* Nutrients list are different depending on time (evolutions in the law)<br />
** e.g. in 2013 in Europe, the main unit for energy became kJ instead of kcal, and salt replaced sodium, with salt = 2.5 x sodium<br />
* Nutrients on labels may be in different units<br />
** e.g. sodium could be listed in mg or in g<br />
** US uses calories (kcal), EU uses kJ + kcal<br />
* Nutrients may be specified per 100g, per 100ml (which may be different than per 100g), per serving, or both<br />
* Nutrients may be specified for the product sold as-is, or prepared (with water, milk or something else), or both<br />
* Some apps, producers, databases etc. may give us values in a specific unit which is not the one that is on the label<br />
<br />
== How it works ==<br />
<br />
=== Data input ===<br />
<br />
==== Fields sent to the write API ====<br />
<br />
Apps (+ the OFF web site edit form) send:<br />
<br />
* <code>nutrition_data_per</code>: <code>100g</code> or <code>serving</code><br />
* <code>serving_size</code>: (optional, but very useful, in particular if the nutrition facts are specified per serving)<br />
* for each nutrient:<br />
** <code>{nutrient-id}</code> (e.g. <code>saturated-fat</code>, <code>energy-kcal</code>): value for the nutrient, for the size specified in the field <code>nutrition_data_per</code>. This is a string made of the modifier ("<", ">" or "") and the value without unit ("17.8", "34,7", "< 0.1", etc).<br />
** <code>{nutrient-id}_unit</code> (e.g. saturated-fat_unit, energy-kcal_unit): the unit of the value passed (e.g. "g", "mg", "kcal", "kJ", "%", "")<br />
<br />
Notes about the energy fields:<br />
* Energy on labels can be written in kcal, kJ or both<br />
* when the energy is written in both, there is no simple conversion ratio between kcal and kJ<br />
** This is because labelling laws in EU, US, CA etc. specify that the energy fields can (or must) be computed by multiplying and summing values for carbohydrates, proteins, fat etc.<br />
** That's why we now store 2 energy fields, and not just one<br />
** see https://esha.com/calorie-calculation-country/ for details<br />
* energy-kj and energy-kcal are the identifiers (nutrient-id) of the "Energy in kJ" and "Energy in kcal" fields.<br />
* old apps used to pass energy (as we had only one energy field instead of energy-kcal + energy-kj)<br />
** for those apps, the energy_unit field is used to populate the corresponding energy-kj or energy-kcal field<br />
<br />
==== Fields entered and computed by the OFF backend (Product Opener) ====<br />
<br />
* nutrient-id_value : what was entered and passed in the nutrient-id field<br />
* nutrient-id_unit : what was entered and passed in the nutrient-id_unit field<br />
* nutrient-id : the value converted in the default unit (currently kJ for all energy fields (including energy-kcal), otherwise gram)<br />
* nutrient-id_[value of nutrition_data_per) is set to nutrient-id (e.g. if nutrition_data_per is "100g", the value of sugars_100g is set to the value of sugars<br />
* if the serving size is known, we compute the value for the other field (nutrient-id_100g or nutrient-id_serving) in default unit<br />
<br />
=== Data display ===<br />
<br />
The OFF web site, and apps, should only use these OFF processed fields to display the nutrition data:<br />
<br />
* <code>{nutrient-id}_100g</code> or <code>{nutrient-id}_serving</code> (depending on the value of nutrition_data_per): value in g or in kJ. The values are passed as float/double???<br />
* <code>{nutrient-id}_value</code>: to show the original entered/passed data (useful for characters as "<" or "~").<br />
<br />
The web site and apps '''must''':<br />
* Indicate if the nutrition facts are per 100g or per serving.<br />
* Convert the value in g or in kJ to the desired unit.<br />
<br />
Notes:<br />
* Don't use the nutrient-id_value and nutrient-id_unit fields<br />
** The nutrient-id may be empty as some apps don't pass a unit, and we use a default unit for the field<br />
** The value may be per 100g or per serving<br />
<br />
=== Data edit ===<br />
<br />
The web site and apps that allow editing the nutrition facts must populate the table with the same rules than for data display.<br />
<br />
(What does this mean? only allow editing of the off processed field)???<br />
<br />
== Possible improvements to make thing (a bit) simpler ==<br />
<br />
* In the API, rename the "nutrient-id" fields (such as energy-kj, saturated-fat) to "nutrient-id_value", so that it matches the name of the field stored. It also makes clearer where the value is coded.<br />
* Store the energy-kcal values in kcal, without converting them to kJ<br />
** This is probably what people intuitively expect<br />
** It removes unnecessary conversions from kcal to kJ and back (which is not trivial, as some people/apps may choose a different conversion factor, such as 4.2 or 4.185)<br />
** This would be a breaking change if some apps use the energy-kcal_100g/serving or energy-kj_100g/serving fields<br />
<br />
== Possible improvements to make thing (a bit) more complex ==<br />
<br />
The current API does not allow to store values for the prepared product, but it can be done on the OFF web site.<br />
<br />
We should extend the API to allow to write nutrition facts for the prepared product.<br />
<br />
The fields for the prepared product are the same than for the as-sold product, except "_prepared" is appended to the nutrient-id.<br />
<br />
e.g. saturated-fat_prepared_100g, saturated-fat_prepared_value etc.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Nutrients_handling_in_Open_Food_Facts&diff=15388Nutrients handling in Open Food Facts2020-06-02T12:34:51Z<p>Vaiton: /* Fields sent by the write API */</p>
<hr />
<div>== Summary ==<br />
<br />
This page describes how nutrients are stored in Open Food Facts and how they can be read or written through the API.<br />
<br />
== Why it's more complex that you might think ==<br />
<br />
* Nutrients lists are different depending on countries<br />
* Nutrients list are different depending on time (evolutions in the law)<br />
** e.g. in 2013 in Europe, the main unit for energy became kJ instead of kcal, and salt replaced sodium, with salt = 2.5 x sodium<br />
* Nutrients on labels may be in different units<br />
** e.g. sodium could be listed in mg or in g<br />
** US uses calories (kcal), EU uses kJ + kcal<br />
* Nutrients may be specified per 100g, per 100ml (which may be different than per 100g), per serving, or both<br />
* Nutrients may be specified for the product sold as-is, or prepared (with water, milk or something else), or both<br />
* Some apps, producers, databases etc. may give us values in a specific unit which is not the one that is on the label<br />
<br />
== How it works ==<br />
<br />
=== Data input ===<br />
<br />
==== Fields sent to the write API ====<br />
<br />
Apps (+ the OFF web site edit form) send:<br />
<br />
* <code>nutrition_data_per</code>: <code>100g</code> or <code>serving</code><br />
* <code>serving_size</code>: (optional, but very useful, in particular if the nutrition facts are specified per serving)<br />
* for each nutrient:<br />
** <code>{nutrient-id}</code> (e.g. <code>saturated-fat</code>, <code>energy-kcal</code>): value for the nutrient, for the size specified in the field <code>nutrition_data_per</code>. This is a string made of the modifier ("<", ">" or "") and the value without unit ("17.8", "34,7", "< 0.1", etc).<br />
** <code>{nutrient-id}_unit</code> (e.g. saturated-fat_unit, energy-kcal_unit): the unit of the value passed (e.g. "g", "mg", "kcal", "kJ", "%", "")<br />
<br />
Notes about the energy fields:<br />
* Energy on labels can be written in kcal, kJ or both<br />
* when the energy is written in both, there is no simple conversion ratio between kcal and kJ<br />
** This is because labelling laws in EU, US, CA etc. specify that the energy fields can (or must) be computed by multiplying and summing values for carbohydrates, proteins, fat etc.<br />
** That's why we now store 2 energy fields, and not just one<br />
** see https://esha.com/calorie-calculation-country/ for details<br />
* energy-kj and energy-kcal are the identifiers (nutrient-id) of the "Energy in kJ" and "Energy in kcal" fields.<br />
* old apps used to pass energy (as we had only one energy field instead of energy-kcal + energy-kj)<br />
** for those apps, the energy_unit field is used to populate the corresponding energy-kj or energy-kcal field<br />
<br />
==== Fields entered and computed by the OFF backend (Product Opener) ====<br />
<br />
* nutrient-id_value : what was entered and passed in the nutrient-id field<br />
* nutrient-id_unit : what was entered and passed in the nutrient-id_unit field<br />
* nutrient-id : the value converted in the default unit (currently kJ for all energy fields (including energy-kcal), otherwise gram)<br />
* nutrient-id_[value of nutrition_data_per) is set to nutrient-id (e.g. if nutrition_data_per is "100g", the value of sugars_100g is set to the value of sugars<br />
* if the serving size is known, we compute the value for the other field (nutrient-id_100g or nutrient-id_serving) in default unit<br />
<br />
=== Data display ===<br />
<br />
The OFF web site, and apps, should only use these OFF proocessed fields to display the nutrition data:<br />
<br />
* nutrient-id_100g or nutrient-id_serving (depending on the value of nutrition_data_per) : value in g or in kJ. The values are passed as float/double???<br />
* nutrient-id_value : to show the original entered/passed data (useful for characters as "<" or "~"}.<br />
<br />
The web site and apps must:<br />
* indicate if the nutrition facts are per 100g or per serving.<br />
* convert the value in g or in kJ to the desired unit.<br />
<br />
Notes:<br />
* Don't use the nutrient-id_value and nutrient-id_unit fields<br />
** The nutrient-id may be empty as some apps don't pass a unit, and we use a default unit for the field<br />
** The value may be per 100g or per serving<br />
<br />
=== Data edit ===<br />
<br />
The web site and apps that allow editing the nutrition facts must populate the table with the same rules than for data display.<br />
<br />
(What does this mean? only allow editing of the off processed field)???<br />
<br />
== Possible improvements to make thing (a bit) simpler ==<br />
<br />
* In the API, rename the "nutrient-id" fields (such as energy-kj, saturated-fat) to "nutrient-id_value", so that it matches the name of the field stored. It also makes clearer where the value is coded.<br />
* Store the energy-kcal values in kcal, without converting them to kJ<br />
** This is probably what people intuitively expect<br />
** It removes unnecessary conversions from kcal to kJ and back (which is not trivial, as some people/apps may choose a different conversion factor, such as 4.2 or 4.185)<br />
** This would be a breaking change if some apps use the energy-kcal_100g/serving or energy-kj_100g/serving fields<br />
<br />
== Possible improvements to make thing (a bit) more complex ==<br />
<br />
The current API does not allow to store values for the prepared product, but it can be done on the OFF web site.<br />
<br />
We should extend the API to allow to write nutrition facts for the prepared product.<br />
<br />
The fields for the prepared product are the same than for the as-sold product, except "_prepared" is appended to the nutrient-id.<br />
<br />
e.g. saturated-fat_prepared_100g, saturated-fat_prepared_value etc.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Infrastructure&diff=15292Infrastructure2020-05-18T23:18:49Z<p>Vaiton: /* dev */</p>
<hr />
<div>[[Category:ProductOpener]]<br />
[[Category:Developer]]<br />
<br />
This page describes the hardware/software infrastructure for the Open Food Facts + Open Beauty Facts projects.<br />
<br />
== Infrastructure planning ==<br />
<br />
* Hardware needs: [[Infrastructure Planning]]<br />
<br />
== Current infrastructure ==<br />
<br />
=== off1 ===<br />
Dedicated free.org server:<br />
<br />
'''Hardware configuration:'''<br />
* Dell 1U R440 server (1 Xeon Silver 4110)<br />
* RAM: 64GB (DDR4@2666)<br />
* Disks:<br />
** 2x4 TB SATA HDD (hardware RAID1) : /srv<br />
** 2x14 TB SATA HDD (hardware RAID1) : /srv2 (images, imports)<br />
'''Running services:'''<br />
* OS: debian 9.5<br />
* 1 nginx reverse proxy to serve static files<br />
* 1 apache + mod_perl to generate dynamic pages + API<br />
** running 4 separate instances on different ports: OFF, OBF, OPFF, OPF<br />
<br />
=== off2 ===<br />
Dedicated free.org server:<br />
<br />
'''Hardware configuration:'''<br />
* Dell 1U R440 server (1 Xeon Silver 4110)<br />
* RAM: 64GB (DDR4@2666)<br />
* Disks:<br />
** 2x4 TB SATA HDD (hardware RAID1) : /srv<br />
** 2x14 TB SATA HDD (hardware RAID1) : /srv2 (images, imports)<br />
'''Running services:'''<br />
* OS: debian 9.5<br />
* 1 apache + mod_perl (not used)<br />
* 1 MongoDB (production)<br />
<br />
=== no name yet ===<br />
Dedicated OVH - soyoustart server (rented):<br />
<br />
'''Hardware configuration:'''<br />
* E3-SAT-1-32<br />
* Storage: SoftRaid 3x2To SATA<br />
* RAM: 32GB DDR3 1333 MHz<br />
* CPU: Xeon E3-1245v2 (4c/8th)<br />
'''Running services:'''<br />
* zammad (soon)<br />
* wiki (soon)<br />
<br />
=== dev ===<br />
Dedicated OVH - soyoustart server (rented):<br />
<br />
'''Hardware configuration:'''<br />
* Super Micro server (1 Xeon D-1520)<br />
* Storage: 4 x 2TB HDD, software RAID1 / /boot + LVM /srv /srv2<br />
* RAM: 32GB (DDR4@2666)<br />
* CPU: Xeon D-1520<br />
'''Running services:'''<br />
* OS: debian 9.8<br />
* 1 robotoff (dockerized)<br />
* 1 nginx reverse proxy<br />
* 1 apache + mod_perl (https://openfoodfacts.dev - auth: off / off)<br />
* 1 mongodb<br />
<br />
=== dev2 ===<br />
Dedicated server (self-hosted by [[User:Cquest|cquest]])<br />
<br />
'''Hardware configuration:'''<br />
* Dell R710 server (2U)<br />
* Storage (ZFS pool) with:<br />
** 6 x 2TB HITACHI HUS72402 (SAS)<br />
** 500GB Samsung 860 SSD: OS and 256GB read cache (L2ARC)<br />
** 16GB Intel Optane SSD: write journal (ZIL)<br />
* RAM: 96GB (DDR3@1333)<br />
* CPU: 2 Xeon X5675 = 12 cores @ 3.07GHz<br />
'''Running services:'''<br />
* OS: Proxmox 6 (debian 10 based)<br />
<br />
'''Network''':<br />
* uplink: optic fiber from OVH (1G down/500M up) with dedicated IPv4 and IPv6/72<br />
* ethernet 1Gbps (bonded for backup)<br />
* infiniband 40Gbps (proxmox cluster backbone + access to storage server)<br />
<br />
=== backup ===<br />
Shared storage server (self-hosted by [[User:Cquest|cquest]])<br />
<br />
'''Hardware configuration:'''<br />
* Supermicro storage server (4U)<br />
* Storage (ZFS pool) with:<br />
** 36 SAS bays (populated disks evolving with time are needs)<br />
** 1TB Samsung 860 SSD: OS and 256GB read cache (L2ARC)<br />
** 16GB Intel Optane SSD: write journal (ZIL)<br />
* RAM: 128GB<br />
* CPU: '''Running services:'''<br />
* OS: Proxmox 6 (debian 10 based)<br />
* Local NFS access from dev2 to /srv /srv2 backups (nghtly rsync + ZFS snapshots)<br />
* Proxmox CT/VM replication<br />
<br />
== History ==<br />
<br />
From 2012 to 2016, OFF and OBF have been running on part of an OVH server (also used for other purposes):<br />
* cat /etc/debian_version -> 6.0.10 (squeeze)<br />
* 1 apache 2.4 setup as reverse proxy to serve static files (manually built)<br />
* 1 apache 1.3 + mod_perl for OFF (manually built)<br />
* 1 apache 1.3 + mod_perl for OBF (manually built)<br />
* MongoDB 2.4.12 (installed from mongodb provided packages)<br />
<br />
From 2016 to 2018, 1 dedicated OVH server running:<br />
* 1 nginx reverse proxy to serve static files (installed with apt-get)<br />
* 1 apache 2.4 + mod_perl (installed with apt-get)<br />
** running two separate instances on different ports, 1 for OFF and 1 for OBF<br />
* 1 MongoDB<br />
<br />
== 2012-2016 server install log ==<br />
<br />
OFF and OBF have been hosted from 2012 to 2016 on a (now very old) OVH dedicated server that is also hosting other projects.<br />
On June 13th 2016, a new dedicated server has been ordered specifically for OFF and OBF.<br />
<br />
=== Hardware ===<br />
<br />
* E3-SAT-3 Intel Xeon E3 1245v2 4 c / 8 t 3.4 GHz+ 32 Go 2x 2 To SATA3 Soft 16* 40.00€ HT (SOIT 48.00€ TTC)<br />
* https://www.soyoustart.com/fr/offres/e3-sat-3.xml<br />
<br />
=== Server setup ===<br />
<br />
* Order server and pay.<br />
* Login to manager https://eu.soyoustart.com/manager<br />
* Install server<br />
** Debian 8.4 Stable Jessie<br />
<br />
=== Server configuration ===<br />
<br />
* uname -a<br />
** Linux ns3362784.ip-37-187-74.eu 3.14.32-xxxx-grs-ipv6-64 #7 SMP Wed Jan 27 18:05:09 CET 2016 x86_64 GNU/Linux<br />
* perl -v<br />
** This is perl 5, version 20, subversion 2 (v5.20.2) built for x86_64-linux-gnu-thread-multi<br />
<br />
==== Basic configuration ====<br />
<br />
* apt-get update<br />
* apt-get upgrade<br />
* apt-get install fail2ban<br />
* apt-get install sudo<br />
<br />
* apt-get install build-essential<br />
* apt-get install git<br />
<br />
<br />
==== Users ====<br />
<br />
* admin users with sudo access<br />
* off user<br />
<br />
==== IP failover ====<br />
<br />
1 ip failover for each service so that we can easily switch servers<br />
* OFF: 178.33.252.125<br />
* OBF: 178.33.104.169<br />
<br />
Add to /etc/network/interfaces :<br />
<br />
<pre><br />
<br />
post-up /sbin/ifconfig eth0:0 178.33.104.169 netmask 255.255.255.255 broadcast 178.33.104.169<br />
post-down /sbin/ifconfig eth0:0 down<br />
<br />
post-up /sbin/ifconfig eth0:1 178.33.252.125 netmask 255.255.255.255 broadcast 178.33.252.125<br />
post-down /sbin/ifconfig eth0:1 down<br />
</pre><br />
<br />
/etc/init.d/networking restart<br />
* [ ok ] Restarting networking (via systemctl): networking.service.<br />
<br />
==== DNS ====<br />
<br />
Product Opener needs a domain, with a A record for the domain itself and another wildcard A record for all subdomains.<br />
<br />
* openbeautyfacts.org. 0 A 178.33.104.169 <br />
* *.openbeautyfacts.org. 0 A 178.33.104.169<br />
<br />
For testing the new server, we will be using openfoodfacts.eu<br />
<br />
==== Product Opener dependencies ====<br />
<br />
===== exim =====<br />
<br />
* apt-get install exim4<br />
* dpkg-reconfigure exim4-config<br />
** Internet Site mail is sent by smtp <br />
** 127.0.0.1<br />
<br />
===== MongoDB =====<br />
<br />
See https://docs.mongodb.com/manual/tutorial/install-mongodb-on-debian/<br />
<br />
apt-get install mongodb<br />
<br />
MongoDB shell version: 2.4.10<br />
<br />
service mongod stop<br />
mv /var/lib/mongodb /home/mongodb<br />
<br />
vi /etc/mongod.conf<br />
<pre><br />
# dbPath: /var/lib/mongodb<br />
dbPath: /home/mongodb<br />
</pre><br />
<br />
service mongod start<br />
<br />
Stars with some warnings:<br />
<br />
<pre><br />
mongo<br />
MongoDB shell version: 3.2.7<br />
connecting to: test<br />
Server has startup warnings:<br />
2016-06-13T19:34:08.245+0200 I CONTROL [initandlisten]<br />
2016-06-13T19:34:08.246+0200 I CONTROL [initandlisten] ** WARNING: Cannot detect if NUMA interleaving is enabled. Failed to probe "/sys/devices/system/node/node1": Permission denied<br />
2016-06-13T19:34:08.246+0200 W CONTROL [initandlisten]<br />
2016-06-13T19:34:08.246+0200 W CONTROL [initandlisten] Failed to probe "/sys/kernel/mm/transparent_hugepage": Permission denied<br />
2016-06-13T19:34:08.246+0200 W CONTROL [initandlisten]<br />
2016-06-13T19:34:08.246+0200 W CONTROL [initandlisten] Failed to probe "/sys/kernel/mm/transparent_hugepage": Permission denied<br />
2016-06-13T19:34:08.246+0200 I CONTROL [initandlisten]<br />
</pre><br />
<br />
<br />
==== Apache / mod_perl and nginx ====<br />
<br />
Apache 2 + mod_perl serve the dynamically generated HTML pages from Product Opener.<br />
<br />
nginx is installed on port 80 as a reverse proxy. It serves the static files (images, JS, CSS etc.) and proxies the dynamic requests to the Apache server on another port.<br />
<br />
apt-get install apache2<br />
<br />
# stop apache in order to be able to install nginx (default port 80)<br />
service stop apache2<br />
<br />
apt-get install nginx<br />
<br />
===== nginx configuration =====<br />
<br />
<pre><br />
/etc/nginx/sites-available# more off<br />
##<br />
# You should look at the following URL's in order to grasp a solid understanding<br />
# of Nginx configuration files in order to fully unleash the power of Nginx.<br />
# https://wiki.nginx.org/Pitfalls<br />
# https://wiki.nginx.org/QuickStart<br />
# https://wiki.nginx.org/Configuration<br />
#<br />
# Generally, you will want to move this file somewhere, and start with a clean<br />
# file but keep this around for reference. Or just disable in sites-enabled.<br />
#<br />
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.<br />
##<br />
<br />
# Default server configuration<br />
#<br />
server {<br />
#listen 80 default_server;<br />
#listen [::]:80 default_server;<br />
<br />
server_name openfoodfacts.org *.openfoodfacts.org openfoodfacts.eu *.openfoodfacts.eu;<br />
<br />
# SSL configuration<br />
#<br />
# listen 443 ssl default_server;<br />
# listen [::]:443 ssl default_server;<br />
#<br />
# Self signed certs generated by the ssl-cert package<br />
# Don't use them in a production server!<br />
#<br />
# include snippets/snakeoil.conf;<br />
<br />
root /home/off/html;<br />
<br />
access_log /home/off/logs/nginx.access2.log;<br />
error_log /home/off/logs/nginx.error2.log;<br />
<br />
gzip on;<br />
gzip_min_length 1000;<br />
<br />
<br />
# Add index.php to the list if you are using PHP<br />
index index.html index.htm index.nginx-debian.html;<br />
<br />
location ~* \.(eot|ttf|woff|woff2)$ {<br />
add_header Access-Control-Allow-Origin *;<br />
}<br />
<br />
location ~ ^/images/products/ {<br />
add_header Link "<http://creativecommons.org/licenses/by-sa/3.0/>; rel='license'; title='CC-BY-SA 3.0'";<br />
}<br />
<br />
location ~ ^/(favicon.ico) {<br />
# First attempt to serve request as file, then<br />
# as directory, then fall back to displaying a 404.<br />
try_files $uri $uri/ =404;<br />
}<br />
<br />
<br />
location ~ ^/(images|js|rss|data|files|resources|foundation)/ {<br />
# First attempt to serve request as file, then<br />
# as directory, then fall back to displaying a 404.<br />
try_files $uri $uri/ =404;<br />
}<br />
<br />
location = /robots.txt {<br />
try_files $uri $uri/ =404;<br />
}<br />
<br />
location / {<br />
proxy_set_header Host $host;<br />
proxy_set_header X-Real-IP $remote_addr;<br />
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />
<br />
proxy_pass http://127.0.0.1:8001/cgi/display.pl?;<br />
}<br />
<br />
location /cgi/ {<br />
proxy_set_header Host $host;<br />
proxy_set_header X-Real-IP $remote_addr;<br />
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;<br />
proxy_pass http://127.0.0.1:8001;<br />
}<br />
<br />
# deny access to .htaccess files, if Apache's document root<br />
# concurs with nginx's one<br />
#<br />
#location ~ /\.ht {<br />
# deny all;<br />
#}<br />
}<br />
<br />
<br />
</pre><br />
<br />
/etc/nginx/sites-enabled# ln -s /etc/nginx/sites-available/off off<br />
rm default<br />
<br />
service nginx restart<br />
<br />
To check for errors:<br />
<br />
systemctl -l status nginx.service<br />
<br />
===== Apache configuration =====<br />
<br />
Note: imagemagick + mod_perl seems to crash Apache in the worker / event MPM, use prefork.<br />
<br />
remove event and then:<br />
<br />
/etc/apache2-off/mods-enabled# ln -s ../mods-available/mpm_prefork.conf mpm_prefork.conf<br />
/etc/apache2-off/mods-enabled# ln -s ../mods-available/mpm_prefork.load mpm_prefork.load<br />
<br />
Set the user to off<br />
<br />
vi /etc/apache2/envvars<br />
<br />
<pre><br />
#export APACHE_RUN_USER=www-data<br />
export APACHE_RUN_USER=off<br />
#export APACHE_RUN_GROUP=www-data<br />
export APACHE_RUN_GROUP=off<br />
</pre><br />
<br />
off.conf:<br />
<br />
<pre><br />
/etc/apache2/sites-available# cat off.conf<br />
# LoadModule perl_module modules/mod_perl.so<br />
<br />
PerlSwitches -I/home/off/lib<br />
<br />
PerlWarn On<br />
PerlRequire /home/off/lib/startup_apache2.pl<br />
<br />
<br />
# log the X-Forwarded-For IP address (the client ip) in access_log<br />
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy<br />
<br />
<Location /cgi><br />
SetHandler perl-script<br />
PerlResponseHandler ModPerl::Registry<br />
PerlOptions +ParseHeaders<br />
Options +ExecCGI<br />
Require all granted<br />
</Location><br />
<br />
<br />
<VirtualHost *><br />
DocumentRoot /home/off/html<br />
ServerName openfoodfacts.org<br />
ErrorLog /home/off/logs/error_log<br />
CustomLog /home/off/logs/access_log combined<br />
LogLevel warn<br />
ScriptAlias /cgi/ "/home/off/cgi/"<br />
<br />
<Directory /home/off/html><br />
Require all granted<br />
</Directory><br />
<br />
</VirtualHost><br />
<br />
PerlPostReadRequestHandler My::ProxyRemoteAddr<br />
<br />
</pre><br />
<br />
<br />
<pre><br />
/etc/apache2/sites-enabled# ls -lrt<br />
total 0<br />
lrwxrwxrwx 1 root root 35 Jun 13 22:12 000-default.conf -> ../sites-available/000-default.conf<br />
/etc/apache2/sites-enabled# rm 000-default.conf<br />
/etc/apache2/sites-enabled# ln -s ../sites-available/off.conf off.conf<br />
</pre><br />
<br />
Port 8001<br />
<br />
<pre><br />
<br />
/etc/apache2# vi ports.conf<br />
<br />
#Listen 80<br />
Listen 8001<br />
<br />
</pre><br />
<br />
service apache2 restart<br />
<br />
To check for errors:<br />
<br />
systemctl -l status apache2.service<br />
<br />
mkdir /home/off/logs<br />
<br />
<br />
Debugging:<br />
<br />
If Apache does not start, check the apache2 logs (e.g. for apache2-obf) :<br />
<br />
<pre><br />
/var/log/apache2-obf# tail -f error.log<br />
[Mon Jul 04 15:38:52.616689 2016] [perl:error] [pid 15197:tid 120373734786944] Can't locate /home/obf/cgi/startup_apache2.pl in @INC (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.20.2 /usr/local/share/perl/5.20.2 /usr/lib/x86_64-linux-gnu/perl5/5.20 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.20 /usr/share/perl/5.20 /usr/local/lib/site_perl . /etc/apache2-obf) at (eval 2) line 1.\n<br />
[Mon Jul 04 15:38:52.616762 2016] [perl:error] [pid 15197:tid 120373734786944] Can't load Perl file: /home/obf/cgi/startup_apache2.pl for server ns3362784.ip-37-187-74.eu:0, exiting...<br />
</pre><br />
<br />
-> forgot to create startup_apache2.pl, going to copy the one from off and change the path in it.<br />
<br />
More debugging:<br />
<br />
If mod_perl starts, it loads some modules from cgi/startup_apache2.pl, and may fail if some modules are missing.<br />
Check /home/obf/logs/error_log:<br />
<br />
<pre><br />
[Mon Jul 04 18:31:11.501044 2016] [perl:error] [pid 23498:tid 116442525869952] Can't locate Math/Random/Secure.pm in @INC (you may need to install the Math::Random::Secure module)<br />
</pre><br />
<br />
===== Running a 2nd Apache instance for OBF =====<br />
<br />
OFF and OBF share the same code (except some configuration in the Config.pm and SiteLang.pm modules), but the code is not made to run two separate servers.<br />
So we need two run two separate instances of Apache, one for OFF and one for OBF. This also allows to restart one but not the other, to run different versions of the code etc.<br />
<br />
Note: we use the off user for both OFF and OBF so that OBF can read and write in /home/off/users<br />
<br />
There is some support to run multiple Apache instances. Documentation is in /usr/share/doc/apache2/README.multiple-instances<br />
<br />
<pre><br />
sh /usr/share/doc/apache2/examples/setup-instance obf<br />
Setting up /etc/apache2-obf ...<br />
Setting up /etc/init.d/apache2-obf ...<br />
Setting up symlinks: a2enmod-obf a2dismod-obf a2ensite-obf a2dissite-obf a2enconf-obf a2disconf-obf apache2ctl-obf<br />
Setting up /etc/logrotate.d/apache2-obf and /var/log/apache2-obf ...<br />
<br />
</pre><br />
<br />
Configuration files for the new instance are in /etc/apache2-obf :<br />
<br />
* Copy and edit obf.conf:<br />
** /etc/apache2-obf/sites-available# cp off.conf obf.conf<br />
** vi obf.conf<br />
*** :%s/off/obf/g<br />
*** ServerName openbeautyfacts.org<br />
* /etc/apache2-obf/sites-enabled# ls -lrt off.conf<br />
* lrwxrwxrwx 1 root root 27 Jun 17 14:45 off.conf -> ../sites-available/off.conf<br />
* /etc/apache2-obf/sites-enabled# rm off.conf<br />
* /etc/apache2-obf/sites-enabled# ln -s ../sites-available/obf.conf obf.conf<br />
<br />
vi /etc/apache2-obf/envvars<br />
<br />
<pre><br />
#export APACHE_RUN_USER=www-data<br />
export APACHE_RUN_USER=off<br />
#export APACHE_RUN_GROUP=www-data<br />
export APACHE_RUN_GROUP=off<br />
</pre><br />
<br />
<br />
Port 8002<br />
<br />
<pre><br />
<br />
/etc/apache2-obf# vi ports.conf<br />
<br />
#Listen 80<br />
Listen 8002<br />
<br />
</pre><br />
<br />
<pre><br />
service apache2-obf start<br />
Failed to start apache2-obf.service: Unit apache2-obf.service failed to load: No such file or directory.<br />
<br />
Found solution in https://lists.debian.org/debian-apache/2016/03/msg00017.html<br />
<br />
systemctl enable apache2-obf<br />
Synchronizing state for apache2-obf.service with sysvinit using update-rc.d...<br />
Executing /usr/sbin/update-rc.d apache2-obf defaults<br />
Executing /usr/sbin/update-rc.d apache2-obf enable<br />
systemctl start apache2-obf<br />
<br />
</pre><br />
<br />
<br />
To check for errors:<br />
<br />
systemctl -l status apache2-obf.service<br />
<br />
mkdir /home/obf/logs<br />
<br />
<br />
===== Forwarding client IPs from nginx to Apache configuration =====<br />
<br />
in nginx config:<br />
<br />
Apache:<br />
<br />
install Apache2::Connection::XForwardedFor<br />
<br />
Can't find the mod_perl include dir (reason: path /usr/include/apache2 doesn't exist)<br />
<br />
-> just mkdir /usr/include/apache2 and reinstall module<br />
<br />
==== Product Opener ====<br />
<br />
===== Libraries =====<br />
<br />
* apt-get install zlib1g-dev<br />
<br />
====== GeoIP updatate ======<br />
<br />
The packaged geoip database installed through "apt-get install geoip-database" is very old, need to install one manually:<br />
<br />
<pre><br />
root@ns3362784:/home/obf/logs# apt-get install geoip-database<br />
Reading package lists... Done<br />
Building dependency tree<br />
Reading state information... Done<br />
geoip-database is already the newest version.<br />
The following packages were automatically installed and are no longer required:<br />
libasan0 libboost-dev libboost-filesystem1.55.0<br />
libboost-program-options1.55.0 libboost-system1.55.0 libboost-thread1.55.0<br />
libboost1.55-dev libgcc-4.8-dev libgoogle-perftools4 libpcrecpp0 libsnappy1<br />
libstdc++-4.8-dev libtcmalloc-minimal4 libunwind8 libv8-3.14.5<br />
Use 'apt-get autoremove' to remove them.<br />
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.<br />
root@ns3362784:/home/obf/logs# cd /usr/share/GeoIP/<br />
root@ns3362784:/usr/share/GeoIP# ls -lrt<br />
total 4900<br />
-rw-r--r-- 1 root root 1061883 Mar 17 2015 GeoIP.dat<br />
-rw-r--r-- 1 root root 3949299 Mar 17 2015 GeoIPv6.dat<br />
root@ns3362784:/usr/share/GeoIP# wget https://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz<br />
--2016-07-15 00:16:08-- https://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz<br />
Resolving geolite.maxmind.com (geolite.maxmind.com)... 2400:cb00:2048:1::6810:262f, 2400:cb00:2048:1::6810:252f, 104.16.38.47, ...<br />
Connecting to geolite.maxmind.com (geolite.maxmind.com)|2400:cb00:2048:1::6810:262f|:80... connected.<br />
HTTP request sent, awaiting response... 200 OK<br />
Length: 517602 (505K) [application/octet-stream]<br />
Saving to: ‘GeoIP.dat.gz’<br />
<br />
GeoIP.dat.gz 100%[=====================>] 505.47K --.-KB/s in 0.06s<br />
<br />
2016-07-15 00:16:08 (7.76 MB/s) - ‘GeoIP.dat.gz’ saved [517602/517602]<br />
<br />
root@ns3362784:/usr/share/GeoIP# gzip -d GeoIP.dat.gz<br />
gzip: GeoIP.dat already exists; do you wish to overwrite (y or n)? y<br />
root@ns3362784:/usr/share/GeoIP# ls -lrt<br />
total 4744<br />
-rw-r--r-- 1 root root 3949299 Mar 17 2015 GeoIPv6.dat<br />
-rw-r--r-- 1 root root 904073 Jul 6 19:50 GeoIP.dat<br />
</pre><br />
<br />
Make a symbolic link (Perl module seems to think the database is at /usr/local/share/GeoIP/GeoIP.dat )<br />
<br />
<pre><br />
ln -s /usr/share/GeoIP /usr/local/share/GeoIP<br />
</pre><br />
<br />
===== Perl modules =====<br />
<br />
apt-get install libwww-perl libimage-magick-perl libxml-encoding-perl libtext-unaccent-perl libmime-lite-perl libcache-memcached-fast-perl libjson-perl libclone-perl libgraphviz-perl libmime-lite-perl libcrypt-passwdmd5-perl libencode-detect-perl libgraphics-color-perl libbarcode-zbar-perl libxml-feedpp-perl libmongodb-perl liburi-find-perl libxml-simple-perl<br />
<br />
Some modules seem not to have Debian packages and must be built using CPAN:<br />
<br />
<pre><br />
cpan<br />
install URI::Escape::XS<br />
install Encode::Punycode<br />
install GraphViz2<br />
install HTML::Defang<br />
install Algorithm::CheckDigits<br />
install Geo::IP<br />
install Image::OCR::Tesseract<br />
install DateTime::Format::Mail<br />
install DateTime::Format::CLDR<br />
install DateTime::Locale<br />
</pre><br />
<br />
===== Symbolic links in lib directory =====<br />
<br />
ls -lrt |grep -- "->"<br />
<br />
Make sure all links are pointing to the right path.<br />
<br />
<pre><br />
/home/off/lib/ProductOpener# ln -s SiteLang_off.pm SiteLang.pm<br />
/home/off/lib/ProductOpener# ln -s Config_off.pm Config.pm<br />
<br />
/home/off/lib/ProductOpener# cp Config2_sample.pm Config2.pm<br />
-> put right values for server domain, home path, and mongodb database name<br />
<br />
/home/off/scripts# ln -s ../lib/ProductOpener ProductOpener<br />
<br />
</pre><br />
<br />
===== robots.txt =====<br />
<br />
Since we will run a copy of OFF on a separate domain, add a line to forbid robots completely.<br />
<br />
<pre><br />
/home/off/html# vi robots.txt<br />
User-agent: *<br />
Disallow: /<br />
Disallow: /cgi<br />
Disallow: /code<br />
~<br />
</pre><br />
<br />
<br />
===== Data =====<br />
<br />
* Copy data to new server<br />
** Populate Mongodb by running /home/off/cgi/update_all_products_from_dir_in_mongodb.pl<br />
* Copy images<br />
* Make sur permissions are correct<br />
** chown -R off deleted* html index ingredients lang invalid lists products users tmp<br />
<br />
<br />
===== MongoDB indexes =====<br />
<br />
Some basic indexes, needs to be revisited.<br />
https://github.com/openfoodfacts/openfoodfacts-server/issues/341<br />
<br />
<pre><br />
mongo<br />
use off<br />
<br />
<br />
db.products.createIndex( { code : 1 }, { background : true });<br />
db.products.createIndex( { unique_scans_n : -1 }, { background : true });<br />
db.products.createIndex( { sortkey : -1 }, { background : true });<br />
db.products.createIndex( { last_modified_t : -1 }, { background : true });<br />
<br />
db.products.createIndex( { created_t : 1 }, { background : true });<br />
db.products.createIndex( { lc : 1 }, { background : true });<br />
<br />
db.products.createIndex( { _keywords : 1, last_modified_t : -1 }, { background : true });<br />
db.products.createIndex( { _keywords : 1, sortkey : -1 }, { background : true });<br />
<br />
<br />
db.products.createIndex( { countries_tags : 1 , last_modified_t : -1 }, { background : true });<br />
<br />
db.products.createIndex( { countries_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { brands_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { categories_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { labels_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { packaging_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { origins_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { manufacturing_places_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { emb_codes_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { cities_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { ingredients_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { ingredients_from_palm_oil_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { vitamins_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { minerals_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { amino_acids_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { nucleotides_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { other_nutritional_substances_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { allergens_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { traces_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { nova_groups_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { nutrition_grades_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { misc_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { languages_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { users_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { editors_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { informers_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { correctors_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { checkers_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { photographers_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { states_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { entry_dates_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { last_edit_dates_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { purchase_places_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { stores_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { codes_tags : 1 , sortkey : -1 }, { background : true });<br />
db.products.createIndex( { debug_tags : 1 , sortkey : -1 }, { background : true });<br />
<br />
<br />
<br />
<br />
</pre><br />
<br />
===== Product opener debug =====<br />
<br />
Once Apache starts:<br />
<br />
/home/off/logs# tail -f error_log<br />
<br />
<pre><br />
[Fri Jun 17 14:51:34.123696 2016] [perl:error] [pid 18764:tid 117837813839616] [client 127.0.0.1:35749] Can't locate object method "remote_ip" via package "Apache2::Connection" at /home/off/cgi/startup.pl line 76.\n, referer: http://openfoodfacts.eu/<br />
</pre><br />
<br />
-> created startup_apache2.pl, loaded in off.conf<br />
<br />
<br />
===== Generate CSS and download dependencies =====<br />
<br />
<pre><br />
/srv/off/yarn install<br />
/srv/off/yarn run build<br />
</pre><br />
<br />
The commands above might fail if the correct versions of yarn and nodejs are not installed. To fix:<br />
<br />
<pre><br />
apt remove cmdtest<br />
apt remove yarn<br />
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -<br />
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list<br />
apt-get update<br />
apt-get install yarn<br />
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash -<br />
apt-get install -y nodejs<br />
yarn install<br />
yarn run build<br />
</pre><br />
<br />
==== Cron jobs ====<br />
<br />
User root:<br />
<br />
* # m h dom mon dow command<br />
* 0 10 * * * /home/scripts/lowdiskspace.pl<br />
* 0 15 * * * /home/scripts/mdstat.pl<br />
* 0 2 * * * /home/scripts/backup.sh<br />
* */45 * * * * wget -q -O /home/off/html/cestemballepresdechezvous.html https://fr.openfoodfacts.org/cgi/madenearyou.pl<br />
* */50 * * * * wget -q -O /home/off/html/madenearme-uk.html https://uk.openfoodfacts.org/cgi/madenearme.pl<br />
* */55 * * * * wget -q -O /home/off/html/madenearme.html https://world.openfoodfacts.org/cgi/madenearme.pl<br />
<br />
<br />
Need a ftp client for the OVH FTP backup space (100G) <br />
* apt-get install ftp<br />
<br />
install Filesys::DiskFree<br />
<br />
<br />
<br />
User obf:<br />
* 35 * * * * /home/obf/scripts/gen_feeds.sh > /dev/null<br />
* 15 4 * * * /home/obf/scripts/gen_feeds_daily.sh > /dev/null</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=API/Roadmap&diff=8858API/Roadmap2019-12-01T00:47:58Z<p>Vaiton: </p>
<hr />
<div>== API Redesign ==<br />
The API is far from perfect. It's been decided to fix the most urgent bugs, and start planning for a V2, more compliant with modern API standards.<br />
We need all the help we can get. Please join us on the #api channel.<br />
<br />
* [[Project:API:Additives]]<br />
* [[Project:API:States]]<br />
* [[Project:API:Statistics]]<br />
* [[Project:API:Statistics Entry Dates]]<br />
[[Category:API]][[Category:Roadmap]]</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=API&diff=8857API2019-12-01T00:47:35Z<p>Vaiton: </p>
<hr />
<div>[[Category:Developer]] [[Category:API]]<br />
<br />
== Introduction ==<br />
=== Notice for API users ===<br />
# You are very welcome to use the API for production cases, as long as '''1 API call = 1 real scan by a user'''.<br />
# <span style="color:#d33">'''If you need all the database, download it directly from the data page, do ''NOT'' scrape the API'''</span><br />
# Please tell us (contact@openfoodfacts.org or in the #API channel) what you build with the API, it's always great to see new reuses come to life :-)<br />
<br />
=== Before using the API ===<br />
* Some products are incomplete.<br />
* '''You should ensure your UX tells the final user that the product is not complete, encourage them to exercise caution and/or help complete the product.'''<br />
* When doing averages, computations... filter incomplete products to avoid issues.<br />
* Assume the data is not reliable until the product is marked as complete.<br />
* '''In general, ensure the user exercises caution (for allergens...) and be upfront about possible risks.'''<br />
* <span style="color:#d33">'''By using any part of the API you have read and understood the [[#License|license]].'''</span><br />
<br />
=== Current status of the API ===<br />
Currently, the API is used internally for the official Open Food Facts mobile applications (iOS, Android, Windows, and we need help!) and by hundreds of reuses on various topics (Nutrition, sport…) and platforms (iOS, Android...), but does not yet follow good practices in API design.<br />
<br />
It is also used by several applications and while not yet stable, doesn't change much.<br />
<br />
You can have a look at the source code of the apps ([[Mobile_App]])<br />
<br />
'''Anyone with Swagger (or equivalent knowledge) willing to help us document the API is most welcome :-)'''<br />
<br />
=== Getting help with the API ===<br />
You can ask for help on using the API in the [https://openfoodfacts.slack.com/messages/api/ #api channel on Slack]. Join us to discuss your use case and get help/code from other devs.<br />
<br />
== READ operations ==<br />
For more information, see [[API/Read]]<br />
<br />
=== Technical details ===<br />
* You can do READ operations using the production server.<br />
* You should use the SSL version of the API. <code>https://world.openfoodfacts.org</code><br />
* '''Please send a UserAgent HTTP Header''' with the name of the app/service querying, the version, system and a URL if you have one, so that you are not blocked by mistake (e.g. <code>UserAgent: CoolFoodApp - Android - Version 1.0 - https://coolfoodapp.com</code>)<br />
<br />
== WRITE operations ==<br />
For more information, see [[API/Write]]<br />
<br />
=== Use cases ===<br />
* You can add photos and information to Open Food Facts using the API. <br />
** Letting your users add new products by uploading photos is the most common use case.<br />
** Several apps already enable more advanced editing. Gamification would be welcome.<br />
* The official mobile apps can use some help.<br />
<br />
=== A few things ===<br />
* '''DO''' join the API channel if you intend on using WRITE<br />
* '''DO NOT''' send copyrighted photos or information using the API. Everything you send is OdBL for the data, and CC-BY-SA for the pictures. If those are not yours (eg from scraping), you bear all the legal consequences.<br />
* You can create a global account for your app if you don't want to implement Open Food Facts user creation in your app right now. Please report it in #api so that it can be monitored for errors.<br />
* You should do all your test edits on https://world.openfoodfacts.dev (ask for the password on Slack)<br />
<br />
=== Conventions for the API ===<br />
* fields that end with _t are dates in the UNIX timestamp format (number of seconds since Jan 1st 1970)<br />
* fields that end with _datetime are dates in the iso8601 format: yyyy-mm-ddThh:mn:ssZ<br />
* fields that end with _tags are comma separated list of tags (e.g. categories_tags is the set of normalized tags computer from the categories field)<br />
* fields that end with a language 2 letter code (e.g. fr for French) is the set of tags in that language<br />
* fields that end with _100g correspond to the amount of a nutriment (in g) for 100 g or 100 ml of product<br />
<br />
=== Ready made code you can use in your app ===<br />
React Native: https://github.com/openfoodfacts/openfoodfacts-react-native<br />
<br />
== SDKs ==<br />
We have projects to create SDKs for major platforms. If you'd like to help out, please join the dedicated Slack channels.<br />
* [[API/Android|Android SDK]] <br />
* [[API/C sharp|C# SDK]] - https://github.com/Albert-Le5/openfoodfacts-csharp ; https://github.com/aberteau/OpenFoodFacts4Net<br />
* [[API/Go|Go SDK]] - https://github.com/openfoodfacts/openfoodfacts-go<br />
* [[API/Java|Java SDK]]<br />
* [[API/Javascript|JavaScript SDK]]<br />
* [[API/Javascript/NodeJS|NodeJS SDK]]<br />
* [[API/Perl|Perl SDK]]<br />
* [[API/PHP|PHP SDK]] - https://github.com/openfoodfacts/openfoodfacts-php<br />
* [[API/Python|Python SDK]] - https://github.com/openfoodfacts/openfoodfacts-python (LIVE API) - https://github.com/openfoodfacts/OpenFoodFacts-APIRestPython (Local Dump) <br />
* [[API/R|R SDK]]<br />
* [[API/React Native|React Native SDK]] https://github.com/openfoodfacts/openfoodfacts-react-native<br />
* [[API/Ruby|Ruby SDK]] - https://github.com/openfoodfacts/openfoodfacts-ruby OR gem install openfoodfacts - https://github.com/openfoodfacts/openbeautyfacts-ruby OR gem install openbeautyfacts<br />
* [[API/Scala|Scala SDK]]<br />
* [[API/Swift|Swift SDK]]<br />
Please help us bring Open Food Facts to your favorite language by contributing to SDK!<br />
<br />
== Licence ==<br />
Open Food Facts is under the [https://opendatacommons.org/licenses/odbl/ OdBL licence] (database) and [https://creativecommons.org/licenses/by-sa/3.0 CC-BY-SA] (pictures). That has a couple of legal implications, in short:<br />
* Mention Open Food Facts as the source of the data;<br />
* Do not mix with other product databases (since you are then required to release them under OdBL, at your own legal risk if you didn't actually own them);<br />
* Share any additions under the OdBL, back to the community.<br />
Please join us on the Slack channel to discuss the legal and technical side of things :-) (https://slack.openfoodfacts.org)<br />
<br />
== Roadmap ==<br />
See [[API/Roadmap]]<br />
<br />
== Bugs ==<br />
=== Reporting bugs ===<br />
Do not hesitate to file a bug if you find an issue in the API, or need an improvement!<br />
<br />
You can fill in the issue report [https://github.com/openfoodfacts/openfoodfacts-server/issues/new here on GitHub]<br />
<br />
=== Known bugs ===<br />
* General bugs: https://github.com/openfoodfacts/openfoodfacts-server/issues<br />
* API bugs: https://github.com/openfoodfacts/openfoodfacts-server/labels/api<br />
* API milestone: https://github.com/openfoodfacts/openfoodfacts-server/milestone/8<br />
<br />
== Sister projects ==<br />
=== Open Pet Food Facts ===<br />
Open Pet Food Facts behaves just like Open Food Facts. Behaviours may change over time, as we tweak it.<br />
* https://world.openpetfoodfacts.org/api/v0/product/20106836.json<br />
<br />
=== Open Beauty Facts ===<br />
[[API/OpenBeautyFacts]]<br />
<br />
=== Open Products Facts ===<br />
Open Products Facts behaves mostly like Open Food Facts. Behaviours may change over time, as we tweak it.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=API&diff=8856API2019-12-01T00:47:11Z<p>Vaiton: </p>
<hr />
<div>[[Category:Developer]] [[Category:API]]<br />
<br />
== Introduction ==<br />
=== Notice for API users ===<br />
# You are very welcome to use the API for production cases, as long as '''1 API call = 1 real scan by a user'''.<br />
# <span style="color:#d33">'''If you need all the database, download it directly from the data page, do ''NOT'' scrape the API'''</span><br />
# Please tell us (contact@openfoodfacts.org or in the #API channel) what you build with the API, it's always great to see new reuses come to life :-)<br />
<br />
=== Before using the API ===<br />
* Some products are incomplete.<br />
* '''You should ensure your UX tells the final user that the product is not complete, encourage them to exercise caution and/or help complete the product.'''<br />
* When doing averages, computations... filter incomplete products to avoid issues.<br />
* Assume the data is not reliable until the product is marked as complete.<br />
* '''In general, ensure the user exercises caution (for allergens...) and be upfront about possible risks.'''<br />
* <span style="color:#d33">'''By using any part of the API you have read and understood the [[#License|license]].'''</span><br />
<br />
=== Current status of the API ===<br />
Currently, the API is used internally for the official Open Food Facts mobile applications (iOS, Android, Windows, and we need help!) and by hundreds of reuses on various topics (Nutrition, sport…) and platforms (iOS, Android...), but does not yet follow good practices in API design.<br />
<br />
It is also used by several applications and while not yet stable, doesn't change much.<br />
<br />
You can have a look at the source code of the apps ([[Mobile_App]])<br />
<br />
'''Anyone with Swagger (or equivalent knowledge) willing to help us document the API is most welcome :-)'''<br />
<br />
=== Getting help with the API ===<br />
You can ask for help on using the API in the [https://openfoodfacts.slack.com/messages/api/ #api channel on Slack]. Join us to discuss your use case and get help/code from other devs.<br />
<br />
== READ operations ==<br />
For more information, see [[API/Read]]<br />
<br />
=== Technical details ===<br />
* You can do READ operations using the production server.<br />
* You should use the SSL version of the API. <code>https://world.openfoodfacts.org</code><br />
* '''Please send a UserAgent HTTP Header''' with the name of the app/service querying, the version, system and a URL if you have one, so that you are not blocked by mistake (e.g. <code>UserAgent: CoolFoodApp - Android - Version 1.0 - https://coolfoodapp.com</code>)<br />
<br />
== WRITE operations ==<br />
For more information, see [[API/Write]]<br />
<br />
=== Use cases ===<br />
* You can add photos and information to Open Food Facts using the API. <br />
** Letting your users add new products by uploading photos is the most common use case.<br />
** Several apps already enable more advanced editing. Gamification would be welcome.<br />
* The official mobile apps can use some help.<br />
<br />
=== A few things ===<br />
* '''DO''' join the API channel if you intend on using WRITE<br />
* '''DO NOT''' send copyrighted photos or information using the API. Everything you send is OdBL for the data, and CC-BY-SA for the pictures. If those are not yours (eg from scraping), you bear all the legal consequences.<br />
* You can create a global account for your app if you don't want to implement Open Food Facts user creation in your app right now. Please report it in #api so that it can be monitored for errors.<br />
* You should do all your test edits on https://world.openfoodfacts.dev (ask for the password on Slack)<br />
<br />
=== Conventions for the API ===<br />
* fields that end with _t are dates in the UNIX timestamp format (number of seconds since Jan 1st 1970)<br />
* fields that end with _datetime are dates in the iso8601 format: yyyy-mm-ddThh:mn:ssZ<br />
* fields that end with _tags are comma separated list of tags (e.g. categories_tags is the set of normalized tags computer from the categories field)<br />
* fields that end with a language 2 letter code (e.g. fr for French) is the set of tags in that language<br />
* fields that end with _100g correspond to the amount of a nutriment (in g) for 100 g or 100 ml of product<br />
<br />
=== Ready made code you can use in your app ===<br />
React Native: https://github.com/openfoodfacts/openfoodfacts-react-native<br />
<br />
== SDKs ==<br />
We have projects to create SDKs for major platforms. If you'd like to help out, please join the dedicated Slack channels.<br />
* [[API/Android|Android SDK]] <br />
* [[API/C sharp|C# SDK]] - https://github.com/Albert-Le5/openfoodfacts-csharp ; https://github.com/aberteau/OpenFoodFacts4Net<br />
* [[API/Go|Go SDK]] - https://github.com/openfoodfacts/openfoodfacts-go<br />
* [[API/Java|Java SDK]]<br />
* [[API/Javascript|JavaScript SDK]]<br />
* [[API/Javascript/NodeJS|NodeJS SDK]]<br />
* [[API/Perl|Perl SDK]]<br />
* [[API/PHP|PHP SDK]] - https://github.com/openfoodfacts/openfoodfacts-php<br />
* [[API/Python|Python SDK]] - https://github.com/openfoodfacts/openfoodfacts-python (LIVE API) - https://github.com/openfoodfacts/OpenFoodFacts-APIRestPython (Local Dump) <br />
* [[API/R|R SDK]]<br />
* [[API/React Native|React Native SDK]] https://github.com/openfoodfacts/openfoodfacts-react-native<br />
* [[API/Ruby|Ruby SDK]] - https://github.com/openfoodfacts/openfoodfacts-ruby OR gem install openfoodfacts - https://github.com/openfoodfacts/openbeautyfacts-ruby OR gem install openbeautyfacts<br />
* [[API/Scala|Scala SDK]]<br />
* [[API/Swift|Swift SDK]]<br />
Please help us bring Open Food Facts to your favorite language by contributing to SDK!<br />
<br />
== Licence ==<br />
Open Food Facts is under the [https://opendatacommons.org/licenses/odbl/ OdBL licence] (database) and [https://creativecommons.org/licenses/by-sa/3.0 CC-BY-SA] (pictures). That has a couple of legal implications, in short:<br />
* Mention Open Food Facts as the source of the data;<br />
* Do not mix with other product databases (since you are then required to release them under OdBL, at your own legal risk if you didn't actually own them);<br />
* Share any additions under the OdBL, back to the community.<br />
Please join us on the Slack channel to discuss the legal and technical side of things :-) (https://slack.openfoodfacts.org)<br />
<br />
== Roadmap ==<br />
[[API/Roadmap]]<br />
<br />
== Bugs ==<br />
=== Reporting bugs ===<br />
Do not hesitate to file a bug if you find an issue in the API, or need an improvement!<br />
<br />
You can fill in the issue report [https://github.com/openfoodfacts/openfoodfacts-server/issues/new here on GitHub]<br />
<br />
=== Known bugs ===<br />
* General bugs: https://github.com/openfoodfacts/openfoodfacts-server/issues<br />
* API bugs: https://github.com/openfoodfacts/openfoodfacts-server/labels/api<br />
* API milestone: https://github.com/openfoodfacts/openfoodfacts-server/milestone/8<br />
<br />
== Sister projects ==<br />
=== Open Pet Food Facts ===<br />
Open Pet Food Facts behaves just like Open Food Facts. Behaviours may change over time, as we tweak it.<br />
* https://world.openpetfoodfacts.org/api/v0/product/20106836.json<br />
<br />
=== Open Beauty Facts ===<br />
[[API/OpenBeautyFacts]]<br />
<br />
=== Open Products Facts ===<br />
Open Products Facts behaves mostly like Open Food Facts. Behaviours may change over time, as we tweak it.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=API&diff=8855API2019-12-01T00:42:11Z<p>Vaiton: </p>
<hr />
<div>[[Category:Developer]] [[Category:API]]<br />
<br />
== Introduction ==<br />
=== Notice for API users ===<br />
# You are very welcome to use the API for production cases, as long as '''1 API call = 1 real scan by a user'''.<br />
# <span style="color:#d33">'''If you need all the database, download it directly from the data page, do ''NOT'' scrape the API'''</span><br />
# Please tell us (contact@openfoodfacts.org or in the #API channel) what you build with the API, it's always great to see new reuses come to life :-)<br />
<br />
=== Before using the API ===<br />
* Some products are incomplete.<br />
* '''You should ensure your UX tells the final user that the product is not complete, encourage them to exercise caution and/or help complete the product.'''<br />
* When doing averages, computations... filter incomplete products to avoid issues.<br />
* Assume the data is not reliable until the product is marked as complete.<br />
* '''In general, ensure the user exercises caution (for allergens...) and be upfront about possible risks.'''<br />
* <span style="color:#d33">'''By using any part of the API you have read and understood the [[#License|license]].'''</span><br />
<br />
=== Current status of the API ===<br />
Currently, the API is used internally for the official Open Food Facts mobile applications (iOS, Android, Windows, and we need help!) and by hundreds of reuses on various topics (Nutrition, sport…) and platforms (iOS, Android...), but does not yet follow good practices in API design.<br />
<br />
It is also used by several applications and while not yet stable, doesn't change much.<br />
<br />
You can have a look at the source code of the apps ([[Mobile_App]])<br />
<br />
'''Anyone with Swagger (or equivalent knowledge) willing to help us document the API is most welcome :-)'''<br />
<br />
=== Getting help with the API ===<br />
You can ask for help on using the API in the [https://openfoodfacts.slack.com/messages/api/ #api channel on Slack]. Join us to discuss your use case and get help/code from other devs.<br />
<br />
== READ operations ==<br />
For more information, see [[API/Read]]<br />
<br />
=== Technical details ===<br />
* You can do READ operations using the production server.<br />
* You should use the SSL version of the API. <code>https://world.openfoodfacts.org</code><br />
* '''Please send a UserAgent HTTP Header''' with the name of the app/service querying, the version, system and a URL if you have one, so that you are not blocked by mistake (e.g. <code>UserAgent: CoolFoodApp - Android - Version 1.0 - https://coolfoodapp.com</code>)<br />
<br />
== WRITE operations ==<br />
For more information, see [[API/Write]]<br />
<br />
=== Use cases ===<br />
* You can add photos and information to Open Food Facts using the API. <br />
** Letting your users add new products by uploading photos is the most common use case.<br />
** Several apps already enable more advanced editing. Gamification would be welcome.<br />
* The official mobile apps can use some help.<br />
<br />
=== A few things ===<br />
* '''Do''' join the API channel if you intend on using WRITE<br />
* '''Do not''' send copyrighted photos or information using the API. Everything you send is OdBL for the data, and CC-BY-SA for the pictures. If those are not yours (eg from scraping), you bear all the legal consequences.<br />
* You can create a global account for your app if you don't want to implement Open Food Facts user creation in your app right now. Please report it in #api so that it can be monitored for errors.<br />
* You should do all your test edits on https://world.openfoodfacts.dev (ask for the password on Slack)<br />
<br />
=== Conventions for the API ===<br />
* fields that end with _t are dates in the UNIX timestamp format (number of seconds since Jan 1st 1970)<br />
* fields that end with _datetime are dates in the iso8601 format: yyyy-mm-ddThh:mn:ssZ<br />
* fields that end with _tags are comma separated list of tags (e.g. categories_tags is the set of normalized tags computer from the categories field)<br />
* fields that end with a language 2 letter code (e.g. fr for French) is the set of tags in that language<br />
* fields that end with _100g correspond to the amount of a nutriment (in g) for 100 g or 100 ml of product<br />
<br />
=== Ready made code you can use in your app ===<br />
React Native: https://github.com/openfoodfacts/openfoodfacts-react-native<br />
<br />
== SDKs ==<br />
We have projects to create SDKs for major platforms. If you'd like to help out, please join the dedicated Slack channels.<br />
* [[API/Android|Android SDK]] <br />
* [[API/C sharp|C# SDK]] - https://github.com/Albert-Le5/openfoodfacts-csharp ; https://github.com/aberteau/OpenFoodFacts4Net<br />
* [[API/Go|Go SDK]] - https://github.com/openfoodfacts/openfoodfacts-go<br />
* [[API/Java|Java SDK]]<br />
* [[API/Javascript|JavaScript SDK]]<br />
* [[API/Javascript/NodeJS|NodeJS SDK]]<br />
* [[API/Perl|Perl SDK]]<br />
* [[API/PHP|PHP SDK]] - https://github.com/openfoodfacts/openfoodfacts-php<br />
* [[API/Python|Python SDK]] - https://github.com/openfoodfacts/openfoodfacts-python (LIVE API) - https://github.com/openfoodfacts/OpenFoodFacts-APIRestPython (Local Dump) <br />
* [[API/R|R SDK]]<br />
* [[API/React Native|React Native SDK]] https://github.com/openfoodfacts/openfoodfacts-react-native<br />
* [[API/Ruby|Ruby SDK]] - https://github.com/openfoodfacts/openfoodfacts-ruby OR gem install openfoodfacts - https://github.com/openfoodfacts/openbeautyfacts-ruby OR gem install openbeautyfacts<br />
* [[API/Scala|Scala SDK]]<br />
* [[API/Swift|Swift SDK]]<br />
Please help us bring Open Food Facts to your favorite language by contributing to SDK!<br />
<br />
== Licence ==<br />
Open Food Facts is under the [https://opendatacommons.org/licenses/odbl/ OdBL licence] (database) and [https://creativecommons.org/licenses/by-sa/3.0 CC-BY-SA] (pictures). That has a couple of legal implications, in short:<br />
* Mention Open Food Facts as the source of the data;<br />
* Do not mix with other product databases (since you are then required to release them under OdBL, at your own legal risk if you didn't actually own them);<br />
* Share any additions under the OdBL, back to the community.<br />
Please join us on the Slack channel to discuss the legal and technical side of things :-) (https://slack.openfoodfacts.org)<br />
<br />
== Roadmap ==<br />
[[API/Roadmap]]<br />
<br />
== Bugs ==<br />
=== Reporting bugs ===<br />
Do not hesitate to file a bug if you find an issue in the API, or need an improvement!<br />
<br />
You can fill in the issue report [https://github.com/openfoodfacts/openfoodfacts-server/issues/new here on GitHub]<br />
<br />
=== Known bugs ===<br />
* General bugs: https://github.com/openfoodfacts/openfoodfacts-server/issues<br />
* API bugs: https://github.com/openfoodfacts/openfoodfacts-server/labels/api<br />
* API milestone: https://github.com/openfoodfacts/openfoodfacts-server/milestone/8<br />
<br />
== Sister projects ==<br />
=== Open Pet Food Facts ===<br />
Open Pet Food Facts behaves just like Open Food Facts. Behaviours may change over time, as we tweak it.<br />
* https://world.openpetfoodfacts.org/api/v0/product/20106836.json<br />
<br />
=== Open Beauty Facts ===<br />
[[API/OpenBeautyFacts]]<br />
<br />
=== Open Products Facts ===<br />
Open Products Facts behaves mostly like Open Food Facts. Behaviours may change over time, as we tweak it.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=API&diff=8854API2019-12-01T00:41:47Z<p>Vaiton: </p>
<hr />
<div>[[Category:Developer]] [[Category:API]]<br />
<br />
== Introduction ==<br />
=== Notice for API users ===<br />
# You are very welcome to use the API for production cases, as long as '''1 API call = 1 real scan by a user'''.<br />
# <span style="color:#d33">'''If you need all the database, download it directly from the data page, do ''NOT'' scrape the API'''</span><br />
# Please tell us (contact@openfoodfacts.org or in the #API channel) what you build with the API, it's always great to see new reuses come to life :-)<br />
<br />
=== Before using the API ===<br />
* Some products are incomplete.<br />
* '''You should ensure your UX tells the final user that the product is not complete, encourage them to exercise caution and/or help complete the product.'''<br />
* When doing averages, computations... filter incomplete products to avoid issues.<br />
* Assume the data is not reliable until the product is marked as complete.<br />
* '''In general, ensure the user exercises caution (for allergens...) and be upfront about possible risks.'''<br />
* <span style="color:#d33">'''By using any part of the API you have read and understood the [[#License|license]].'''</span><br />
<br />
=== Current status of the API ===<br />
Currently, the API is used internally for the official Open Food Facts mobile applications (iOS, Android, Windows, and we need help!) and by hundreds of reuses on various topics (Nutrition, sport…) and platforms (iOS, Android...), but does not yet follow good practices in API design.<br />
<br />
It is also used by several applications and while not yet stable, doesn't change much.<br />
<br />
You can have a look at the source code of the apps ([[Mobile_App]])<br />
<br />
'''Anyone with Swagger (or equivalent knowledge) willing to help us document the API is most welcome :-)'''<br />
<br />
=== Getting help with the API ===<br />
You can ask for help on using the API in the [https://openfoodfacts.slack.com/messages/api/ #api channel on Slack]. Join us to discuss your use case and get help/code from other devs.<br />
<br />
== READ operations ==<br />
{{Further|API/Read}}<br />
For more information, see [[API/Read]]<br />
<br />
=== Technical details ===<br />
* You can do READ operations using the production server.<br />
* You should use the SSL version of the API. <code>https://world.openfoodfacts.org</code><br />
* '''Please send a UserAgent HTTP Header''' with the name of the app/service querying, the version, system and a URL if you have one, so that you are not blocked by mistake (e.g. <code>UserAgent: CoolFoodApp - Android - Version 1.0 - https://coolfoodapp.com</code>)<br />
<br />
== WRITE operations ==<br />
For more information, see [[API/Write]]<br />
<br />
=== Use cases ===<br />
* You can add photos and information to Open Food Facts using the API. <br />
** Letting your users add new products by uploading photos is the most common use case.<br />
** Several apps already enable more advanced editing. Gamification would be welcome.<br />
* The official mobile apps can use some help.<br />
<br />
=== A few things ===<br />
* '''Do''' join the API channel if you intend on using WRITE<br />
* '''Do not''' send copyrighted photos or information using the API. Everything you send is OdBL for the data, and CC-BY-SA for the pictures. If those are not yours (eg from scraping), you bear all the legal consequences.<br />
* You can create a global account for your app if you don't want to implement Open Food Facts user creation in your app right now. Please report it in #api so that it can be monitored for errors.<br />
* You should do all your test edits on https://world.openfoodfacts.dev (ask for the password on Slack)<br />
<br />
=== Conventions for the API ===<br />
* fields that end with _t are dates in the UNIX timestamp format (number of seconds since Jan 1st 1970)<br />
* fields that end with _datetime are dates in the iso8601 format: yyyy-mm-ddThh:mn:ssZ<br />
* fields that end with _tags are comma separated list of tags (e.g. categories_tags is the set of normalized tags computer from the categories field)<br />
* fields that end with a language 2 letter code (e.g. fr for French) is the set of tags in that language<br />
* fields that end with _100g correspond to the amount of a nutriment (in g) for 100 g or 100 ml of product<br />
<br />
=== Ready made code you can use in your app ===<br />
React Native: https://github.com/openfoodfacts/openfoodfacts-react-native<br />
<br />
== SDKs ==<br />
We have projects to create SDKs for major platforms. If you'd like to help out, please join the dedicated Slack channels.<br />
* [[API/Android|Android SDK]] <br />
* [[API/C sharp|C# SDK]] - https://github.com/Albert-Le5/openfoodfacts-csharp ; https://github.com/aberteau/OpenFoodFacts4Net<br />
* [[API/Go|Go SDK]] - https://github.com/openfoodfacts/openfoodfacts-go<br />
* [[API/Java|Java SDK]]<br />
* [[API/Javascript|JavaScript SDK]]<br />
* [[API/Javascript/NodeJS|NodeJS SDK]]<br />
* [[API/Perl|Perl SDK]]<br />
* [[API/PHP|PHP SDK]] - https://github.com/openfoodfacts/openfoodfacts-php<br />
* [[API/Python|Python SDK]] - https://github.com/openfoodfacts/openfoodfacts-python (LIVE API) - https://github.com/openfoodfacts/OpenFoodFacts-APIRestPython (Local Dump) <br />
* [[API/R|R SDK]]<br />
* [[API/React Native|React Native SDK]] https://github.com/openfoodfacts/openfoodfacts-react-native<br />
* [[API/Ruby|Ruby SDK]] - https://github.com/openfoodfacts/openfoodfacts-ruby OR gem install openfoodfacts - https://github.com/openfoodfacts/openbeautyfacts-ruby OR gem install openbeautyfacts<br />
* [[API/Scala|Scala SDK]]<br />
* [[API/Swift|Swift SDK]]<br />
Please help us bring Open Food Facts to your favorite language by contributing to SDK!<br />
<br />
== Licence ==<br />
Open Food Facts is under the [https://opendatacommons.org/licenses/odbl/ OdBL licence] (database) and [https://creativecommons.org/licenses/by-sa/3.0 CC-BY-SA] (pictures). That has a couple of legal implications, in short:<br />
* Mention Open Food Facts as the source of the data;<br />
* Do not mix with other product databases (since you are then required to release them under OdBL, at your own legal risk if you didn't actually own them);<br />
* Share any additions under the OdBL, back to the community.<br />
Please join us on the Slack channel to discuss the legal and technical side of things :-) (https://slack.openfoodfacts.org)<br />
<br />
== Roadmap ==<br />
[[API/Roadmap]]<br />
<br />
== Bugs ==<br />
=== Reporting bugs ===<br />
Do not hesitate to file a bug if you find an issue in the API, or need an improvement!<br />
<br />
You can fill in the issue report [https://github.com/openfoodfacts/openfoodfacts-server/issues/new here on GitHub]<br />
<br />
=== Known bugs ===<br />
* General bugs: https://github.com/openfoodfacts/openfoodfacts-server/issues<br />
* API bugs: https://github.com/openfoodfacts/openfoodfacts-server/labels/api<br />
* API milestone: https://github.com/openfoodfacts/openfoodfacts-server/milestone/8<br />
<br />
== Sister projects ==<br />
=== Open Pet Food Facts ===<br />
Open Pet Food Facts behaves just like Open Food Facts. Behaviours may change over time, as we tweak it.<br />
* https://world.openpetfoodfacts.org/api/v0/product/20106836.json<br />
<br />
=== Open Beauty Facts ===<br />
[[API/OpenBeautyFacts]]<br />
<br />
=== Open Products Facts ===<br />
Open Products Facts behaves mostly like Open Food Facts. Behaviours may change over time, as we tweak it.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Template:Further&diff=8853Template:Further2019-12-01T00:41:36Z<p>Vaiton: Created page with "<includeonly>{{#invoke:labelled list hatnote|labelledList|Further information{{#if:{{{topic|}}}|&#32;on {{{topic|}}}}}}}</includeonly><noinclude> {{documentation}} <!-- Catego..."</p>
<hr />
<div><includeonly>{{#invoke:labelled list hatnote|labelledList|Further information{{#if:{{{topic|}}}|&#32;on {{{topic|}}}}}}}</includeonly><noinclude><br />
{{documentation}}<br />
<!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --><br />
</noinclude></div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Translations&diff=8852Translations2019-12-01T00:32:39Z<p>Vaiton: </p>
<hr />
<div>← Back to [[Main Page]].<br />
<br />
Thanks a lot for your interest in translating Open Food Facts (website interface, mobile applications) in new languages and/or improving the existing translations!<br />
<br />
== Translation workflow ==<br />
We use 2 tools to add translations to Open Food Facts:<br />
* GitHub (you'll need to create an account);<br />
* CrowdIn (you can log in with a 3rd party account or create an account). [[https://translate.openfoodfacts.org Start translating on Crowdin]]<br />
<br />
'''Also please join your local channel on [https://slack.openfoodfacts.org our Slack server] and the <code>#translation</code> channel so that we can coordinate.<br />
<br />
== Things to translate (in order of impact you'll have) ==<br />
=== High priority translations===<br />
* [https://translate.openfoodfacts.org Translations of the Web app - Mobile apps]<br />
* [[Translations - Names of nutrients]]<br />
* [[Translations - Slogan]]<br />
<br />
=== Medium priority translations ===<br />
==== Taxonomies ====<br />
===== What are taxonomies? =====<br />
Taxonomies make Open Food Facts work like magic. They are our way to organize information and automatically make sense of products.<br />
<br />
This will enable :<br />
* Suggestions in your language, to make contribution faster<br />
* Auto-detection of categories, enabling worldwide comparison between food.<br />
* Multilingual products automatically translated to your language (if the item in the taxonomy is translated to your language)<br />
<br />
===== Categories, labels, nova, ingredients…directly on Open Food Facts =====<br />
[[File:Taxonomy online translation.png|thumb]]<br />
We have a new system to translate taxonomies directly on the Open Food Facts web site. To access it, just go to a page that lists some tags (categories, labels) like the one for categories in German: <br><br />
https://world-de.openfoodfacts.org/categories and then add '''?translate=add''' to the url like this:<br><br />
https://world-de.openfoodfacts.org/categories?translate=add<br><br><br />
<br />
It will show a list of the categories that are not yet translated to German, and you can type in a translation. Just click on save, and that's it.<br />
Benefits of this new method to translate taxonomies:<br />
# No need to go to the wiki, load a huge list etc. <br />
# You see instantaneously the list of entries that have no translation in the language that interests you<br />
# The list is sorted by the number of products: you can prioritize the translations to first translate the entries that are on a lot of products<br />
# There is a link to the actual products that have this category, label etc. -> that can be very useful to understand what kind of products we are talking about, and also to see how the category etc. is written on the actual products.<br />
# You can add the '''&translate=add''' to any page that lists tags, so you can filter it by country, by any other facet etc.<br />
<br />
If you want to see the list of entries that have pending translations, you can add '''&translate=review'''<br />
And if you want to see both the list of entries to be translated and with pending translations, you can add '''&translate=edit''' (useful if you made a mistake and want to change a translation)<br />
Here is what it looks like:<br />
<br />
https://world-de.openfoodfacts.org/labels?translate=add<br><br />
https://world-de.openfoodfacts.org/states?translate=add<br><br />
https://world-de.openfoodfacts.org/categories?translate=add<br><br />
https://world-de.openfoodfacts.org/ingredients?translate=add<br><br />
https://world-zh.openfoodfacts.org/nova-groups?translate=add<br><br />
https://world-zh.openfoodfacts.org/ingredients-analysis?translate=add<br><br />
https://world-zh.openfoodfacts.org/additives?translate=add<br><br />
https://world-zh.openfoodfacts.org/ingredients?translate=add<br><br />
<!--<br />
==== High priority taxonomies (ranked) ====<br />
<br />
(OLD, please use the online system)<br />
* [[Global labels taxonomy]]<br />
* [[Global states taxonomy]] (easy and short one)<br />
* [[Global categories taxonomy]]<br />
* [[Global countries taxonomy]]<br />
* [[Global additives taxonomy]]<br />
* [[Global allergens taxonomy]]<br />
<br />
==== Other taxonomies ====<br />
(OLD, please use the online system)<br />
* [[Global labels taxonomy logos]]<br />
<br />
==== Draft taxonomies ====<br />
(OLD, please use the online system)<br />
* [[Global ingredients taxonomy]]<br />
* [[Global brands and companies taxonomy]]<br />
<br />
==== Example taxonomy ====<br />
(OLD, please use the online system)<br />
* [[Test taxonomy]] showing the basic taxonomy definition features<br />
--><br />
<br />
=== Less important ===<br />
<!--<br />
* [[Translations - Code of conduct]]<br />
* [[Translations - Data]]<br />
--><br />
* [[Translations - Marketing]] (posters, logos…)<br />
<br />
* [[Translations - Missions]]<br />
<br />
=== So you've translated everything ? ===<br />
[https://en.wiki.openbeautyfacts.org/Translations Translate Open Beauty Facts] :-)<br />
<br />
<!--<br />
=== Pages for special operations that could be localized ===<br />
<br />
* [[Translations - Vending machines]]<br />
--><br />
<br />
=== Advanced Country Support ===<br />
Let Open Food Facts better handle specifities of various countries and areas, such as labels, specific foods…<br />
[[Country Support]]<br />
<br />
=== Draft Taxonomies ===<br />
* [[Global packaging taxonomy]]<br />
* [[Global Religious Certification taxonomy]]<br />
* [[Global Food Preparation taxonomy]] (related to [[Project:Microwave]])<br />
* [[Global IGP taxonomy]]<br />
<br />
=== Old, for reference only ===<br />
<br />
* [[Translations - Front page]]<br />
<br />
== News / Announcements etc. ==<br />
<br />
* [[January 2014 - Open Food Facts is getting global]]<br />
<br />
<br />
<br />
{{Box<br />
| 1 = Join the discussion on the #Translation slack channel<br />
| 2 = [https://openfoodfacts.slack.com/messages/translation/ #translation]<br />
}}<br />
[[fr:Traductions]]<br />
[[es:Traducciones]]<br />
[[Category:Translations]]</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Translations_-_Index_page&diff=8851Translations - Index page2019-12-01T00:29:24Z<p>Vaiton: Replaced content with "Go back to the main Translations page. Category:Translations"</p>
<hr />
<div>Go back to the main [[Translations]] page.<br />
[[Category:Translations]]</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Bazaar&diff=8789Bazaar2019-10-27T20:21:42Z<p>Vaiton: </p>
<hr />
<div><br />
== Moved to Slack ==<br />
<br />
'''We are now using Slack for communication between Open Food Facts contributors.''' To join us, go to https://slack.openfoodfacts.org.<br />
<br />
We will continue to use the wiki to document everything.<br />
<br />
== Archive ==<br />
=== 07/29/2014 - list of additives in cigarettes ===<br />
<br />
Just found this list, it might be useful if/when we create Open Drugs Facts, a new can of worms: https://en.wikipedia.org/wiki/List_of_additives_in_cigarettes<br />
--[[User:Stephane|Stephane]] ([[User talk:Stephane|talk]]) 18:19, 29 July 2014 (CEST)<br />
<br />
=== 01/23/2014 - help to translate internationalization announcement ===<br />
<br />
We need some help to translate a blog post in different languages:<br />
http://en.wiki.openfoodfacts.org/January_2014_-_Open_Food_Facts_is_getting_global<br />
<br />
Thanks! :-)<br />
--[[User:Stephane|Stephane]] ([[User talk:Stephane|talk]]) 17:54, 23 January 2014 (CET)<br />
<br />
=== 12/07/2013 - new extensions for the wiki ===<br />
<br />
As suggested by Teolemon and others, this wiki now use the Echo notifications extension, the Thanks extension (look for edit in "View history" next to editors names), and the WikiEditor and CodeEditor extensions.<br />
--[[User:Stephane|Stephane]] ([[User talk:Stephane|talk]]) 15:52, 7 December 2013 (CET)<br />
<br />
=== 10/22/2013 - What's in my yogurt? project starting soon! ===<br />
<br />
Let's launch the [[Project:What's in my yogurt?]] on November 1st! Please join a team (or more) and help to finalize the project. -- Stephane<br />
<br />
=== 10/16/2013 - Join us to hack on opening food ===<br />
We need iOS, Android, MediaWiki devs, wizards on OCR and OpenCV, and any skill that would be relevant to the cause to help us scale OpenFoodFact, and create a smooth experience to foster and maximize contributions.<br />
We also need growth hackers to make OpenFoodFacts go viral in English speaking countries, and worldwide--[[User:Teolemon|Teolemon]] ([[User talk:Teolemon|talk]]) 01:34, 17 October 2013 (CEST)<br />
<br />
=== 10/14/2013 - The Bazaar ===<br />
<br />
This page is similar to Wikipedia's Village Pump: a place to share news and ideas, to discuss etc. --[[User:Stephane|Stephane]] ([[User talk:Stephane|talk]]) 18:24, 14 October 2013 (CEST)<br />
<br />
=== 10/14/2013 - English wiki ===<br />
<br />
We started a wiki in French for Open Food Facts contributors a few months ago, and we now have one in English! --[[User:Stephane|Stephane]] ([[User talk:Stephane|talk]]) 18:24, 14 October 2013 (CEST)<br />
<br />
<br />
<br />
[[fr:Le Bazar]]</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Product_Opener_installation&diff=8788Product Opener installation2019-10-27T20:18:35Z<p>Vaiton: Vaiton moved page Product Opener installation to Product Opener/Installation</p>
<hr />
<div>#REDIRECT [[Product Opener/Installation]]</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Product_Opener/Installation&diff=8787Product Opener/Installation2019-10-27T20:18:35Z<p>Vaiton: Vaiton moved page Product Opener installation to Product Opener/Installation</p>
<hr />
<div>[[Category:ProductOpener]]<br />
[[Category:Developer]]<br />
Installation instructions for Product Opener (see [[Product Opener]]).<br />
<br />
== Before you start ==<br />
<br />
Product Opener is not yet released as open source. The instructions below are for reference and for early testers of Product Opener. They are very likely to change as the code will be restructured, made more independent of proprietary code and specific Open Food Facts uses etc.<br />
<br />
When it is released, Product Opener will have much easier to use install scripts and instructions.<br />
<br />
== Install directory ==<br />
<br />
Instructions below use /home/obf for the install directory, replace with your install dir.<br />
<br />
== Product Opener code ==<br />
<br />
=== Configuration ===<br />
<br />
==== startup.pl ====<br />
<br />
This file is used to preload Perl module in Apache.<br />
It contains a path that needs to be updated:<br />
<br />
# Needs to be configured<br />
use lib "/home/obf/cgi/";<br />
<br />
==== Config.pm ====<br />
<br />
==== Config2.pm ====<br />
<br />
Contains info about the domain, database and path. This is separated from Config.pm so that it is easy to create test instance that share the same configuration in Config.pm but are on other domains.<br />
<br />
# server constants<br />
$domain = "openbeautyfacts.org";<br />
<br />
# server paths<br />
$www_root = "/home/obf/html";<br />
$data_root = "/home/obf";<br />
<br />
$mongodb = "obf";<br />
<br />
=== Libraries ===<br />
Either <code>brew install</code> or <code>apt-get install</code> these dependencies as appropriate:<br />
zbar imagemagick graphviz tesseract<br />
=== Required Perl modules ===<br />
The following Perl modules need to be installed (some of them might be included with Perl).<br />
<br />
<pre><br />
Cache::Memcached::Fast<br />
Crypt::PasswdMD5<br />
DateTime<br />
DateTime::Format::Mail<br />
Digest::MD5<br />
Digest::SHA1<br />
Encode::Punycode<br />
File::Copy<br />
File::Path<br />
Geo::IP<br />
Getopt::Long<br />
GraphViz2<br />
Hash::Util<br />
HTML::Defang<br />
HTML::Entities<br />
Image::Magick<br />
Image::OCR::Tesseract<br />
IPC::Open3<br />
JSON<br />
LWP::Authen::Digest<br />
</pre><br />
<br />
To install a module, you can sometimes use packages.<br />
<br />
e.g. on Debian / Ubuntu : <code>apt-get install libdatetime-perl</code><br />
<br />
Or you can use ''cpan'': <code>cpan install DateTime</code><br />
<br />
Or ''cpanm'': <code>perl cpanm --installdeps .</code><br />
<br />
== MongoDB database ==<br />
Product Opener requires [https://www.mongodb.com/ MongoDB] to run.<br />
<br />
* Install MongoDB.<br />
<br />
* The MongoDB database name is configured in PROJECTROOT/cgi/Config.pm<br />
<br />
* The MongoDB database is created when the first product is added.<br />
<br />
=== MongoDB indexes ===<br />
<br />
See [[Product Opener mongodb indexes]]<br />
<br />
== Apache servers == <br />
<br />
In production we use a light weight Apache web server for static files (e.g. images) that does reverse proxying to a modperl Apache server that dynamically generates the HTML pages.<br />
<br />
If the traffic is low or moderate, you can use only one Apache mod_perl server that also serves images etc.<br />
<br />
In the example below, the Apache mod_perl server listens on port 19000.<br />
<br />
=== Light-weight reverse proxy for static files ===<br />
<br />
Compile:<br />
<br />
./configure --prefix=/home/xyz/proxy --enable-rewrite --enable-proxy --enable-proxy_http --disable-userdir --enable-headers --enable-expires --enable-mime --enable-so --with-included-apr<br />
<br />
Add to httpd.conf:<br />
<br />
<pre><br />
<br />
<VirtualHost *><br />
DocumentRoot /home/obf/html<br />
ServerName world.openbeautyfacts.org<br />
ServerAlias *.openbeautyfacts.org<br />
<br />
ErrorLog /home/obf/logs/proxy_error_log<br />
CustomLog /home/obf/logs/proxy_access_log combined<br />
ServerAdmin stephane@openbeautyfacts.org<br />
<br />
<Directory "/home/obf/html"><br />
Options -Indexes FollowSymLinks<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
ProxyPreserveHost On<br />
RewriteEngine on<br />
RewriteCond %{REQUEST_URI} !/./<br />
RewriteRule ^(/cgi/.*)$ http://localhost:19000$1 [P,L]<br />
RewriteMap escape int:escape<br />
RewriteRule ^/favicon.ico$ /favicon.ico [L]<br />
RewriteCond %{REQUEST_URI} !^/images/<br />
RewriteCond %{REQUEST_URI} !^/js/<br />
RewriteCond %{REQUEST_URI} !^/rss/<br />
RewriteCond %{REQUEST_URI} !^/robots<br />
RewriteCond %{REQUEST_URI} !^/clicks/<br />
RewriteCond %{REQUEST_URI} !^/data/<br />
RewriteCond %{REQUEST_URI} !^/files/<br />
RewriteRule ^(.*)$ http://localhost:19000/cgi/display.pl?${escape:$1} [P,L,QSA]<br />
</VirtualHost><br />
<br />
<br />
<VirtualHost *><br />
DocumentRoot /home/obf/html<br />
ServerName openbeautyfacts.org<br />
ErrorLog /home/obf/logs/proxy_error_log<br />
CustomLog /home/obf/logs/proxy_access_log combined<br />
DirectoryIndex index.html index.shtml<br />
<Directory "/home/obf/html"><br />
Options -Indexes FollowSymLinks Includes<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
RewriteEngine on<br />
RewriteCond %{HTTP_HOST} ^openbeautyfacts\.org<br />
RewriteRule ^/products$ /products.shtml [L]<br />
<br />
</VirtualHost><br />
<br />
</pre><br />
<br />
=== modperl Apache server for dynamic pages ===<br />
<br />
# Download the latest version of the source of the Apache httpd server from the 2.2 branch (2.2.29 when writing this)<br />
#* Do not use the 2.4 branch as mod_perl is not yet compatible with it<br />
# Extract the source<br />
# <code>./configure --with-mpm=prefork --prefix=/home/obf/apache --enable-rewrite --enable-proxy --enable-proxy_http --enable-deflate --disable-userdir --enable-headers</code><br />
# <code>make</code><br />
# <code>make install</code><br />
# Download the latest version of mod_perl from http://perl.apache.org/<br />
# Extract the source<br />
# <code>perl Makefile.PL MP_APXS=/home/obf/apache/bin/apxs</code><br />
# <code>make</code><br />
# <code>make install</code><br />
<br />
==== Configuration ====<br />
<br />
In /home/obf/apache/conf/httpd.conf:<br />
<br />
Change the port:<br />
<br />
<code>Listen 19000</code><br />
<br />
Add at the end:<br />
<br />
<pre><br />
LoadModule perl_module modules/mod_perl.so<br />
<br />
PerlWarn Off<br />
PerlRequire /home/obf/cgi/startup.pl<br />
<br />
<br />
<Location /cgi><br />
SetHandler perl-script<br />
PerlResponseHandler ModPerl::Registry<br />
PerlOptions +ParseHeaders<br />
Options +ExecCGI<br />
Order allow,deny<br />
Allow from all<br />
</Location><br />
<br />
<br />
<VirtualHost *><br />
DocumentRoot /home/obf/html<br />
ServerName world.openbeautyfacts.org<br />
ErrorLog /home/obf/logs/error_log<br />
CustomLog /home/obf/logs/access_log combined<br />
ScriptAlias /cgi/ "/home/obf/cgi/"<br />
</VirtualHost><br />
<br />
PerlPostReadRequestHandler My::ProxyRemoteAddr<br />
</pre><br />
<br />
== Installation issues ==<br />
<br />
Depending on your environment (in particular different versions of Linux, Apache, MongoDB, Perl, Perl modules etc.), you may encounter some issues when installing or running Product Opener.<br />
<br />
[[Product Opener installation issues]] lists those issues and steps to resolve them.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Product_Opener/Installation&diff=8786Product Opener/Installation2019-10-27T20:18:16Z<p>Vaiton: </p>
<hr />
<div>[[Category:ProductOpener]]<br />
[[Category:Developer]]<br />
Installation instructions for Product Opener (see [[Product Opener]]).<br />
<br />
== Before you start ==<br />
<br />
Product Opener is not yet released as open source. The instructions below are for reference and for early testers of Product Opener. They are very likely to change as the code will be restructured, made more independent of proprietary code and specific Open Food Facts uses etc.<br />
<br />
When it is released, Product Opener will have much easier to use install scripts and instructions.<br />
<br />
== Install directory ==<br />
<br />
Instructions below use /home/obf for the install directory, replace with your install dir.<br />
<br />
== Product Opener code ==<br />
<br />
=== Configuration ===<br />
<br />
==== startup.pl ====<br />
<br />
This file is used to preload Perl module in Apache.<br />
It contains a path that needs to be updated:<br />
<br />
# Needs to be configured<br />
use lib "/home/obf/cgi/";<br />
<br />
==== Config.pm ====<br />
<br />
==== Config2.pm ====<br />
<br />
Contains info about the domain, database and path. This is separated from Config.pm so that it is easy to create test instance that share the same configuration in Config.pm but are on other domains.<br />
<br />
# server constants<br />
$domain = "openbeautyfacts.org";<br />
<br />
# server paths<br />
$www_root = "/home/obf/html";<br />
$data_root = "/home/obf";<br />
<br />
$mongodb = "obf";<br />
<br />
=== Libraries ===<br />
Either <code>brew install</code> or <code>apt-get install</code> these dependencies as appropriate:<br />
zbar imagemagick graphviz tesseract<br />
=== Required Perl modules ===<br />
The following Perl modules need to be installed (some of them might be included with Perl).<br />
<br />
<pre><br />
Cache::Memcached::Fast<br />
Crypt::PasswdMD5<br />
DateTime<br />
DateTime::Format::Mail<br />
Digest::MD5<br />
Digest::SHA1<br />
Encode::Punycode<br />
File::Copy<br />
File::Path<br />
Geo::IP<br />
Getopt::Long<br />
GraphViz2<br />
Hash::Util<br />
HTML::Defang<br />
HTML::Entities<br />
Image::Magick<br />
Image::OCR::Tesseract<br />
IPC::Open3<br />
JSON<br />
LWP::Authen::Digest<br />
</pre><br />
<br />
To install a module, you can sometimes use packages.<br />
<br />
e.g. on Debian / Ubuntu : <code>apt-get install libdatetime-perl</code><br />
<br />
Or you can use ''cpan'': <code>cpan install DateTime</code><br />
<br />
Or ''cpanm'': <code>perl cpanm --installdeps .</code><br />
<br />
== MongoDB database ==<br />
Product Opener requires [https://www.mongodb.com/ MongoDB] to run.<br />
<br />
* Install MongoDB.<br />
<br />
* The MongoDB database name is configured in PROJECTROOT/cgi/Config.pm<br />
<br />
* The MongoDB database is created when the first product is added.<br />
<br />
=== MongoDB indexes ===<br />
<br />
See [[Product Opener mongodb indexes]]<br />
<br />
== Apache servers == <br />
<br />
In production we use a light weight Apache web server for static files (e.g. images) that does reverse proxying to a modperl Apache server that dynamically generates the HTML pages.<br />
<br />
If the traffic is low or moderate, you can use only one Apache mod_perl server that also serves images etc.<br />
<br />
In the example below, the Apache mod_perl server listens on port 19000.<br />
<br />
=== Light-weight reverse proxy for static files ===<br />
<br />
Compile:<br />
<br />
./configure --prefix=/home/xyz/proxy --enable-rewrite --enable-proxy --enable-proxy_http --disable-userdir --enable-headers --enable-expires --enable-mime --enable-so --with-included-apr<br />
<br />
Add to httpd.conf:<br />
<br />
<pre><br />
<br />
<VirtualHost *><br />
DocumentRoot /home/obf/html<br />
ServerName world.openbeautyfacts.org<br />
ServerAlias *.openbeautyfacts.org<br />
<br />
ErrorLog /home/obf/logs/proxy_error_log<br />
CustomLog /home/obf/logs/proxy_access_log combined<br />
ServerAdmin stephane@openbeautyfacts.org<br />
<br />
<Directory "/home/obf/html"><br />
Options -Indexes FollowSymLinks<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
ProxyPreserveHost On<br />
RewriteEngine on<br />
RewriteCond %{REQUEST_URI} !/./<br />
RewriteRule ^(/cgi/.*)$ http://localhost:19000$1 [P,L]<br />
RewriteMap escape int:escape<br />
RewriteRule ^/favicon.ico$ /favicon.ico [L]<br />
RewriteCond %{REQUEST_URI} !^/images/<br />
RewriteCond %{REQUEST_URI} !^/js/<br />
RewriteCond %{REQUEST_URI} !^/rss/<br />
RewriteCond %{REQUEST_URI} !^/robots<br />
RewriteCond %{REQUEST_URI} !^/clicks/<br />
RewriteCond %{REQUEST_URI} !^/data/<br />
RewriteCond %{REQUEST_URI} !^/files/<br />
RewriteRule ^(.*)$ http://localhost:19000/cgi/display.pl?${escape:$1} [P,L,QSA]<br />
</VirtualHost><br />
<br />
<br />
<VirtualHost *><br />
DocumentRoot /home/obf/html<br />
ServerName openbeautyfacts.org<br />
ErrorLog /home/obf/logs/proxy_error_log<br />
CustomLog /home/obf/logs/proxy_access_log combined<br />
DirectoryIndex index.html index.shtml<br />
<Directory "/home/obf/html"><br />
Options -Indexes FollowSymLinks Includes<br />
Order allow,deny<br />
Allow from all<br />
</Directory><br />
RewriteEngine on<br />
RewriteCond %{HTTP_HOST} ^openbeautyfacts\.org<br />
RewriteRule ^/products$ /products.shtml [L]<br />
<br />
</VirtualHost><br />
<br />
</pre><br />
<br />
=== modperl Apache server for dynamic pages ===<br />
<br />
# Download the latest version of the source of the Apache httpd server from the 2.2 branch (2.2.29 when writing this)<br />
#* Do not use the 2.4 branch as mod_perl is not yet compatible with it<br />
# Extract the source<br />
# <code>./configure --with-mpm=prefork --prefix=/home/obf/apache --enable-rewrite --enable-proxy --enable-proxy_http --enable-deflate --disable-userdir --enable-headers</code><br />
# <code>make</code><br />
# <code>make install</code><br />
# Download the latest version of mod_perl from http://perl.apache.org/<br />
# Extract the source<br />
# <code>perl Makefile.PL MP_APXS=/home/obf/apache/bin/apxs</code><br />
# <code>make</code><br />
# <code>make install</code><br />
<br />
==== Configuration ====<br />
<br />
In /home/obf/apache/conf/httpd.conf:<br />
<br />
Change the port:<br />
<br />
<code>Listen 19000</code><br />
<br />
Add at the end:<br />
<br />
<pre><br />
LoadModule perl_module modules/mod_perl.so<br />
<br />
PerlWarn Off<br />
PerlRequire /home/obf/cgi/startup.pl<br />
<br />
<br />
<Location /cgi><br />
SetHandler perl-script<br />
PerlResponseHandler ModPerl::Registry<br />
PerlOptions +ParseHeaders<br />
Options +ExecCGI<br />
Order allow,deny<br />
Allow from all<br />
</Location><br />
<br />
<br />
<VirtualHost *><br />
DocumentRoot /home/obf/html<br />
ServerName world.openbeautyfacts.org<br />
ErrorLog /home/obf/logs/error_log<br />
CustomLog /home/obf/logs/access_log combined<br />
ScriptAlias /cgi/ "/home/obf/cgi/"<br />
</VirtualHost><br />
<br />
PerlPostReadRequestHandler My::ProxyRemoteAddr<br />
</pre><br />
<br />
== Installation issues ==<br />
<br />
Depending on your environment (in particular different versions of Linux, Apache, MongoDB, Perl, Perl modules etc.), you may encounter some issues when installing or running Product Opener.<br />
<br />
[[Product Opener installation issues]] lists those issues and steps to resolve them.</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Product_Opener&diff=8785Product Opener2019-10-27T20:15:44Z<p>Vaiton: </p>
<hr />
<div>'''Product Opener''' is the software used by ''Open Food Facts'' to create and maintain its collaborative database of food products in open data.<br />
<br />
[[File:ProductOpenerStructure.png|thumbnail|Diagram explaining the infrastructure of ''Product Opener'']]<br />
<br />
== Open source ==<br />
<br />
Product Opener is released under the [https://en.wikipedia.org/wiki/GNU_Affero_General_Public_License GNU Affero License], a free, copyleft license so that it can be reused by other projects, for instance to open the data for other types of products.<br />
<br />
Product Opener original code includes code related to the original developer's other projects. Efforts are under way to clean, decouple and document the Product Opener code so that it can be released as open source.<br />
<br />
== Components ==<br />
<br />
=== Product Opener Database ===<br />
<br />
==== Product data and history ====<br />
<br />
The data for each product is stored in a structured object (several levels of hashes and arrays). The data is stored on disk in individual files in Perl's binary format for objects (Storable). The history of each change to the product data is also saved in the same format. There is one binary file for each version.<br />
[[File:ProductOpenerDataStructure.png|thumbnail]]<br />
<br />
==== Product data index ====<br />
<br />
The current version of each product is stored in a MongoDB database. The database includes indexes and is used to search and display products.<br />
MongoDB allow storing structured objects as-is, so there is an exact correspondence between Perl's internal format, MongoDB's format and the JSON export of the API.<br />
[[File:Perlmongodb.png|thumbnail]]<br />
<br />
=== Product images ===<br />
<br />
Images are saved on disk for each product. Original images uploaded through the web server or mobile applications are kept. Thumbnails are also generated for the final product image.<br />
<br />
==== Aggregated data ====<br />
<br />
Some of the data is periodically aggregated and saved in Perl binary files (e.g. average nutrition facts for products of each category).<br />
<br />
==== Exported data ====<br />
<br />
The data for all products is periodically exported in CSV and RDF formats.<br />
<br />
=== Product Opener Web Server ===<br />
<br />
The web interface for searching, displaying, adding and editing products. (e.g. http://world.openfoodfacts.org for Open Food Facts)<br />
<br />
The server is written in Perl. In production we use a light weight Apache web server for static files (e.g. images) that does reverse proxying to a modperl Apache server that dynamically generates<br />
the HTML pages.<br />
<br />
The form to add and edit product uses Javascript and jquery.<br />
<br />
In the backend, other libraries and software are used, such as Tesseract for optical character recognition for ingredients.<br />
<br />
=== Product Opener API ===<br />
[[Project:API|See Detailed Page: Project:API]]<br />
<br />
Product Opener provides a JSON API to search products and read their data.<br />
<br />
There is also a limited API to upload product images and edit some of the product data that is used by the mobile applications.<br />
<br />
The API functionality is currently provided by the Product Opener Web Server, but it may change in the future (e.g. at some point we could implement a full API for accessing (reading + writing) the Product Opener database, and have the Web Server call the API instead of going directly to the database).<br />
<br />
=== Product Opener client applications ===<br />
<br />
==== Apache Cordova mobile app for Android, iOS and Windows Phone ====<br />
<br />
[[Mobile App Development Notes|See detailed article: Mobile App Development Notes]]<br />
<br />
The current Open Food Facts mobile apps for Android, iOS and Windows Phone are developed with Apache Cordova (previously known as Phonegap) with the same HTML + Javascript (including jquery and jquerymobile) code base.<br />
<br />
The Android app uses Moodstocks image recognizer and barcode scanner plugin. The iOS and Windows Phone apps use the BarcodeScanner plugin.<br />
<br />
The code for the Open Food Facts phonegap app is already in open source:<br />
* https://github.com/openfoodfacts/openfoodfacts-android/tree/master/phonegap/Open%20Food%20Facts (with the BarcodeScanner plugin)<br />
* https://github.com/openfoodfacts/openfoodfacts-moodstocks (with the Moodstocks plugin)<br />
<br />
== Installation ==<br />
<br />
(in progress)<br />
<br />
See [[Product Opener installation]]<br />
<br />
and [[Product Opener installation on Debian / Ubuntu]]<br />
<br />
== Maintenance tasks ==<br />
* [[Product Opener - How to update a taxonomy]]<br />
* [[Product Opener - How to update interface translations in Lang.pm]]<br />
<br />
== Documentation ==<br />
<br />
(in progress)<br />
<br />
[[Product Opener documentation]]<br />
[[Category:ProductOpener]]<br />
[[Category:Developer]]</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Project:Product_Opener&diff=8784Project:Product Opener2019-10-27T20:11:24Z<p>Vaiton: Vaiton moved page Project:Product Opener to Product Opener</p>
<hr />
<div>#REDIRECT [[Product Opener]]</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Product_Opener&diff=8783Product Opener2019-10-27T20:11:23Z<p>Vaiton: Vaiton moved page Project:Product Opener to Product Opener</p>
<hr />
<div>== Introduction ==<br />
<br />
Product Opener is the software used by Open Food Facts to create and maintain its collaborative database of food products in open data.<br />
<br />
[[File:ProductOpenerStructure.png|thumbnail]]<br />
<br />
== Open source ==<br />
<br />
Product Opener will be released under an open source licence so that it can be reused by other projects, for instance to open the data for other types of products.<br />
<br />
The Product Opener original code includes code related to the original developer's other projects. Efforts are under way to clean, decouple and document the Product Opener code so that it can be released as open source.<br />
<br />
== Components ==<br />
<br />
=== Product Opener Database ===<br />
<br />
==== Product data and history ====<br />
<br />
The data for each product is stored in a structured object (several levels of hashes and arrays). The data is stored on disk in individual files in Perl's binary format for objects (Storable). The history of each change to the product data is also saved in the same format. There is one binary file for each version.<br />
[[File:ProductOpenerDataStructure.png|thumbnail]]<br />
<br />
==== Product data index ====<br />
<br />
The current version of each product is stored in a MongoDB database. The database includes indexes and is used to search and display products.<br />
MongoDB allow storing structured objects as-is, so there is an exact correspondence between Perl's internal format, MongoDB's format and the JSON export of the API.<br />
[[File:Perlmongodb.png|thumbnail]]<br />
<br />
=== Product images ===<br />
<br />
Images are saved on disk for each product. Original images uploaded through the web server or mobile applications are kept. Thumbnails are also generated for the final product image.<br />
<br />
==== Aggregated data ====<br />
<br />
Some of the data is periodically aggregated and saved in Perl binary files (e.g. average nutrition facts for products of each category).<br />
<br />
==== Exported data ====<br />
<br />
The data for all products is periodically exported in CSV and RDF formats.<br />
<br />
=== Product Opener Web Server ===<br />
<br />
The web interface for searching, displaying, adding and editing products. (e.g. http://world.openfoodfacts.org for Open Food Facts)<br />
<br />
The server is written in Perl. In production we use a light weight Apache web server for static files (e.g. images) that does reverse proxying to a modperl Apache server that dynamically generates<br />
the HTML pages.<br />
<br />
The form to add and edit product uses Javascript and jquery.<br />
<br />
In the backend, other libraries and software are used, such as Tesseract for optical character recognition for ingredients.<br />
<br />
=== Product Opener API ===<br />
[[Project:API|See Detailed Page: Project:API]]<br />
<br />
Product Opener provides a JSON API to search products and read their data.<br />
<br />
There is also a limited API to upload product images and edit some of the product data that is used by the mobile applications.<br />
<br />
The API functionality is currently provided by the Product Opener Web Server, but it may change in the future (e.g. at some point we could implement a full API for accessing (reading + writing) the Product Opener database, and have the Web Server call the API instead of going directly to the database).<br />
<br />
=== Product Opener client applications ===<br />
<br />
==== Apache Cordova mobile app for Android, iOS and Windows Phone ====<br />
<br />
[[Mobile App Development Notes|See detailed article: Mobile App Development Notes]]<br />
<br />
The current Open Food Facts mobile apps for Android, iOS and Windows Phone are developed with Apache Cordova (previously known as Phonegap) with the same HTML + Javascript (including jquery and jquerymobile) code base.<br />
<br />
The Android app uses Moodstocks image recognizer and barcode scanner plugin. The iOS and Windows Phone apps use the BarcodeScanner plugin.<br />
<br />
The code for the Open Food Facts phonegap app is already in open source:<br />
* https://github.com/openfoodfacts/openfoodfacts-android/tree/master/phonegap/Open%20Food%20Facts (with the BarcodeScanner plugin)<br />
* https://github.com/openfoodfacts/openfoodfacts-moodstocks (with the Moodstocks plugin)<br />
<br />
== Installation ==<br />
<br />
(in progress)<br />
<br />
See [[Product Opener installation]]<br />
<br />
and [[Product Opener installation on Debian / Ubuntu]]<br />
<br />
== Maintenance tasks ==<br />
* [[Product Opener - How to update a taxonomy]]<br />
* [[Product Opener - How to update interface translations in Lang.pm]]<br />
<br />
== Documentation ==<br />
<br />
(in progress)<br />
<br />
[[Product Opener documentation]]<br />
[[Category:ProductOpener]]<br />
[[Category:Developer]]</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Development_Team&diff=8782Development Team2019-10-27T20:11:01Z<p>Vaiton: Added Product opener table and brief description</p>
<hr />
<div>The developement team behind Open Food Facts is made of volunteers around the world who believe in a world of open data. Most of contributions are made on [https://github.com/openfoodfacts github].<br />
== Product Opener ==<br />
[[Project:Product Opener| Product Opener]] is the software used by Open Food Facts to serve the website openfoodfacts.org and to maintain and update the database of products.<br />
It is developed via [https://github.com/openfoodfacts/openfoodfacts-server git] and its main 10 contributors are (at October 2019):<br />
{| class="wikitable"<br />
|-<br />
! Username<br />
! Commits<br />
! Additions (LOCs)<br />
! Deletions (LOCs)<br />
|-<br />
| [https://github.com/stephanegigandet @stephanegigandet] (Stéphane Gigandet)<br />
| 1,455<br />
| 4,609,071<br />
| 2,476,694<br />
|-<br />
| [https://github.com/teolemon @teolemon] (Pierre Slamich)<br />
| 15,070<br />
| 2,293,657<br />
| 796,177<br />
|-<br />
| [https://github.com/hangy @hangy]<br />
| 600<br />
| 251,505<br />
| 307,100<br />
|-<br />
| [https://github.com/aleene @alenee] (Arnaud Leene)<br />
| 1,871<br />
| 141,155<br />
| 84,175<br />
|-<br />
| [https://github.com/moon-rabbitOFF @moon-rabbitOFF]<br />
| 76<br />
| 66,997<br />
| 397<br />
|-<br />
| [https://github.com/maddingue @maddingue]<br />
| 13<br />
| 38,536<br />
| 13,788<br />
|-<br />
| [https://github.com/VaiTon @VaiTon]<br />
| 55<br />
| 13,731<br />
| 8,498<br />
|-<br />
| [https://github.com/Lunique @Lunique]<br />
| 4<br />
| 7,595<br />
| 9<br />
|-<br />
| [https://github.com/K13b3r @K13b3r]<br />
| 7<br />
| 5,427<br />
| 0<br />
|-<br />
|[https://github.com/NerOcrO1 @NerOcrO1]<br />
| 43<br />
| 574<br />
| 24,527<br />
|}<br />
== Mobile ==<br />
=== iOS ===<br />
=== Android ===<br />
=== Hybrid ===<br />
== Taxonomies ==</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Tech_Team&diff=8781Tech Team2019-10-27T19:23:24Z<p>Vaiton: /* Needs */</p>
<hr />
<div>The Open Food Facts software is developed collaboratively by hackers from all around the world.<br />
<br />
We have a lot of development work to do:<br />
* Open Food Facts backend (Perl and MongoDB);<br />
* API (JSON);<br />
* Web site (HTML5, JS, Foundation);<br />
* iOS native (Swift);<br />
* Android native (Java);<br />
* Windows Phone and FirefoxOS apps (currently developed in HTML and JS with Apache Cordova / PhoneGap);<br />
* Build new cool reuses etc...<br />
<br />
All our code is on GitHub : [https://github.com/openfoodfacts/ https://github.com/openfoodfacts/]<br />
<br />
== Needs ==<br />
<br />
There is many issues, categorized by topics, see:<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/issues Website, backend and API issues]<br />
** For beginners see [https://github.com/openfoodfacts/openfoodfacts-server/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22 First Good Issue] category<br />
** For those who love i18n see [https://github.com/openfoodfacts/openfoodfacts-server/issues?q=is%3Aopen+is%3Aissue+label%3Ai18n translations] category<br />
** See [https://github.com/openfoodfacts/openfoodfacts-server/labels all the categories]<br />
* [https://github.com/openfoodfacts/openfoodfacts-androidapp/issues Android app issues]<br />
* [https://github.com/openfoodfacts/openfoodfacts-ios/issues iOS app issues]<br />
* [https://github.com/openfoodfacts/openfoodfacts-ai/issues Open Food Facts AI issues]<br />
* [https://github.com/openfoodfacts/ All the repositories]<br />
<br />
== Principles ==<br />
<br />
Our goal is to follow and keep few and simple guidelines.<br />
<br />
# '''discuss the topics or issues or functionalities you want to work on'''. The [http://slack.openfoodfacts.org/ slack workspace] is the best choice for it.<br />
# if not already done, '''open an issue''' on Github to explain the problem you want to solve or the functionality you want to work on.<br />
# if you want to work on an existing issue, '''tell everyone in the issue's Github comments'''.<br />
# fork the project and '''create one branch per issue or functionality you want to work on'''.<br />
## It's cool to name a branch: ''issue/[issue_number]-[name]''; ex.: ''issue/1630-name-of-the-issue''<br />
## When you're ready to propose something, send a "pull request"; be patient, sometimes it takes time to the core team to review pull request.<br />
# '''coding style''' is defined in the .editorconfig file, see [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/.editorconfig https://github.com/openfoodfacts/openfoodfacts-server/blob/master/.editorconfig]; many editors support EditorConfig, check yours: https://editorconfig.org<br />
<br />
== Inspirations ==<br />
<br />
* https://www.mediawiki.org/wiki/How_to_contribute<br />
* Inspirations from https://www.mediawiki.org/wiki/How_to_become_a_MediaWiki_hacker<br />
* Wikimedia makes a difference between:<br />
** policies, what people MUST do: https://www.mediawiki.org/wiki/Development_policy<br />
** guidelines, what people SHOULD do: https://www.mediawiki.org/wiki/Development_guideline</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Global_taxonomies&diff=8679Global taxonomies2019-07-19T15:18:26Z<p>Vaiton: /* Taxonomies */</p>
<hr />
<div>[[Category:Global Taxonomies]]<br />
<br />
'''Open Food Facts''' uses '''global taxonomies''' for fields such as '''categories''', '''brands''', '''labels''' and '''countries'''. This page explains how taxonomies work in Open Food Facts and how they can be updated and enhanced.<br />
<br />
== Features ==<br />
<br />
* A global hierarchy / taxonomy for each type of data field (categories, brands, labels, countries etc.)<br />
* Translations for every language of each field value<br />
* Multiple synonyms for each field value in each language<br />
* Stopwords for each language/field type<br />
<br />
== Generalities ==<br />
<br />
=== Languages ===<br />
Each language has a 2-letter prefix. e.g. "en" for English and "fr" for French.<br />
<br />
Whenever possible, the canonical language for each field value should be English. e.g. en:soups is the canonical value for the Soups category.<br />
A value can be defined in another language (which becomes the canonical language), e.g. fr:soupes-a-l-oignon could be the canonical value for "Onion Soups" if we don't have an English translation yet.<br />
<br />
New values (e.g. categories that do not exist yet) should have an English canonical value.<br />
<br />
Each field value can be translated to any language.<br />
<br />
When a field value needs to be translated to a target language, if the translation does not exist yet, English is shown (or the canonical language if the English translation does not exist either).<br />
<br />
==== Remarks ====<br />
* Which standard is used for the codes? It can be the [https://en.wikipedia.org/wiki/ISO_639-1 ISO-639-1] standard, eventually this can be extended the 3-letter codes.<br />
<br />
=== Singular or plural? ===<br />
Generally, we use the plural for categories but some of them are in singular. We don't put the plural form when it has a different meaning. For example Beef and Beefs. We are talking of the meat and not the animal, so there is no "s". But "Rillettes" in french (and others languages) doesn't have a singular form.<br />
<br />
Sometimes plural or singular depends on the language. The situation for dutch is described in [[Dutch translation issues]].<br />
<br />
If the category is in plural form, the translations should be in the plural form.<br />
<br />
<pre><br />
@stephane new proposal (not yet adopted, to be discussed)<br />
In the categories taxonomy, always use the plural (en:beers, fr:bières).<br />
Then add the singular (especially if it's not a simple rule like removing the final s) in a property:<br />
singular:en:beer<br />
singular:fr:bière<br />
For the ingredients taxonomy, do the reverse:<br />
always use the singular for the main entry, and then add the plural:<br />
en:tomato<br />
plural:en:tomatoes<br />
</pre><br />
<br />
=== Synonyms ===<br />
In each language, each value can have a number of synonyms.<br />
<br />
Simple synonyms (simple singular) are done automatically when possible.<br />
<br />
Synonyms are recursive: if en:yoghurt is a synonym of en:yogurt, then en:banana_yoghurt will automatically be added as a synonym of en:banana_yogurt<br />
<br />
=== Remarks ===<br />
* What are the simple synonym rules? How does translate to other languages?<br />
* Not that recursion does not work for languages, where the adjectives changes based on gender.<br />
<br />
=== Stopwords ===<br />
Stopwords can be used to further extend synonyms. e.g. if "à" and "la" are stopwords for French, then "Yaourts fraise" will automatically be mapped to "Yaourts à la fraise".<br />
<br />
In the ingredients taxonomy, stopwords are also words that can be ignored. For instance ''contains'' is not an ingredient.<br />
<br />
=== Taxonomy architecture ===<br />
The taxonomy is not a strict hierarchy: values can have multiple parents. But cycles are not allowed.<br />
<br />
== Format ==<br />
<br />
<pre><br />
# stopwords<br />
stopwords:en: some,stopwords<br />
stopwords:fr: word,that,are,removed,when,matching<br />
<br />
# synonyms that are not field values but that are contained in field values<br />
synonyms:en: global,international<br />
<br />
en: value, a synonym value, another synonym value<br />
fr: valeur, une valeur synonyme, une autre valeur synonyme<br />
<br />
<en: value<br />
en: a child value, a synonym for a child value<br />
fr: une valeur enfant, un synonyme d'une valeur enfant<br />
<br />
<en: value<br />
en: another child value<br />
<br />
<en: a child value<br />
<en: another child value<br />
en: a grand-child value<br />
<br />
# properties<br />
en: value<br />
fr: valeur<br />
description:en: a property of value<br />
description:fr: french version of the property<br />
country_code:en: a property that is the same for all languages -> use English suffix en:<br />
wikidata:en:Q89<br />
<br />
</pre><br />
<br />
== Taxonomies ==<br />
<br />
The definitions can be edited on [https://github.com/openfoodfacts/openfoodfacts-server/tree/master/taxonomies GitHub], they are periodically synchronized on the Open Food Facts database and web site.<br />
<br />
=== Taxonomies ===<br />
'''(on Github, account and VCS knowledge needed)'''<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/test.txt Test taxonomy] showing the basic taxonomy definition features<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/ingredients.txt Global ingredients taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/categories.txt Global categories taxonomy]<br />
* [[Global brands and companies taxonomy]]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/labels.txt Global labels taxonomy]<br />
* [[Global labels taxonomy logos]]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/languages.txt Global languages taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/countries.txt Global countries taxonomy]<br />
* [[Global origins taxonomy]]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/additives.txt Global additives taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/additives_classes.txt Global additives classes taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/vitamins.txt Global vitamins taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/minerals.txt Global minerals taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/amino_acids.txt Global amino acids taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/nucleotides.txt Global nucleotides taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/other_nutritional_substances.txt Global other nutritional substances taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/allergens.txt Global allergens taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/states.txt Global states taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/nova_groups.txt Global NOVA groups taxonomy]<br />
<br />
=== Draft Taxonomies ===<br />
* [[Global packaging taxonomy]]<br />
* [[Global stores taxonomy]]<br />
* [[Global Religious Certification taxonomy]]<br />
* [[Global Food Preparation taxonomy]] (related to [[Project:Microwave]])<br />
* [[Global IGP taxonomy]]<br />
* [[Global EC marks taxonomy]]<br />
<br />
== More info ==<br />
For detailed information specific for the ingredients taxonomy see [[Project:Ingredients ontology|Ingredients Ontology]].</div>Vaitonhttps://wiki.openfoodfacts.org/index.php?title=Global_taxonomies&diff=8678Global taxonomies2019-07-19T15:15:01Z<p>Vaiton: </p>
<hr />
<div>[[Category:Global Taxonomies]]<br />
<br />
'''Open Food Facts''' uses '''global taxonomies''' for fields such as '''categories''', '''brands''', '''labels''' and '''countries'''. This page explains how taxonomies work in Open Food Facts and how they can be updated and enhanced.<br />
<br />
== Features ==<br />
<br />
* A global hierarchy / taxonomy for each type of data field (categories, brands, labels, countries etc.)<br />
* Translations for every language of each field value<br />
* Multiple synonyms for each field value in each language<br />
* Stopwords for each language/field type<br />
<br />
== Generalities ==<br />
<br />
=== Languages ===<br />
Each language has a 2-letter prefix. e.g. "en" for English and "fr" for French.<br />
<br />
Whenever possible, the canonical language for each field value should be English. e.g. en:soups is the canonical value for the Soups category.<br />
A value can be defined in another language (which becomes the canonical language), e.g. fr:soupes-a-l-oignon could be the canonical value for "Onion Soups" if we don't have an English translation yet.<br />
<br />
New values (e.g. categories that do not exist yet) should have an English canonical value.<br />
<br />
Each field value can be translated to any language.<br />
<br />
When a field value needs to be translated to a target language, if the translation does not exist yet, English is shown (or the canonical language if the English translation does not exist either).<br />
<br />
==== Remarks ====<br />
* Which standard is used for the codes? It can be the [https://en.wikipedia.org/wiki/ISO_639-1 ISO-639-1] standard, eventually this can be extended the 3-letter codes.<br />
<br />
=== Singular or plural? ===<br />
Generally, we use the plural for categories but some of them are in singular. We don't put the plural form when it has a different meaning. For example Beef and Beefs. We are talking of the meat and not the animal, so there is no "s". But "Rillettes" in french (and others languages) doesn't have a singular form.<br />
<br />
Sometimes plural or singular depends on the language. The situation for dutch is described in [[Dutch translation issues]].<br />
<br />
If the category is in plural form, the translations should be in the plural form.<br />
<br />
<pre><br />
@stephane new proposal (not yet adopted, to be discussed)<br />
In the categories taxonomy, always use the plural (en:beers, fr:bières).<br />
Then add the singular (especially if it's not a simple rule like removing the final s) in a property:<br />
singular:en:beer<br />
singular:fr:bière<br />
For the ingredients taxonomy, do the reverse:<br />
always use the singular for the main entry, and then add the plural:<br />
en:tomato<br />
plural:en:tomatoes<br />
</pre><br />
<br />
=== Synonyms ===<br />
In each language, each value can have a number of synonyms.<br />
<br />
Simple synonyms (simple singular) are done automatically when possible.<br />
<br />
Synonyms are recursive: if en:yoghurt is a synonym of en:yogurt, then en:banana_yoghurt will automatically be added as a synonym of en:banana_yogurt<br />
<br />
=== Remarks ===<br />
* What are the simple synonym rules? How does translate to other languages?<br />
* Not that recursion does not work for languages, where the adjectives changes based on gender.<br />
<br />
=== Stopwords ===<br />
Stopwords can be used to further extend synonyms. e.g. if "à" and "la" are stopwords for French, then "Yaourts fraise" will automatically be mapped to "Yaourts à la fraise".<br />
<br />
In the ingredients taxonomy, stopwords are also words that can be ignored. For instance ''contains'' is not an ingredient.<br />
<br />
=== Taxonomy architecture ===<br />
The taxonomy is not a strict hierarchy: values can have multiple parents. But cycles are not allowed.<br />
<br />
== Format ==<br />
<br />
<pre><br />
# stopwords<br />
stopwords:en: some,stopwords<br />
stopwords:fr: word,that,are,removed,when,matching<br />
<br />
# synonyms that are not field values but that are contained in field values<br />
synonyms:en: global,international<br />
<br />
en: value, a synonym value, another synonym value<br />
fr: valeur, une valeur synonyme, une autre valeur synonyme<br />
<br />
<en: value<br />
en: a child value, a synonym for a child value<br />
fr: une valeur enfant, un synonyme d'une valeur enfant<br />
<br />
<en: value<br />
en: another child value<br />
<br />
<en: a child value<br />
<en: another child value<br />
en: a grand-child value<br />
<br />
# properties<br />
en: value<br />
fr: valeur<br />
description:en: a property of value<br />
description:fr: french version of the property<br />
country_code:en: a property that is the same for all languages -> use English suffix en:<br />
wikidata:en:Q89<br />
<br />
</pre><br />
<br />
== Taxonomies ==<br />
<br />
The definitions can be edited on this wiki, they are periodically synchronized on the Open Food Facts database and web site.<br />
<br />
=== Taxonomies ===<br />
'''(on Github, account and VCS knowledge needed)'''<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/test.txt Test taxonomy] showing the basic taxonomy definition features<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/ingredients.txt Global ingredients taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/categories.txt Global categories taxonomy]<br />
* [[Global brands and companies taxonomy]]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/labels.txt Global labels taxonomy]<br />
* [[Global labels taxonomy logos]]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/languages.txt Global languages taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/countries.txt Global countries taxonomy]<br />
* [[Global origins taxonomy]]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/additives.txt Global additives taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/additives_classes.txt Global additives classes taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/vitamins.txt Global vitamins taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/minerals.txt Global minerals taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/amino_acids.txt Global amino acids taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/nucleotides.txt Global nucleotides taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/other_nutritional_substances.txt Global other nutritional substances taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/allergens.txt Global allergens taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/states.txt Global states taxonomy]<br />
* [https://github.com/openfoodfacts/openfoodfacts-server/blob/master/taxonomies/nova_groups.txt Global NOVA groups taxonomy]<br />
<br />
=== Draft Taxonomies ===<br />
* [[Global packaging taxonomy]]<br />
* [[Global stores taxonomy]]<br />
* [[Global Religious Certification taxonomy]]<br />
* [[Global Food Preparation taxonomy]] (related to [[Project:Microwave]])<br />
* [[Global IGP taxonomy]]<br />
* [[Global EC marks taxonomy]]<br />
<br />
== More info ==<br />
For detailed information specific for the ingredients taxonomy see [[Project:Ingredients ontology|Ingredients Ontology]].</div>Vaiton