Rules the tool applies
Every rule that Recipe Nutrition Labels applies to a label, with the paragraph of 21 CFR that it comes from and the words of that paragraph. The text is quoted from eCFR, up to date as of 2026-11-12 (title 21, part 101, §§ 101.9 and 101.12), at https://www.ecfr.gov/current/title-21/chapter-I/subchapter-B/part-101. Appendix B to part 101 is shown on eCFR only as images, so it is quoted from the annual edition of the CFR on govinfo (below).
python3 -I ecfr.py checkfetches the current eCFR text and checks that every quote below is found, word for word, in the paragraph it is cited from (quotation-mark style and spacing aside). It fails when eCFR's date is no longer the one above.- The Daily Values, the RDIs and the reference amounts (RACC) are not typed by hand:
python3 -I ecfr.py buildwrites them from eCFR's own tables intosite/rules-data.js, which the engine reads. - The engine is
site/engine.js; its tests (node --test tests/*.test.mjs) are written from these paragraphs, with the edge values of each rounding rule on both sides. - Where 101.9 lets the seller choose ("may"), the rule says which choice the tool makes.
A calculation is not a lab analysis, and following these rules does not make a label right for a given food: the seller of the food is responsible for its label. This list is not regulatory or legal advice.
What goes on the label
R-ORDER: the 15 nutrients, their names and their order
Source: 21 CFR 101.9(c)
Except as provided for in paragraphs (f) or (j) of this section, nutrient information shall be presented using the nutrient names specified and in the following order in the formats specified in paragraphs (d) or (e) of this section.
Source: 21 CFR 101.9(c)(8)(ii)
The declaration of vitamins and minerals as a quantitative amount by weight and percent of the RDI shall include vitamin D, calcium, iron, and potassium in that order
What the tool does: it always declares the 15 mandatory nutrients in the order of 101.9(c): Calories, Total Fat, Saturated Fat, Trans Fat, Cholesterol, Sodium, Total Carbohydrate, Dietary Fiber, Total Sugars, Added Sugars ("Includes … Added Sugars"), Protein, then Vitamin D, Calcium, Iron and Potassium. It declares them also where 101.9(c) would let a nutrient be left out (R-NOT-APPLIED), and it declares no voluntary nutrient.
The numbers before rounding
R-AMOUNT: the amount of each ingredient
What the tool does: the buyer gives each ingredient's amount in grams, ounces, pounds, or a number of one of USDA's household portions for that food (USDA's gram weight of that portion). An ounce is 28.349523125 g and a pound 453.59237 g (avoirdupois). An amount must be a finite number above zero, and so must a portion's gram weight; anything else is refused and the label stays incomplete. This is the weight in the recipe, not a label statement; the 28 g ounce of 101.9(b)(5)(viii) is for household measures on the label, which the buyer writes (R-SERV-HOUSEHOLD).
R-PERSERVING: nutrients per serving
Source: 21 CFR 101.9(b)
Except as provided in § 101.9(h)(3), all nutrient and food component quantities shall be declared in relation to a serving as defined in this section.
What the tool does: for each nutrient, the batch's total is the sum over the ingredients of amount × (value per 100 g) ÷ 100. Per serving it is that total × serving grams ÷ batch weight (R-BATCH). Each value per 100 g comes from USDA FoodData Central (DATA.md), from the buyer's own entry (a supplier's label, converted to 100 g as value × 100 ÷ the label's serving grams), or from what the buyer filled in where USDA has none. A value USDA does not give is never taken as zero: the label shows no number for that nutrient until the buyer enters a value or marks the ingredient as having none, and the recipe's summary shows that choice. A value must be a finite number of 0 or more (an own entry, a filled-in value, and the serving of the supplier's label above zero); a negative or non-finite number is refused, never used, and the label stays incomplete. So are a serving and a package net weight that are not finite numbers above zero.
R-BATCH: the weight after cooking
Source: 21 CFR 101.9(b)(9)
The declaration of nutrient and food component content shall be on the basis of food as packaged or purchased
What the tool does: when the buyer enters the weight of the finished batch (for example after baking), per-serving values use that weight, so water lost in cooking makes each gram richer. Without it, the batch weight is the sum of the ingredients. A weight after cooking that is entered but is not a finite number above zero is refused: the label stays incomplete, with no fallback to the sum. Nutrient losses in cooking are not modelled: every nutrient of the raw ingredients is counted as still there. The exceptions in this paragraph (raw fish, foods packed in a liquid that is not eaten, declared on drained solids) are the buyer's to apply.
R-CAL-METHOD: how calories are calculated
Source: 21 CFR 101.9(c)(1)(i)
Caloric content may be calculated by the following methods. Where either specific or general food factors are used, the factors shall be applied to the actual amount (i.e., before rounding) of food components (e.g., fat, carbohydrate, protein, or ingredients with specific food factors) present per serving.
Source: 21 CFR 101.9(c)(1)(i)(B)
Using the general factors of 4, 4, and 9 calories per gram for protein, total carbohydrate, and total fat, respectively, as described in USDA Handbook No. 74 (slightly revised, 1973) pp. 9-11;
What the tool does: calories per serving = 4 × protein + 4 × total carbohydrate + 9 × total fat, on the actual (unrounded) grams per serving. USDA's own energy values are not used, so every ingredient, USDA or own entry, is counted the same way. This method does not count alcohol, and counts fiber and sugar alcohols as carbohydrate at 4 calories per gram; methods (A), (C) to (F) are not offered.
Rounding
R-TIE: what "nearest" does with a tie
What the tool does: 101.9 says "nearest" without saying which way a value exactly half-way goes. The tool rounds it up (0.75 g of fat to the nearest 0.5 g is 1 g; 137.5 mg of sodium to the nearest 5 mg is 140 mg). This is the tool's choice, not a rule of 21 CFR. It applies to every rounding below; 101.9(b)(5)(ix) says the same for serving sizes that fall half-way.
R-CAL-ROUND: calories
Source: 21 CFR 101.9(c)(1)
A statement of the caloric content per serving, expressed to the nearest 5-calorie increment up to and including 50 calories, and 10-calorie increment above 50 calories, except that amounts less than 5 calories may be expressed as zero.
What the tool does: under 5: 0. From 5 up to and including 50: nearest 5. Above 50: nearest 10. (47.5 is 50; 50 is 50; 54.9 is 50; 55 is 60.)
R-FAT: total fat
Source: 21 CFR 101.9(c)(2)
Amounts shall be expressed to the nearest 0.5 ( 1/2) gram increment below 5 grams and to the nearest gram increment above 5 grams. If the serving contains less than 0.5 gram, the content shall be expressed as zero.
What the tool does: under 0.5 g: 0 g. From 0.5 g to under 5 g: nearest 0.5 g. 5 g and more: nearest gram. (5 g exactly is 5 g by either rule.)
R-SAT: saturated fat
Source: 21 CFR 101.9(c)(2)(i)
Saturated fat content shall be indented and expressed as grams per serving to the nearest 0.5 gram ( 1/2) gram increment below 5 grams and to the nearest gram increment above 5 grams. If the serving contains less than 0.5 gram, the content shall be expressed as zero.
What the tool does: as R-FAT.
R-TRANS: trans fat
Source: 21 CFR 101.9(c)(2)(ii)
Trans fat content shall be indented and expressed as grams per serving to the nearest 0.5 ( 1/2)-gram increment below 5 grams and to the nearest gram increment above 5 grams. If the serving contains less than 0.5 gram, the content, when declared, shall be expressed as zero.
What the tool does: as R-FAT. "Trans" is set in roman type; the paragraph allows italics but does not require them.
R-CHOL: cholesterol
Source: 21 CFR 101.9(c)(3)
A statement of the cholesterol content in a serving expressed in milligrams to the nearest 5-milligram increment, except that label declaration of cholesterol information is not required for products that contain less than 2 milligrams cholesterol in a serving and make no claim about fat, fatty acids, or cholesterol content, or such products may state the cholesterol content as zero. […] If the food contains 2 to 5 milligrams of cholesterol per serving, the content may be stated as "less than 5 milligrams."
Source: 21 CFR 101.9(d)(7)(i)
The symbol "<" may be used in place of "less than."
What the tool does: under 2 mg: 0mg. From 2 mg to under 5 mg: "<5mg". 5 mg and more: nearest 5 mg.
R-SODIUM: sodium
Source: 21 CFR 101.9(c)(4)
A statement of the number of milligrams of sodium in a specified serving of food expressed as zero when the serving contains less than 5 milligrams of sodium, to the nearest 5-milligram increment when the serving contains 5 to 140 milligrams of sodium, and to the nearest 10-milligram increment when the serving contains greater than 140 milligrams.
What the tool does: under 5 mg: 0mg. From 5 up to and including 140 mg: nearest 5 mg. Above 140 mg: nearest 10 mg.
R-CARB: total carbohydrate
Source: 21 CFR 101.9(c)(6)
A statement of the number of grams of total carbohydrate in a serving expressed to the nearest gram, except that if a serving contains less than 1 gram, the statement "Contains less than 1 gram" or "less than 1 gram" may be used as an alternative, or if the serving contains less than 0.5 gram, the content may be expressed as zero. Total carbohydrate content shall be calculated by subtraction of the sum of the crude protein, total fat, moisture, and ash from the total weight of the food.
What the tool does: under 0.5 g: 0g. From 0.5 g to under 1 g: "<1g" (R-ORDER, (d)(7)(i)). 1 g and more: nearest gram. USDA's value is its "Carbohydrate, by difference" (DATA.md), which is the subtraction this paragraph describes. A buyer's own entry is whatever the supplier's label says.
R-FIBER: dietary fiber
Source: 21 CFR 101.9(c)(6)(i)
A statement of the number of grams of total dietary fiber in a serving, indented and expressed to the nearest gram, except that if a serving contains less than 1 gram, declaration of dietary fiber is not required or, alternatively, the statement "Contains less than 1 gram" or "less than 1 gram" may be used, and if the serving contains less than 0.5 gram, the content may be expressed as zero.
What the tool does: as R-CARB, and always declared. USDA's "Fiber, total dietary" is a laboratory measure; whether every fiber in it meets the definition in this paragraph (isolated or synthetic fibers must be ones FDA has listed) is the buyer's to check.
R-SUGARS: total sugars
Source: 21 CFR 101.9(c)(6)(ii)
Total sugars content shall be indented and expressed to the nearest gram, except that if a serving contains less than 1 gram, the statement "Contains less than 1 gram" or "less than 1 gram" may be used as an alternative, and if the serving contains less than 0.5 gram, the content may be expressed as zero.
What the tool does: as R-CARB, and always declared. No percent Daily Value: 101.9(c)(9) sets no DRV for total sugars.
R-ADDED: added sugars
Source: 21 CFR 101.9(c)(6)(iii)
Added sugars content shall be indented under Total Sugars and shall be prefaced with the word "Includes" followed by the amount (in grams) "Added Sugars" ("Includes 'X' g Added Sugars"). It shall be expressed to the nearest gram, except that if a serving contains less than 1 gram, the statement "Contains less than 1 gram" or "less than 1 gram" may be used as an alternative, and if the serving contains less than 0.5 gram, the content may be expressed as zero.
What the tool does: rounded as R-CARB, shown as "Includes 6g Added Sugars", always declared, with its percent Daily Value (R-DV).
R-ADDED-MARK: which ingredients are added sugars
Source: 21 CFR 101.9(c)(6)(iii)
Added sugars are either added during the processing of foods, or are packaged as such, and include sugars (free, mono and disaccharides), sugars from syrups and honey, and sugars from concentrated fruit or vegetable juices that are in excess of what would be expected from the same volume of 100 percent fruit or vegetable juice of the same type
What the tool does: USDA's data says nothing about added sugars, so the tool asks for every ingredient. The buyer marks an ingredient as an added sugar (sugar, honey, a syrup): all of its total sugars then count as added. Or the buyer marks it as having none, or enters a value (an own entry takes the supplier label's added sugars). Which ingredients are added sugars, including the exceptions for juice concentrates in this paragraph, is the buyer's decision. The same paragraph asks the manufacturer to keep records when added and naturally occurring sugars are mixed, or when added sugars ferment or brown ((g)(10) and (g)(11)); keeping them is the buyer's.
R-PROTEIN: protein
Source: 21 CFR 101.9(c)(7)
A statement of the number of grams of protein in a serving, expressed to the nearest gram, except that if a serving contains less than 1 gram, the statement "Contains less than 1 gram" or "less than 1 gram" may be used as an alternative, and if the serving contains less than 0.5 gram, the content may be expressed as zero.
Source: 21 CFR 101.9(c)(7)(i)
A statement of the corrected amount of protein per serving, as determined in paragraph (c)(7)(ii) of this section, calculated as a percentage of the RDI or DRV for protein, as appropriate, and expressed as Percent of Daily Value, may be placed on the label, except that such a statement shall be given if a protein claim is made for the product, or if the product is represented or purported to be specifically for infants through 12 months or children 1 through 3 years of age.
What the tool does: rounded as R-CARB. No percent Daily Value for protein: (c)(7)(i) makes it optional when no protein claim is made and the food is not for infants or children 1 through 3, and it would need the protein's PDCAAS, which the tool does not have. A buyer who makes a protein claim needs it ("Not applied"). The case of protein of low quality is R-PROTEIN-QUALITY.
R-PROTEIN-QUALITY: protein of low quality
Source: 21 CFR 101.9(c)(7)
When the protein in foods represented or purported to be for adults and children 4 or more years of age has a protein quality value that is a protein digestibility-corrected amino acid score of less than 20 expressed as a percent, or when the protein in a food represented or purported to be for children greater than 1 but less than 4 years of age has a protein quality value that is a protein digestibility-corrected amino acid score of less than 40 expressed as a percent, either of the following shall be placed adjacent to the declaration of protein content by weight: The statement "not a significant source of protein," or a listing aligned under the column headed "Percent Daily Value" of the corrected amount of protein per serving
What the tool does: this applies with or without a protein claim. The tool cannot know a food's PDCAAS, so every recipe asks the buyer whether the protein in the food has a PDCAAS below 20%, and the label is incomplete until the buyer answers. When the answer is yes, the label says "Protein 2g not a significant source of protein" on the protein line (on the next line if it does not fit). The other choice of this paragraph, the corrected percent Daily Value, is not offered. Finding the food's PDCAAS is the buyer's. Foods for children under 4 are not made by this tool, so the 40% case does not arise.
Percent Daily Values
R-DV: Daily Reference Values and the percent
Source: 21 CFR 101.9(c)(9)
The following DRVs, nomenclature, and units of measure are established for the following food components:
What the tool does: it uses the column "Adults and children ≥4 years" of that table, copied by ecfr.py build: total fat 78 g, saturated fat 20 g, cholesterol 300 mg, total carbohydrate 275 g, sodium 2,300 mg, dietary fiber 28 g, added sugars 50 g (protein 50 g is not used, R-PROTEIN). Trans fat and total sugars have none, so they get no percent.
Source: 21 CFR 101.9(d)(7)(ii)
A listing of the percent of the DRV as established in paragraphs (c)(7)(iii) and (c)(9) of this section shall be given in a column aligned under the heading "% Daily Value" established in paragraph (d)(6) of this section with the percent expressed to the nearest whole percent for each nutrient declared in the column described in paragraph (d)(7)(i) of this section for which a DRV has been established, except that the percent for protein may be omitted as provided in paragraph (c)(7) of this section. The percent shall be calculated by dividing either the amount declared on the label for each nutrient or the actual amount of each nutrient (i.e., before rounding) by the DRV for the nutrient
What the tool does: percent = declared amount ÷ DRV × 100, to the nearest whole percent, so that "0g" of fat always shows 0%. Where the declaration is "<1g" or "<5mg", which has no single amount, it uses the actual amount instead, which the same paragraph allows. (9 g of fat: 11.5%, shown 12%.)
R-VM: vitamin D, calcium, iron and potassium
Source: 21 CFR 101.9(c)(8)(iv)
The following RDIs, nomenclature, and units of measure are established for the following vitamins and minerals which are essential in human nutrition:
Source: 21 CFR 101.9(c)(8)(i)
All other foods shall use the RDI for adults and children 4 or more years of age.
Source: 21 CFR 101.9(c)(8)(iii)
The percentages for vitamins and minerals shall be expressed to the nearest 2-percent increment up to and including the 10-percent level, the nearest 5-percent increment above 10 percent and up to and including the 50-percent level, and the nearest 10-percent increment above the 50-percent level. Quantitative amounts and percentages of vitamins and minerals present at less than 2 percent of the RDI are not required to be declared in nutrition labeling but may be declared by a zero […] The quantitative amounts of vitamins and minerals, excluding sodium, shall be the amount of the vitamin or mineral included in one serving of the product, using the units of measurement and the levels of significance given in paragraph (c)(8)(iv) of this section, except that zeros following decimal points may be dropped, and additional levels of significance may be used when the number of decimal places indicated is not sufficient to express lower amounts
What the tool does:
- RDIs from the column "Adults and children ≥ 4 years", copied by
ecfr.py build: vitamin D 20 mcg, calcium 1,300 mg, iron 18 mg, potassium 4,700 mg. Foods for infants, children 1 through 3, or pregnant or lactating women are not made by this tool. - The percent is the actual amount ÷ RDI × 100, then: up to and including 10%, nearest 2%; above 10% up to and including 50%, nearest 5%; above 50%, nearest 10%.
- Under 2% of the RDI: amount and percent are both declared as zero ("0mg 0%").
- The amount: in whole micrograms or milligrams, as the RDIs are given; under one unit, to the nearest tenth (iron 0.674 mg is "0.7mg"). This is the tool's reading of "levels of significance"; FDA guidance may recommend other increments, which the tool does not apply.
Serving size and servings per container
R-RACC: the reference amount of the product category
Source: 21 CFR 101.9(b)(2)
serving size declared on a product label shall be determined from the "Reference Amounts Customarily Consumed Per Eating Occasion * * * *" (reference amounts) that appear in § 101.12(b) using the procedures described below.
Source: 21 CFR 101.12(b)
The following reference amounts shall be used as the basis for determining serving sizes for specific products:
What the tool does: the buyer picks the product category from Table 2 of 101.12(b) ("General Food Supply"), copied by ecfr.py build with its footnotes; the tool shows its reference amount and label statement. Table 1 (foods for infants and young children) and the "Dietary supplements" row are left out. When the reference amount is a single number of grams, the tool shows the serving as a percent of it and makes the checks R-SERV-SINGLE and R-SERV-DUAL. Otherwise (mL, cups, tablespoons, "amount to make …") it says so and leaves the comparison to the buyer. Choosing the category, and the serving that follows from the procedures of 101.9(b)(2) (whole units, fractions of a large unit, household measures of bulk products), is the buyer's.
R-SERV-HOUSEHOLD: the household measure
Source: 21 CFR 101.9(b)(7)
A label statement regarding a serving shall be the serving size expressed in common household measures as set forth in paragraphs (b)(2) through (b)(6) of this section and shall be followed by the equivalent metric quantity in parenthesis (fluids in milliliters and all other foods in grams) except for single-serving containers.
What the tool does: the buyer types the household measure ("2 cookies", "2/3 cup") and the serving's weight in grams; the label shows "Serving size 2 cookies (30g)". Whether the measure follows 101.9(b)(5) (cups in 1/4 or 1/3 cup steps, the allowed tablespoons and teaspoons, and so on) is the buyer's. Servings are in grams only; fluids in milliliters are not supported.
R-SERV-METRIC: the grams of the serving
Source: 21 CFR 101.9(b)(7)(ii)
The gram or milliliter quantity equivalent to the household measure should be rounded to the nearest whole number except for quantities that are less than 5 g (mL). The gram (mL) quantity between 2 and 5 g (mL) should be rounded to the nearest 0.5 g (mL) and the g (mL) quantity less than 2 g (mL) should be expressed in 0.1-g (mL) increments.
What the tool does: 5 g and more: nearest gram. From 2 g to under 5 g: nearest 0.5 g. Under 2 g: nearest 0.1 g. The nutrients are calculated on the grams as entered, before this rounding.
R-SERV-COUNT: servings per container
Source: 21 CFR 101.9(b)(8)(i)
The number of servings shall be rounded to the nearest whole number except for the number of servings between 2 and 5 servings and random weight products. The number of servings between 2 and 5 servings shall be rounded to the nearest 0.5 serving. Rounding should be indicated by the use of the term about (e.g., about 2 servings, about 3.5 servings).
What the tool does: servings = net weight of the package ÷ serving grams. From 2 up to and including 5: nearest 0.5; otherwise nearest whole number. When rounding changed the number, it is preceded by "About". "Varied" for random-weight products ((b)(8)(iii)) is not offered.
R-SERV-SINGLE: a package under 200% of the reference amount
Source: 21 CFR 101.9(b)(6)
A product that is packaged and sold individually that contains less than 200 percent of the applicable reference amount must be considered to be a single-serving container, and the entire content of the product must be labeled as one serving.
What the tool does: when the reference amount is in grams and the package's net weight is under twice it, the tool warns that, if the product is packaged and sold individually, the whole package is one serving. It does not change the serving itself: whether the product is sold that way is the buyer's to know.
R-SERV-DUAL: a package of 200% to 300% of the reference amount
Source: 21 CFR 101.9(b)(12)(i)
Products that are packaged and sold individually and that contain at least 200 percent and up to and including 300 percent of the applicable reference amount must provide an additional column within the Nutrition Facts label that lists the quantitative amounts and percent Daily Values for the entire package, as well as a column listing the quantitative amounts and percent Daily Values for a serving that is less than the entire package
What the tool does: in that range it warns that such a product needs a second column, which this tool does not make (R-NOT-APPLIED). The same holds for a discrete unit of 200% to 300% of the reference amount, 101.9(b)(2)(i)(D), which the tool does not check.
The format
R-FORMAT: the standard vertical format
Source: 21 CFR 101.9(d)(1)
In the interest of uniformity of presentation, FDA strongly recommends that the nutrition information be presented using the graphic specifications set forth in appendix B to part 101.
Source: 21 CFR 101.9(d)(1)(i)
The nutrition information shall be set off in a box by use of hairlines and shall be all black or one color type, printed on a white or other neutral contrasting background whenever practical.
Source: 21 CFR 101.9(d)(1)(ii)
All information within the nutrition label shall utilize:
Source: 21 CFR 101.9(d)(1)(ii)(A)
Except as provided for in paragraph (c)(2)(ii) of this section, a single easy-to-read type style,
Source: 21 CFR 101.9(d)(1)(ii)(C)
At least one point leading (i.e., space between two lines of text) except that at least four points leading shall be utilized for the information required by paragraphs (d)(7) and (d)(8) of this section as shown in paragraph (d)(12), and
Source: 21 CFR 101.9(d)(1)(ii)(D)
Letters should never touch.
Source: 21 CFR 101.9(d)(1)(iii)
Information required in paragraphs (d)(7) and (8) of this section shall be in type size no smaller than 8 point. Information required in paragraph (d)(5) of this section for the "Calories" declaration shall be highlighted in bold or extra bold and shall be in a type size no smaller than 16 point […] The numeric amount for the information required in paragraph (d)(5) of this section shall also be highlighted in bold or extra bold type and shall be in a type size no smaller than 22 point […] The information required in paragraphs (d)(4), (6), and (9) of this section shall be in a type size no smaller than 6 point.
Source: 21 CFR 101.9(d)(1)(iv)
The headings required by paragraphs (d)(2), (d)(3)(ii), (d)(4), and (d)(6) of this section (i.e., "Nutrition Facts," "Serving size," "Amount per serving," and "% Daily Value*"), the names of all nutrients that are not indented according to requirements of paragraph (c) of this section (i.e., "Calories," "Total Fat," "Cholesterol," "Sodium," "Total Carbohydrate" and "Protein"), and the percentage amounts required by paragraph (d)(7)(ii) of this section shall be highlighted in bold or extra bold type or other highlighting (reverse printing is not permitted as a form of highlighting) that prominently distinguishes it from other information. No other information shall be highlighted.
Source: 21 CFR 101.9(d)(1)(v)
A hairline rule that is centered between the lines of text shall separate "Nutrition Facts" from the servings per container statement required in paragraph (d)(3)(i) of this section and shall separate each nutrient and its corresponding percent Daily Value required in paragraphs (d)(7)(i) and (ii) of this section from the nutrient and percent Daily Value above and below it
Source: 21 CFR 101.9(d)(2)
The information shall be presented under the identifying heading of "Nutrition Facts" which shall be set in a type size no smaller than all other print size in the nutrition label except for the numerical information for "Calories" required in paragraph (d)(5) of this section
Source: 21 CFR 101.9(d)(3)(i)
The information required in this paragraph shall be located immediately after the "Nutrition Facts" heading and shall be in a type size no smaller than 10 point
Source: 21 CFR 101.9(d)(3)(ii)
"Serving size": A statement of the serving size as specified in paragraph (b)(7) of this section which shall immediately follow the "____servings per container" declaration. The information required in this paragraph shall be highlighted in bold or extra bold and be in a type size no smaller than 10 point […] The serving size amount must be right justified if adequate space is available.
Source: 21 CFR 101.9(d)(4)
A subheading "Amount per serving" shall be separated from the serving size information by a bar as shown in paragraph (d)(12) of this section
Source: 21 CFR 101.9(d)(5)
Information on calories shall immediately follow the subheading "Amount per serving" and shall be declared in one line.
Source: 21 CFR 101.9(d)(6)
The column heading "% Daily Value," followed by an asterisk (e.g., "% Daily Value*"), shall be separated from information on calories by a bar as shown in paragraph (d)(12) of this section.
Source: 21 CFR 101.9(d)(7)(i)
The name of each nutrient, as specified in paragraph (c) of this section, shall be given in a column and followed immediately by the quantitative amount by weight for that nutrient appended with a "g" for grams, "mg" for milligrams, or "mcg" for micrograms as shown in paragraph (d)(12) of this section.
Source: 21 CFR 101.9(d)(8)
Nutrient information for vitamins and minerals (except sodium) shall be separated from information on other nutrients by a bar and may be arrayed vertically as shown in paragraph (d)(12) of this section (e.g., Vitamin D 2 mcg 10%, Calcium 260 mg 20%, Iron 8 mg 45%, Potassium 235 mg 6%) or may be listed horizontally.
Source: 21 CFR 101.9(d)(9)
A footnote, preceded by an asterisk, shall be placed beneath the list of vitamins and minerals and shall be separated from the list by a bar […] The footnote shall state: "*The % Daily Value tells you how much a nutrient in a serving of food contributes to a daily diet. 2,000 calories a day is used for general nutrition advice."
Source: 21 CFR part 101, appendix B, "Graphic Enhancements Used by the FDA" ([83 FR 65504, Dec. 21, 2018]). Quoted from the CFR annual edition of April 1, 2025 on govinfo, https://www.govinfo.gov/content/pkg/CFR-2025-title21-vol2/pdf/CFR-2025-title21-vol2-part101-appB.pdf, because eCFR shows this appendix only as images (its image server refused dev-01 on 2026-11-14). eCFR's current appendix carries the same source note. Not checked by ecfr.py.
2. Key nutrients and their % Daily Values are set in 8 point Helvetica Black. […] 4. "Servings per container" is set in 10 point Helvetica Regular and "Serving size" is set in 10 point Helvetica Black and with 1 point of leading. "Amount per serving" is set in 6 point Helvetica Black. 5. "Calories" is set in 16 point Helvetica Black and the numerical value of calories is set in 22 point Helvetica Black. 6. Absolute measures of nutrient content (for example, "1g") and nutrient subgroups are set in 8 point Helvetica Regular with 4 points of leading. […] 8. The type for the footnote is set in 6 point Helvetica Regular with 1 point of leading. […] 1. A 7 point rule separates large groupings as shown in the example. A 3 point rule separates calorie information from the nutrient information. 2. A hairline rule or ¼ point rule separates individual nutrients, as shown in the example. […] The rule above the "Added Sugars" declaration is shortened as shown in the example. […] 1. All labels are enclosed by ½ point box rule within 3 points of text measure.
What the tool does: one layout, drawn the same way in the page, the SVG, the PDF and the PNG (site/label.js):
- black on white, in a ½ pt box with 3 pt between the box and the text;
- one type family, Liberation Sans regular and bold (SIL Open Font License; the same character widths as Helvetica and Arial), drawn as outlines so that the files look the same on every machine and need no font. It is not Helvetica, which appendix B names, and bold stands in for Helvetica Black; (d)(1)(ii)(A) asks only for "a single easy-to-read type style", and (d)(1)(iii)-(iv) for "bold or extra bold";
- "Nutrition Facts" in bold, sized to the full width, larger than every other line except the calorie number would allow; then a hairline, servings per container (10 pt), "Serving size" and its amount right-justified (10 pt bold);
- a 7 pt bar, "Amount per serving" (6 pt bold), "Calories" (16 pt bold) and the number (22 pt bold) on one line, a 3 pt bar, "% Daily Value*" (6 pt bold);
- each nutrient in 8 pt with ¼ pt rules between them and at least 4 pt of leading; names of Total Fat, Cholesterol, Sodium, Total Carbohydrate and Protein, and the DRV percents, in bold; Saturated Fat, Trans Fat, Dietary Fiber and Total Sugars indented, "Includes … Added Sugars" indented further with a shortened rule above it;
- a 7 pt bar, the four vitamins and minerals listed vertically in 8 pt regular type, their percents in regular type;
- a 3 pt bar, then the footnote of (d)(9) in 6 pt with 1 pt of leading;
- 2 pt between the type and each rule in the nutrient lines, so that descenders do not touch a rule ((d)(1)(ii)(D), appendix B C.2).
Data
R-DATA-FAT: what "total fat" means in USDA's data
Source: 21 CFR 101.9(c)(2)
A statement of the number of grams of total fat in a serving defined as total lipid fatty acids and expressed as triglycerides
What the tool does: it uses USDA's "Total lipid (fat)" (nutrient 1004) as total fat. That is the fat of the food as USDA measured it, not necessarily the sum of fatty acids expressed as triglycerides that this paragraph defines; the two can differ. The buyer should know this.
R-DATA-SOURCE: where the numbers come from
What the tool does: USDA FoodData Central, Foundation Foods (release 2026-10-29) and SR Legacy (2018-04, USDA's final release), as DATA.md lists, with each food's FDC ID on the calculation sheet; and the buyer's own entries, marked "own entry". Neither is a lab analysis of the buyer's food.
Not applied: the buyer's to check
The tool does not apply these; a label that needs one of them is not made by this tool, or needs the buyer's own work:
- Compliance with 101.9(g): FDA judges a label by analysis of the food (for example, calories, sugars, fat, saturated fat, trans fat, cholesterol and sodium may not be more than 20% above the label, (g)(5)). A database calculation can miss that. Records the buyer must keep ((g)(10), (g)(11)).
- Other formats: dual columns ((b)(2)(i)(D), (b)(10)-(12), (e)), tabular and linear displays ((d)(11), (j)(13)), the simplified format ((f)), aggregate displays ((d)(13)), side-by-side vitamins ((d)(8)), a second language ((d)(14)), foods for infants and children 1 through 3 ((j)(5)), foods for pregnant or lactating women ((c)(8)(i)).
- Leaving out a nutrient where 101.9(c) allows it, with "Not a significant source of …" at the bottom; declaring vitamins and minerals under 2% with an asterisk; kilojoules ((c)(1)); calories per gram ((d)(10)).
- Protein quality: the tool does not determine a food's PDCAAS; it relies on the buyer's answer (R-PROTEIN-QUALITY), and it does not offer the corrected percent Daily Value of protein, which (c)(7) allows instead of the statement and (c)(7)(i) requires with a protein claim.
- Voluntary nutrients (calories from saturated fat, polyunsaturated and monounsaturated fat, fluoride, soluble and insoluble fiber, sugar alcohol, other vitamins and minerals) and the declarations that become required with them, for example a vitamin or mineral that is added as a nutrient supplement ((c)(8)(ii)), folic acid ((c)(8)(vii)), or protein's percent Daily Value with a protein claim ((c)(7)(i)).
- Claims of any kind (nutrient content, health, "no added sugar"), and the second columns or statements they require ((b)(11), (b)(12)(ii)).
- Serving size choices of 101.9(b)(2) to (b)(5): units, fractions, household measures, the exceptions for meal and main dish products ((b)(3)), variety packs ((b)(4)), drained solids ((b)(9)), random weights ((b)(8)(iii)).
- Exemptions and special cases of 101.9(j) (small businesses, restaurants, small packages, and others), placement on the package (101.2), and everything outside 101.9 and 101.12: the ingredient statement, allergens, the net quantity statement, the name of the food.
- Calorie methods other than (c)(1)(i)(B), and nutrient losses or gains in cooking.
Second-model check
reviewer checks each rule above against eCFR's current text (and appendix B against govinfo), and records the result here, one line per rule, before the site goes public (README.md "Every rule has its source"):
R-ORDER: pass R-AMOUNT: fail: gramsOf accepts a non-finite positive amount (engine.js:157-161); compute can mark the resulting label complete. Require finite positive quantities. R-PERSERVING: fail: negative nutrient entries/fills are accepted (engine.js:173-184) and non-finite computed values can pass complete (line 289). The sum/scaling formula is correct for valid inputs; validate inputs and derived values. R-BATCH: fail: cookedWeightG=Infinity is accepted (engine.js:239-240), producing a complete label with every nutrient and calories zero. Reject supplied invalid/non-finite weights instead of calculating or silently falling back. R-CAL-METHOD: pass R-TIE: pass R-CAL-ROUND: pass R-FAT: pass R-SAT: pass R-TRANS: pass R-CHOL: pass R-SODIUM: pass R-CARB: pass R-FIBER: pass R-SUGARS: pass R-ADDED: pass R-ADDED-MARK: pass R-PROTEIN-QUALITY: (new after the check of 1437fc7; to check) R-PROTEIN: fail: the rest of 101.9(c)(7) requires either a protein-quality statement or corrected %DV for adult foods with PDCAAS below 20%. No protein claim is needed to trigger this. The tool does neither and does not exclude this case. R-DV: pass R-VM: pass: the stated whole-unit/tenth-unit choice follows the levels-of-significance language of (c)(8)(iii)-(iv); this does not check or adopt separate FDA guidance increments. R-RACC: pass R-SERV-HOUSEHOLD: pass R-SERV-METRIC: pass R-SERV-COUNT: pass R-SERV-SINGLE: pass R-SERV-DUAL: pass: the warning states the general (b)(12)(i) case; its exceptions remain the buyer's to check. R-FORMAT: pass: checked against 101.9(d) and both pages of the cited govinfo appendix; SVG, PDF and browser PNG inspected. The 8-point serving fallback is permitted by the final sentence of (d)(3)(ii), although the description above only mentions its 10-point default. R-DATA-FAT: pass R-DATA-SOURCE: pass Not applied: fail: add the low-protein-quality case of 101.9(c)(7); the present list and R-PROTEIN imply that absence of a protein claim is sufficient to omit both a qualifier and protein %DV.
Checked by Codex GPT-6.1 Sol on 2026-11-14 for ventures#253, against PR #252 head 1437fc74dc1fe0504255eca7aa39b35c192cff5d. Sources: current eCFR title 21, up to date as of 2026-11-12, and the cited 2025 govinfo appendix B. These results cover part 1 only; the page, calculation sheet and subscription gating remain for part 2.
After the check of 1437fc7: R-AMOUNT, R-PERSERVING and R-BATCH now refuse non-finite and negative numbers (engine.js isPositive, isAmount; tests "review ventures#253" in tests/engine.test.mjs); R-PROTEIN-QUALITY is new and "Not applied" names protein quality. These lines and R-PROTEIN are to be checked again.
Each line: pass, or fail: and why. The author fixes each failing rule and asks for a new check of it.
Second round — ventures#258
Checked by Codex GPT-6.1 Sol on 2026-11-14 against PR #252 head dc55127cd6f2a73bc62aa825f744c0b04a3f3f8d. These results supersede the failed results and the pending protein-quality check above; the first-round record is retained as history. Unchanged rules retain their first-round results.
R-AMOUNT: pass: finite positive amounts and portion weights are required, including after unit conversion; invalid quantities keep the label incomplete. R-PERSERVING: pass: negative/non-finite nutrient entries and fills are rejected; supplied invalid supplier-label serving weights invalidate its nutrient values; non-finite per-serving values or calories cannot produce a complete label. Valid sum/scaling calculations remain unchanged. R-BATCH: pass: a supplied invalid cooked weight records an error and prevents completion; omission still uses the ingredient total. The intermediate result retains that total when invalid, but is not a complete label. R-PROTEIN: pass: the omission of protein %DV is qualified for foods without protein claims and outside the excluded age groups, with the low-quality case covered separately. R-PROTEIN-QUALITY: pass: current 101.9(c)(7) requires the adjacent statement or corrected %DV below 20% PDCAAS for adults/children 4+; a required buyer answer selects the statement, which appears beside protein in the rendered label. Determining PDCAAS remains the buyer's responsibility. Not applied: pass: now explicitly names PDCAAS determination and the unsupported corrected protein %DV, including its requirement with protein claims; foods for children under 4 remain excluded.
Source: [current eCFR 21 CFR 101.9](https://www.ecfr.gov/current/title-21/chapter-I/subchapter-B/part-101/subpart-A/section-101.9), title 21 up to date as of 2026-11-12. Verification: all 35 tests pass; 203 additional invalid-input checks pass; all 52 eCFR quotations verify; rebuilding the 139 RACC categories and DRV/RDI data produces no change. The worked example was rendered to SVG and PDF, and its low-quality-protein SVG was inspected in Chromium. PDF rendering, browser PNG export, USDA rebuilding and appendix B were not repeated in this round; their unchanged first-round checks are retained. The page, calculation sheet, subscription gating, deployment and physical printing are outside this part-1 review.