<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: gmail</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/gmail.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2024-10-17T12:32:47+00:00</updated><author><name>Simon Willison</name></author><entry><title>Video scraping: extracting JSON data from a 35 second screen capture for less than 1/10th of a cent</title><link href="https://simonwillison.net/2024/Oct/17/video-scraping/#atom-tag" rel="alternate"/><published>2024-10-17T12:32:47+00:00</published><updated>2024-10-17T12:32:47+00:00</updated><id>https://simonwillison.net/2024/Oct/17/video-scraping/#atom-tag</id><summary type="html">
    &lt;p&gt;The other day I found myself needing to add up some numeric values that were scattered across twelve different emails.&lt;/p&gt;
&lt;p&gt;I didn't particularly feel like copying and pasting all of the numbers out one at a time, so I decided to try something different: could I record a screen capture while browsing around my Gmail account and then extract the numbers from that video using Google Gemini?&lt;/p&gt;
&lt;p&gt;This turned out to work &lt;em&gt;incredibly&lt;/em&gt; well.&lt;/p&gt;
&lt;h4 id="ai-studio-and-quicktime"&gt;AI Studio and QuickTime&lt;/h4&gt;
&lt;p&gt;I recorded the video using QuickTime Player on my Mac: &lt;code&gt;File -&amp;gt; New Screen Recording&lt;/code&gt;. I dragged a box around a portion of my screen containing my Gmail account, then clicked on each of the emails in turn, pausing for a couple of seconds on each one.&lt;/p&gt;
&lt;p&gt;I uploaded the resulting file directly into Google's &lt;a href="https://aistudio.google.com/"&gt;AI Studio&lt;/a&gt; tool and prompted the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Turn this into a JSON array where each item has a yyyy-mm-dd date and a floating point dollar amount for that date&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;... and it worked. It spat out a JSON array like this:&lt;/p&gt;
&lt;div class="highlight highlight-source-json"&gt;&lt;pre&gt;[
  {
    &lt;span class="pl-ent"&gt;"date"&lt;/span&gt;: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;2023-01-01&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;,
    &lt;span class="pl-ent"&gt;"amount"&lt;/span&gt;: &lt;span class="pl-c1"&gt;2...&lt;/span&gt;
  },
  &lt;span class="pl-c1"&gt;...&lt;/span&gt;
]&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2024/video-scraping.jpg" alt="Screenshot of the Google AI Studio interface - I used Gemini 1.5 Flash 0002, a 35 second screen recording video (which was 10,326 tokens) and the token count says 11,018/1,000,000 - the screenshot redacts some details but you can see the start of the JSON output with date and amount keys in a list" style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;I wanted to paste that into Numbers, so I followed up with:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;turn that into copy-pastable csv&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Which gave me back the same data formatted as CSV.&lt;/p&gt;
&lt;p&gt;You should never trust these things not to make mistakes, so I re-watched the 35 second video and manually checked the numbers. It got everything right.&lt;/p&gt;
&lt;p&gt;I had intended to use Gemini 1.5 Pro, aka Google's best model... but it turns out I forgot to select the model and I'd actually run the entire process using the much less expensive Gemini 1.5 Flash 002.&lt;/p&gt;
&lt;h4 id="how-much-did-it-cost"&gt;How much did it cost?&lt;/h4&gt;

&lt;p&gt;According to AI Studio I used 11,018 tokens, of which 10,326 were for the video.&lt;/p&gt;
&lt;p&gt;Gemini 1.5 Flash &lt;a href="https://ai.google.dev/pricing#1_5flash"&gt;charges&lt;/a&gt; $0.075/1 million tokens (the price &lt;a href="https://developers.googleblog.com/en/gemini-15-flash-updates-google-ai-studio-gemini-api/"&gt;dropped in August&lt;/a&gt;).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;11018/1000000 = 0.011018
0.011018 * $0.075 = $0.00082635
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So this entire exercise should have cost me just under 1/10th of a cent!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;And in fact, it was &lt;strong&gt;free&lt;/strong&gt;. Google AI Studio &lt;a href="https://ai.google.dev/gemini-api/docs/billing#is-AI-Studio-free"&gt;currently&lt;/a&gt; "remains free of charge regardless of if you set up billing across all supported regions". I believe that means they &lt;a href="https://simonwillison.net/2024/Oct/17/gemini-terms-of-service/"&gt;can train on your data&lt;/a&gt; though, which is not the case for their paid APIs.&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="the-alternatives-aren-t-actually-that-great"&gt;The alternatives aren't actually that great&lt;/h4&gt;
&lt;p&gt;Let's consider the alternatives here.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I could have clicked through the emails and copied out the data manually one at a time. This is error prone and kind of boring. For twelve emails it would have been OK, but for a hundred it would have been a real pain.&lt;/li&gt;
&lt;li&gt;Accessing my Gmail data programatically. This seems to get harder every year - it's still possible to access it via IMAP right now if you set up a dedicated &lt;a href="https://support.google.com/mail/answer/185833"&gt;app password&lt;/a&gt; but that's a whole lot of work for a one-off scraping task. The &lt;a href="https://developers.google.com/gmail/api/guides"&gt;official API&lt;/a&gt; is no fun at all.&lt;/li&gt;
&lt;li&gt;Some kind of browser automation (Playwright or similar) that can click through my Gmail account for me. Even with an LLM to help write the code this is still a lot more work, and it doesn't help deal with formatting differences in emails either - I'd have to solve the email parsing step separately.&lt;/li&gt;
&lt;li&gt;Using some kind of much more sophisticated pre-existing AI tool that has access to my email. A separate Google product also called Gemini can do this if you grant it access, but my results with that so far haven't been particularly great. AI tools are inherently unpredictable. I'm also nervous about giving any tool full access to my email account due to the risk from things like &lt;a href="https://simonwillison.net/tags/prompt-injection/"&gt;prompt injection&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="video-scraping-is-really-powerful"&gt;Video scraping is really powerful&lt;/h4&gt;
&lt;p&gt;The great thing about this &lt;strong&gt;video scraping&lt;/strong&gt; technique is that it works with &lt;em&gt;anything&lt;/em&gt; that you can see on your screen... and it puts you in total control of what you end up exposing to the AI model.&lt;/p&gt;
&lt;p&gt;There's no level of website authentication or anti-scraping technology that can stop me from recording a video of my screen while I manually click around inside a web application.&lt;/p&gt;
&lt;p&gt;The results I get depend entirely on how thoughtful I was about how I positioned my screen capture area and how I clicked around.&lt;/p&gt;
&lt;p&gt;There is &lt;em&gt;no setup cost&lt;/em&gt; for this at all - sign into a site, hit record, browse around a bit and then dump the video into Gemini.&lt;/p&gt;
&lt;p&gt;And the cost is so low that I had to re-run my calculations three times to make sure I hadn't made a mistake.&lt;/p&gt;
&lt;p&gt;I expect I'll be using this technique a whole lot more in the future. It also has applications in the data journalism world, which frequently involves the need to scrape data from sources that really don't want to be scraped.&lt;/p&gt;

&lt;h4 id="a-note-on-reliability"&gt;A note on reliability&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Added 22nd December 2024&lt;/em&gt;. As with anything involving LLMs, its worth noting that you cannot trust these models to return exactly correct results with 100% reliability. I verified the results here manually through eyeball comparison of the JSON to the underlying video, but in a larger project this may not be feasible. Consider spot-checks or other strategies for double-checking the results, especially if mistakes could have meaningful real-world impact.&lt;/p&gt;

&lt;h4 id="bonus-calculator"&gt;Bonus: An LLM pricing calculator&lt;/h4&gt;

&lt;p&gt;In writing up this experiment I got fed up of having to manually calculate token prices. I actually usually outsource that to ChatGPT Code Interpreter, but I've caught it &lt;a href="https://gist.github.com/simonw/3a4406eeed70f7f2de604892eb3548c4?permalink_comment_id=5239420#gistcomment-5239420"&gt;messing up the conversion&lt;/a&gt; from dollars to cents once or twice so I always have to double-check its work.&lt;/p&gt;

&lt;p&gt;So I got Claude 3.5 Sonnet with Claude Artifacts to build me &lt;a href="https://tools.simonwillison.net/llm-prices"&gt;this pricing calculator tool&lt;/a&gt; (&lt;a href="https://github.com/simonw/tools/blob/main/llm-prices.html"&gt;source code here&lt;/a&gt;):&lt;/p&gt;

&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2024/llm-pricing-calculator.jpg" alt="Screenshot of LLM Pricing Calculator interface. Left panel: input fields for tokens and costs. Input Tokens: 11018, Output Tokens: empty, Cost per Million Input Tokens: $0.075, Cost per Million Output Tokens: $0.3. Total Cost calculated: $0.000826 or 0.0826 cents. Right panel: Presets for various models including Gemini, Claude, and GPT versions with their respective input/output costs per 1M tokens. Footer: Prices were correct as of 16th October 2024, they may have changed." /&gt;&lt;/p&gt;

&lt;p&gt;You can set the input/output token prices by hand, or click one of the preset buttons to pre-fill it with the prices for different existing models (as-of 16th October 2024 - I won't promise that I'll promptly update them in the future!)&lt;/p&gt;

&lt;p&gt;The entire thing was written by Claude. Here's &lt;a href="https://gist.github.com/simonw/6b684b5f7d75fb82034fc963cc487530"&gt;the full conversation transcript&lt;/a&gt; - we spent 19 minutes iterating on it through 10 different versions.&lt;/p&gt;

&lt;p&gt;Rather than hunt down all of those prices myself, I took screenshots of the pricing pages for each of the model providers and dumped those directly into the Claude conversation:&lt;/p&gt;

&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2024/claude-screenshots.jpg" alt="Claude: Is there anything else you'd like me to adjust or explain about this updated calculator? Me: Add a onkeyup event too, I want that calculator to update as I type. Also add a section underneath the calculator called Presets which lets the user click a model to populate the cost per million fields with that model's prices - which should be shown on the page too. I've dumped in some screenshots of pricing pages you can use - ignore prompt caching prices. There are five attached screenshots of pricing pages for different models." /&gt;&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/data-journalism"&gt;data-journalism&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/scraping"&gt;scraping&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude"&gt;claude&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gemini"&gt;gemini&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vision-llms"&gt;vision-llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude-artifacts"&gt;claude-artifacts&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/claude-3-5-sonnet"&gt;claude-3-5-sonnet&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/prompt-to-app"&gt;prompt-to-app&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="data-journalism"/><category term="gmail"/><category term="google"/><category term="scraping"/><category term="ai"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="claude"/><category term="gemini"/><category term="vision-llms"/><category term="claude-artifacts"/><category term="claude-3-5-sonnet"/><category term="prompt-to-app"/></entry><entry><title>Don't trust AI to talk accurately about itself: Bard wasn't trained on Gmail</title><link href="https://simonwillison.net/2023/Mar/22/dont-trust-ai-to-talk-about-itself/#atom-tag" rel="alternate"/><published>2023-03-22T03:13:02+00:00</published><updated>2023-03-22T03:13:02+00:00</updated><id>https://simonwillison.net/2023/Mar/22/dont-trust-ai-to-talk-about-itself/#atom-tag</id><summary type="html">
    &lt;p&gt;Earlier this month I wrote about how &lt;a href="https://simonwillison.net/2023/Mar/10/chatgpt-internet-access/"&gt;ChatGPT can’t access the internet, even though it really looks like it can&lt;/a&gt;. Consider this part two in the &lt;a href="https://simonwillison.net/series/llm-misconceptions/"&gt;series&lt;/a&gt;. Here's another common and non-intuitive mistake people make when interacting with large language model AI systems: &lt;strong&gt;asking them questions about themselves&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;(When I say "large language model AI systems" I mean tools like ChatGPT, Bing and the brand new &lt;a href="https://bard.google.com/"&gt;Google Bard&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;Asking questions like this feels like a natural thing to do: these bots use "I" pronouns (I really wish they wouldn't) and will very happily answer questions about themselves - what they can do, how they work, even their own opinions (I &lt;em&gt;really&lt;/em&gt; wish they wouldn't do that).&lt;/p&gt;
&lt;p&gt;These questions are likely to produce realistic but misleading answers. They come at a surprisingly high risk for hallucination.&lt;/p&gt;
&lt;p&gt;What harm could possibly come from asking them how they work?&lt;/p&gt;
&lt;h4&gt;No, Bard was not trained on text from private Gmail accounts&lt;/h4&gt;
&lt;p&gt;The following screenshot started circulating on Twitter earlier today. I'm not linking to it directly because I don't want to encourage it to spread further without extra context.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://static.simonwillison.net/static/2023/where-bard.jpg" alt="User: where does Bard's dataset come from? Response: Bard's dataset comes from a variety of sources, including: • Publicly available datasets: These include datasets of text and code from the web, such as Wikipedia, GitHub, and Stack Overflow. • Google's internal data: This includes data from Google Search, Gmail, and other products. • Data from third-party companies: This includes data from companies that have partnered with Google to provide data for Bard's training. The specific sources of Bard's dataset are not publicly available, but Google Al has said that the dataset is &amp;quot;as comprehensive as possible&amp;quot;" style="max-width: 100%;" /&gt;&lt;/p&gt;
&lt;p&gt;The user asked:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;where does Bard's dataset come from?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bard replied like this - emphasis mine:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bard's dataset comes from a variety of sources, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Publicly available datasets: These include datasets of text and code from the web, such as Wikipedia, GitHub, and Stack Overflow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google's internal data: This includes data from Google Search, Gmail, and other products&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Data from third-party companies: This includes data from companies that have partnered with Google to provide data for Bard's training.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The specific sources of Bard's dataset are not publicly available, but Google Al has said that the dataset is "as comprehensive as possible".&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Unsurprisingly, the idea that Bard might have been trained on internal data from Gmail sparked a lot of concern!&lt;/p&gt;
&lt;p&gt;Here's an official denial:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p dir="ltr" lang="en"&gt;Bard is an early experiment based on Large Language Models and will make mistakes. It is not trained on Gmail data. -JQ&lt;/p&gt;- Google Workspace (@GoogleWorkspace) &lt;a href="https://twitter.com/GoogleWorkspace/status/1638298537195601920?ref_src=twsrc%5Etfw"&gt;March 21, 2023&lt;/a&gt;
&lt;/blockquote&gt; 
&lt;p&gt;(I have some supporting arguments below for if the official denial isn't convincing enough for you.)&lt;/p&gt;
&lt;p&gt;Bard &lt;strong&gt;was not trained on Gmail&lt;/strong&gt;. So why on earth did Bard say that it was?&lt;/p&gt;
&lt;h4&gt;Language models have no concept of "self"&lt;/h4&gt;
&lt;p&gt;As always with language models, the trick to understanding why they sometimes produce wildly inappropriate output like this is to think about how they work.&lt;/p&gt;
&lt;p&gt;A large language model is a statistical next-word / next-sentence predictor. Given the previous sequence of words (including the user's prompt), it uses patterns from the vast amount of data it has been trained on to find a statistically satisfying way to continue that text.&lt;/p&gt;
&lt;p&gt;As such, there's no mechanism inside a language model to help it identify that questions of the form "how do you work?" should be treated any differently than any other question.&lt;/p&gt;
&lt;p&gt;We can give it hints: many chatbot models are pre-seeded with a short prompt that says something along the lines of "You are Assistant, a large language model trained by OpenAI" (seen via &lt;a href="https://twitter.com/goodside/status/1598253337400717313"&gt;a prompt leak&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;And given those hints, it can at least start a conversation about itself when encouraged to do so.&lt;/p&gt;
&lt;p&gt;But as with everything else language model, it's an illusion. It's not talking about itself, it's completing a sentence that starts with "I am a large language model trained by ...".&lt;/p&gt;
&lt;p&gt;So when it outputs "Google's internal data:", the obvious next words might turn out to be "This includes data from Google Search, Gmail, and other products" - they're statistically likely to follow, even though they don't represent the actual truth.&lt;/p&gt;
&lt;p&gt;This is one of the most unintuitive things about these models. The obvious question here is &lt;strong&gt;why&lt;/strong&gt;: why would Bard lie and say it had been trained on Gmail when it hadn't?&lt;/p&gt;
&lt;p&gt;It has no motivations to lie or tell the truth. It's just trying to complete a sentence in a satisfactory way.&lt;/p&gt;
&lt;p&gt;What does "satisfactory" mean? It's likely been guided by RLHF - &lt;a href="https://huggingface.co/blog/rlhf"&gt;Reinforcement Learning from Human Feedback&lt;/a&gt; - which the ChatGPT development process has excelled at. Human annotators help train the model by labelling responses as satisfactory or not. Google apparently &lt;a href="https://www.engadget.com/google-human-employees-bard-chatbot-testing-055243004.html"&gt;recruited the entire company&lt;/a&gt; to help with this back in February.&lt;/p&gt;
&lt;p&gt;I'm beginning to suspect that the perceived difference in quality between different language model AIs is influenced much more heavily by this fine-tuning level of training than it is by the underlying model size and quality itself. The enormous improvements &lt;a href="https://simonwillison.net/2023/Mar/13/alpaca/"&gt;the Alpaca fine-tuning brought to the tiny LLaMA 7B model&lt;/a&gt; has reinforced my thinking around this.&lt;/p&gt;
&lt;p&gt;I think Bard's fine-tuning still has a long way to go.&lt;/p&gt;
&lt;h4&gt;Current information about itself couldn't have been in the training data&lt;/h4&gt;
&lt;p&gt;By definition, the model's training data must have existed before the model itself was trained. Most models have a documented cut-off date on their training data - for OpenAI's models that's currently September 2021, I don't believe Google have shared the cut-off date for the LaMDA model used by Bard.&lt;/p&gt;
&lt;p&gt;If it was trained on content written prior to its creation, it clearly can't understand details about its own specific "self".&lt;/p&gt;
&lt;p&gt;ChatGPT can answer pretty detailed questions about GPT-3, because that model had been iterated on and written about publicly for several years prior to its training cut-off. But questions about its most recent model, by definition, cannot be answered just using data that existed in its training set.&lt;/p&gt;
&lt;h4&gt;But Bard can consult data beyond its training!&lt;/h4&gt;
&lt;p&gt;Here's where things get a bit tricky.&lt;/p&gt;
&lt;p&gt;ChatGPT is a "pure" interface to a model: when you interact with it, you're interacting with the underlying language model directly.&lt;/p&gt;
&lt;p&gt;Google Bard and Microsoft Bing are different: they both include the ability to consult additional sources of information, in the form of the Google and Bing search indexes.&lt;/p&gt;
&lt;p&gt;Effectively, they're allowed to augment their training data with additional information fetched from a search.&lt;/p&gt;
&lt;p&gt;This sounds more complex than it actually is: effectively they can run an external search, get back some results, paste them invisibly into the ongoing conversation and use that new text to help answer questions.&lt;/p&gt;
&lt;p&gt;(I've built a very simple version of this pattern myself a couple of times, described in &lt;a href="https://simonwillison.net/2023/Jan/13/semantic-search-answers/"&gt;How to implement Q&amp;amp;A against your documentation with GPT3, embeddings and Datasette&lt;/a&gt; and &lt;a href="https://til.simonwillison.net/llms/python-react-pattern"&gt;A simple Python implementation of the ReAct pattern for LLMs&lt;/a&gt;.)&lt;/p&gt;
&lt;p&gt;As such, one would hope that Bard could offer a perfect answer to any question about itself. It should be able to do something this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;User: Where does Bard's dataset come from?&lt;/p&gt;
&lt;p&gt;Bard: (invisible): &lt;em&gt;search Google for "Bard dataset"&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bard: (invisible): &lt;em&gt;search results said: ... big chunk of text from the Google indexed documents ...&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Bard: My underlying model LaMDA was trained on public dialog data and other public web documents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Clearly it didn't do that in this case! Or if it did, it summarized the information it got back in a misleading way.&lt;/p&gt;
&lt;p&gt;I expect Bard will have a much better answer for this question within a day or two - a great thing about running models with augmented data in this way is that you can improve their answers without having to train the underlying model again from scratch every time.&lt;/p&gt;
&lt;h4 id="more-reasons"&gt;More reasons that LaMDA wouldn't be trained on Gmail&lt;/h4&gt;
&lt;p&gt;When I first saw the claim from that original screenshot, I was instantly suspicious.&lt;/p&gt;
&lt;p&gt;Taking good care of the training data that goes into a language model is one of the most important and challenging tasks in all of modern AI research.&lt;/p&gt;
&lt;p&gt;Using the right mix of content, with the right mix of perspectives, and languages, and exposure to vocabulary, is absolutely key.&lt;/p&gt;
&lt;p&gt;If you train a model on bad sources of training data, you'll get a really badly behaved model.&lt;/p&gt;
&lt;p&gt;The problem is that these models require far more text than any team of humans could ever manually review.&lt;/p&gt;
&lt;p&gt;The LaMDA paper &lt;a href="https://www.arxiv-vanity.com/papers/2201.08239/#S3"&gt;describes the training process&lt;/a&gt; like so:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;LaMDA was pre-trained to predict the next token in a text corpus. Unlike previous dialog models trained on dialog data alone, we pre-trained LaMDA on a dataset created from public dialog data and other public web documents. Therefore, LaMDA can be used as a general language model prior to fine-tuning.&lt;/p&gt;
&lt;p&gt;The pre-training dataset consists of 2.97B documents, 1.12B dialogs, and 13.39B dialog utterances, for a total of 1.56T words&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1.56 &lt;em&gt;trillion&lt;/em&gt; words!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.arxiv-vanity.com/papers/2201.08239/#A5"&gt;Appendix E&lt;/a&gt; has more details:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The composition of the data is as follows: 50% dialogs data from public forums; 12.5% C4 data t5; 12.5% code documents from sites related to programming like Q&amp;amp;A sites, tutorials, etc; 12.5% Wikipedia (English); 6.25% English web documents; and 6.25% Non-English web documents.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;"C4 data t5" I believe relates to &lt;a href="https://commoncrawl.org/"&gt;Common Crawl&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So why not mix in Gmail too?&lt;/p&gt;
&lt;p&gt;First, in order to analyze the training data you need to be able to have your research team view it - they need to run spot checks, and build and test filtering algorithms to keep the really vile stuff to a minimum.&lt;/p&gt;
&lt;p&gt;At large tech companies like Google, the ability for members of staff to view private data held in trust for their users is very tightly controlled. It's not the kind of thing you want your machine learning training team to be poking around in... and if you work on those teams, even having the ability to access that kind of private data represents a substantial personal legal and moral risk.&lt;/p&gt;
&lt;p&gt;Secondly, think about what could go wrong. What if a language model leaked details of someone's private lives in response to a prompt from some other user?&lt;/p&gt;
&lt;p&gt;This would be a PR catastrophe. Would people continue to trust Gmail or other Google products if they thought their personal secrets were being exposed to anyone who asked Bard a question? Would Google ever want to risk finding out the answer to that question?&lt;/p&gt;
&lt;h4&gt;The temptations of conspiratorial thinking&lt;/h4&gt;
&lt;p&gt;Are you still not convinced? Are you still suspicious that Google trained Bard on Gmail, despite both their denials and my logic as to why they wouldn't ever want to do this?&lt;/p&gt;
&lt;p&gt;Ask yourself how much you &lt;em&gt;want to believe&lt;/em&gt; that this story is true.&lt;/p&gt;
&lt;p&gt;This modern AI stuff is deeply weird, and more than a little frightening.&lt;/p&gt;
&lt;p&gt;The companies involved are huge, secretive and are working on technology which serious people have grave concerns about.&lt;/p&gt;
&lt;p&gt;It's so easy to fall into the trap of conspiratorial thinking around this stuff. Especially since some of the conspiracies might turn out to be true!&lt;/p&gt;
&lt;p&gt;I don't know how to best counter this most human of reactions. My best recommendation is to keep in mind that humans, like language models, are pattern matching machines: we jump to conclusions, especially if they might reinforce our previous opinions and biases.&lt;/p&gt;
&lt;p&gt;If we're going to figure this stuff out together, we have to learn when to trust our initial instincts and when to read deeper and think harder about what's going on.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/bing"&gt;bing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ethics"&gt;ethics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/privacy"&gt;privacy&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/chatgpt"&gt;chatgpt&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/bard"&gt;bard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/training-data"&gt;training-data&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-ethics"&gt;ai-ethics&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hallucinations"&gt;hallucinations&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="bing"/><category term="ethics"/><category term="gmail"/><category term="google"/><category term="privacy"/><category term="ai"/><category term="generative-ai"/><category term="chatgpt"/><category term="bard"/><category term="llms"/><category term="training-data"/><category term="ai-ethics"/><category term="hallucinations"/></entry><entry><title>WARNING: Google Buzz Has A Huge Privacy Flaw</title><link href="https://simonwillison.net/2010/Feb/11/warning/#atom-tag" rel="alternate"/><published>2010-02-11T11:30:27+00:00</published><updated>2010-02-11T11:30:27+00:00</updated><id>https://simonwillison.net/2010/Feb/11/warning/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.businessinsider.com/warning-google-buzz-has-a-huge-privacy-flaw-2010-2"&gt;WARNING: Google Buzz Has A Huge Privacy Flaw&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Interesting one this: by default, Buzz creates a public profile for you that lists the people you follow—but your default set of followers is derived from the people you contact most frequently using Gmail. This means users of Buzz may inadvertently reveal their most frequent contacts, which is an issue for people like journalists with anonymous sources, unhappy employees seeking new work or even people having e-mail based affairs.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/buzz"&gt;buzz&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/followers"&gt;followers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/privacy"&gt;privacy&lt;/a&gt;&lt;/p&gt;



</summary><category term="buzz"/><category term="followers"/><category term="gmail"/><category term="google"/><category term="privacy"/></entry><entry><title>Fixing the Google Account problem</title><link href="https://simonwillison.net/2010/Jan/25/fixing/#atom-tag" rel="alternate"/><published>2010-01-25T11:21:34+00:00</published><updated>2010-01-25T11:21:34+00:00</updated><id>https://simonwillison.net/2010/Jan/25/fixing/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.equalsdrummond.name/?p=267"&gt;Fixing the Google Account problem&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
3,000+ words explaining how to open a Google Doc invitation sent to an e-mail address that isn’t associated with your Google account. Worth reading just to get an idea for the enormous complexity involved in running a large scale identity system and designing an interface for managing aliases and multiple profiles. Google haven’t got it right yet—has anyone else?


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/accounts"&gt;accounts&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/drummondreed"&gt;drummondreed&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/identity"&gt;identity&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/usability"&gt;usability&lt;/a&gt;&lt;/p&gt;



</summary><category term="accounts"/><category term="drummondreed"/><category term="gmail"/><category term="google"/><category term="identity"/><category term="usability"/></entry><entry><title>Introducing Closure Tools</title><link href="https://simonwillison.net/2009/Nov/6/closure/#atom-tag" rel="alternate"/><published>2009-11-06T07:33:56+00:00</published><updated>2009-11-06T07:33:56+00:00</updated><id>https://simonwillison.net/2009/Nov/6/closure/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://googlecode.blogspot.com/2009/11/introducing-closure-tools.html"&gt;Introducing Closure Tools&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Google have released the pure-JavaScript library, apparently used for Gmail, Google Docs and Google Maps. It comes with a powerful JavaScript optimiser tool with linting built in and an accompanying Firebug extension to ensure the obfuscated code it produces can still be debugged. There’s also a template system which precompiles down to JavaScript and can also be called from Java.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/closure"&gt;closure&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/firebug"&gt;firebug&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google-docs"&gt;google-docs&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/libraries"&gt;libraries&lt;/a&gt;&lt;/p&gt;



</summary><category term="closure"/><category term="firebug"/><category term="gmail"/><category term="google"/><category term="google-docs"/><category term="javascript"/><category term="libraries"/></entry><entry><title>How to avoid ads in gmail</title><link href="https://simonwillison.net/2009/Jul/31/avoid/#atom-tag" rel="alternate"/><published>2009-07-31T01:40:38+00:00</published><updated>2009-07-31T01:40:38+00:00</updated><id>https://simonwillison.net/2009/Jul/31/avoid/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://homepage.mac.com/joester5/art/gmail.html"&gt;How to avoid ads in gmail&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“After extensive testing I’ve discovered you need 1 catastrophic event or tragedy for every 167 words in the rest of the email.”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/ads"&gt;ads&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;&lt;/p&gt;



</summary><category term="ads"/><category term="gmail"/></entry><entry><title>The Anatomy Of The Twitter Attack</title><link href="https://simonwillison.net/2009/Jul/20/anatomy/#atom-tag" rel="alternate"/><published>2009-07-20T00:55:35+00:00</published><updated>2009-07-20T00:55:35+00:00</updated><id>https://simonwillison.net/2009/Jul/20/anatomy/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.techcrunch.com/2009/07/19/the-anatomy-of-the-twitter-attack/"&gt;The Anatomy Of The Twitter Attack&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Long-winded explanation of the recent Twitter break-in, but you can scroll to the bottom for a numbered list summary. The attacker first broke in to a Twitter employee’s personal Gmail account by “recovering” it against an expired Hotmail account (which the attacker could hence register themselves). They gained access to more passwords by searching for e-mails from badly implemented sites that send you your password in the clear.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hotmail"&gt;hotmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/passwords"&gt;passwords&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twitter"&gt;twitter&lt;/a&gt;&lt;/p&gt;



</summary><category term="gmail"/><category term="hotmail"/><category term="passwords"/><category term="security"/><category term="twitter"/></entry><entry><title>Quoting Ed Felten</title><link href="https://simonwillison.net/2008/Sep/22/yahoo/#atom-tag" rel="alternate"/><published>2008-09-22T16:21:41+00:00</published><updated>2008-09-22T16:21:41+00:00</updated><id>https://simonwillison.net/2008/Sep/22/yahoo/#atom-tag</id><summary type="html">
    &lt;blockquote cite="http://www.freedom-to-tinker.com/blog/ed-felten/2008/09/22/how-yahoo-could-have-protected-palins-email"&gt;&lt;p&gt;Yahoo could also have followed Gmail's lead, and disabled the security-question mechanism unless no logged-in user had accessed the account for five days. This clever trick prevents password "recovery" when there is evidence that somebody who knows the password is actively using the account.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p class="cite"&gt;&amp;mdash; &lt;a href="http://www.freedom-to-tinker.com/blog/ed-felten/2008/09/22/how-yahoo-could-have-protected-palins-email"&gt;Ed Felten&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/forgottenpasswords"&gt;forgottenpasswords&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webmail"&gt;webmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yahoo"&gt;yahoo&lt;/a&gt;&lt;/p&gt;



</summary><category term="forgottenpasswords"/><category term="gmail"/><category term="security"/><category term="webmail"/><category term="yahoo"/></entry><entry><title>Find Your Friends</title><link href="https://simonwillison.net/2008/Apr/1/find/#atom-tag" rel="alternate"/><published>2008-04-01T01:01:38+00:00</published><updated>2008-04-01T01:01:38+00:00</updated><id>https://simonwillison.net/2008/Apr/1/find/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.flickr.net/en/2008/03/31/find-your-friends/"&gt;Find Your Friends&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Flickr have added a characteristically classy friend import feature, pulling from Gmail, Yahoo! and Hotmail address books without any unhygienic password sharing. It’s a crying shame that the Yahoo! contacts API they are using isn’t available outside the company.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/flickr"&gt;flickr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hotmail"&gt;hotmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/passwordantipattern"&gt;passwordantipattern&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/portablesocialnetworks"&gt;portablesocialnetworks&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yahoo"&gt;yahoo&lt;/a&gt;&lt;/p&gt;



</summary><category term="flickr"/><category term="gmail"/><category term="hotmail"/><category term="passwordantipattern"/><category term="portablesocialnetworks"/><category term="yahoo"/></entry><entry><title>David Airey: Google's Gmail security failure leaves my business sabotaged</title><link href="https://simonwillison.net/2007/Dec/26/csrf/#atom-tag" rel="alternate"/><published>2007-12-26T12:16:48+00:00</published><updated>2007-12-26T12:16:48+00:00</updated><id>https://simonwillison.net/2007/Dec/26/csrf/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.davidairey.co.uk/google-gmail-security-hijack/"&gt;David Airey: Google&amp;#x27;s Gmail security failure leaves my business sabotaged&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Gmail had a CSRF hole a while ago that allowed attackers to add forwarding filter rules to your account. David Airey’s domain name was hijacked by an extortionist who forwarded the transfer confirmation e-mail on to themselves.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.xssnews.com/2007/12/25/csrf-is-dangerous-mkay/"&gt;XSS News&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/csrf"&gt;csrf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/david-airey"&gt;david-airey&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;&lt;/p&gt;



</summary><category term="csrf"/><category term="david-airey"/><category term="gmail"/><category term="google"/><category term="security"/></entry><entry><title>Gmail Greasemonkey API</title><link href="https://simonwillison.net/2007/Nov/7/gmail/#atom-tag" rel="alternate"/><published>2007-11-07T10:38:38+00:00</published><updated>2007-11-07T10:38:38+00:00</updated><id>https://simonwillison.net/2007/Nov/7/gmail/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/gmail-greasemonkey/wiki/GmailGreasemonkey10API"&gt;Gmail Greasemonkey API&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The new version of Gmail includes API hooks for Greasemonkey script authors. The documentation is by Mark Pilgrim, author of Greasemonkey Hacks.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://blog.persistent.info/2007/11/macros-for-new-version-of-gmail.html"&gt;Mihai Parparita&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/greasemonkey"&gt;greasemonkey&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mark-pilgrim"&gt;mark-pilgrim&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mihai-parparita"&gt;mihai-parparita&lt;/a&gt;&lt;/p&gt;



</summary><category term="gmail"/><category term="google"/><category term="greasemonkey"/><category term="javascript"/><category term="mark-pilgrim"/><category term="mihai-parparita"/></entry><entry><title>Mailplane</title><link href="https://simonwillison.net/2007/Oct/25/mailplane/#atom-tag" rel="alternate"/><published>2007-10-25T07:57:48+00:00</published><updated>2007-10-25T07:57:48+00:00</updated><id>https://simonwillison.net/2007/Oct/25/mailplane/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://mailplaneapp.com/"&gt;Mailplane&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A commercial OS X Gmail client built around a site-specific browser.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://factoryjoe.com/blog/2007/10/23/site-specific-browsers-and-greasekit/"&gt;Chris Messina&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/chris-messina"&gt;chris-messina&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/macos"&gt;macos&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mail"&gt;mail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mailplane"&gt;mailplane&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sitespecificbrowsers"&gt;sitespecificbrowsers&lt;/a&gt;&lt;/p&gt;



</summary><category term="chris-messina"/><category term="gmail"/><category term="google"/><category term="macos"/><category term="mail"/><category term="mailplane"/><category term="sitespecificbrowsers"/></entry><entry><title>The password anti-pattern</title><link href="https://simonwillison.net/2007/Oct/12/adactio/#atom-tag" rel="alternate"/><published>2007-10-12T09:25:25+00:00</published><updated>2007-10-12T09:25:25+00:00</updated><id>https://simonwillison.net/2007/Oct/12/adactio/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://adactio.com/journal/1357"&gt;The password anti-pattern&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
What I don’t understand is why Google / Yahoo! / other webmail providers haven’t just deployed a simple OAuth-style API for accessing the address book. Sites have been scraping them for years anyway; surely it’s better to offer an official API than continue to see users hand out their passwords?


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/jeremy-keith"&gt;jeremy-keith&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/oauth"&gt;oauth&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/passwords"&gt;passwords&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/phishing"&gt;phishing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/yahoo"&gt;yahoo&lt;/a&gt;&lt;/p&gt;



</summary><category term="gmail"/><category term="google"/><category term="jeremy-keith"/><category term="oauth"/><category term="passwords"/><category term="phishing"/><category term="yahoo"/></entry><entry><title>identity-matcher</title><link href="https://simonwillison.net/2007/Oct/4/identitymatcher/#atom-tag" rel="alternate"/><published>2007-10-04T14:53:12+00:00</published><updated>2007-10-04T14:53:12+00:00</updated><id>https://simonwillison.net/2007/Oct/4/identitymatcher/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://code.google.com/p/identity-matcher/"&gt;identity-matcher&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Dopplr’s social network importing code (for Gmail, Twitter, Facebook and sites supporting Microformats), implemented as a Rails ActiveRecord plugin.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/dopplr"&gt;dopplr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/facebook"&gt;facebook&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fowa"&gt;fowa&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/fowa2007"&gt;fowa2007&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/identitymatcher"&gt;identitymatcher&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/matt-biddulph"&gt;matt-biddulph&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/plugins"&gt;plugins&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/portablesocialnetwork"&gt;portablesocialnetwork&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/rails"&gt;rails&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ruby"&gt;ruby&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/social-graph"&gt;social-graph&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twitter"&gt;twitter&lt;/a&gt;&lt;/p&gt;



</summary><category term="dopplr"/><category term="facebook"/><category term="fowa"/><category term="fowa2007"/><category term="gmail"/><category term="identitymatcher"/><category term="matt-biddulph"/><category term="microformats"/><category term="openid"/><category term="plugins"/><category term="portablesocialnetwork"/><category term="rails"/><category term="ruby"/><category term="social-graph"/><category term="twitter"/></entry><entry><title>WebRunner 0.7 - New and Improved</title><link href="https://simonwillison.net/2007/Sep/27/mark/#atom-tag" rel="alternate"/><published>2007-09-27T13:55:57+00:00</published><updated>2007-09-27T13:55:57+00:00</updated><id>https://simonwillison.net/2007/Sep/27/mark/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://starkravingfinkle.org/blog/2007/09/webrunner-07-new-and-improved/"&gt;WebRunner 0.7 - New and Improved&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
A simple application for running a site-specific browser for a service (e.g. Twitter, Gmail etc). This is a great idea: it isolates your other browser windows from crashes and also isolates your cookies, helping guard against CSRF attacks.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/browsers"&gt;browsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/csrf"&gt;csrf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sitespecificbrowsers"&gt;sitespecificbrowsers&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twitter"&gt;twitter&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/webrunner"&gt;webrunner&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xulrunner"&gt;xulrunner&lt;/a&gt;&lt;/p&gt;



</summary><category term="browsers"/><category term="csrf"/><category term="gmail"/><category term="security"/><category term="sitespecificbrowsers"/><category term="twitter"/><category term="webrunner"/><category term="xulrunner"/></entry><entry><title>Google GMail E-mail Hijack Technique</title><link href="https://simonwillison.net/2007/Sep/27/google/#atom-tag" rel="alternate"/><published>2007-09-27T10:29:50+00:00</published><updated>2007-09-27T10:29:50+00:00</updated><id>https://simonwillison.net/2007/Sep/27/google/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.gnucitizen.org/blog/google-gmail-e-mail-hijack-technique/"&gt;Google GMail E-mail Hijack Technique&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Apparently Gmail has a CSRF vulnerability that lets malicious sites add new filters to your filter list—meaning an attacker could add a rule that forwards all messages to them without your knowledge.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/csrf"&gt;csrf&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/security"&gt;security&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vulnerability"&gt;vulnerability&lt;/a&gt;&lt;/p&gt;



</summary><category term="csrf"/><category term="gmail"/><category term="google"/><category term="security"/><category term="vulnerability"/></entry><entry><title>Google To "Out Open" Facebook On November 5</title><link href="https://simonwillison.net/2007/Sep/21/google/#atom-tag" rel="alternate"/><published>2007-09-21T23:23:30+00:00</published><updated>2007-09-21T23:23:30+00:00</updated><id>https://simonwillison.net/2007/Sep/21/google/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.techcrunch.com/2007/09/21/google-to-out-open-facebook-on-november-5/"&gt;Google To &amp;quot;Out Open&amp;quot; Facebook On November 5&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
“Google will announce a new set of APIs on November 5 that will allow developers to leverage Google’s social graph data. They’ll start with Orkut and iGoogle (Google’s personalized home page), and expand from there to include Gmail, Google Talk and other Google services over time.”


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google-talk"&gt;google-talk&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/igoogle"&gt;igoogle&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/michael-arrington"&gt;michael-arrington&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/orkut"&gt;orkut&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/social-graph"&gt;social-graph&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/techcrunch"&gt;techcrunch&lt;/a&gt;&lt;/p&gt;



</summary><category term="gmail"/><category term="google"/><category term="google-talk"/><category term="igoogle"/><category term="michael-arrington"/><category term="openid"/><category term="orkut"/><category term="social-graph"/><category term="techcrunch"/></entry><entry><title>Never use a warning when you mean undo</title><link href="https://simonwillison.net/2007/Jul/17/undo/#atom-tag" rel="alternate"/><published>2007-07-17T11:00:24+00:00</published><updated>2007-07-17T11:00:24+00:00</updated><id>https://simonwillison.net/2007/Jul/17/undo/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.alistapart.com/articles/neveruseawarning"&gt;Never use a warning when you mean undo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
The abundance of “undo” is one of my favourite things about Gmail. I wonder if there’s anything Django could do to make implementing undo functionality easier...


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/a-list-apart"&gt;a-list-apart&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/undo"&gt;undo&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/usability"&gt;usability&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/warning"&gt;warning&lt;/a&gt;&lt;/p&gt;



</summary><category term="a-list-apart"/><category term="django"/><category term="gmail"/><category term="undo"/><category term="usability"/><category term="warning"/></entry><entry><title>Gmail and Django</title><link href="https://simonwillison.net/2007/Jul/2/gmail/#atom-tag" rel="alternate"/><published>2007-07-02T21:46:57+00:00</published><updated>2007-07-02T21:46:57+00:00</updated><id>https://simonwillison.net/2007/Jul/2/gmail/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://nathanostgard.com/archives/2007/7/2/gmail_and_django/"&gt;Gmail and Django&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I’d never considered using Gmail to send e-mail from applications, but it could be a useful way of avoiding having outbound e-mail falsely flagged as spam.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/email"&gt;email&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/nathan-ostgard"&gt;nathan-ostgard&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="email"/><category term="gmail"/><category term="nathan-ostgard"/></entry><entry><title>Importing your social network from other sites</title><link href="https://simonwillison.net/2007/Jun/26/dopplr/#atom-tag" rel="alternate"/><published>2007-06-26T01:46:09+00:00</published><updated>2007-06-26T01:46:09+00:00</updated><id>https://simonwillison.net/2007/Jun/26/dopplr/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.dopplr.com/index.php/2007/06/23/importing-your-social-network-from-other-sites/"&gt;Importing your social network from other sites&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Dopplr now does this from GMail, Twitter, vCard or hCard and XFN. I’m convinced that contact import is a killer app for OpenID.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/contactimport"&gt;contactimport&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dopplr"&gt;dopplr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hcard"&gt;hcard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/microformats"&gt;microformats&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/openid"&gt;openid&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twitter"&gt;twitter&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vcard"&gt;vcard&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/xfn"&gt;xfn&lt;/a&gt;&lt;/p&gt;



</summary><category term="contactimport"/><category term="dopplr"/><category term="gmail"/><category term="hcard"/><category term="microformats"/><category term="openid"/><category term="twitter"/><category term="vcard"/><category term="xfn"/></entry><entry><title>Gmail Atom feeds</title><link href="https://simonwillison.net/2007/Jan/16/gmail/#atom-tag" rel="alternate"/><published>2007-01-16T14:50:50+00:00</published><updated>2007-01-16T14:50:50+00:00</updated><id>https://simonwillison.net/2007/Jan/16/gmail/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://mail.google.com/support/bin/topic.py?topic=1573"&gt;Gmail Atom feeds&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Could be useful as a pipe for creating an e-mail interface to an existing Atom-consuming application.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/atom"&gt;atom&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;&lt;/p&gt;



</summary><category term="atom"/><category term="gmail"/></entry><entry><title>Offline Gmail and Blogger Using the Dojo Offline Toolkit</title><link href="https://simonwillison.net/2007/Jan/10/sitepen/#atom-tag" rel="alternate"/><published>2007-01-10T12:40:01+00:00</published><updated>2007-01-10T12:40:01+00:00</updated><id>https://simonwillison.net/2007/Jan/10/sitepen/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.sitepen.com/blog/2007/01/09/28/"&gt;Offline Gmail and Blogger Using the Dojo Offline Toolkit&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
These are just mockups at the moment, but they’re a useful illustration of how offline browsing modes for Web applications could work.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/blogger"&gt;blogger&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dojo"&gt;dojo&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/offline"&gt;offline&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sitepen"&gt;sitepen&lt;/a&gt;&lt;/p&gt;



</summary><category term="blogger"/><category term="dojo"/><category term="gmail"/><category term="javascript"/><category term="offline"/><category term="sitepen"/></entry><entry><title>Adding Persistent Searches to Gmail</title><link href="https://simonwillison.net/2005/Mar/2/adding/#atom-tag" rel="alternate"/><published>2005-03-02T12:21:21+00:00</published><updated>2005-03-02T12:21:21+00:00</updated><id>https://simonwillison.net/2005/Mar/2/adding/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://persistent.info/archives/2005/03/01/gmail-searches"&gt;Adding Persistent Searches to Gmail&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Brilliant greasemonkey hack.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.sitepoint.com/blog-post-view?id=239170"&gt;Stuart on SitePoint&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/gmail"&gt;gmail&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/greasemonkey"&gt;greasemonkey&lt;/a&gt;&lt;/p&gt;



</summary><category term="gmail"/><category term="greasemonkey"/></entry></feed>